第2回 基礎プログラミング II レポート課題 氏名:青木 千紗 学籍番号:C1090012 語学クラス:中国語1 コース(系):地域共創コース 1 筆記問題 A ジブリの主題歌を hash 配列 ghibli としました。 song の key と value はそれぞれ動物名とその主題歌にとりました。 その 1: key 「となりのトトロ」 に対して value は 「さんぽ」 その 2: key 「魔女の宅急便」 に対して value は 「やさしさに包まれたな ら」 その 3: key 「千と千尋の神隠し」 に対して value は 「いつも何度でも」 その 4: key 「天空の城ラピュタ」 に対して value は 「君をのせて」 その 5: key 「ハウルの動く城」 に対して value は 「世界の約束」 これに対応する hash の表し方は song["となりのトトロ"] = "さんぽ" song["魔女の宅急便"] = "やさしさに包まれたなら" song["千と千尋の神隠し"] = "いつも何度でも" song["天空の城ラピュタ"] = "君をのせて" song["ハウルの動く城"] = "世界の約束" また、もう一つの表し方は {"となりのトトロ" => "さんぽ", "魔女の宅急便" => "やさしさに包まれたな ら", "千と千尋の神隠し" => "いつも何度でも", "天空の城ラピュタ" => "君 をのせて", "ハウルの動く城" => "世界の約束"} B 10進数 2 3 4 5 6 7 8 9 10 11 12 13 2進数 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 16進数 2 3 4 5 6 7 8 9 A B C D a. 0d 2010 = 0x ?? 0dは10進数である。10進数の2010という数字を0xである16進数に変えるため には、0になるまで16で割りつづける。 2010 / 16 = 125 余り 10 125 / 16 = 7 余り 13 7 / 16 = 0 余り 7 この余りを下から読むと、71310となる。これを16進数の表を参考にすると、 7は7、13はd、10はaになる。 したがって、0d 2010 = 0x 7da b. 0d 2010 = 0b ?? 0dは10進数である。10進数の2010という数字を0bである2進数に変えるために は、1になるまで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 この余りを下から読むと11111011010となる。 したがって、0d 2010 = 0b 11111011010 さらにこれを右から4つに区切ると 111 1101 1010となり、これを10進数になおす。 1*2^2 + 1*2^1 + 1*2^0 = 7 1*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = 13 1*2^3 + 0*2^2 + 1*2^1 + 0*2^0 = 10 となり、これを表に当てはめると、7は7、13はd、10はaになる。 このことによって1問目の答えと同じになる。 2 プログラム問題 A プログラム(hash_for.rb) a 考えた設定 プログラムにジブリ作品の作品名と主題歌を登録し、全てを表示するプログラ ムを考えた b 作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' song = Hash.new # Hash.newで新しいhashを作る song["となりのトトロ"] = "さんぽ" # hashの設定 song["魔女の宅急便"] = "やさしさに包まれたなら" song["千と千尋の神隠し"] = "いつも何度でも" song["天空の城ラピュタ"] = "君をのせて" song["ハウルの動く城"] = "世界の約束" for ghibli in song.keys # hashの対を表示させる printf("%s の主題歌は %s \n", ghibli, song[ghibli]) # printf文で文章を表示させる end # forに対するend c もとにしたプログラム hash_pair.rb を参考にしてプログラムを作成した d 実行結果 pan{c109001}% ./hash_for.rb [~/Ruby] 天空の城ラピュタ の主題歌は 君をのせて ハウルの動く城 の主題歌は 世界の約束 魔女の宅急便 の主題歌は やさしさに包まれたなら 千と千尋の神隠し の主題歌は いつも何度でも となりのトトロ の主題歌は さんぽ e 考察 プログラムでは「となりのトトロ」の主題歌は「さんぽ」である。これを実行 してみると「となりのトトロ の主題歌は さんぽ」と表示される。よって、プ ログラムは正しく実行されているといえる。 B プログラム(hash_choice.rb) a 考えた設定 前問にくわえて、自分が知りたい作品の情報だけを結果表示するプログラムを 考えた b 作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' song = Hash.new # Hash.newで新しいhashを作る song["となりのトトロ"] = "さんぽ" # hashの設定 song["魔女の宅急便"] = "やさしさに包まれたなら" song["千と千尋の神隠し"] = "いつも何度でも" song["天空の城ラピュタ"] = "君をのせて" song["ハウルの動く城"] = "世界の約束" STDERR.print("知りたい題名をいれてください:") # STDERR.print文で文字を表示し、入力させる ghibli = gets.chomp # 入力された文字の改行部分を切取り変数ghibliの中にいれる if song.key?(ghibli) == true # もしtrueだったら(データの中に入力された文字があったらtrue、なかったらfalse) printf("%s の主題歌は %s です。\n", ghibli, song[ghibli]) # printf文で文字を表示させる else # もしそれ以外だったら print("該当なし\n") # print文で文字を表示させる end #ifに対するend c もとにしたプログラム hash_data.rbを参考にプログラムを作成した d 実行結果 データにあるものを入力した場合 pan{c109001}% ./hash_choice.rb [~/Ruby] 知りたい題名をいれてください:となりのトトロ となりのトトロ の主題歌は さんぽ です。 データにないものを入力した場合 pan{c109001}% ./hash_choice.rb [~/Ruby] 知りたい題名をいれてください:崖の上のポニョ 該当なし e 考察 プログラムには「となりのトトロ」の主題歌は「さんぽ」というデータがある。 これを実際に実行してみると、「となりのトトロ の主題歌は さんぽ です」 と実行される。 プログラムにデータのないものを入力した場合は「該当なし」と実行される。 実際にデータのない「崖の上のポニョ」と入力すると、「該当なし」と実行さ れる。 したがって、このプログラムは正しく実行されたといえる。 C プログラム(hash_register.rb) a 考えた設定 知りたい作品が出てこない場合、作品名・題名の対を登録させ、結果を出力す るプログラムを考えた b 作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' song = Hash.new # Hash.newで新しいhashを作る songsong = Hash.new song["となりのトトロ"] = "さんぽ" # hashの設定 song["魔女の宅急便"] = "やさしさに包まれたなら" song["千と千尋の神隠し"] = "いつも何度でも" song["天空の城ラピュタ"] = "君をのせて" song["ハウルの動く城"] = "世界の約束" print("作品の題名と主題歌を入力してください。(Ctrl + Dで終了)\n") # print文で文章を表示させる ghibli = gets.chomp # 入力された文字の改行を切取り変数ghibliの中にいれる if song.key?(ghibli) == true # もしtrueだったら(データの中に入力された文字があればtrue、なかったらfalse) printf("%s の主題歌は %s です。\n", ghibli, song[ghibli]) # printhで文章を表示させる else # もしそれ以外だったら print("該当しません\n") # print文で文章を表示 print("新しくデータを加えます。\n") while true # 繰り返す STDERR.printf("作品の題名を入力してください(終了ならCtrl + D):\n") # STDERR.printfで文章を表示させる ghibli = gets # 入力された文字の部分を変数ghiliの中にいれる if ghibli == nil # もしghibliがnilだったら break # 終了 else # もしそれ以外だったら ghibli = ghibli.chomp # 入力された文字の改行部分を切取り変数ghibliの中にいれる end # ifに対するend printf("主題歌を入力してください:\n") # printfで文章を表示させる songsong[ghibli] = gets # 入力された文字の部分を変数songsongo[ghibli]の中にいれる end # whileに対するend for ghiblighibli in songsong.keys # hashの対を表示させる printf("%s の主題歌は %s", ghiblighibli, songsong[ghiblighibli]) # printfで文章を表示させる end # forに対するend end # ifに対するend c もとにしたプログラム hash_data.rbとhash_pair.rbを参考にプログラムを作成した d 実行結果 データにあるものを入力した場合 pan{c109001}% ./hash_choice.rb [~/Ruby] 知りたい題名をいれてください:となりのトトロ となりのトトロ の主題歌は さんぽ です。 データにないものを入力した場合 pan{c109001}% ./hash_register.rb [~/Ruby] 作品の題名と主題歌を入力してください。(Ctrl + Dで終了) 崖の上のポニョ 該当しません 新しくデータを加えます。 作品の題名を入力してください(終了ならCtrl + D): 崖の上のポニョ 主題歌を入力してください: 崖の上のポニョ 作品の題名を入力してください(終了ならCtrl + D): 崖の上のポニョ の主題歌は 崖の上のポニョ e 考察 プログラムには「となりのトトロ」の主題歌は「さんぽ」というデータがある。 これを実際に実行してみると「となりのトトロ の主題歌は さんぽ です。」 と実行される。 プログラムにデータのないものを入力した場合は、新しくデータを加えること ができる。実際にデータのない「崖の上のポニョ」と入力してみると、「新し くデータを加えます」と表示され、新しくデータを加えることができ、その結 果を出力することができた。 したがって、このプログラムは正しく実行されたといえる。 3 感想 実際に使われていると思うものは、レジである。理由は、商品のバーコードを 読み込むと、それに合った商品の値段が出力される。したがって、hashが使わ れているはずだ。 4 参考文献 CyberLibrarian http://www.asahi-net.or.jp/~ax2s-kmtn/ref/bdh.html 2進数、16進数と10進数 tips on computer for librarians, 1998- ---------------------------------------------------------------- 基礎プログラミング II 第2回 http://roy/~madoka/2010/r2/02/02_03_theme_02_hash_input.html 「入力したデータを取り出そう」 http://roy/~madoka/2010/r2/02/02_04_theme_03_existornot.html 「あるかないか」 http://roy/~madoka/2010/r2/02/02_05_theme_04_initialize.html 「対にないものが呼び出されたとき」 http://roy/~madoka/2010/r2/02/02_07_theme_06_forprint.html 「Hash の対を表示するには」 著者:西村まどか 5 共同学習者 小松 由里 久保田 瑛一朗 横山 広樹 6 添付