氏名 | 田辺 健 |
---|---|
クラス | 理科1類18組 |
学籍番号 | 940677G |
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!
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のようにする事で両立できるのでマスターしておく必要がある。
g940677@as301> java Array3 4 Area of Chiba: 4995.72 km^2
このプログラムでは配列の基本的な利用の仕方を確認した。配列の初期化を利用する事で配列宣言と同時に値を代入する事ができる。
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
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ではファイルからのデータの読み込みを配列に応用する事でより現実的なプログラムになっている。
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.
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'までの文字コードが連続している事を利用してファイル内の数文字、空白文字、行数、その他の文字を数えている。
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倍になるので採用しなかった。