配列 (第7回)

氏名 田辺 健
クラス 理科1類18組
学籍番号 940677G

□課題7.1 - 2.23節 例2,3

○実行結果 例2

g940677@as301> java Copy2
Good night!
Good night!
Gute Nacht!
Gute Nacht!
^C
g940677@as301> java Copy2 > gomi
Good night!
Gute nacht!
^C
g940677@as301> cat gomi
Good night!
Gute nacht!
g940677@as301> java Copy2 < gomi
Good night!
Gute nacht1
g940677@as301> java Copy2 < gomi > junk
g940677@as301> cat junk
Good night!
Gute nacht!

○実行結果 例3

g940677@as301> java Copy3 Copy2.java gomi.java
Total: 16 lines
g940677@as301> cat gomi.java
1:      import java.io.*;
2:      public class Copy2 {
3:        public static void main(String args[]) {
4:          try {
5:            BufferedReader br = new BufferedReader(new InputStreamReader(Syste
m.in));
6:            int i;
7:            while ((i = br.read()) != -1)
8:              System.out.write(i);
9:            br.close();
10:         }
11:         catch (Exception e) {
12:           System.out.println("Error: " + e);
13:           e.printStackTrace();
14:         }
15:       }
16:     }

○考察

これらのプログラムではファイル入出力の方法について確認した。

例2では標準入力を介したデータの読み込みと書き出しを行っている。入出力リダイレクションを使う事によってファイルとデータの読み書きしている。

例3ではコマンド引数で指定したファイルからデータを読み込み、行番号をつけて別のコマンド引数で指定したファイルにデータを書き込んで出力している。

リダイレクションを使ってファイル入出力をする場合、全入出力がファイルだけになってしまい画面表示やキーボード入力ができなくなってしまうが、例3のようにする事で両立できるのでマスターしておく必要がある。

□課題7.2 - 2.24節 例3

○実行結果

g940677@as301> java Array3 4
Area of Chiba: 4995.72 km^2

○考察

このプログラムでは配列の基本的な利用の仕方を確認した。

配列の初期化を利用する事で配列宣言と同時に値を代入する事ができる。

□課題7.3 - 2.25節 例3,4

○実行結果 例3

g940677@as301> java Iteration3
Rank of #0 = 3,          Ratio = 0.18956997730304415
Rank of #1 = 1,          Ratio = 0.19935368427339875
Rank of #2 = 2,          Ratio = 0.19795005674238952
Rank of #3 = 5,          Ratio = 0.11718952206980308
Rank of #4 = 4,          Ratio = 0.155410685487885
Rank of #5 = 7,          Ratio = 0.0653949817827065
Rank of #6 = 6,          Ratio = 0.07513109234077289

○実行結果 例4

g940677@as301> java Iteration4 KantoArea.dat
Rank of #0 = 3,          Ratio = 0.18956997730304415
Rank of #1 = 1,          Ratio = 0.19935368427339875
Rank of #2 = 2,          Ratio = 0.19795005674238952
Rank of #3 = 5,          Ratio = 0.11718952206980308
Rank of #4 = 4,          Ratio = 0.155410685487885
Rank of #5 = 7,          Ratio = 0.0653949817827065
Rank of #6 = 6,          Ratio = 0.07513109234077289

○考察

これらのプログラムでは配列の効果的な使い方、配列と繰り返しについて確認した。

例3では配列の添え字に変数を使う事で配列間の値の比較を行って順位を求めている。

例4ではファイルからのデータの読み込みを配列に応用する事でより現実的なプログラムになっている。

□課題7.4 - 2.28節 例2,3

○実行結果 例2

g940677@as301> java Switch2 -1
-1 is negative or more than four.
g940677@as301> java Switch2 0
0 is less than one.
0 is less than two.
0 is less than three.
0 is less than four.
g940677@as301> java Switch2 1
1 is less than two.
1 is less than three.
1 is less than four.
g940677@as301> java Switch2 2
2 is less than three.
2 is less than four.
g940677@as301> java Switch2 3
3 is less than four.
g940677@as301> java Switch2 4
4 is negative or more than four.
g940677@as301> java Switch2 5
5 is negative or more than four.

○実行結果 例3

