第 2 回 なになにといえばこれこれ レポート課題 氏名:大熊麻友 学籍番号:C1100377 語学クラス:英語6 コース(系):政策マネジメント [1] A 都道府県名を hash 配列 place としました。 placae の key と visit は都道府県名とそこにある観光名所です。 1: key 「千葉」 に対して value 「ディズニーランド」 2: key 「北海道」に対して value 「旭山動物園」 3: key 「大阪」 に対して value 「ユニバーサルスタジオジャパン」 4: key 「沖縄」 に対して value 「美ら海水族館」 5: key 「京都」 に対して value 「金閣寺」 6: key 「山梨」 に対して value 「「富士急ハイランド」 これに対応する Hash の表し方は place["千葉"] = "ディズニーランド" place["北海道"] = "旭山動物園" place["大阪"] = "ユニバーサルスタジオジャパン" place["沖縄"] = "美ら海水族館" place["京都"] = "金閣寺" place["山梨"] = "富士急ハイランド" また、もう一つの表し方は {"千葉" => "ディズニーランド","北海道" => "旭山動物園","大阪" => "ユニバー サルスタジオジャパン","沖縄" => "美ら海水族館","京都" => "金閣寺","山梨" => "富士急ハイランド"} ------------------------------------------------------------ B 1 0d 2010 = 0x ?? 10進数 2010 を16進数になおす。 2010 / 16 = 125 … 10(a) 2010 / 16 = 7 … 13(d) 2010 / 16 = 0 … 7 これにより、0d 2010 = 0x 7da 2 0d 2010 = 0b ?? 10進数 2010 を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 11111011010 3 0b 11111011010 = 0x ?? 2進数 11111011010 を16進数になおす。 4桁ごとに区切ると「0111」「1101」「1010」 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(d) 1010 = 1*2の3乗 + 0*2の2乗 + 1*2の1乗 + 0*2の0乗 = 8 + 0 + 2 + 0 = 10(a) これにより、0b 11111011010 = 0x 7da したがって、問1と同じになったため正しいと言える。 ------------------------------------------------------------ [2] A 1 考えた設定 前問で考えた都道府県名とそこにある観光名所の対を 全て表示させるプログラム 2 作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' place = Hash.new # Hash.newで新しいhashを作成 place["千葉"] = "ディズニーランド" place["北海道"] = "旭山動物園" place["大阪"] = "ユニバーサルスタジオジャパン" place["沖縄"] = "美ら海水族館" place["京都"] = "金閣寺" place["山梨"] = "富士急ハイランド" # hashを設定 print("------------観光地の紹介------------\n") for visit in place.keys # hashの対を表示する printf("%s といえば... %s! \n",visit,place[visit]) en # forに対するend print("------------------------------------\n") 3 もとにしたプログラムからの変更点 授業で作成した hash_item.rb を参考にした。 まず、都道府県名を place 観光名所を visit に変更。 それから、実行で文字を入力して それについて値段や重量を計算するプログラムから 作成した対を全て表示するものへ変えた。 具体的に、 ・print文の前の STDERR ・キーボードからの入力を読み込む getsメソッド ・値の型を変換する to_fメソッド ・if文で「それ以外」を表す else これらを不要なため省いた。 4 実行した結果画面 ------------観光地の紹介------------ 沖縄 といえば... 美ら海水族館! 京都 といえば... 金閣寺! 千葉 といえば... ディズニーランド! 大阪 といえば... ユニバーサルスタジオジャパン! 山梨 といえば... 富士急ハイランド! 北海道 といえば... 旭山動物園! ------------------------------------ 5 結果の考察 hashの中身である 「千葉 = ディズニーランド」 「北海道 = 旭山動物園」「大阪 = ユニバーサルスタジオジャパン」 「沖縄 = 美ら海水族館」「京都 = 金閣寺」「山梨 = 富士急ハイランド」 が ○○ といえば... ××! の通りにすべて表示されている。 したがって、正しく実行されていることがわかる。 ---------------------------------------------------------- B 1 考えた設定 前問で作成した対について 知りたい情報のみを表示させるプログラム。 2 作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' place = Hash.new # Hash.newで新しいhashを作成 place["千葉"] = "ディズニーランド" place["北海道"] = "旭山動物園" place["大阪"] = "ユニバーサルスタジオジャパン" place["沖縄"] = "美ら海水族館" place["京都"] = "金閣寺" place["山梨"] = "富士急ハイランド" # hashを設定 STDERR.print("どの都道府県にしますか?:") # STDERR.print文で文字表示をし、キーボードから入力させる visit = gets.chomp # 入力された文字の改行部分を切り取りvisitへいれる if place.key?(visit) == true # もしtrueなら(データと合致したらtrue しなかったらfalse) printf("%s といえば... %s! \n",visit,place[visit]) else # それ以外なら print("該当するものがありません。\n") end #ifに対するend 3 もとにしたプログラムからの変更 hash_for.rbのプログラムをもとにした。 すべて表示させるプログラムから、 知りたい情報のみを表示させるプログラムへ変更させた。 具体的には、 ・STDERR.print文で文字表示とキーボードからの入力を促した。 ・getsやchompメソッドを使って入力された文字の表示を行った。 ・if文では else も使用し、入力された文字が プログラム上で作成したものの中にあるかないかを判断し ないものを入力した場合は「該当するものがありません。」と表示した。 4 実行した結果画面 ※true だった場合と false だった場合の2パターンの結果画面 どの都道府県にしますか?:北海道 北海道 といえば... 旭山動物園! どの都道府県にしますか?:山形 該当するものがありません。 5 結果の考察 STDERR.print文の「どの都道府県にしますか?:」が表示され、 「千葉」「北海道」「大阪」「沖縄」「京都」「山梨」のどれかが 入力された場合には、それと対の表示が行われている。 また、その5つ以外の都道府県名が入力された場合には、 「該当するものがありません。」と表示されている。 true と false の両方の場合を確認した結果、 どちらも正しく表示されたのでこのプログラムは正確である。 -------------------------------------------------------------- C 1 考えた設定 知りたい情報がなかった場合に、 実行者に対を入力してもらい、それを表示させるプログラム 2 作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' place = Hash.new place2 = Hash.new # Hash.newで新しいhashを作成 place["千葉"] = "ディズニーランド" place["北海道"] = "旭山動物園" place["大阪"] = "ユニバーサルスタジオジャパン" place["沖縄"] = "美ら海水族館" place["京都"] = "金閣寺" place["山梨"] = "富士急ハイランド" # hashを設定 print("都道府県名とそこのにある観光名所を入力してください (終了は Ctrl + D)\n") visit = gets.chomp # 入力された文字の改行部分を切り取りvisitへいれる if place.key?(visit) == true # もしtrueなら(データと合致したらtrue しなかったらfalse) printf("%s といえば... %s! \n",visit,place[visit]) else # それ以外なら print("該当するものがありません。\n") print("新しくデータを作りましょう!\n") while true # 繰り返し表示を行う STDERR.printf("まず、都道府県名を入力してください (終了は Ctrl + D):\n") # STDERR.printfで文字表示をし、キーボードから入力させる visit = gets # 入力された文字をvisitheへいれる if visit == nil # visitがnilなら break # 繰り返しから抜ける else # それ以外なら visit = visit.chomp # 入力された文字の改行部分を切り取りvisitへいれる end # ifに対するend printf("次に、そこにある観光名所を入力してください:\n") place2[visit] = gets # 入力された文字をplace2[visit]へいれる end # whileに対するend for visit2 in place2.keys # hashの対を表示する printf("%s といえば... %s",visit2,place2[visit2]) end # forに対するend end # ifに対するend 3 もとにしたプログラムからの変更点 hash_choice.rb をもとにした。 実行者にプログラムにない観光名所を入力してもらうようにした。 while true で繰り返し、順に都道府県名と観光名所を 登録したい分だけ入力し break で抜けるようにした。 4 実行した結果画面 ※true だった場合と false だった場合の2パターンの結果画面 都道府県名とそこのにある観光名所を入力してください (終了は Ctrl + D) 山梨 山梨 といえば... 富士急ハイランド! 都道府県名とそこのにある観光名所を入力してください (終了は Ctrl + D) 東京 該当するものがありません。 新しくデータを作りましょう! まず、都道府県名を入力してください (終了は Ctrl + D): 東京 次に、そこにある観光名所を入力してください: 東京タワー まず、都道府県名を入力してください (終了は Ctrl + D): 栃木 次に、そこにある観光名所を入力してください: 日光東照宮 まず、都道府県名を入力してください (終了は Ctrl + D): 神奈川 次に、そこにある観光名所を入力してください: みなとみらい まず、都道府県名を入力してください (終了は Ctrl + D): 神奈川 といえば... みなとみらい 東京 といえば... 東京タワー 栃木 といえば... 日光東照宮 5 結果の考察 変更点である繰り返しと繰り返しから抜ける作業ができている。 true と false の両方の実行結果が正しいため このプログラムは正確である。 ----------------------------------------------------------- 6 参考文献 ・基礎プログラミング II 第2回 あるかないか http://roy/~madoka/2011/r2/02/02_04_theme_03_existornot.html ・基礎プログラミング II 第2回 Hash の対を表示するには http://roy/~madoka/2011/r2/02/02_07_theme_06_forprint.html 7 共同学習者、協力してくれた先輩 なし