繰り返し

プログラムで目的に応じて処理を繰り返すことができます。記述方法はfor文とwhile文の2種類あります。

プログラムで目的に応じて処理を繰り返すことができます。記述方法はfor文とwhile文の2種類あります。

for文の繰り返し

for文は基本的に数値を演算しながら繰り返すので、数値を扱う繰り返しに便利です。

for (変数の初期化; 条件式; 反復処理) {
    繰り返し処理
}

例えば、10回処理を繰り返すfor文は次のようになります。

for (int i=0; i<10; i++) {
    繰り返し処理
}

これはfor文のはじめにi変数に0を代入し、繰り返し処理を実行後にi変数を1増加します。

そして、i変数が10より小さい場合は再び繰り返し処理を実行しi変数を1増加します。

i変数が10より小さい間はこれを繰り返すので、i変数は0,1,2,…と増えていき、9まで処理を繰り返すので、10回繰り返すことになります。

for (int i=0; i<10; i++) {
  println(i);
}

10回繰り返しprintln()を実行します。i変数をprintln()でコンソールに表示を10回実行します。

なので、コンソールには1行ずつ0,1,2,…9まで表示されます。

while文の繰り返し

while文は条件が成立している間繰り返します。そのため、ずっと条件が成立している状況では、永久に繰り返す(永久ループ)ので注意が必要です。

while (条件式) {
    繰り返し処理
}

先ほどのfor文と同じく10回処理を繰り返すwhile文を書いてみましょう。

int i=0;
while (i<10) {
    繰り返し処理
    i++;
}

for文と同じくi変数が0~9と変化しながら10回繰り返します。このwhile文で注意しないといけないのは、i変数を増加するコードをwhile文の中で書き忘れてはいけないということです。

もし書き忘れるとこのwhile文は永久ループします。i変数ははじめに0を代入してから、while文の中で変化しなくなるからです。

比較演算子

条件式に用いる演算子は以下の比較演算子が使われます。

比較演算子意味
==左辺と右辺は等しいか
!=左辺と右辺は等しくないか
>左辺は右辺より大きいか
>=左辺は右辺以上か(右辺を含む大きさ)
<左辺は右辺より小さいか
<=左辺は右辺以下か(右辺を含む小ささ)

これらの演算子は結果として条件が成立した場合はtrue、不成立だった場合はfalseを返します。

for文とwhile文は条件が成立した場合(結果がtrueだった場合)、{〜}の範囲内に書かれた処理を実行します。条件が成立している間は繰り返し処理を実行します。

この{〜}の範囲のことをブロックといいます。

繰り返しを使った図形の描画

size(500,500);
background(255);
stroke(255,0,0);
for (int i=0; i<10; i++) {
  line(100+i*30,100,100+i*30,400);
}

for文を使って10回繰り返し、縦の赤い線を等間隔に10本描いています。

for文の記述で用いたi変数を使って、線の座標を特定しています。

縦の線で変化しているのはx座標です。i変数を使ってx座標を算出しています。はじめはi変数が0なのでx座標は100、次はi変数が1なのでx座標は130、次はi変数が2なのでx座標は160…といった具合にx座標は100から30ずつ変わっていきます。

つまり線の間隔は30あることがわかります。

size(500,500);
background(255);
stroke(255,0,0);
for (int i=0; i<10; i++) {
  line(100+i*30,100,100+i*30,400);
}
for (int i=0; i<9; i++) {
  line(70,130+i*30,400,130+i*30);
}

7行目以降のfor文を追加し、9本の横の赤い線を追加で描画します。

横の線で変化しているのはy座標です。i変数を使ってy座標を算出しています。縦の線と同じく30の等間隔で線を描画しています。

size(500,500);
background(255);
noStroke();
fill(0,255,0);
for (int y=0; y<9; y++) {
  for (int x=0; x<9; x++) {
    ellipse(50+x*50,50+y*50,40,40);
  }
}

繰り返しの中で繰り返しを行うこともできます。この場合は、横に9個の円を並べて描画するのを9回繰り返し9×9個の円を描画します。

size(500,500);
background(255);
noFill();
stroke(0,0,255);
int w=10;
while (w<500) {
  ellipse(250,250,w,w);
  w += 20;
}

これはwhile文で円の大きさが画面を超えない限り20ずつ大きくしながら描画しています。

変数のスコープ

先ほどのコードではfor文を2つ記述し縦の線と横の線を描画しました。そのfor文はどちらもi変数を定義しています。

1連のプログラム内で同じ名前の変数は2つ以上定義できないはずですが、この2つのfor文はどちらも「int i」とi変数を定義しています。

これはi変数の定義がfor文の中にあるから定義できるのです。つまり、{〜}の範囲内で定義した変数は{〜}の範囲を出るとなくなります。

例えば、先ほどの2つのfor文の間にprintln()でi変数を表示しようとすると、エラーになります。

size(500,500);
background(255);
stroke(255,0,0);
for (int i=0; i<10; i++) {
  line(100+i*30,100,100+i*30,400);
}
println(i); //エラーとなる
for (int i=0; i<9; i++) {
  line(70,130+i*30,400,130+i*30);
}

これを変数のスコープといいます。{〜}の範囲のことをブロックといいます。

{〜}を書いてその範囲内にコードを書く文はブロックを持つプログラム文です。for文やwhile文、条件分岐のif文や関数、クラス定義が相当します。

また、このブロックの中で定義した変数をローカル変数といい、ブロックの外で一連のプログラムの中のどこからでもアクセスできる変数をグローバル変数といいます。