WWW, programming 1
WWW を利用した情報収集, プログラミング入門 1

第 9 回課題「インターネットとマナー」

第 9 回課題「インターネットとマナー」 を読んで第 9 回課題を提出しなさい.

講義メモ

条件分岐

if 文を使って変数に格納されている値により違った処理を行わせることが できる

プログラム 6

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

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

このプログラムは a, b の値を表示するところまでは共通の処理を 行い,a, b, の値の大小により以降の処理を選択し,実行する. if 文のテスト (a>b) が真であれば上の分岐, それ以外は下の分岐のみ処理される.

練習問題 1

int 型の変数 a に学籍番号の下 4 桁の数字が 4 桁の 10 進数として 格納されているとして,

を表示するプログラムを作成せよ. 入力の a の値はキーボードから入力できる必要はなく, プログラム 4 の a, b のようにプログラム中に直接記入する方法でよい. 出力の形式は自由に設計せよ.

練習問題 1 のプログラム部分

class Exp1{
   public static void main(String args[]){
     int a;

     a = 1234;

     この部分を作成

   }
}

上のように, "Exp1" というクラス名にした場合は, ファイル名を"Exp1.java" としなければならないことに注意せよ.

テスト

作成し,コンパイルエラーのなくなったプログラムにも間違いが含まれているこ とは多い.間違いを発見するためにいろいろな条件でテストを行うことが重要 である.

前回の練習問題のプログラムでは最低限 3 クラスの境界の前後, 前半後半の前後のデータでテストすることが必要である.

前回の練習問題のプログラムをテストせよ.

if else if ラダー

3 以上の分岐は下図のように if 文を入れ子にすることで実現できる.

プログラム部分 7

     if (a < 2000){
        System.out.println("I class");
     } else {
        if (a < 3000){
           System.out.println("II class");
        } else {
           System.out.println("III class");           
        }
     }

上図の書き方は分岐の構造を正しく表現しているが, 分岐が多くなるにつれて字下げが深くなり読みにくい. それを避けるために else if を使った下図の書き方ができる.

プログラム部分 8

     if (a < 2000){
        System.out.println("I class");
     } else if (a < 3000){
        System.out.println("II class");
     } else {
        System.out.println("III class");           
     }

プログラム部分 7 と 8 は等価である.プログラム部分 8 の記法は 2 分岐の組み合わせではなく多数の分岐 (この場合は 3 分岐) を表す記法と考える.分岐のうち 1 つの処理しか実行されないことに 注意する.

算術演算

初歩の段階で使用する算術演算子を挙げる.

+
加算
-
減算
*
乗算
/
除算
%
剰余

論理演算

初歩の段階で必要となる論理演算子を挙げる. if 文のテスト部分などを記述するのに使用する.

&
論理積
|
論理和
!
否定
&&
ショートカットつき論理積
||
ショートカットつき論理和

ショートカットつきの演算は真偽が確定したら即座に比較をやめる.

コメント

他人(あるいは未来の自分)へプログラムの説明メモを残すために コメントを書くことができる. コメント部分に記述したものは無視して処理される.

プログラム部分 9

     /* ここに書いた文字は無視される */

複数行をまとめてコメントにすることもできるので, テスト用に入れたプログラムの一部を一時的に削除することもできる.

プログラム部分 10

     /*
     System.out.println("Test A");           
     System.out.println("Test B");           
     System.out.println("Test C");           
     ここに書いたプログラムは無視される.
     */

配列

同じ型をもつ変数をまとめて共通の名前をつけることができる. 個々の要素は共通の名前と番号でアクセスできる. 例えば a[0],a[1],...,a[9] は,それぞれに整数型のデータを格納しているとき, a という名前の整数型 (1 次元)配列という.この例は以下のように宣言できる.

プログラム部分 11

   int a[] = new int[10];

