第 2 回 なになにといえばこれこれ レポート課題 氏名:伊藤詩野 学籍番号:C1110186 語学クラス:中国語3 コース:社会福祉コース 1.筆記問題 A.Hash 5つの対を考える 野菜の特徴を hash 配列 vegetables としました。 vegetables の key と value はそれぞれ野菜の名前とその色にしました。 その1:key 「だいこん」に対してvalue は「白」 その2:key 「きゅうり」に対してvalue は「緑」 その3:key 「なす」に対して value は「紫」 その4:key 「トマト」に対して value は「赤」 その5:key 「パプリカ」に対して value は「黄」 これに対する Hash の表し方は vegetable["だいこん"] = "白" vegetable["きゅうり"] = "緑" vegetable["なす"] = "紫" vegetable["トマト"] = "赤" vegetable["パプリカ"] = "黄" また、もう一つの表し方は {"だいこん" => "白","きゅうり" => "緑","なす" => "紫", "トマト" => "赤","パプリカ" => "黄"} B.計算問題 a.0d 2012 = 0x?? 10進数を16進数に変換するには、10進数を商が0になるまで、16で割る。 2012 / 16 = 125 余り 12 125 / 16 = 7 余り 13 7 / 16 = 0 余り 7 計算結果を下から逆に表示すると 7, 13 = d , 12 = c よって0d 2012 = 0x7dc b.0d 2012 = 0b?? 10進数を2進数に変換するには、10進数を答えが0になるまで2を割り続け、 余りを逆から表示する。 2012 / 2 = 1006 余り 0 1006 / 2 = 503 余り 0 503 / 2 = 251 余り 1 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 2012 = 0b 11111011100 これを16進数に変換し、a 問題と答えが一致するか確かめる。 2進数を16進数に変換するには、2進数を右から4桁ずつ区切る。 0b 11111011100 → 0111,1101,1100 それぞれを変換すると 2進数→16進数 0111 →7 1101 →d 1100 →c よって、0b 11111011100 = 0x 7dc となり、答えは一致。 2.プログラム問題 ○選択:A 設定:あらかじめプログラムに登録してある対を全て表示するもの プログラム:hash_for.rb #!/usr/koeki/bin/ruby vegetable = Hash.new # Hash 配列をvegetableと定義する。 vegetable["だいこん"] = "白" vegetable["きゅうり"] = "緑" vegetable["なす"] = "紫" vegetable["トマト"] = "赤" vegetable["パプリカ"] = "黄" for vegetable,color in vegetable # for キー名,値 in ハッシュ配列 printf("%s の色は 「%s」です。\n", vegetable, color) end 実行結果 pan{ITO Shino}% ./hash_for.rb [~/Ruby] だいこん の色は 「白」です。 きゅうり の色は 「緑」です。 なす の色は 「紫」です。 トマト の色は 「赤」です。 パプリカ の色は 「黄」です。 考察 あらかじめ設定していたものが表示された。プログラムは正常である。 ○選択:B 設定:ユーザが知りたい情報だけを結果表示する プログラム:hash_choice.rb #!/usr/koeki/bin/ruby vegetable = Hash.new("登録されていません\n")# Hash 配列をvegetableと定義する vegetable["だいこん"] = "白" vegetable["きゅうり"] = "緑" vegetable["なす"] = "紫" vegetable["トマト"] = "赤" vegetable["パプリカ"] = "黄" print("野菜のなまえを入力すると、その野菜の色が表示されます\n") STDERR.print("野菜のなまえ: ") # STDERR.print("入力を促す文章") name = gets.chomp if vegetable.key?(name) == false # 文字列 key があるかどうか調べる printf("%s は %s \n",name, vegetable[name]) else printf("%s の色は、「%s」です\n",name,vegetable[name]) end 実行結果 ・その1 pan{ITO Shino}% ./hash_choice.rb [~/Ruby] 野菜のなまえを入力すると、その野菜の色が表示されます 野菜のなまえ: だいこん だいこん の色は、「白」です ・その2 pan{c111018}% ./hash_choice.rb [~/Ruby] 野菜のなまえを入力すると、その野菜の色が表示されます 野菜のなまえ: にんじん にんじん は 登録されていません 考察 プログラムで設定したように、実行画面できちんと表示されている。また、「だ いこん」〜「パプリカ」以外の言葉が入力された場合、「登録されていません」 と表示された。このプログラムは正常に動いているといえる。 ○選択:C 設定:知りたい情報が出てこない場合に、ユーザに対を登録させ、 登録した結果 を出力する プログラム:hash_register.rb #!/usr/koeki/bin/ruby vegetable = Hash.new # Hash 配列をvegetableと定義する STDERR.print("野菜と色を入力して下さい(Ctrl-Dで終了)\n") while true STDERR.print("野菜のなまえ:") # STDERR.print("入力を促す文章") yasai = gets if yasai == nil #Ctrl-Dが押されたとき break #whileの繰り返しから抜ける else yasai = yasai.chomp STDERR.printf("その野菜の色:") #STDERR.print("入力を促す文章") color = gets.chomp vegetable[yasai] = color end end for yasai,color in vegetable # for キー名,値 in ハッシュ配列 printf("%sの色は「%s」です\n",yasai,color) end 実行結果 その1 pan{ITO Shino}% ./hash_register.rb [~/Ruby] 野菜と色を入力して下さい(Ctrl-Dで終了) 野菜のなまえ:にんじん その野菜の色:オレンジ 野菜のなまえ:にんじんの色は「オレンジ」です その2 pan{c111018}% ./hash_register.rb [~/Ruby] 野菜と色を入力して下さい(Ctrl-Dで終了) 野菜のなまえ:ごぼう その野菜の色:茶色 野菜のなまえ:ごぼうの色は「茶色」です 考察 野菜を「にんじん」 色を「オレンジ」野菜を「ごぼう」 色を「茶色」と登録 したところ、登録した内容が表示された。よって、このプログラムは正常といえ る。また、このプログラムはすぐ登録する流れだが、プログラム問題 B で作成 したように、「登録されていません」と表示したうえで、ユーザーに新しい野菜 とその色を登録をさせたほうがプログラムとして自然だと思った。 ○選択:D 設定:データから読み込むようにしたプログラムにする データ: hash_data.dat だいこん 白 きゅうり 緑 なす 紫 トマト 赤 パプリカ 黄 プログラム:hash_read.rb #!/usr/koeki/bin/ruby vegetable = Hash.new("登録されていません\n")# Hash 配列を vegetableとする。 print("野菜のなまえを入力して下さい\n") open("hash_data.dat","r") do |v| while hash_data = v.gets if/(\S+)\s+(\S+)/ =~ hash_data vegetable[$1] = $2 end end end STDERR.print("野菜のなまえ:") #STDERR.print("入力を促す文章") yasai = gets.chomp if vegetable.key?(yasai) == true # 文字列 key があるかどうか調べる printf("%s の色は「%s」です\n",yasai,vegetable[yasai]) end 実行結果 その1 pan{c111018}% ./hash_read.rb [~/Ruby] 野菜のなまえを入力して下さい 野菜のなまえ:だいこん だいこん の色は「白」です その2 pan{c111018}% ./hash_read.rb [~/Ruby] 野菜のなまえを入力して下さい 野菜のなまえ:なす なす の色は「紫」です 考察 作成したデータの中身と、プログラムを実行し表示されたものが一致している。 よって、このプログラムは正常である。今回は、登録されていないデータが入力 されるとユーザーに知らせる部分をつくらなかったので、ユーザーに知らせたほ うがプログラムとして親切だと思った。 ○選択:E 設定:新規データも含め、登録した情報を出力するプログラム。なお、書きこむ データ先は、hash_data.dat (前問から使用しているデータファイル)とする。 プログラム:hash_write.rb #!/usr/koeki/bin/ruby vegetable = Hash.new print("登録したい野菜とその色を入力して下さい(Ctrl-Dで終了\n") while true #while tureで何度も動作を繰り返す STDERR.printf("野菜のなまえ:") yasai = gets if yasai == nil print("登録終了\n") break #while trueを抜ける else yasai = yasai.chomp STDERR.print("色:") vegetable[yasai] = gets.chomp end end for yasai,color in vegetable printf("なまえ:%s\t色:%s \n",yasai,vegetable[yasai]) end open("hash_data.dat","w") do |g| for yasai,color in vegetable g.printf("%s \t %s\n",yasai,vegetable[yasai]) end end 実行結果 ・その1 pan{c111018}% ./hash_write.rb [~/Ruby] 登録したい野菜とその色を入力して下さい(Ctrl-Dで終了 野菜のなまえ:セロリ 色:黄緑 野菜のなまえ:ごぼう 色:茶色 野菜のなまえ:登録終了 なまえ:セロリ 色:黄緑 なまえ:ごぼう 色:茶色 ・その2 pan{c111018}% ./hash_write.rb [~/Ruby] 登録したい野菜とその色を入力して下さい(Ctrl-Dで終了 野菜のなまえ:かぼちゃ 色:緑とオレンジ 野菜のなまえ:白なす 色:白 野菜のなまえ:登録終了 なまえ:かぼちゃ 色:緑とオレンジ なまえ:白なす 色:白 考察 登録したものが、きちんとデータに書きこまれているか【cat】調べてみる。 ・その1 pan{c111018}% cat hash_data.dat [~/Ruby] セロリ 黄緑 ごぼう 茶色 ・その2 an{c111018}% cat hash_data.dat [~/Ruby] かぼちゃ 緑とオレンジ 白なす 白 書きこまれていることが【cat】により証明された。よって、このプログラムは 正常だといえる。 3.感想  実際に使われていると思うもの・こと。通販サイトの、購入・チェック履歴な どからの「あなたにおすすめの商品」。商品それぞれに「タグ」というものが付 けられて、同じキーワードのものが表示されるほか、関連商品も表示される。  1回目は前期の復習でしたが、今回から新しい内容がスタートしました。最初は 「Hash」がよく理解できませんでしたが、「マジカルばなな」のようなものだと 考えたら、イメージがつかめました。講義で、100g あたりの値段を計算するプ ログラムを作成した際には実用的だと思いました。  今回のプログラム問題ではA~Eの選択問題でしたが、より多くの問題にチャレ ンジしようと思い、複数回答しました。E 問題では、入力されたデータを確かめ る際に、データファイルをemacsで開くのではなく、catコマンドを利用しました。 いくつかの問題の考察に改善したい点を述べましたが、改善せずそのまま提出す るかたちになってしまったので、プログラムの「作りっぱなし」にならないよう に次回から頑張りたいです。 4.参考文献 ・基礎プログラミング II 第 2 回 (なになにといえばこれこれ) 「入力したデー タを取り出そう」 西村まどか URL:http://roy.e.koeki-u.ac.jp/~madoka/2012/r2/02/r2_02_03_theme_02_hash_input.html ・基礎プログラミング II 第 2 回 (なになにといえばこれこれ) 「あるかないか」 西村まどか URL:http://roy.e.koeki-u.ac.jp/~madoka/2012/r2/02/r2_02_04_theme_03_existornot.html ・基礎プログラミング II 第 2 回 (なになにといえばこれこれ) 「対にないものが 呼び出されたとき」 西村まどか URL:http://roy.e.koeki-u.ac.jp/~madoka/2012/r2/02/r2_02_05_theme_04_default.html ・基礎プログラミングI (8) 06/11の授業内容:ファイルの入出力 神田直弥 URL:http://roy/~naoya/ruby/8.html 共同学習者 村上茉奈美さん、浅沼佑香さん 添付ファイル ・hash_data.dat ・hash_for.rb ・hash_choice.rb ・hash_register.rb ・hash_read.rb ・hash_write.rb