プログラミング入門(金曜1・2限)講義資料(2008年後期)

最終レポート

最終レポート-1(文字列検索)

ファイル中の,特定の文字列が含まれる行だけ抜き出して表示するような文字列検索プログラムSearchStringを作ってください.

表示する行には,その行が何行目なのかも一緒に表示してください.最初の行は1行目とします.

検索する文字列とファイル名は引数で与えること.

myfile(という名前のファイル)から"tion"という文字列を含む行を検索する場合,
以下のように実行します.
以下の結果は30行目と43行目にtionを含む行があったことを示しています.

$ java SearchString tion myfile
30:your question is ..
43:reputation ...
$

実は,UNIX には同様の処理を行うコマンド(fgrep)が既に存在します.上記の例を fgrep コマンドで実行するにはコマンドラインから fgrep -n tion myfile と入力して下さい.

ソースプログラム,プログラムの解説,実行結果,感想,難易度を書いて下さい.

ヒント: 文字列中から文字列を検索するにはStringクラスのindexOf(String)メソッドを使うと簡単です.

最終レポート-2(アルファベットの出現頻度)

アルファベットの出現頻度を調べるプログラムFreqを作りましょう.

引数で指定したファイルを読み込んで,A〜Zまでのそれぞれのアルファベットが何回出現したかを表示してください.

% java Freq foo.txt  (foo.txtというファイルから調べる)
A ... 10
B ... 4
C ... 9
...
Z ... 5
%

/usr/share/dict/words というファイルに英語の単語が1行1語で載っています.このファイルを指定した場合の実行結果を添付してください.

ヒント

ソースプログラム,プログラムの解説,実行結果,感想,難易度を書いて下さい.

最終レポート-3(JRの運賃計算)

JR阪和線の天王寺〜鳳間の各駅の駅間距離(営業キロ)は以下の表の通りです.

天王寺〜美章園1.5 km
美章園〜南田辺1.5
南田辺〜鶴ヶ丘0.9
鶴ヶ丘〜長居0.8
長居〜我孫子町1.2
我孫子町〜杉本町1.0
杉本町〜浅香1.0
浅香〜堺市0.9
堺市〜三国ヶ丘1.4
三国ヶ丘〜百舌鳥0.9
百舌鳥〜上野芝1.3
上野芝〜津久野1.3
津久野〜鳳1.4

JRの運賃は次のように計算します.

次に,下の表を引きます(電車特定区間内相互発着の場合)

1〜3 km120 円
4〜6160
7〜10170
11〜15210
16〜20290
21〜25380

この情報を基に,ユーザが指定した駅から駅までの運賃を求めるプログラム TrainFare を作ってください.

考え方: 次のような配列を使う.

	// 阪和線に適用される運賃表
	// 3キロメートルまでは120円.6キロメートルまでは160円…
	int[] dist_table = {  3,   6,  10,  15,  20,  25};
	int[] fare_table = {120, 160, 170, 210, 290, 380};

	// dist_hanwa[0]は天王寺〜美章園の距離
	double[] dist_hanwa = { 1.5, 1.5, 0.9, 0.8, 1.2, 1.0, 1.0, 0.9, 1.4,
                                0.9, 1.3, 1.3, 1.4};
	String[] eki_hanwa = { "天王寺", "美章園", "南田辺", "鶴ヶ丘", "長居",
			       "我孫子町", "杉本町", "浅香", "堺市", "三国ヶ丘", 
			       "百舌鳥", "上野芝", "津久野", "鳳" };
  
  1. 駅を2つ入力する(数字で良い)
  2. 指定された駅間の営業キロを求める.
  3. 1キロ未満の端数を切り上げ(Mathクラスのceilメソッドを使うと簡単)
  4. dist_tableを使って,適用される添字を求める(3キロなら0,5キロなら1)
  5. fare_tableから,適用される運賃を求める.

JRの運賃計算方法に興味がある人はJR西日本の●旅客営業規則/第2編 旅客営業/第3章 旅客運賃・料金等を見てください.

結果を確認するにはハイパーダイヤ等が便利です.

使いやすいプログラムとなるように心掛けること.

ソースプログラム,プログラムの解説,感想,難易度を書いて下さい.

最終レポート-4(マインスイーパーもどき)

次のようなJavaアプレットを作成してください.

なお,同等に難しそうな別のゲームに変更しても構いません.(15パズル等)

注意:

ヒント

周囲にある地雷の数を求める方法(この処理はstartメソッドで行う):

(● = 地雷)

という配置の場合,num の中身を次のようにしたい.

?21
12?
011

(?の部分は使わないので値はなんでもよい.)

最初に配列numの要素を全て0にしておく.配列mine上に地雷を配置した後,2重ループを使ってmine上の要素を1つずつみていく.mine[x][y]に地雷を発見したら,配列num上で,x,yの周りのマスの要素を+1する.

x,yの周りのマスの要素を+1するには,例えば次のようにする.

  for (int i = x - 1 ; i <= x + 1 ; i++) {
    for (int j = y - 1 ; j <= y + 1 ; j++) {
       // 配列からはみ出ないようにチェックする
       if (0 <= i && i < 5 && 0 <= j && j < 5) {
         num[i][j]++;
       }
    }
  }

ソースプログラム,アプレットが置いてあるページのURL(http://からはじまるもの),プログラムの解説,感想,難易度を書いて下さい.

昔のTAの植村君のサンプル

最終レポート-5(この講義で学んだこと)

この講義で学んだことと感想を書いてください.また,授業の進め方,授業の中身(これは要らない,これを教えて欲しかった,etc),授業の進む早さ(もっと遅く,もっと早く),宿題の量,などについてもコメントがあれば書いてください.