第2回 基礎プログラミング II レポート課題 氏名: xxxxxxxx 学籍番号:c109xxx 語学クラス:中国語 コース(系):政策 1.筆記問題 車のメーカーをhash 配列 car とした。 car の key はメーカー、value は 車種とした。 1:key「スズキ」に対して value は「ワゴンR」 2:key「スバル」に対して value は「プレオ」 3:key「ダイハツ」に対して value は「ムーブ」 4:key「トヨタ」に対して value は「パッソ」 5:key「メルセデスベンツ」に対して value は「ベンツ」 これに対応するHashの表し方は以下になる。 car["スズキ"] = "ワゴンR" car["スバル"] = "プレオ" car["ダイハツ"] = "ムーブ" car["トヨタ"] = "パッソ" car["メルセデスベンツ"] = "ベンツ" {"スズキ"=>"ワゴンR" , "スバル" => "プレオ" , "ダイハツ"=>"ムーブ" , "ト ヨタ"=>"パッソ" , "メルセデスベンツ"=>"ベンツ"} B. a 10進数を16進数にするには、16で割り出た商を16で割って、余りを下から順に並 べる。 2010/16 = 125 余り10 125/16 = 7 余り13 7/16 = 0 余り7 10 = a 13 = d なので 0d2010 = 7da b 10進数を2進数にするためには2で割る。 2010/2 = 1005 余り0 1005/2 = 502 余り1 502/2 = 251 余り0 251/2 = 125 余り1 125/2 = 62 余り1 62/2 = 31 余り0 31/2 = 15 余り1 15/2 = 7 余り1 7/2 = 3 余り1 3/2 = 1 余り1 1/2 = 0 余り1 なので 0x2010 = 0b11111011010 これを16進数に直す。 進数を16進数にするには2進数を下から4桁ずつに区切って、その数字ごとに10進 数に変換する。 0111=0*2の3乗+1*2の2乗+1*2の1乗+1*2の0乗 =0+4+2+1 =7 1101=1*2の3乗+1*2の2乗+0*2の1乗+1*2の0乗 =8+4+0+1 =13 1010=1*2の3乗+0*2の2乗+1*2の1乗+0*2の0乗 =8+0+2+0 =10 以上から問1と同じになった。 2.プログラム問題 A プログラム本体 #!/usr/koeki/bin/ruby $KCODE = 'e' car = Hash.new car["スズキ"] = "「ワゴンR」" car["スバル"] = "「プレオ」" car["ダイハツ"] = "「ムーブ」" car["トヨタ"] = "「パッソ」" car["メルセデスベンツ"] = "「ベンツ」" for item,make in car printf("%sは%sです\n",item,make) end 実行結果 pan{c109056}% ./hash_for.rb [~/Ruby] トヨタは「パッソ」です ダイハツは「ムーブ」です スバルは「プレオ」です メルセデスベンツは「ベンツ」です スズキは「ワゴンR」です 考察 hashのデータどうりになったのでこのプログラムは正しい。 B プログラム本体 #!/usr/koeki/bin/ruby $KCODE = 'e' #日本語コードでEUCで出力する。 car = Hash.new #Hash配列を car と定義。 car["スズキ"] = "「ワゴンR」" car["スバル"] = "「プレオ」" car["ダイハツ"] = "「ムーブ」" car["トヨタ"] = "「パッソ」" car["メルセデスベンツ"] = "「ベンツ」" print("どのメーカーについて調べますか?\n\n") print("スズキ\nスバル\nダイハツ\nトヨタ\nメルセデスベンツ\n") STDERR.print("\n上記から調べたいメーカーを入力して下さい:") make = gets.chomp if car.key?(make) == false print("\nそのメーカーは調べられません。\n選び直して下さい。\n") elsif #elsifはそうでなければ、と言う意味。 printf("\n%sの車は、%sです。 \n",make, car[make]) end 実行結果 pan{c109056}% ./hash_choice.rb [~/Ruby] どのメーカーについて調べますか? スズキ スバル ダイハツ トヨタ メルセデスベンツ 上記から調べたいメーカーを入力して下さい:スズキ スズキの車は、「ワゴンR」です。 pan{c109056}% ./hash_choice.rb [~/Ruby] どのメーカーについて調べますか? スズキ スバル ダイハツ トヨタ メルセデスベンツ 上記から調べたいメーカーを入力して下さい:ダイハツ ダイハツの車は、「ムーブ」です。 pan{c109056}% ./hash_choice.rb [~/Ruby] どのメーカーについて調べますか? スズキ スバル ダイハツ トヨタ メルセデスベンツ 上記から調べたいメーカーを入力して下さい:メルセデスベンツ メルセデスベンツの車は、「ベンツ」です。 pan{c109056}% ./hash_choice.rb [~/Ruby] どのメーカーについて調べますか? スズキ スバル ダイハツ トヨタ メルセデスベンツ 上記から調べたいメーカーを入力して下さい:トヨタ トヨタの車は、「パッソ」です。 pan{c109056}% ./hash_choice.rb [~/Ruby] どのメーカーについて調べますか? スズキ スバル ダイハツ トヨタ メルセデスベンツ 上記から調べたいメーカーを入力して下さい:スバル スバルの車は、「プレオ」です。 pan{c109056}% ./hash_choice.rb [~/Ruby] どのメーカーについて調べますか? スズキ スバル ダイハツ トヨタ メルセデスベンツ 上記から調べたいメーカーを入力して下さい: そのメーカーは調べられません。 選び直して下さい。 考察 正しくメーカー名とそれに続く車種も正しく出力された。エラーの時もエラーメッ セージが正しく出力された。よってこのプログラムは正しいことがわかった。 E プログラム本体 #!/usr/koeki/bin/ruby $KCODE = 'e' car = Hash.new print("登録したいメーカーと車種をを入力してください\n") while true #while tureで何度も動作を繰り返す。 STDERR.printf("\nメーカーを入力:") #STDERRでキーボードから入力させる。 make = gets if make == nil print("登録終了\n") break #while trueを抜ける。 elsif make = make.chomp end STDERR.printf("車種を入力:") car[make] = gets.chomp end print("\n\n登録したのは…\n\n") for make,syasyu in car printf("メーカー名 : %s\t車種 : %s \n",make,car[make]) end open("hash_data.dat", "a") do |kuruma| for make,syasyu in car kuruma.printf("%s\t %s\n",make,car[make]) end end 実行結果 pan{c109056}% ./hash_write.rb [~/Ruby] 登録したいメーカーと車種をを入力してください メーカーを入力:日産 車種を入力:エクストレイル メーカーを入力:スズキ 車種を入力:MRワゴン メーカーを入力:キナイ 車種を入力:ユウ メーカーを入力:登録終了 登録したのは… メーカー名 : 日産 車種 : エクストレイル メーカー名 : キナイ 車種 : ユウ メーカー名 : スズキ 車種 : MRワゴン 考察 ちゃんと思ったようになった。 次に登録したものがちゃんと hash_data.datに書きこまれているか確かめる。 cat を使って調べてみた。 pan{c109056}% cat hash_data.dat [~/Ruby] 日産 エクストレイル キナイ ユウ スズキ MRワゴン 上記よりちゃんと書きこまれていることがわかった。 よってこのプログラムは正しく動いている。 感想 こういったプログラムはユーザー登録などに使われていると思う。新規でサイト などに登録する際にこのプログラムのような仕組みになっているのかもしれない。 今回はデータファイルに書きこむということを始めてやってみた。データファイ ルに書きこまれた時は感動した。プログラミングの授業も徐々に実用的なものに なってきていると感じた。今回のレポートは大変だったが楽しかった。 参考文献 ◯第2回 なになにといえばこれこれ http://roy/~madoka/2010/r2/02/ 著者:西村まどか先生 ◯2進数、16進数と10進数 http://www.asahi-net.or.jp/~ax2s-kmtn/ref/bdh.html 共同学習者 遠藤裕貴、酒井信市郎