第 2 章 Java 言語の基本的な文法 I 5
2.13 繰り返し
2.13.1 for 文
最初に学ぶのは、繰り返しの回数が決まっている、例えばある処理を10回繰り返したい、という場合です。そうし た場合は、for文という命令で書きます。
for(int i = 1; i <= 10; i++) { // 繰り返したい処理
}
中かっこで括られた部分を forブロックと言い、この中に繰り返したい処理(複数の文でも構わない)を書きます。
forの次に続く小かっこの中に、繰り返しのカウンタについての処理を3 項目で書きます。間をセミコロンで区切っ ています(最後の命令i++にはセミコロンが無いことに注意)。小かっこの中の書き方は、次のようになります。
for(カウンタの初期化; 繰り返し条件; 処理の最後に行うカウンタの処理)
まず、「カウンタの初期化」ですが、カウンタとなる変数の宣言と初期値を与えます。カウンタはカウントできる型な らば何でも良いので、整数型・実数型・文字型のいずれかが使えます。整数型のカウンタとしては、数学でも添字によ
く使われるi, j, k, l, m, nがよく使われますが、もちろんcounterなど意味を持つ変数名でも構いません。型 宣言と初期化をするのが、この第 1項目です。
次に、「繰り返し条件」ですが、ここにはカウンタがどんな条件を満たしているとき繰り返しを続けるかを論理式で 書きます。カウンタがこの条件を満たさなくなったら、繰り返しの実行をやめることになります(初期値によっては最 初からこの条件を満たさないので繰り返しを 1度も行わないこともあるのでご注意あれ)。
そして、最後の「処理の最後に行うカウンタの処理」ですが、これは繰り返しの処理を1 回行なうたびに、その後で カウンタに対して行う処理を書きます。例えば、カウンタを 1から10まで1づつ増やして合計10回の繰り返しを行 いたいなら、カウンタを1 づつ増やすという処理を繰り返しのたびに行わないといけません。それをここに書きます。
ここで、i++などが登場するわけでが、もちろん、これをi+=1と書いたり、i=i+1、++iと書いてもOKです(i++
を使う人が多いですね)。
問題 2.13.1. 実数カウンタ xを0.0から10.0 まで0.01 刻みで増やしながら繰り返すfor文の小かっこの中身を書 きなさい。forブロックの方はいらない。
問題 2.13.2. コンソールに「ヤッホー」と10回出力するfor文による繰り返し処理を書きなさい。
問題 2.13.3. コンソールに「10秒前」「9 秒前」…「1 秒前」とカウントダウンを出力するfor文による繰り返しを 書きなさい。(出力のタイミングを実際に1秒間隔にしろという意味ではありません)
この場合、カウンタを10から1まで減らしていきながら、そのカウンタの値を出力すれば良いわけです。
問題 2.13.4. 上の問題のカウントダウンを 2 秒ごとで 10 から 0 まで行う for 文による繰り返しを書きなさい。
(「0 秒前」はちょっと変ですけどね)
問題 2.13.5. 以下のfor文で繰り返される繰り返しは、それぞれ何回行われますか。
1. for(int i=0; i<10; i++) 2. for(int i=10; i>0; i--) 3. for(int k=1; k<=100; k+=2) 4. for(int j=1; j<100; j*=2) 5. for(int i=1; i>-100 && i<100; i*=-2) 6. for(char c='A'; c<='Z'; c++) 7. for(double x=-1.0; x<=1.0; x+=1.0/50)
ところで、最後のdouble型カウンタによる繰り返しでは、やはり計算誤差が生じるだろうな!という推測は正しい です。以下のプログラムを動かしてみましょう。
ソースコード2.28 DoubleCounter.java (実数型の繰り返しカウンタ)
package section0213;
public class DoubleCounter {
public static void main(String[] args) { int count = 0;
for(double x=-1.0; x<=1.0; x+=1.0/50) { System.out.println( count + ":" + x );
count++;
} } }
変数countは1.0/50を何回加えたかの数になります。案の定、本来 100回加えてx==1.0で終了するはずが計算誤 差のせいで最後の1回が実行されていません(1.0を超えてしまったのですね)。
for文は主に繰り返し回数がわかっている場合に使われます。問題2.13.5 では、簡単にその回数が想像できないも のもありましたが、本来そうした場合にはfor文を使わずに次に学ぶwhile 文などで書くことが多くなります。
問題 2.13.6. int型変数nに与えられた数だけ文字'*'を横に並べるプログラム PrintStar.javaをfor文を用 いて作りなさい。次に、その処理をさらに別のfor文で囲むことで以下の出力(最初にn個の星が出力され、改行し て次の行はn-1個の星、と順に1個ずつ減らして、最後は1 個の出力)が行われるプログラムPrintStar2.javaを 作りなさい。
ヒント:星を横に並べるには、改行しない出力文を用いれば良い。2 つ目のプログラムでは、外側のfor文のカウンタ をiとして、nから1まで減らし、内側のfor文のカウンタは1からiまで増やす、というようにする。ただし、1 行毎に改行しなければいけないが、それは何も書かずに単に改行だけする命令を置けば良い。さあ、このヒントで作れ るかな?
**********
*********
:
***
**
*
問題 2.13.7. 次のプログラムがコンソールに出力するものを順に書きなさい。
ソースコード2.29 FibonacciNumbers.java (フィボナッチ数列) package section0213;
public class FibonacciNumbers {
public static void main(String[] args) { int a = 1;
int b = 1;
System.out.print( a + " " + b + " " );
for(int i=3; i<=10; i++) { int c = a + b;
System.out.print( c + " " );
a = b;
b = c;
}
System.out.println();
} }
問題 2.13.8. 次のプログラムは、1 から与えられたn までの整数のうち、3の倍数でないものを出力するプログラム です。これを参考に、1から与えられたnまでの整数のうち、2,3,5のいずれの倍数でもないものを出力するプログラ ムNoMultiple2.javaを作りなさい。
ソースコード2.30 NoMultiple.java (3の倍数以外を出力) package section0213;
public class NoMultiple {
public static void main(String[] args) { int n = 100;
System.out.println( "1 から " + n + " までをチェック:" );
for(int i=1; i<=n; i++) { if( i % 3 != 0 ) {
System.out.println( "3の倍数でない数:" + i );
} } } }
問題2.13.9. 上の問題を参考に、1から与えられたnまでの整数のうち、2,3,5のうちいずれか1つの倍数で、他の 2 数の倍数でないものを出力するプログラムNoMultiple3.javaを作りなさい。