上記宣言の書式は <配列要素の型> <配列名> = new <配列要素の型名>; である. 上記のプログラム部分 11 でサイズ 10 の整数型配列 a が作成される. 作成した配列要素 a[0],a[1],...,a[9] は普通の整数型変数と 同様に使うことができる.配列の要素の番号を添字といい, Java では 0 から始まるので注意してほしい. サイズ n の配列の添字は 0,1,2,...n-1 である.

下のプログラム 12 を実行せよ.

プログラム 12

class Example12{
   public static void main(String args[]){
     int a[] = new int[10];

     a[0] = 2;
     a[1] = 3;
     a[9] = a[0]*a[1];
     System.out.println(a[0]+"*"+a[1]+"="+a[9]);
     System.out.println(a.length);
   }
}

上の例では配列要素 a[0],a[1],a[9] を通常の整数型変数として利用している. 最後の出力文で a.length として配列 a の要素数を表示させている.一般に <配列名>.length で配列の要素数を得ることができる.

配列は以下に述べるループと組み合わせ, 同じ型をもつ多数のデータを処理する目的で使われることが多い.

ループ

while

while はある条件を満たしている間だけ処理を繰り返したいときに利用する. 以下のプログラム 13 を実行せよ.

プログラム 13

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

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

プログラム 13 の変数 score の初期化部分

      int score[] = {30, 100, 95, 80, 75, 60, 70, 0, 63, 89};

は以下と等価である.

      int score[] = new int[10];
      score[0] = 30;
      score[1] = 100;
      score[2] = 95;
      score[3] = 80;
      score[4] = 75;
      score[5] = 60;
      score[6] = 70;
      score[7] = 0;
      score[8] = 63;
      score[9] = 89;

一般に while 文は以下の構文をとる.

while (<テスト式>) 本体

プログラム 13 の while テスト式は i <= score.length-1, 本体は { System.out.println(score[i]); i =i +1;} の 2 文からなるブロックである.

while 文はテスト式が真である間は本体を繰り返し, テスト式が偽になれば終了する.プログラム 13 は 添字 i が 0 から始まって配列長 - 1 すなわち score.length -1 まで本体を実行する.本体では score[i] の表示と i のインクリメントが行われる. この結果,score[0],score[1],...,score[9] の値を 順に表示し,終了する.

for

for を利用しても while 同様の繰り返し処理ができる.

一般に for 文は以下の構文をとる.

for (<初期化>;<テスト式>;<インクリメント>) 本体

for 文は最初に 1 回だけ初期化部を実行し,以下の動作を行う.

  1. テスト式を評価する
  2. テスト式が真であれば間は本体を実行した後インクリメント部を実行する. テスト式が偽であればなにも実行せず for ループを終了する.

プログラム 13 を for ループを使って書き直すとプログラム 14 になる. 実行して確かめよ.

プログラム 14

class Example14{
   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-1;i++){
         System.out.println(score[i]);
      }
   }
}

for と while

同じ処理を for と while の両方を使って記述することができる. ループを回る回数が入力データによらず, ループに入る前から決まっている場合に for を使い, そうでない場合に while を使うと自然なプログラムになる場合が多い. この指針に従えば上の例は for を使って書くべきである.

例えば score の値を加算してゆき,何人めで 200 以上になるかを求める プログラムは以下のように書くことができる.

プログラム 15

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

      i = 0;
      sum = 0;
      while (i <= score.length-1 && sum < 200){
         sum = sum + score[i];
         i = i+1;
      }
         if (sum >= 200)
             System.out.println("last index is "+(i-1));
             /* i は 1 回余分に足されている */
         else 
             System.out.println("not enough");
             /* 全部でも足りなかった */
   }
}

プログラム 15 を実行し,入力の点数を変えて和がちょうど 200 になる入力,全部足しても 200 にならない入力などについて試せ.

練習問題

int 型の配列 score[0],score[1],...,score[9] に成績が格納されている として,各学生 0,1,...,9 について成績が 60 未満であれば E, 60 以上 70 未満であれば C, 70 以上 80 未満であれば B, 80 以上 90 未満であれば A, 90 以上であれば S, を表示するプログラムを作成せよ.


Updated in June 15, 2004, schedule, Yamamoto Hiroshi