programming 2
プログラミング入門基本

補足

ブロック

括弧 "{" と "}"は, if, while の本体で複数の文を処理させたいときに使う. 処理が 1 文だけのときは括弧を省略できる.つまり, 括弧がないと,if, while は直後の 1 文だけにしか効かない.

以下のプログラム 6a, 6b を実行し,違いを確かめよ.

プログラム 6a

class Example6a{
   public static void main(String args[]){
     int a,b;

     a = 4;
     b = 3;
     if (a > b){
        System.out.println("a is larger than b.");
     } else {
        System.out.println("b is larger than a.");
        System.out.println("Example a");
     }   
   }
}

プログラム 6b

class Example6b{
   public static void main(String args[]){
     int a,b;

     a = 4;
     b = 3;
     if (a > b){
        System.out.println("a is larger than b.");
     } else 
        System.out.println("b is larger than a.");
        System.out.println("Example b");
   }
}

括弧の対応を読み取りやすくするために,文の書き始めの位置を右に ずらすことをインデントという.プログラムの動作に直接影響はないが, 適切にインデントするようにせよ. プログラム 6b のインデントには間違いがある.指摘せよ.

原始的なデバッグ

プログラムの誤りを訂正することをデバッグという.

下のプログラムには誤りがある.

プログラム 14a

class Example14a{
   public static void main(String args[]){
      int score[] = {30, 100, 95, 80, 75, 60, 70, 0, 63, 89};
      int i;

      for (i = 0;i <= score.length;i++){
         System.out.println(score[i]);
      }
   }
}

ループ変数 i の値がポイントになるので出力してみるとよい.

プログラム 14b

class Example14b{
   public static void main(String args[]){
      int score[] = {30, 100, 95, 80, 75, 60, 70, 0, 63, 89};
      int i;

      for (i = 0;i <= score.length;i++){
         System.out.println(i);
         System.out.println(score[i]);
      }
   }
}

プログラム 14b を実行し,誤りを修正せよ.

リダイレクション

> 記号を使ってプログラムの出力結果をファイルに保存することができる.

java Example14b > output.txt

上の例では java Example14b というコマンドの出力結果を output.txt というファイルに出力している. output.txt ファイルの内容は type output.txt で確認できる.

講義メモ

プログラミング2

第 10 回課題「プログラミング 1」

第 10 回課題「プログラミング 1」 を読んで第 10 回課題を提出しなさい.

print と println

System.out.print() 文は出力後に改行しない.以下のプログラム 16 を実行し て確かめよ.

プログラム 16

class Example16{
   public static void main(String args[]){
     System.out.print("  "+0);
     System.out.print("  "+1);
     System.out.println();
     System.out.print("  "+2);
     System.out.print("  "+3);
     System.out.println();
   }
}

以下のように出力されるはずである.

出力例 16

  0  1
  2  3

ループの利用

0 1 2 3 4 5 6 7 8 9 と出力したい場合どうすればよいか.

プログラム部分 17

     System.out.print(" 0");
     System.out.print(" 1");
     System.out.print(" 2");
          ・
          ・
          ・
     System.out.print(" 9");

上のように print 文を 10 個書き連ねても可能だがループを使えば スマートに記述することができる. また,ループを使えば「 0 から n を出力」 のように, 回数を可変にすることができる.ループを使って 0 1 2 3 4 5 6 7 8 9 を出力するプログラムを書け.

下のプログラム部分 18 を使ってプログラムを書くことができる. 変数 i の宣言を忘れないようにせよ.

プログラム部分 18

     for (i=0; i<=9 ; i++)
        System.out.print(" "+i);
     System.out.println();           

それでは以下のように出力したいときはどうすればよいか.

出力例 19

 0 1 2 3 4 5 6 7 8 9
 0 1 2 3 4 5 6 7 8 9
 0 1 2 3 4 5 6 7 8 9
 0 1 2 3 4 5 6 7 8 9
 0 1 2 3 4 5 6 7 8 9
 0 1 2 3 4 5 6 7 8 9
 0 1 2 3 4 5 6 7 8 9
 0 1 2 3 4 5 6 7 8 9
 0 1 2 3 4 5 6 7 8 9
 0 1 2 3 4 5 6 7 8 9

