第2回 基礎プログラミング II レポート課題 氏名:酒井信市郎 学籍番号:c1090733 語学クラス:英語1 コース(系):政策 -------------------------------------------------------------------------------- 1.A 飲食店名を hash 配列を miseとしました。 mise の key は店名、 value はその店の商品にしました。 1:key「ピザハット」に対して value は「ピザ」 2:key「カッパ寿司」に対して value は「寿司」 3:key「モスバーガー」に対して value は「ハンバーガー」 4:key「くるまや」に対して value は「ラーメン」 5:key「吉野屋」に対して value は「牛丼」 これに対する Hash の表し方は以下のようになります。 mise["ピザハット"] = "ピザ" mise["カッパ寿司"] = "寿司" mise["モスバーガー"] = "ハンバーガー" mise["くるまや"] = "ラーメン" mise["吉野屋"] = "牛丼" もう一つは、以下のようになります。 {"ピザハット"=>"ピザ" , "カッパ寿司" => "寿司" , "モスバーガー"=>"ハンバー ガー" , "くるまや"=>"ラーメン" , "吉野屋"=>"牛丼"} 1.B a.0d 2010 = 0x?? 0d は10進数を、0x は16進数を表す。 10進数から16進数は、2010を商が0になるまで16で割って余りを見る。 2010 / 16 = 125 余り 10 =A 125 / 16 = 7 余り 13 = D 7 / 16 = 余り 7 0x7DA = 0d2010 b. 0d 2010 = 0b?? 10進数から2進数は商が0になるまで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 0d 2010 = 0b 1111011010 2進数を4桁ごとに区切り、16進数表示する。 0111 = 0*2^3 + 1*2^2 + 1*2^1 + 1*2^0 = 4 + 2 + 1 = 7 1101 = 1*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = 8 + 4 + 1 = 13 (D) 1010 = 1*2^3 + 0*2^2 + 1*2^1 + 0*2^0 = 8 + 2 = 10 (A) よって 0x7DAになる 2. プログラム問題 Eを選択 a.設定 飲食店の名前を入力すると、その店の商品が表示されるプログラムを考えまし た。hash_data.datに登録されていない店名を入力した場合は、店名と商品を登 録することができ、全てのデータを for if 文で出力します。 b.作成プログラム #!/usr/koeki/bin/ruby $KCODE = 'e' #日本語コードEUCで出力する mise = Hash.new("登録されていません") #Hash配列をmiseとし、初期値を設定する open("hash_data.dat","r") do |eat| #open-fileの読み込みモードrを使い、hash_data.datをeatという変数にする while line = eat.gets if/(\S+)\s+(\S+)/ =~ line mise[$1] = $2 end end end STDERR.print("飲食店の商品を表示します(終了は q )\n") while true STDERR.print("\n飲食店名を入力:") #検索したい店名を入力 name = gets.chomp if name == "q" STDERR.print("終了します\n\n") break elsif mise.key?(name) == false STDERR.printf("%sは%s\n",name,mise[name]) STDERR.print("登録しますか?(するならyを,しないのなら適当なキーをタイプ):") touroku = gets.chomp #入力された文字をtourokuとして改行文字を切り取る if touroku == "y" #新しく情報を登録するのならyを入力する STDERR.print("商品を入力:") hinmoku = gets.chomp mise[name] = hinmoku open("hash_data.dat","a") do |ea| ea.printf("%s\t\t\t%s\n",name,hinmoku) end else next end else STDERR.printf("%sは%sのお店です\n",name,mise[name]) #登録されているデータがあった場合に出力する文章 end end #最後にhash_data.datの内容を出力させる print("(店名)\t\t\t(代表的メニュー)\n") for omise ,mono in mise #Hash配列miseのkeyをomise,valueをmonoとそれぞれ変数に置き換える printf("%-20s\t%-10s\n",omise,mono) #printf文で出力する。 end (hash_data.datの内容) ピザハット ピザ カッパ寿司 寿司 モスバーガー ハンバーガー くるまや ラーメン 吉野屋 牛丼 c.実行結果 pan{c109073}% ./hash_write.rb [~/Ruby] 飲食店の商品を表示します(終了は q ) 飲食店名を入力:ピザハット ピザハットはピザのお店です 飲食店名を入力:モスバーガー モスバーガーはハンバーガーのお店です 飲食店名を入力:アルバ アルバはカレーのお店です 飲食店名を入力:した したは登録されていません 登録しますか?(するならyを,しないのなら適当なキーをタイプ):y 商品を入力:カレー 飲食店名を入力:味龍 味龍は登録されていません 登録しますか?(するならyを,しないのなら適当なキーをタイプ):y 商品を入力:ラーメン 飲食店名を入力:ドンキー ドンキーは登録されていません 登録しますか?(するならyを,しないのなら適当なキーをタイプ):y 商品を入力:ハンバーグ 飲食店名を入力:q 終了します (店名) (代表的メニュー) 味龍 ラーメン そらまめ食堂 定食 ピザハット ピザ ドンキー ハンバーグ した カレー くるまや ラーメン カッパ寿司 寿司 アルバ カレー ほっともっと 弁当 モスバーガー ハンバーガー 吉野屋 牛丼 (実行後のhash_data.datの内容) ピザハット ピザ カッパ寿司 寿司 モスバーガー ハンバーガー くるまや ラーメン 吉野屋 牛丼 ほっともっと 弁当 アルバ カレー そらまめ食堂 定食 した カレー 味龍 ラーメン ドンキー ハンバーグ d.考察 openfileの読込み、追加書きこみモードを加えました。 登録されていない店を登録することができました。実行後にhash_data.datを開 くと上書きされ新しく登録した店が表示されました。 結果からこのプログラムは正しく作ることができました。 3.感想 難しかったけど先輩や友だちの助けを借りてなんとかできました。 日常ではパソコンの検索があると思います。 4 参考文献 基礎プログラミング II 第2回 なになにといえばこれこれ http://roy/~madoka/2010/r2/02/ 協力者 木内雄、大沼拓海さん