繰り返し(for)

for

一般に繰り返しを制御する変数を決め、初期値,終了値,増分を指定して、指定したブロックを繰り返し実行するものです。

for( int i=1;  i<=10;  i++ ) {
      System.out.println( i );
}

上の例では、i を繰り返しを制御する変数として、i が 1 から 10 まで10回繰り返します。i=1 は i の初期値、 i<=10 は i が 10 になるまで、i++ は一つずつ i を増やしていくことを表しています。繰り返す処理は {    } 内の i の値を書き出すことです。

この初期値,終了値,増分は、C言語のあたりから、開始時の処理,終了判定条件,繰り返し時処理の3つを指定するように拡張されました。javaもそれを引き継いでいます。

for( 開始時の処理; 終了判定条件; 繰り返し時処理 ) {
    /* 繰り返しの処理の内容 */
}

図示

図で示すと次のようなイメージです。こんどは i=0 から 9 までの繰り返しになります。

次の図で3つの条件の働き方を確認してください。初期値の設定で、i=0 でなく、i=10 とすると、繰り返し処理を一度もやらないことになるということもポイントです。

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

   繰返処理;

}

具体例

for の基本は繰り返しを制御する変数を 1 ずつ増やすものです。繰り返しを回数で制御することになります。回数をチェックする変数をカウンタといいます。これには普通整数を使います。

例えば、次の例は変数 i を0に初期化してはじめ、i が10より小さいかどうか繰り返しの度に判定し、繰り返すごとに i を1ずつ増やしていくというものです。繰り返しの処理ではその i の二乗を表示します。

ファイル名 Kurikaeshi.java

/** forの使い方 */
public class Kurikaeshi { 
       public static void main( String[] args ) {
            for( int i=0; i<10; i++ ) {
                  System.out.print( i );
                  System.out.print( " の2乗は " );
                  System.out.println( i*i );
            }
       }
}

初期化の式の中で宣言した i は繰り返しのブロック内でのみ有効な変数です。処理がこのブロックを抜けると i は破棄されます。

繰り返しの内容は、i と、その2乗を表示するというものです。実行結果は、次のようになります。

0 の2乗は 0
1 の2乗は 1
2 の2乗は 4
3 の2乗は 9
4 の2乗は 16
5 の2乗は 25
6 の2乗は 36
7 の2乗は 49
8 の2乗は 64
9 の2乗は 81

いろいろな条件の例

for( int j=10; j<20; j=j+2 )
j=10,12,14,16,18 について行う
for( int k=10; k<=30; k=k+3 )
k=10,13,16,19,21,24,27,30 について行う
for( int n=30; n>20; n-- )
n=30,29,28,27,26,25,24,23,22,21 について行う

for の基本形は if に似ている

else のない if の基本形は次のような形です。

if (条件) {条件が成立するときに実行するブロック}

for も基本形は次のような形です。

for ( 3つの設定事項 ) { 繰り返しの処理の内容 }

従ってブロック内の文が一つだけなら次のように書いても許されます。。

for ( int i=0; i<10; i++ ) System.out.println( i );

for の習慣

カウンタは()内で宣言する

カウンタに使う変数が、前もって宣言されていれば、for の中で宣言は必要ありません。しかし、これは特に必要がない場合は避けた方が無難です。i は作業のための変数として for の中で定義され、その後は破棄されるというほうがすっきりします。

可能だけど避けた方がいい

int i;
for( i=0; i<10; i++ ) {
       System.out.print( i );
       System.out.print( " の2乗は " );
       System.out.println( i*i );
}

カウンタは整数型をつかう

浮動小数型も使用可能ですが、浮動小数型はだいたいの値なので、その誤差が問題になることがあります。処理速度も整数型の方が速いはずなので、可能な限り整数型を使います。

整数型の変数名は i,j,k,l,n,m などが多い

昔のプログラミング言語(FORTRANなど)のきまりがそのまま続いているもの。C言語やjavaではこの制約はないのだが、これを使うことが多い。逆にこれを知っていると他人のプログラムを読むときに楽になる。

もちろんプログラムが読みやすくなるのならこれ以外の変数名をつけてもかまわないし、むしろその方がよい。

カウンタをブロック内で書き換えない

カウンタはブロックの実行が終わるたびに(   )内の第3番目の部分に書かれた処理が行われます。これを途中で書き換えてしまうと意図したように動かなくなります。

間違いの例(この例ではいつまでも終わらない)

for( int i=0; i<10; i++ ) {
       i = 1;
       System.out.print( i );
       System.out.print( " の2乗は " );
       System.out.println( i*i );
}

止まらなくなったら

終了の判定の書き方や、繰り返し時処理を間違えるといつまで経っても終わらなくなります。無限ループともいいます。

このような時は [Ctrl] キー を押しながら [ C ] を押します。(これを [Ctrl] + [ C ] などと書くことがあります)

課題

1.

n=0,1,2,3,…9に対して n2 を計算して表示しするプログラムをつくりなさい。

ファイル名 Kurikaeshi.java

プログラムは上記のままでよい。i を n に変えてもよいし、変えなくてもよい。(計算途中に使用するだけなので)

2.

ファイル名 Kurikaeshi2.java

n=1,2,3,…20に対して n2-1 を計算して表示しするプログラムをつくりなさい。

計算式がほんのちょっと変わるだけ。

3.

1+2+3+…+n を計算するプログラムをつくれ。ただし、n は int n=10; などとプログラム内で与えるものとする。

ファイル名 Kurikaeshi3.java

/** 1+2+3+…+n を計算する */
public class Kurikaeshi3 { 
    public static void main( String[] args ) {
       int n = 10;    //どこまで加えるか
       int s =  0;    //合計をいれておく変数
       for( int i=1; i<=n; i++ ) {
           s = s + i;
       }
       System.out.print( "1 から " );
       System.out.print( n );
       System.out.print( " までの和は " );
       System.out.println( s );
    }
}

4.

1×2×3×…×n を計算するプログラムをつくれ。ただし、n は int n=10; などとプログラム内で与えるものとする。

ファイル名 Kurikaeshi4.java

/**  1×2×3×…×n を計算する */
public class Kurikaeshi4 { 
    public static void main( String[] args ) {
       int    n = 10;    //どこまで掛けるか
       int    s = 1;    //計算結果をいれておく変数。かけ算なので最初は1
        /* このあと for を使って続けること。 */

int s の場合、n=12 までしか正確に計算できません。これ以上計算するときは、long か doubleで計算する必要があります。(longでも20まで、doubleなら170まで)

       double s = 1.0;  //この後の計算は変えなくてもよい。

5.

上記のような計算は階乗といいます。普通大きいほうから書いて、4! = 4 × 3 × 2 × 1 などと書きます。この計算結果でなく計算方法を書き出すプログラムをつくりなさい。

たとえば n= 7; とすると、

 7 ! =  7 × 6 × 5 × 4 × 3 × 2 × 1 

と表示されるようにします。

for (????)の部分だけ書き換えると出来るはずです。

ファイル名 Kurikaeshi5.java

public class Kurikaeshi5 { 
    public static void main( String[] args ) {
       int    n = 7;    //どこまで掛けるか
       System.out.print( n );
       System.out.print( "!=" );
       for (      ){
           System.out.print( i );
           System.out.print( " × " );
       }
       System.out.println( "1" );
   }
}
もくじ

聖愛中学高等学校
http://www.seiai.ed.jp/
Last Modified