プログラミングの強い点の一つ。
それは、同じ処理を繰り返し実行できること。
とはいえ、例えば100回同じ処理をするために、その実行を100回手で行ってしまっては元も子もない。
そこで、プログラムで繰り返し同じ処理を実行できる考え方が用意されている。
そのまま、繰り返し処理と呼ばれるものだ。
今回は、それを解説していこう。
今回の説明内容
今回は、同じ処理を何度も行うことができる繰り返し処理について扱う。
これは、更に大きく二つの考え方に分かれる。が、根本は両方とも同じだ。
まずはそもそもの考え方、そして、その二つの考え方に分岐していこう。
繰り返し処理の基本
繰り返し処理とは
冒頭で説明が済んでしまっているが、もう一度書いておこう。
繰り返し処理とは、ある条件を満たしている間、何度も実行することができる処理のことだ。
この、ある条件を満たしている間、というのがポイントになる。
これがないと、どこまで実行すればいいか分からず、延々と処理を続けてしまう。
そうなると、もう強制終了するしかなくなってしまう。
この、無限ループに気を付けつつ、二つの考え方に進もう。
まずは条件に着目した考え方から。
条件に着目した繰り返し処理
これは、何か条件があって、それが成り立っている間繰り返し処理を行う。
具体的なもので考えてみよう。
例えば、ある二つの数a, bについて、aをbで割った余りを求めたいとしよう。
大まかな方針としては、以下のようになる。
- 変数a, bを用意する
- a – bが0以上である間、以下を繰り返す
- aからbを引く
- aを出力する
先に、これで余りが求められることを説明しよう。
aが10、bが3だったとしてみる。
2行目、まずは10 – 3 = 7は0以上なので、繰り返し処理に入る。
で、3行目でaは7になる。
また2行目に戻り、7 – 3 = 4は0以上、再度繰り返し処理へ。
aが4になり、また2行目、4 – 3 = 1なので繰り返し。
aが1になり、今度は2行目で1 – 3 = -2 < 0となる。これで、繰り返し終了だ。
最後にaを出力すると、1と表示される。これで、余りを求めることができる。
このように、ある条件(今回で言えばa- b >= 0)が成り立っている間、繰り返し一定の処理を行うことができるのだ。
…勘のいい方はお気づきだろう。この条件とは、前回解説した真偽値だ。
前回は条件分岐で、真偽値がtrue
なら1回だけ処理を行えた。
今回は、真偽値がtrue
である間、繰り返し処理を行えるのだ。
これを行うものを、while文と呼ぶ。
書き方は今回の3言語とも共通しており、以下の通り。
while(真偽値){
// 真偽値がtrueである間行う処理
}
処理の流れは以下の通りだ。
- 真偽値を見る。真偽値が
true
なら2へ、false
ならwhile文の処理終了。 - 処理を行う。
- 1に戻る。
これをもとに、3言語それぞれで余りを求めるソースコードを書いてみよう。
Javaの使用例
class Sample04 {
public static void main(String args[]) {
int a = 10;
int b = 3;
while(a - b >= 0){
a -= b;
}
System.out.println(a);
}
}
さて、二つ補足をしておこう。
まず一つ目、7行目を見て欲しい。a -= b;
と書いてある。
これは、まずa - b
をする。その結果を、再度a
に代入する、という意味だ。
今回の引き算だけでなく、足し算、掛け算、割り算共に使える。
この書き方は色々な言語で使用するので覚えておこう。
二つ目、9行目。今までの出力とちょっと異なる。
小括弧の直前、今まではprint
だったのに、今回はprintln
となっている。
これは、出力の最後に改行を一つ追加して出力してくれるものだ。
これがあると、最後にいちいち\r\n
とか\n
とかを書かなくてもよくなる。
これはJava特有だが、頭に入れておくといいだろう。
C言語の使用例
#include<stdio.h>
int main(){
int a = 10;
int b = 3;
while(a - b >= 0){
a -= b;
}
printf("%d\n", a);
return 0;
}
JavaScriptの使用例
var a = 10;
var b = 3;
while(a - b >= 0){
a -= b;
}
console.log(a);
補足:余りを求める場合は…
今回、while文の例として余りを求めるプログラムを書いたが、実はこれ、数式1つで求められる。
a % b
と書くと、a
をb
で割った余りを計算してくれる。
これも大体の言語で使える演算だ。
特に、奇数・偶数の区別で、2で割った余りを求めたりするので、覚えておこう。
回数に着目した繰り返し処理
上では、ある条件の間繰り返すものを書いた。
これを使えば、例えば100回繰り返す、という処理も書ける。
が、この回数での繰り返しをしやすくするためのfor文というものも用意されている。
先に、今回の3言語共通の書き方を見ていこう。
for(初期化式; 真偽値; 再初期化式){
// 真偽値がtrueなら行う処理
}
for文は、while文に2種類の処理が追加されている。
まずは、初期化式というもの。これは、繰り返し処理をする前に、一度だけ行われる処理だ。
そして、再初期化式。これは、繰り返しの処理が一回終わるごとに行われる処理。
処理の流れは、以下のようになる。
- 初期化式の処理を行う。
- 真偽値を見る。真偽値が
true
なら3へ、false
ならfor文の処理終了。 - 処理を行う。
- 再初期化式の処理を行う。
- 2に戻る。
つまり、while文に1, 4の二つの処理が追加されるだけだ。
では、100回処理を繰り返してみよう。1から100までの数を足してみる。
Javaの使用例
class Sample05 {
public static void main(String args[]) {
int res = 0;
for(int i = 1; i <= 100; i++){
res += i;
}
System.out.println(res);
}
}
またしても見慣れないものが出てきている。
5行目、再初期化式の部分。i++
と書かれている。
これはインクリメントと言って、その数値の変数の値を1つ増やすもの。
書き換えれば、i += 1
と同じだ。これはJavaに限らない。
C言語の使用例
#include<stdio.h>
int main(){
int res = 0;
for(int i = 1; i <= 100; i++){
res += i;
}
printf("%d\n", res);
return 0;
}
JavaScriptの使用例
var res = 0;
for(var i = 1; i <= 100; i++){
res += i;
}
console.log(res);
さて、ここまで大丈夫だろうか。
繰り返し処理の中断
繰り返し処理では、真偽値を見てそれがfalse
になったらその処理を終える、と説明した。
しかし、繰り返し処理の中で、途中でやめさせることもできる。
その二つの方法を見ていこう。
continue文
まずはこちら。
繰り返し処理の中に書くことで、その回の処理を終了し、while文なら再度真偽値による条件判定、for文なら再初期化式の処理に飛ばすことができる。
例として、1から10の数で、奇数だけ表示させてみよう。
この時、偶数…つまり、その数を2で割った余りが0ならその時点で繰り返しを中断してみよう。
どれも似たソースになるので、Javaの該当部分だけ載せよう。
他の2言語では出力と、JavaScriptに関しては変数定義の部分を変えて欲しい。
for(int i = 1; i <= 10; i++){
if(i % 2 == 0){
continue;
}
System.out.println(i);
}
i
が偶数の場合は2行目のif文でtrue
になり、3行目のcontinue;
が実行される。
そうすると、再初期化式の処理に移り、その後条件判定と進んでいく。
つまり、これを実行すると、結果に1, 3, 5, 7, 9が1個ずつ、改行しつつ表示される。
これがcontinue文だ。
break文
もう一つがこちら。
これは、実行された時点で、その繰り返し処理自体を終わらせる、というものだ。
今度は以下のように書いてみる。
for(int i = 1; i <= 10; i++){
if(i > 5){
break;
}
System.out.println(i);
}
こうすると、i
が6になった時、2行目のif文がtrue
になるので、break;
が実行される。
すると、その時点でfor文全体の処理が終了される。
つまり、実行すると1, 2, 3, 4, 5が改行しながら出力される。
continue文との違いをしっかり意識しておこう。
まとめ:繰り返し処理
今回は、繰り返し処理を解説した。
基本的な考え方は、ある条件を満たしている間、同じ処理を実行する、というものだ。
条件の判定には、前回のif文と同じく真偽値を用いている。
while文は純粋に条件のみ書き、for文は初期化と、一回の繰り返しごとに別の処理を挟むことができる。
また、両者共通でcontinue文、break文というものも使える。
continue文はその回の繰り返しを終了させ、break文は繰り返し処理全体を終了させる。
このあたりを抑えておこう。
次回は…個人的に一番重要と考えているポインタの解説をする。
が、表面に出てくるのはC言語だけだ。他の2言語では、隠れて使われている。
これが分かっていないと、かなり惑わされることになるので、しっかりと身に付けていこう。
また、同時に文字列についても詳しく見ていこうと思う。
更新情報はTwitterでも呟いている。よかったら、ページ下部のTwitterアイコンから覗いていってほしい。
それでは。
コメント