戻る
次に制御文の1つである反復文を説明する。
反復文を使うと、特定の文を繰り返し実行する事が出来る。反復文には次の3種類がある。
・ while文
・ do〜while文
・ for文
反復文を使う時、ある変数の値を1大きくしたり、1小さくするといった処理が必要になる事がある。
ここでは、変数の値を現在の値を基準に相対的に増減する方法を説明する。
代入演算子
今、変数xの値を1大きくしたいとする。どのように書けばいいだろう。
x = x+1;
とりあえず正解である。これまでの知識からすれば、この代入により変数xの値を一つ大きくする事が出来る。
注意するとすれば「何故、xとx+1が等しいのか?」と思わない事。javaの=は代入であって等値ではない。
次にjavaでは、これを次のように略記することが出来る。
x += 1;
+=は代入演算子の一つで、左辺の変数を右辺の値だけ大きくする。次にjavaに用意されている代入演算子の一部を列挙する。
| 演算子 | 演算 |
| x = val | 変数xに値valを代入する(これが代入の基本) |
| x += val | x = x + val と同じ |
| x -= val | x = x - val |
| x *= val | x = x * val |
| x /= val | x = x / val |
| x %= val | x = x % val |
次にいくつか例を示す。
x += 100; ・・・・・xを100大きくする。
x -= 100; ・・・・・xを100小さくする。
x += -100 ・・・・上と同じ
x %= 4; ・・・・・・・xを4で割った余りをxに代入する。
インクリメント/デクリメント演算子
+-する値が1の時は、+=や-=を使うよりも更に便利な演算子が用意されている。
| 演算子 | 演算 |
| ++x | 変数xの値を+1する。式の値は+1を実行した後の値。x += 1と同じ。 |
| x++ | 変数xの値を+1する。式の値は+1を実行する前のxの値。 |
| --x | 変数xの値を‐1する。式の値は‐1を実行する前のxの値。 |
| x-- | 変数xの値を‐1する。式の値は‐1を執行する前のxの値。 |
++や--を変数の前につける場合を前置インクリメント演算子、前置デクリメント演算子という。
その場合、式全体の値は+1や‐1を実行した後の変数の値になる。
また、++や--を変数の後ろに付ける場合を後置インクリメント演算子、後置デクリメント演算子という。
その場合、式全体の値は+1や-1を実行する前の変数の値になる。
次にこれらの演算の例をまとめて示す。
| 演算 | 演算後のx | 演算後のy |
| x = 1; y = (++x); | 2 | 2 |
| x = 1; y = (x++); | 2 | 1 |
反復文(1):while
これから、最初の反復分としてwhile文を説明する。
while (条件式)
文 ・・・・・・・・・・・条件式が真ならこの文が繰り返し実行される。偽ならこの文は実行されない。
while文は( )の中の条件式が真の間、直後の文を繰り返し実行する。条件式の書き方は、if文と同じである。
whike文の;例を示す。
while (false)
System.out.println("猫ふんじゃった");
この場合、条件式はfalseなので偽である。したがって、printlnの文は実行されない。
while (true)
System.out.println("猫ふんじゃった");
今度は条件式がtrueなので真である。したがってprintlnの文が繰り返し実行される。この様子を確かめるのが以下のサンプルである。
サンプル:Neko_1.java
//
//Neko_1.java---while文のテスト
//
public class Neko_1 {
public static void main(String[ ]
args) {
while (true)
System.out.println("猫ふんじゃった");
}
}
実行例、ただし無限ループになるので真似しない方が良い。
$ java Neko_1
猫ふんじゃった
猫ふんじゃった
猫ふんじゃった
猫ふんじゃった
猫ふんじゃった
……
……
・・・・・・・・・・・・・・・Ctrl
+ C キーで、プロセスにシグナルを送信して止める。
$ _
実行すると、”猫ふんじゃった”を無限に表示し続ける。このようにwhile文は、条件式が真の間は指定された文を繰り返し実行する。
ループ変数
このように見てくると、while文は余り実用性が無いように見える。
なにしろ条件式の値によって文を全く実行しないか、あるいは永遠に実行するかのいずれかになってしまうのだから。
しかし、実際はwhile文をこのように使う事は少ない。通常は繰り返しw制御する為の変数(これをループ変数という。)を用意し、
その値を繰り返しの中(これをループの本体と言う)で変化させる。
こうすれば無限ループに陥ることなく、while文を実用的に使う事が出来る。
簡単な例から始める。まずループ変数を用意する。ループ変数には、i、j、k等を使う事が多い。
int i = 7; ・・・・・・・・・・ループ変数 初期値は繰り返しを行う回数。
そして、ループ変数を条件式の中に入れる。
while (i > 0) ・・・・・・・ループ変数の値によって繰り返しを行うかを判断する。 この場合、i
は7で0より大きいのでtrueと判断される。
そして、最後にループの本体を書く。
while ( i > 0)
System.out.println("猫ふんじゃった");
ただし、これではループ変数の導入前と変わらない。無限ループになってしまう。
繰り返しを有限回でストップさせるには、ループ本体の中でループ変数の値を変化させればよい。
この場合、ループ本体が複数になるのでif文でも使用したブロックを導入する。
while (i > 0) { ・・・・・複数の文を置くためにブロックを導入
System.out println("猫ふんじゃった");
}
そして、ブロックの中に --i (ループ変数の値を1小さくする)を置く。
while (i > 0) {
cout<<"猫ふんじゃった"<<endl;
i--; ・・・・・ここでループ変数の値を変更する
}
これでループ本体が実行されるたびにループ変数
i の値が1つずつ小さくなる。
やがて0になるとfalseと判定されてwhile文を終了する。
この結果、ループ変数の初期値と同じ7回分ループ本体が繰り返し実行される。以上をまとめると次のようになる。
int i = val; ・・・・・valは繰り返しを行う回数
while (i > 0) {
・・・・・・・・・・・ここに繰り返しを行う処理を書く
i--;
}
これがwhile文の基本的な使い方である。尚、このwhile文を次のように短く書くことも出来る。
int i = val; ・・・・・valは繰り返しを行う回数
while (i-- > 0) {
・・・・・・・・・・・ここに繰り返しを行う処理を書く
}
i--を条件式の中に入れる事により、文を1つ減らす事が出来る。
次に、先程の"猫ふんじゃった"を無限ループにならないように改良したものを示す。改良版では、7回繰り返すとプログラムが終了する。
サンプル:Neko_2.java
//
//Neko_2.java---while文のテスト・ループ変数を使って無限ループにしない
//
public class Neko_2 {
public static void main(String[ ]
args) {
int i = 7;
while (i > 0) {
System.out.println("猫ふんじゃった");
i--;
}
}
}
実行例
$ java Neko_2
猫ふんじゃった
猫ふんじゃった
猫ふんじゃった
猫ふんじゃった
猫ふんじゃった
猫ふんじゃった
猫ふんじゃった
$ _
反復文(2):do〜while
while文は、最初に降りかr市をするかどうかの判定をする。しかし、プログラムによっては繰り返しの最後に判定したい事もある。
その場合は。while文の代わりにdo〜while文を使う。
次にdo〜while文の書式を示す。
do
文 ・・・・・この文が繰り返される
while (条件式);
この書式によって、条件式がtrueの間doとwhileに挟まれた文が繰りかえし実行される。
falseなら繰り返し文を実行せず、do〜while文を抜ける。
do〜while文は、書式がwhile文に似ている。とりわけwhileで始まる行は、そっくりである。
while(条件式) ・・・・・・while文の先頭
while(条件式); ・・・・・・do〜while文の最後
違いは、セミコロンが付くか付かないかだけである。do〜while文の場合、最後にセミコロンが付くが、while文では付かない。
このようにdo〜while文とwhile文は書式が似ているので、次のように文の部分を囲ってブロック化することが多い。
do {
文
} while (条件);
こうするとdo〜while文のwhile行は、先頭に
} が付くのでwhile文と見分けが付きやすくなる。
次にwhile文のところで作成した"猫ふんじゃった"をdo〜while文で書き換えたものを示す。
サンプル;Neko_3.java
//
//Neko_3.java---do〜while文のテスト
//
public class Neko_3 {
public static void main(String[ ]
args) {
int i = 7;
do {
System.out.println("猫ふんじゃった");
--i;
} while(i > 0);
}
}
実行例
$ java Neko_3
猫ふんじゃった
猫ふんじゃった
猫ふんじゃった
猫ふんじゃった
猫ふんじゃった
猫ふんじゃった
猫ふんじゃった
$ _
反復文(3):for
3つめの反復文はforである。for文は、while文を拡張したものと考える事ができる。
while文を使う時、無限ループになるのを避けるため、次のようにループ変数を用意する事が多い。
int i = 繰り返しの回数; ・・・・・ループ変数の初期化
while (条件式) { ・・・・・・・・・・
while文
反復文の並び
ループ変数の更新;
}
このようにwhile文では、直前でループ変数を初期化し、ループ本体の最後(文中でも良い)でループ変数の更新を行う事が多い。
それを1つの文で全てまかなえるようにしたのがfor文である。
for文の書式を次に示す。
for (初期化文; 条件式; 更新式)
繰り返し文
このfor文は次のwhile文と等値である。
初期化文;
while (条件式) {
繰り返し文
更新式;
}
for文の動作
for文は次のように実行される。
1:まず「初期化文」が実行される
「序貴下文」にはどんな文でも置く事ができる。しかし通常はループ変数の宣言とその初期化を行うのが普通である。
for (int i = 0;・・・・・) ・・・・・ループ変数を初期かする
ここで「初期化文」のところで変数宣言を行っている事に注意。
このようにjavaのfor文では、初期化文のところでローカル変数を宣言できる。ここで宣言された変数はfor文ループ内でのみ使う事が出来る。
一般にループ変数はここで宣言するのがよい。
2:続いて「条件式」が評価される
「条件式」はwhile文の( )の中に書く条件式に相当する。ここに繰り返しを行うかどうかの判定をする為の式を書く。
for (・・・; i < 7;・・・) ・・・・・条件式
3:その結果がtrueならループの本体が実行される。
4:最後に「更新式」が実行される。
「更新式」にもどんな式でも置く事が出来る。しかし、通常はループ変数の更新を行うのが普通である。
for (・・・;・・・; i++) ・・・・・更新式
5:再び2に戻る。
以上の動作を、2:でfalseと判定されるまで繰り返す。
for文は、あらかじめ繰り返しの回数が分かっている場合に使うと便利である。例えばループの本体を7回繰り返したい時は次のように書く。
for (int i = 0; i < 7; i++)
次にdo〜while文のところで作成した"猫ふんじゃった"をfor文で書き換えたものを示す。
サンプル:Neko_4.java
//
//Neko_4.java---for文のテスト
//
public class Neko_4 {
public static void main(String[ ]
args) {
for (int i = 0; i < 7; i++)
System.out .println("猫ふんじゃった");
}
}
実行例
$ java Neko_4
猫ふんじゃった
猫ふんじゃった
猫ふんじゃった
猫ふんじゃった
猫ふんじゃった
猫ふんじゃった
猫ふんじゃった
$ _
以上、3つの反復文による"猫ふんじゃった"を作成してきた。この中では、for文によるものが最もコンパクトである。
初期化文に文を置く
再びfor文の書式を掲載する。
for (初期化文; 条件式; 更新式)
繰り返し文
ここで、「初期化文」の所が「式」ではなく「文」となっていることに注意。
つまりこの部分には(ループ変数を初期化するのではなく)任意の文を置く事ができる。
例えば、次のサンプルでは、printlnを使って文字列を表示している。
サンプル:Statement.java
//
//Statement.java---初期化部に文を置く
//
public class Statement {
public static void main(String[ ]
args) {
int i = 0;
for (System.out.println("初期化部の文を実行");
i< 7; i++)
System.out println("ループの本体を実行");
}
}
実行例
$ java Statement
初期化部の文を実行 ・・・・・初期化部に置いた文が実行されている
ループの本体を実行 ・・・・・これ以下はループの本体に置いた文が実行されている
ループの本体を実行
ループの本体を実行
ループの本体を実行
ループの本体を実行
ループの本体を実行
ループの本体を実行
$ _
次へ