2013年2月28日

CodeStudy 12-10 continue のこと


今回は 制御文 のまとめをする前の復習として、CodeStudy 12-10 の continue をやってみます。

問題


while 文を使用して、変数 i = 1~100 までのうち、7 で割り切れる数字を、変数 count に全て足したらいくつになるか計算して、それを output ( ) で出力してください。



var i = 1;
var count = 0;

//ここにループを書きましょう。
while (i <= 100) {
    i ++;
    if (i % 7 != 0) {
        
continue;

    } else {
        count += i;
    }
}

output (count);



赤字の部分が 自分で書く必要のある所です。
赤字の部分の
1行目で、while 文を使って繰り返しの処理をしています。繰り返しの条件は、i が 1~100 ですので、100以下 となるように i <= 100 にしました。i は 1づつ増やすので、i < 101 でも良いかも知れません。

2行目 i を 1 増やしていますが、これは i が7になる迄は、count に足される事が無いというのが 予め判っているのでこれでも良いのですが、予め判らない場合は if 文で 分けた処理のそれぞれ最後に i ++ を入れるのが良いと思います。

3~6行目 if 文を使って i が 7 で割り切れるかを判定しています。not 演算子 ( ! ) を使って 7 で割り切れない場合に continue でループを 1回スキップさせて、割り切れる場合は else 以下で i の値を count に足しています。これは not 演算子を使わないで、


if (i % 7 == 0) {
    count += i;
} else {
    continue;
}


このように書いても同じですが、これだと continue を使わなくても同じになってしまうので、回答例のようにしました。
この例題でも、インクリメントをちゃんと入れないと無限ループになってしまうので、注意して下さい。



よろしければこちらの記事もどうぞ

 CodeStudy の問題に挑戦した記事の一覧

2013年2月12日

CodeStudy 12-7 break のこと


制御文のまとめの続きを書こうとしている所ですが、また いつものように CodeStudy で復習をしてみようと思います。今回は break についてです。section 12-7 の問題に挑戦します。


問題


変数 i=0 から while 文でループを回し、その都度変数 count に i の値を足してみましょう。count が 150 を超えたらループを終了し、その時の i を output( ) で出力してください。




var i = 0;
var count = 0;

// 今回は意図的に無限ループを作っています。
// 必ずループの途中で break 文により、ループを中止しましょう。

while (true) {
    count += i;
    if (count > 150) {
        break;
    }
    i++;
}

// i をoutput ()で出力します。
output (i);



赤字の所が 自分で書く所です。
これは 0 + 1 + 2 + 3 + 4 + …とやっていった合計が 150 をこえたら計算のループを止めて 何回目の足し算で 止めたかを表示させるということですね。

先ず赤字の部分の
1行目 ですが、 while の条件式が true となっています。これは コード中のコメントにもあるように ずっと繰り返し続ける(無限ループ)ので、実行する処理の中に break 等を適切に入れないと、ブラウザがフリーズしたようになってしまい強制終了等 しないといけなくなったりして大変ですので注意が必要です。

2行目 では i の値を count の値に足しています。
3行目 で if 文を使って、count の値が 150 を越えたかをチェックしています。越えている場合は
4行目 の break が実行されて、ループを抜けます。
越えていない場合は
6行目 で i の値を 1 増やしてループを繰り返します。条件式が true で無限ループなので、count が 150 をこえるまで、繰り返し続けます。

ループを抜けたあとの処理は、CodeStudy おなじみの output () で i の値を表示させて終了です。

2013年2月4日

JavaScript 初歩のまとめ ⑬ 制御文 while

前回の for 文に続いて、同じ繰り返し処理の while 文のまとめです。



while 文


while は プログラムの中のある処理を 繰り返して行うときに使う命令です。
良く似ている 繰り返しの命令に for がありますが、for が繰り返す回数を最初に指定するのに対して、while は条件を満たす間、何回も処理を繰り返すような場合に使うことが多いです。
但し繰り返しの条件に 比較演算子などを使って、for 文と似た使い方もできます。
while 文は次のように書きます。


while ( 繰り返しの条件 ) {
    実行する処理;
}


for 文の書き方と良く似ていますが、( ) の中に カウンタ変数は書きません。この条件で true が返る間はずっと { } の中の処理が繰り返されます。 実際に書いてみます。



ex.1


var x = 0;
while (2 * x + 10 != 30) {
    x++;
}
document.write (x);




ちょっと良いサンプルが思いつかなかったのですが、小学校で習うような算数の問題を、コンピュータに解かせるとして、人間のやる計算方法ではなくて、 x を0 から 1ずつ増やす総当たり方式で、答えが出るまで繰り返すやり方で解かせます。


ex.1の実行結果















これで気をつけないといけないと思ったのが、while は 条件を満たす ( true が返る ) 間、処理を繰り返す。と言う点です。言い換えると、false が返ると 1回も { } 内が実行されません。この点にだけ気を付ければ、あとは難しい事はないと思います。そこで 原始的ですが、数字当てのゲームを作ってみました。



ex.2


var inp; //ユーザーが入力する数
var ans = Math.floor (Math.random()*9 + 1); //乱数で発生させる答
var ctr = 0; //答えを入力した回数

