プログラミングに出てくる「繰り返し」の理解に苦しんでいます。
「for」や「while」などわかりやすく教えて欲しいな。
具体例とかもあるといい。
本記事の内容
プログラムでは、同じような処理を繰り返すことが多くあります。
その際に使われるのが「繰り返し」処理で「ループ」とも言います。
「繰り返し処理」で使われる3つの構文を理解できれば、煩わしい処理でも簡単に実装できます。
この記事では、「繰り返し処理」について具体例や図解しながらわかりやすく解説していきます。
≫初心者プログラミング|基本構文5つの解説まとめ【図解あり】
\挫折せず効率よく学ぶなら!/
答えてくれると嬉しいです!
1.プログラミングの繰り返し処理とは|ループ
まず最初に「繰り返し」を学習するにあたって「繰り返し」の前提知識を解説していきます。
「繰り返し」とは、プログラムで同じような処理を繰り返す時に使う制御文のことで「ループ」とも呼ばれます。
簡単な例をいえば、次のような処理をしたいときです。
ある月における日々の売上金額を足して合計する
どんな記述になってどのようなメリットがあるのか解説していきます。
コード量が少なくて済む
「日々の売上金額を足す」という同じ処理が30回(月間30日分)行われますから、プログラムでは普通「繰り返し」を行って処理させます。
以下に「繰り返し」処理での総売上を算出するロジックです。
for ( 繰り返し条件 ){
総売上 += X日の売上金額
}
数行ほどのコードで、しかも使う変数も少ないです。
しかし、各日の変数(x日の売上金額)をそれぞれ用意するとなると...
総売上金額 = 1日の売上金額+2日の売上金額+...+30日の売上金額
という長々としたコードとなってしまい、バグの原因やメンテナンスも大変なのです。
次節、「繰り返し」の基本的な構文3つを解説していきます。
2.プログラミングの繰り返しの基本構文3つ
ここでは、以下3つの「繰り返し」について解説していきます。
- for文
- while文
- do〜while文
順番に解説していきます。
1.for文|繰り返す回数が最初からわかっている場合
「for文」の繰り返し処理は以下の構造で記述します。
for (ループカウンタの初期値; 繰り返し条件 ;ループカウンタの増減値) {
処理
}
for文の繰り返し処理は、ループカウンタの仕組みを使って行われるのが特徴です。
ループカウンタとは、処理されるたびに数値が1,2,3,4...と増えていく「カウンタ」のようなものとイメージしてください。
ではfor文の簡単な具体例とその解説をご紹介します。
for文の使い方と解説
以下は、カウンタ値を出力したプログラムです。
php for($i=0; $i<3; $i++){//①ループカウンタ echo $i."\n"; //②ループカウンタ値を表示する }
上記プログラムを解説します。
ループカウンタの仕様(初期値; 繰り返し条件; カウンタ増減値)をもとに...
①ループカウンタ($i)が繰り返し条件($i<3)に合致するか判定します。
②カウンタ値($i)を表示します。
③①に戻りループカウンタ($i)を1加算し、
・繰り返し条件($i<3)に合致すれば②へ...
・繰り返し条件($i<3)に合致しなければ繰り返し処理を終了する。
forの()内に書かれるループカウンタの仕様に基づいて繰り返し処理が行われます。
実行結果
0
1
2
※上記は$iの値が0から1づつ加算されていくパターンでした。
逆に1づつ減算する方法も解説しておきます。
php for($i=8; $i>2; $i--){//①ループカウンタ echo $i."\n"; //②ループカウンタ値を表示する }
実行結果
8
7
...
3
ポイントは、ループカウンタの仕様である3番目の条件に「$i--」と書くということです。
こうすることで「$i」が1づつ減算されていきます。
「for文」は、繰り返す回数があらかじめわかっている時に使われる繰り返し処理
だということを押さえておきましょう。
以上、「for文」による繰り返しを解説してきました。
では、次節、while文の「繰り返し」を解説していきます。
2.while文|繰り返す回数がわかっていない場合
「while文」の繰り返し処理は以下の構造で記述します。
while (繰り返し条件) {
処理
}
whileの()内に書かれる「繰り返し条件」とは、繰り返し処理を継続するための条件のこと。
条件が満たされる限り、繰り返し処理が続けられます。
ではwhile文の簡単な具体例とその解説をご紹介します。
while文の使い方と解説①
以下は、前述したfor文と同じカウンタ値を出力したプログラムです。
php $count = 0;//①カウンタ初期化 while($count < 3){//②条件を満たす間は繰り返し echo $count."\n";//③カウンタを表示する $count++;//④カウンタを1加算する }
上記プログラムを解説します。
①カウンタ値($count)をゼロ初期化する。
②whileの条件判定:カウンタ値($count)が3未満の場合は処理実行する。
③カウンタ値($count)を表示する。
④カウンタ値を1加算する。
⑤②に戻り
・繰り返し条件($count < 3)を満たす間は③④を繰り返す。
・繰り返し条件($count < 3)を満たさなければ繰り返し処理終了する。
④でカウンタ($count)が3となれば、②に戻ったときに条件を満たさなくなるので「繰り返し」処理は終了です。
実行結果
0
1
2
繰り返しの終了条件が決まっているなら、for文と同じ動きをしているよね...
for文とwhile文の違い
前述したfor文と異なるところは、カウンタ値($count)をあらかじめ用意し、カウント(加算)するロジックが必要なことです。
ですから、コードの記述量からいえば、for文の方が少なく綺麗になります。
またwhile文の特徴は、繰り返す回数がわかっていない繰り返し処理に対し効果を発揮します。
次節で解説します。
繰り返す回数がわかっていない場合の繰り返し処理ができる
while文は、繰り返す回数がわかっていない場合の繰り返し処理が可能です。
もう一度「while文」の繰り返し処理の構造を記述し解説します。
while (繰り返し条件) {
処理
}
whileの()内に書かれる「条件」は、繰り返し処理を継続するための条件のことでしたよね。
この条件が満たされる限り、繰り返し処理が続けられます。
これを別の言い方でいうと、true(真)の間は処理を続けるということなのです。
trueの逆はfalse(偽)で、falseになれば処理は終了します。
以上を前提とし、具体的に「繰り返す回数がわかっていない」場合のwhile文を解説します。
while文の使い方と解説②|繰り返す回数がわかっていない場合
以下のコードをみてみましょう。
このプログラムは6月の日付を1日から順番に表示しています。
php $julyDay = 1;//①日にちの変数定義 while(checkdate(6, $julyDay, 2020)){//②繰り返し条件 echo $julyDay."\n";//③日付表示 $julyDay++;//④日付を加算 }
見て欲しいのが、while文の()内の繰り返し条件です。
checkdate()関数を使って、指定された月の日付が妥当かどうかをチェックしtrueかfalseを返すものです。
この場合は6月の日付をチェックしています。
$julyDayが1〜30の間であればcheckdate関数はtrueを返します。
ですが、$julyDayが31となった場合にはcheckdate関数はfalseを返します。
となると、whileの()内がfalseとなって処理が終了するのです。
while文は、繰り返し回数がわかっていない場合に効果を発揮し「true」の間だけ処理が行われます。
3.do〜while文|一度だけ処理が行われる
「do〜while文」の繰り返し処理は以下の構造で記述します。
do {
処理
} while (繰り返し条件)
結論をいうと、do{}がwhileよりも前につくことで、1回だけは確実に処理が行われるということです。
2回目以降はwhile()の中の繰り返し条件を満たす(trueの)間は処理が繰り返されます。
ではdo〜while文の簡単な具体例とその解説をご紹介します。
do〜while文の使い方と解説
以下は、前述したwhile文と同じカウンタ値を出力したプログラムです。
php $count = 0;//①カウンタ初期化 do{ echo $count."\n"; //②カウンタを表示する $count =++; //③カウンタを1加算する }while($count < 3) //④条件を満たす(trueの)間はdo{}内の処理を繰り返す
上記プログラムを解説します。
①カウンタ値($count)をゼロ初期化する。
②カウンタ値($count)を表示する。
③カウンタ値を1加算する。
④whileの条件判定:
・カウンタ値($count)が3未満の場合は②③を実行する。
・カウンタ値($count)が3以上の場合は繰り返し処理を終了する。
実行結果
0
1
2
while文と同じ結果が得られましたよね。
これではおもしろくないので、while文との違いをこれから解説します。
whileとdo〜whileの違い
以下2つのプログラムとその実行結果を見て欲しいです。
プログラムは、初期値が-2のカウンタを減算しその値を表示するものです。
まず、while文のプログラムと実行結果は以下のとおり
PHP:while文 $count = -2;//①カウンタ初期化 while($count > 0){ echo $count."\n";//②カウンタを表示する $count-=2;//③カウンタを2減算する }
実行結果
なし
次に、do〜while文のプログラムと実行結果は以下のとおり
PHP:do〜while文 $count = -2;//①カウンタ初期化 do{ echo $count."\n";//②カウンタを表示する $count-=2;//③カウンタを2減算する }while($count > 0);//②条件を満たす(trueの)間はdo{}内の処理を繰り返す
実行結果
-2
カウンタの初期値が-2に対し、while文では最初に条件を判定します。
そのため、カウンタ値が正の数ではない(-2)ので処理は行われません。
しかし、do〜whileでは、条件判定が処理の後に行われるため、初期値の-2が必ず表示されています。
while文とdo〜while文の違いは「繰り返し条件の判定が先か後か」というところです。
必ず1回は処理実行させたい場合は、do〜while文を使いましょう。
3.プログラミングでは無限ループに注意
while文などの繰り返し処理は、「繰り返し条件」が成立(true)している間は繰り返し処理を行います。
なので、「繰り返し条件」が不成立(false)となるようなロジックをきちんと書いておかなければなりません。
でないと、いつまでも処理が終わらない「無限ループ」となり、プログラムに負荷を掛けてしまいます。
無限ループの例
例えば以下の無限ループとなるプログラムを見てみましょう。
結論として、0,1,2,3,4.....と無限にカウンタが表示され続けてしまいます。
PHP $count = 0;//①カウンタ初期化 while($count < 3){//②条件を満たす間は繰り返し echo $count."\n";//③カウンタを表示する }
実行結果
0
1
2
...
「無限ループ」を避けるためには、以下のようにwhileの条件を不成立(false)にさせるロジックが必要です。
PHP $count = 0;//①カウンタ初期化 while($count < 3){//②条件を満たす間は繰り返し echo $count."\n";//③カウンタを表示する $count++;//④カウンタを1加算する }
上記は、処理のたびに$countを加算していき「$count < 3」が不成立(false)となれば繰り返し処理は終了します。
繰り返し処理を終了させるためのロジックがないと、無限ループになりますよ!
4.繰り返し処理を中断する方法
繰り返し処理を中断したいは「break文」や「continue文」を使います。
- break文|繰り返し処理を終了する
- continue文|次の繰り返し条件の判定へジャンプ
どのように使うのかをそれぞれ解説します。
1.break文|繰り返し処理を終了する
「break文」は繰り返し処理を中断(終了)したい時に使います。
それではbreak文を使ったプログラムを見てみましょう。
break文の具体例
ここで紹介するプログラムは、カウンタをゼロから順に表示させていくものです。
「カウンタが3より大きくなったら」繰り返し(while)処理を終わらせています。
PHP $count = 0;//①カウンタ初期化 while($count < 5){//②条件を満たす間は繰り返し if($count>3){//カウンタが3より大きい時に実施する。 break;//while文を強制終了する。 } echo $count."\n";//③カウンタを表示する $count++;//変数countに1を足す }
実行結果
0
1
2
3
「4」は表示されていません。
これはカウンタが4の場合はif文に入ってbreak文により、繰り返し処理が終了しています。
「break文」を使うことで繰り返し処理を中断(終了)させることができます。
2.continue文|次の繰り返し条件の判定へ処理をジャンプ
「continue文」はその回の繰り返し処理を中断し、次回の繰り返し条件判定まで処理をジャンプさせることができます。
break文と違い、繰り返し処理自体は終わりませんよ。
それでは、continue文を使ったプログラムを見てみましょう。
continue文の具体例
ここで紹介するプログラムも、カウンタをゼロから順に表示させていくものです。
「カウンタが3になったら」その回の繰り返し(while)処理を終わらせ、次回繰り返し条件の判定を行います。
PHP for($count=0; $count < 5 ;$count++){ if($count==3){//カウンタが3の時に実施する。 continue;//次回の繰り返し条件判定へ。 } echo $count."\n";//カウンタを表示する }
実行結果
0
1
2
4
「3」が表示されていません。
これはカウンタが3の場合は、if文に入ってcontinue文によりfor文の繰り返し条件判定へ処理がジャンプしています。
「continue文」を使うことで、その回の繰り返し処理を中断し、次回の繰り返し条件を判定させることができます。
まとめ
最後に要点をまとめます。
「繰り返し」とは、プログラムで同じような処理を繰り返す時に使う制御文のことで「ループ」とも呼ばれます。
繰り返しの基本構文は以下3つ
for文
繰り返す回数がわかっている場合の繰り返し処理ができます 。
for(ループカウンタ初期値; 繰り返し処理の終了条件; ループカウンタの増減){
処理
}
while文
繰り返す回数がわかっていない場合の繰り返し処理ができます。
while(繰り返しの条件){
処理
}
do〜while文
最初に繰り返し条件判定があるwhile文に対し、do〜while文は処理が行われた後に条件判定があります。
なので、1回は必ず処理実行します。
do{
処理
}
while(繰り返しの条件)
「繰り返し」の制御文は、同じ処理を繰り返すことができるすごく便利な構文です。
実際の開発現場でも多く使われます。
ですから、当記事で「繰り返し」の仕組みをきちんと理解しておきましょうね。