第10回

  繰り返し、条件分岐
  
1 繰り返し(その2)
 
繰り返しの処理の復習+αです。
 
コンソールに 1, 2, 3, 4, 5 を表示するには
for(int i=0; i<5; i++){
  println(i+1);
}

のように記述する

前回の復習、for の文法は
 
  for(初期化; 繰り返す条件; 更新式){
   :
    処理;
   :

  }

  
繰り返す条件 が満たされる間、中カッコ{}の内部 ‥ 処理; ‥ が実行される
更新式‥ 処理; ‥ が1回実行されるごとに実行される
 
・少しアレンジした使い方
  
 <例1> 0, 3, 6, 9 をコンソールに表示
for(int i=0; i<10; i+=3){ // (1)
  println( i ); // (2)
}

  (1) 初期化は i=0, 繰り返す条件は i<10, 更新式i+=3i+=3 は変数 i の値を3増やす、の意味)
  (2) i の値をコンソールに表示(改行あり) 
  i が0から始まり、1回の処理が行われるごとに i は +3 される
  
  
 <例2> 9, 8, 7,・・・, 2, 1, 0  をコンソールに表示
for(int i=9; i>=0; i--){ // (1)
  println( i );
// (2)
}

  (1) 初期化は i=9, 繰り返す条件は i>=0(ゼロ以上), 更新式i--i-- は変数 i の値を1減らす、の意味)
  (2) i の値をコンソールに表示(改行あり) 
  i が9から始まり、1回の処理が行われるごとに i は -1 される
 
・2重ループ(入れ子構造) 
 
 <例3> 3行4列の * をコンソールに表示
for(int i=0; i<3; i++){ // i行(垂直方向に i+1 行目)
  for(int j=0; j<4; j++){ // j列(水平方向に j+1 列目)
    print(" *");
  }
  print("\n"); // 改行のみ
}

 <実行結果>
  
  
 
 <例4> 3行4列で、それぞれの (i, j) をコンソールに表示
for(int i=0; i<3; i++){
  for(int j=0; j<4; j++){
    print(" (" + i + "," + j + ")"); // (2,1) の形式で表示
  }
  print("\n"); // 改行のみ
}

 <実行結果>
  
 
  
・インデントについて
 繰り返しや条件分岐の処理では{}で囲い、複数の処理のかたまりを作ります。
 その際、処理の範囲をわかりやすくするために、処理の範囲(レベル)に応じてインデント(左側の空白)を適宜入れるようにしましょう。

 <インデントなしの場合>
 
 
 <インデントありの場合>
 
 
 
<演習1>

 0~100の偶数のみの数値を合計したらいくつになるかを計算してコンソールに表示しなさい。
 合計の計算方法は、第7回「4 繰り返し」の<例3>を参考にすること。
 
 解答例
 
 
<演習2>

 下図の様に簡単な 九九 の表もどきをコンソールに出力しなさい。
 for文の2重ループ(入れ子構造)を用いて計算すること。
 
 
 
 解答例
  
 
<演習3>

 以下は、5個 x 5個の〇を描画するプログラムである。
 ウィンドウサイズは 400x400, 〇の直径は 80 である。
 まずはこれをそのまま実行しなさい。
size(400,400);
background(255);

for(int i=0; i<5; i++){
  for(int j=0; j<5; j++){
    ellipse( j*80+40, i*80+40, 80, 80 ); // 〇を描画
  }
}

 <実行結果>
  
  
 これを、下図のように 10個 x 10個 の〇で描画されるように修正しなさい。
  
   
 解答例
  
 
  
2 条件分岐
 
条件分岐は条件式により、実行する処理をコントロールします。
条件分岐は if文 を用います。
 
例えば、変数 score60以上であれば、"合格" をコンソールに表示する のような処理は
if( score>=60 ){
  println("合格");
}

のように記述する
この場合、score が60未満であれば何もしない
 
if の書き方は
 
  if( 条件式 ){
    処理;
  }

  
条件式成り立つとき、中カッコ{}の内部  処理; が実行される
条件式成り立たないときは何もしない
  
2つの処理に分岐させる場合( else )  
  
変数 score60以上であれば、"合格" をコンソールに表示する、
そうでなければ(60未満の場合)は "不合格" を表示する のような処理
if( score>=60 ){
  println("合格");
}
else{
  println("不合格");
}
のように記述する
  
この場合、ifelse を追加する
 
  if( 条件式 ){
    処理A;
  }else{
    処理B;
  }
  
条件式成り立つとき、中カッコ{}の内部  処理A; が実行される
条件式成り立たないとき、処理B; が実行される
処理A;処理B; のどちらかが実行される
 
条件式の書き方
 if( p==7 ){ ‥‥ p が7と等しい場合(イコールが2個であることに注意) 
 if( x>3 ){ ‥‥ x が3より大きい場合 
 if( y<3 ){ ‥‥ y が3より小さい場合 
 if( a>=5 ){ ‥‥ a が5以上の場合 
 if( b<=5 ){ ‥‥ b が5以下の場合 
 if( t!=8 ){ ‥‥ t が8と異なる場合 
など 
 
 <記述例1> 0, 2, 4,  ‥‥ , 16, 18 をコンソールに表示
for(int i=0; i<20; i++){ //(1)
  if( i%2==0 ){
//(2)
    print(" " + i);
//(3)
  }
}

  (1) 変数 i が 0, 1, 2, ~ 18, 19 で繰り返す
  (2) i の値を 2 で割った余りが 0 (iが偶数)の場合は 
  (3) i の値をコンソールに表示 
 <実行結果>
  
  
 
 <記述例2> 0, #, 2, #, 4,  ‥‥ 14, #, 16, #, 18, # を(奇数のときは#)コンソールに表示
for(int i=0; i<20; i++){
  if( i%2==0 ){

    print(" " + i);

  }else{
//(1)
    print(" #"); //(2)
  }
}

  (1) i の値を 2 で割った余り0 (iが偶数)でない場合は 
  (2) # をコンソールに表示 
 <実行結果>
  
  
  
<演習4>

 以下は青色の〇を10個描画するプログラムである。まずはこれをそのまま実行しなさい。
size(400,100);
background(255);

for(int i=0; i<10; i++){
  fill(0,0,255); // 描画色を青色にする
  ellipse( i*40+20, 50, 40, 40 ); // 〇を描画
}

 <実行結果>
  
  
 これを、下図のように左5個を青色、右5個を赤色の〇で描画されるように修正しなさい。
 なお、赤色を指定するには fill( 255, 0, 0 ); と記述すればよい。
  
   
 解答例
  
  
<演習5>

 <演習3>の修正前のソースにおいて、下図のように青色赤色の〇が交互に描画されるように修正しなさい。
 なお、赤色を指定するには fill( 255, 0, 0 ); と記述する
  
 
 解答例