if文は何となく理解できたけど、他の書き方ってどんなものがあるのだろう。
前回のif文に続き、プログラミングで必ず使用することになる繰り返しの処理を書いていきます。
繰り返し処理に関しても、プログラミング言語によって微妙に書き方が異なりますが、こちらも書き方や考え方などはほとんど同じです。
今回もjavaを例にして説明していきます。
繰り返しの処理はどう書くのか
繰り返し処理には主に以下の文法がよく使用されます。
・while文
ざっくり違いを説明すると「for文は指定した回数を繰り返す」、「while文は条件を満たすまで繰り返す」といった感じです。
どちらを使うかは仕様次第になりますが、サーバ側の処理に限ってはfor文を使用することが多いです。
データベースから取得した件数分を処理するといったような内容です。
イメージしやすいように日本語で表現すると以下のような形です。
・相手が電話出るまで電話をかける(while文)
繰り返し処理:for文の書き方
if文同様にプログラミング言語によって、多少書き方は異なりますが共通して以下の書き方(考え方)がほとんどです。
以下がよくあるfor文の書き方になります。
for (int i = 0; i < 10; i++) { 「電話をかける」 }
「int i = 0; i < 10; i++」の部分が10回行うことを指定している形です。
簡単に説明しますと以下のような形です。
・{}内の処理を1回行うたびに i に1を足す(i++)
・i が10以上になったら繰り返し終了(i < 10;)
いかがでしょう。i がカウンターの役目をしていることが分かるかと思います。
「i < 10;」の部分が処理を実行する条件。
「i++」の部分がカウンターの増加する条件。
※++というのが1加算するという指定です。
もちろんはじめの i の値を5から始めることも可能ですし、1加算ではなく2を加算することも指定すれば可能になります。(あまりここを変えることは少ないですが)
基本的には「i < 10;」の条件部分が最終的に処理を実行するかしないかの条件になりますので、ここの部分をよく変更することになります。
ちなみにカウンターの役目をしているこの i ですが、これはあくまで変数名ですので i である必要はありません。
aでもbでもcでもOKです。counterとしても問題ないです。
後、{}内の処理でこのカウンターの値を使用することができます。
例えば以下のような感じです。
for (int i = 0; i < 10; i++) { System.out.println(i); }
上記を実行すると出力結果が以下のような感じになります。
0
1
2
3
4
5
6
7
8
9
はじめは i が0からなので、1回目は0が出力されます。
その後、1回処理を行うごとに「i++」で1加算されるため、処理するごとに1ずつ増えていっている感じです。
処理の実行条件が「i < 10」ですので、最後の9の出力が終わるとカウンターが10になります。
10になると「i < 10」の i が10未満であることの条件に一致しなくなるため、処理が終了するといった感じです。
あと少しややこしくなるかもしれませんが、for文の中にfor文を入れることも可能です。
以下のような感じです。
for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { System.out.println(j); } }
上記を実行すると先ほど0~9まで出力された内容が10回出力される事になります。
補足ですが、for文やwhile文の中で使用できる文法がありますので紹介します。
それは「continue」と「break」です。
for文の中に「continue;」を記載するとcontinueを実行するタイミングで次の繰り返し処理へいきます。
上記だけで理解できた方は問題ないですが、あまりピンとこなかった方は以下のメモで簡単に説明します。
段ボール箱が10個あるとします。
そして、これらの段ボール箱中に「みかん」か「りんご」のどちらかが入っていたとします。
あなたは段ボール箱を開けて、「みかんだった場合はみかんを食べる」が「りんごの場合は食べません」。このような仕様があったとします。
まず、処理としては段ボールを10個開ける必要があるので、10回繰り返す処理を書きます。
そして開いた結果、みかんだった場合はその後の食べる処理を実行することになります。
もし、りんごだった場合はその後の食べる処理は実行したくないので、次の段ボールを開けに行きます。
この次の段ボールを開ける行為が「continue」になります。
続いて、break文ですがこちらは分かりやすいと思います。
このbreakが実行された場合、繰り返しを抜ける動作になります。
本来、10回繰り返すなどの繰り返す条件があるのですが、その条件を満たない5回や6回などのときにでもこのbreakeが実行されると繰り返しがお終いということです。
繰り返し処理:while文の書き方
while文について説明します。
こちらも繰り返しを行う文法ですが、for文と違うところは繰り返す回数を条件にするのではなく、if文と似たような形で条件指定することになります。
書き方としては以下のような形です。
while(相手が電話にでない) { 「電話をかける」 }
相手が電話に出るまで電話かける感じです。
ちなみに先ほど説明したfor文と同じことをwhile文でも表現が可能です。
int i = 0; while (i > 10) { System.out.println(i); i++; }
for文では、()の中にすべて収まってましたが、whileの()には繰り返しを行う条件だけ記載することになるので、「i < 10」だけ入っています。
じゃあ、while文だけでfor文使わなくていいじゃん!って思う方がいるかもしれませんが、プログラミングの文法は各々役割があってそれにあった文法を使用することで読みやすく(可読性があがる)なります。
上記のような簡単なロジックだけであれば、見てすぐ10回繰り返しているのだなとわかりますが、これが何百行のコードが{}のなかに書かれてたとしたらどうでしょう。
i がカウンタの役目として使用しているのか、そうでないのかが一目ではわかりません。
しかし、for文を使用するとfor文の()の中身を見ただけで、この処理はある回数分繰り返すのだなとすぐに判断できます。
※for文の{}内でカウンタを変えることもできるので最終的には中身を全部見ないと判断できないというのが本当ですが、原則特別な理由がない限りカウンタは変えることはないです。(可読性がおちるので)
無限ループには気を付けよう
簡単に繰り返し処理を行う代表的なfor文とwhile文について書いていきました。
最後に繰り返し処理を書く上で、一番注意しないといけないことがあります。
それが無限ループです。
どういったものかといいますとずっと繰り返し条件から外れない状況に陥って、処理がいつまで経っても終わらない状態のことです。
結構不具合として有名で、よくあるミスでもあるので注意してください。
では、例としてどういったコードか参考までに記載していきます。
以下、for文の場合。
for (int i = 0; i < 10; i--) { System.out.println(i); }
「i–」は、先ほどの++の反対で1減算するという意味です。
いかがでしょう。上記を処理した場合の i の値の変化を見ていくとずっと減算していくので、10になることはありません。
永遠、「System.out.println(i);」を実行し続けることになります。
※「0、-1、-2、-3・・・」みたいな感じです。
ただ、for文はあまり無限ループになることは少ないと思います。
理由は()内に繰り返し条件が集約されているからです。
while文が無限ループに陥る可能性が高いです。
以下、コード例です。
int i = 0; while (i < 10) { System.out.println(i); }
いかかでしたでしょうか。
「i++;」がないため、iは永遠0のままです。
そうなるともちろん i が10になることもありません。
whileは{}内にいつか繰り返しが終了するように条件を意識しておく必要があります。
これがよく漏れていたり、もしくは破綻したりすることが多いのです。
while文を書いた後は、机上でもいいのでまずちゃんと繰り返しが終了する作りになっているかを確認しましょう。
まとめ
いかかでしたでしょうか。
繰り返しの書き方は理解できましたでしょうか。
簡単にまとめると以下のとおりです。
・while文は繰り返しの条件を指定する
・無限ループにならないよういつか繰り返しが終了する作りになっているか確認する
はじめは慣れていないとうまくいかないことも多いし、ちゃんと理解できたか不安になったりしますが、それらはたくさんコードを書いていく内に身についていきます。
まず、実際にプログラミングしてみて経験を積むことが大事です。
コメント