上のループを 10 回書き連ねても可能だがこれもループを使って 記述することができる.すなわち,

プログラム部分 19

     for (j=0; j<=9 ; j++){
        <プログラム部分 18>
     }

プログラム部分 19 を完成させ,実行せよ.

結局ループの中に別のループが入る 2 重ループの構造になる. 外側のループ変数は j として,内側のループ変数 i とは異なる変数を 使用していることに注意せよ. 内側のループで外側のループ変数の値を変化させると 意図しない動作を行う.

プログラム部分 19 を書き下したもの

     for (j=0; j<=9 ; j++){
        for (i=0; i<=9 ; i++)
           System.out.print(" "+i);
        System.out.println();           
     }

内側のループ内で外側のループの値を読んでもループの制御には 影響がない.出力例 20 のように出力するにはプログラム部分 19 をどう変更すればよいか.プログラムを完成させ実行して確認せよ.

出力例 20

 0:0 0:1 0:2 0:3 0:4 0:5 0:6 0:7 0:8 0:9
 1:0 1:1 1:2 1:3 1:4 1:5 1:6 1:7 1:8 1:9
 2:0 2:1 2:2 2:3 2:4 2:5 2:6 2:7 2:8 2:9
                 ・
                 ・
                 ・
                 ・
 9:0 9:1 9:2 9:3 9:4 9:5 9:6 9:7 9:8 9:9

プログラム部分 19 の System.out.print 文を以下のように変更すればよい

プログラム部分 21

           System.out.print(" "+j+":"+i);

Java では 1 次元だけでなく 2 次元の配列も扱うことができる. 整数型の要素の 2 行 3 列の配列 a を宣言するには以下のように書けばよい.

プログラム部分 22

    int a[][] = new int[2][3];

1 次元配列と同様に宣言と初期化を一度に行うこともできる.

プログラム 23

class Example23{
   public static void main(String args[]){
      int i,j;
      int a[][] = {
         {0,1,2},
         {3,4,5}
      };

      for (j=0; j < 2 ; j++){
         for (i=0; i < 3 ; i++)
            System.out.print(" "+a[j][i]);
         System.out.println();           
      }
   }
}

a.length で配列 a の行のサイズ, a[j].length で配列 a の j 行の列のサイズを得ることができる. これを利用して プログラム 23 の for ループの条件式は以下のように書き直すほうがよい.

プログラム部分 24

      for (j=0; j < a.length ; j++){
         for (i=0; i < a[j].length ; i++)
            System.out.print(" "+a[j][i]);
         System.out.println();           
      }

プログラム部分 24 のように書き直したほうが良い理由を考えよ.

練習課題

以下の仕様を満たすプログラムを作成せよ.

仕様

入力
int 型の 3 行 5 列の配列 a の要素のうち, 各行の 0 列から 3 列までに正の値を入力として プログラム中で記述して与える.
出力
a の各行の 4 列にその行の要素の値の合計を代入する.

配列の第 4 列に正しく出力を計算して代入しても 表示しなければ確認できないことに注意せよ. プログラムの最後に表示部を作る必要がある.

ヒント

第 4 列の値を 0 に初期化しておき, すべての行についてその列の各要素を足して行けばよい.

ヒント2

下記は 1 次元配列 score の要素の合計を計算するプログラムである.

プログラム Hint2

class Hint2{
   public static void main(String args[]){
      int score[] = {30, 100, 95, 80, 75, 60, 70, 0, 63, 89, 0};
      int i;

      score[10] = 0;/* 実際には不要 */
      for (i = 0 ; i <= 9 ; i++){
         score[10] = score[10] + score[i];
      }
      System.out.println(score[10]);
   }
}

for ループの中の処理を " score[10] += score[i]; " と書くこともできる.

このプログラムには「マジックナンバー」 「9」 や 「10」が使われている. length を使い,変更に強いプログラムに書き直すのが望ましい.


Updated in June 22, 2004, schedule, Yamamoto Hiroshi