while (true) {
ctr++;
inp = prompt ('1 ~ 10 の数字が変数に代入されています。その数を当てて下さい。');
if (inp == ans) {
document.write('正解。<br>正解までにかかった回数 ' + ctr + ' 回');
  break;
}
else if (inp > ans) {
alert ('ハズレです ' + inp + ' よりは小さい数です。');
}
else {
alert ('ハズレです ' + inp + ' よりは大きい数です。');
}
}



while の条件式を true にしています。この条件だと当然、常に true が返るので ループが終了しません。(無限ループと言うそうです)
無限ループのスクリプトを実行してしまうと、ブラウザが フリーズしたようになってしまって、強制終了しないといけなくなったりして なかなか面倒でした。ここは注意が必要な所です。
無限ループにならないようにしているのが、真ん中あたりの赤字で書いた break です。詳しくは 次回以降に まとめを書こうと思っているのですが、ここでは if 文と組み合わせて ある条件を満たしたときに while のループを抜けるための命令です。

while のまとめの内容から外れてしまいますが、このスクリプトで alert で表示している「ハズレ…」のメッセージは document.write( ) で表示させたかったのですが、どうしても上手く行きませんでした。もうちょっと 勉強が進んだら理由が判るかも知れません。


 ここ迄で while 文については終わりですが、while 文のバリエーションのような do … while 文というのもあるので、次回は それと、今回少し使ってみた break 等についてまとめてみようと思います。その前に また、CodeStudy で復習が必要になるかも…。



よろしかったらこちらもどうぞ

制御文に関する記事の一覧

2013年2月1日

CodeStudy 12-4 while のこと

今 while 文のまとめの記事を書こうとしている所ですが、書き始める前に 色々と復習しています。ずっとお世話になっている CodeStudy  4-1 から 4-4 に while 文の問題がありますので、改めて挑戦してみました。
但し 4-1 から 4-3 は「ちょっとした問題」ですので、ここでは 4-4 だけ取り上げます。


問題

var i =1~30 までループを回し、i が偶数の時のみ、変数 count にその時の i を足してみましょう。 そしてその結果、count がいくつになるのかを output( ) で出力しましょう。


var i = 1;
var count = 0;

//ここにループを書きましょう。

//iをインクリメントするのを忘れないでください。
while (i <= 30) {
    if (i % 2 == 0) {
        count += i;
    }
    i++;
}
//結果をoutputで出力しましょう。
output(count);


赤字の部分が 自分で書く部分です。
このように書いたら 正解になりました。この問題だと ループの回数が、30回と決まっているので、for 文を使っても 答えは出ます。教本などを読むと for 文は ループ回数が決まっている場合に使い、while 文は何回繰り返すか判らない場合に使う事が多いとあります。
では、練習と思って 同じ条件のスクリプトを for 文で書き直してみます。


ex.1

var count = 0;
for (var i = 1; i <= 30; i++) {
    if (i % 2 == 0) {
        count += i;
    }
}
document.write (count);


ex.1の実行結果
















書いた行数だけを見ると 少しの差ですが、for で書いた方が少なくて済むようです。
for にしても while にしても 条件の書き方がとても重要だと判ってきました。結果は同じでも 違う書き方というのもできそうですし…。
ともかく練習にはなりましたので、次はwhile 文のまとめを書こうと思います。



よろしければこちらもどうぞ

CodeStudy に取り組んだ記事一覧

2013年1月25日

JavaScript 初歩のまとめ ⑫ 制御文 for


前回 for 文を色々と試しながらまとめましたが、もう少し試してみたい事もあるので 続きです。


for 文のネスト


ex.1

document.write ('掛け算');
for (var i = 1; i < 10; i++) { 
    document.write('<br>', i + 'の段', '<br>');
    for (var j = 1; j < 10; j++) { 
        document.write (i + ' × ' + j + ' = ' + i * j, '<br>');
    }
}


ex.1 の実行結果






















for 文の繰り返し処理に for 文を書いて、2重のループにする事ができます。ex.1 では 前回のまとめで作った 掛け算のループを 2重のループに改造して、1の段から 9の段まで表示するようにしてみました。
カウンタ変数 i は ◯の段を 1~9 まで繰り返します。i のループを 1回処理する毎に 内側のループ(カウンタ変数 j のループ)が、i の段 の掛け算を 1~9 まで行います。
j のループが終了すると、i が 1増えて、次の段の掛け算が 行われ、9の段まで行うと全ての処理が終了します。ややこしく見えますが、やっている事は単純です。




複数の変数の値を増減させる for 文


for 文では 複数の変数の値を増減させながら ループする事もできます。この場合 扱う変数を , (カンマ)区切りで 書きます。



ex.2

var num = new Array();
for (var i=0, j=2; i<9; ++i, j*=2) {
    num[i] = j;
}
document.write (num);



ex.2 の実行結果














繰り返し条件を書く ( ) 内に 初期値と ループ1回毎の増減値を ,(カンマ)で区切って書きます。
今の所 この方法以外ではできない処理のサンプルが思いつきませんが、覚えておくと役に立つ時があるかも知れません。ex.2 は次のように書いてもとりあえず同じ結果になりました。

var num = new Array();
var j = 2;
for (var i=0; i<9; ++i) {
    num[i] = j;
    j *= 2;
}

document.write (num);

for 文についてはひとまず完了です。次回のまとめは、繰り返し処理の続きで、while 文にしようかと思います。



よろしければ こちらもどうぞ。