g940677@as301> java Switch3 KantoArea.dat
# of 0's: 4
# of 1's: 6
# of 2's: 5
# of 3's: 4
# of 4's: 4
# of 5's: 2
# of 6's: 6
# of 7's: 5
# of 8's: 3
# of 9's: 4
# of lines: 7
# of whites: 7
# of othe characters: 7

○考察

これらのプログラムでは繰り返しやswitchからbreakによって復帰する方法について確認した。

例2ではbreakの有無による違いが確認できる。

例3では'0'から'9'までの文字コードが連続している事を利用してファイル内の数文字、空白文字、行数、その他の文字を数えている。

□課題7.5 - 配列のプログラム

○プログラムリスト

import java.io.*; //java.io.* パッケージのimport
public class Iteration5 {
  public static void main(String args[]) {
    try { //例外処理の宣言
      BufferedReader br = new BufferedReader(new FileReader(args[0])); //ファイルargs[0]のBefferReader生成
      int n = Integer.valueOf(br.readLine()).intValue(); //県数の読み込み
      double area[] = new double[n]; //配列宣言と配列領域作成
      for (int i = 0; i < n; i++) { //面積の読み込み
        area[i] = Double.valueOf(br.readLine()).doubleValue();
      }
      br.close(); //ファイルのBefferReader閉鎖

      double maxarea = 0.0; //面積の最大値を代入する変数maxareaを宣言
      double sum = 0.0; //面積の合計値を代入する変数sumを宣言

      for (int k = 0; k < n; k++) { //ここから15行では面積が最大,最小,中間の県を求め,面積の合計値を計算する。k番目の県について
        int rank = 1; //仮の順位として1位を与え
        for (int l = 0; l < area.length; l++) { //反復によってすべての県と比較し
          if (area[l] > area[k]) rank++; //,もし他の県の方が大きければ順位を一つ下げる。
        }
        if (rank == 1) { //もしk番目の県の順位が1位ならば
          System.out.println("Biggest area is #" + k + ". \t It\'s area is " + area[k] + "km^2."); //最大の県はk番目と表示
          maxarea = area[k]; //そして最大値にk番目の県の面積を代入。
        }
        if (rank == n)  //もしk番目の県の順位がn位ならば
          System.out.println("Smallest area is #" + k + ". \t It\'s area is " +area[k] + "km^2."); //最小の県はk番目と表示
        if (rank == (n+1)/2)  //もしk番目の県の順位が(n+1)/2位ならば
          System.out.println("Middle area is #" + k + ". \t It\'s area is " + area[k] + "km^2."); //面積が中間の県はk番目と表示
        sum += area[k]; //k-1番目までの面積の合計値にk番目の面積の値を足す。
      } //ここまで

      System.out.println("Average of them is " + (sum / n) + "km^2"); //面積の合計値を県の数で割って平均値を求め表示

      for (int k = 0; k < n; k++) { //ここでは各県の面積の最大値に対する割合を求める。k番目の県について
        System.out.println("Ratio of #" + k + " is " + (area[k]/maxarea)); //面積を最大値で割って表示
      }
    }
    catch (Exception e) {
      System.out.println("Error: " + e);
      e.printStackTrace();
    }
  }
}

○実行結果

g940677@as301> java Iteration5 KantoArea.dat
Biggest area is #1.      It's area is 6408.28km^2.
Middle area is #4.       It's area is 4995.72km^2.
Smallest area is #5.     It's area is 2102.14km^2.
Average of them is 4592.182857142858km^2
Ratio of #0 is 0.9509228685388279
Ratio of #1 is 1.0
Ratio of #2 is 0.9929591091525339
Ratio of #3 is 0.5878472850749343
Ratio of #4 is 0.7795726778480342
Ratio of #5 is 0.32803497974495494
Ratio of #6 is 0.3768733575936133

○考察

このプログラムでは配列を使う事で、データファイルを読み込みそのデータについて各種の作業を実行している。

プログラム16行目からの面積が最大、最小、中間となる健を求める繰り返し文を共通にしないで、それぞれに分け計3回書くと結果の表示を最大、最小、中間の順になるようにする事もできる。しかし繰り返し文を3回に分けると処理時間がほぼ3倍になるので採用しなかった。