第2回 基礎プログラミング II レポート課題 氏名: xxxxxxxx 学籍番号:C10xxxx 語学クラス:英語1 コース(系):社会系 1.筆記問題 A. 作家の名前と主著を hash 配列 meisaku としました。 meisakuの key と value はそれぞれ作者名とその代表作をとりました。 その 1: key 「谷崎潤一郎」に対して value は「細雪」 その 2: key 「川端康成」に対して value は「雪国」 その 3: key 「井伏鱒二」に対して value は「山椒魚」 その 4: key 「三島由紀夫」に対して value は「美徳のよろめき」 その 5: key 「安部公房」に対して value は「砂の女」 これに対するHash の表し方は meisaku["谷崎潤一郎"] = "細雪" meisaku["川端康成"] = "雪国" meisaku["井伏鱒二"] = "山椒魚" meisaku["三島由紀夫"] = "美徳のよろめき" meisaku["安部公房"] = "砂の女" また、もう一つの表し方は {"谷崎潤一郎" => "細雪","川端康成" => "雪国","井伏鱒二" => "山椒魚", "三島由紀夫" => 美徳のよろめき"","安部公房" => "砂の女"} B. a.0d 2010 = 0x ?? まず10進数を16進数になおす。 2010を16で割って行く。 2010 / 16 = 125...10 125 / 16 = 7...13 7 / 16 = 0...7 そして計算したなかで出てきたあまりを、上述の式の下の方からかけていく。 16進数で7はそのままだが、13と10は13がDで、10がAだから7DAとなる。 よって、0x7DAとなる。 b.0d 2010 = 0b ?? 10進数を2進数になおす。ために、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 そして、この計算式の下の方からかけていき、ob11111011010になる。 ここからさらに、16進数になおし、先程の問題aと計算の答えが同じになるかを 確かめる。 ob11111011010 この数値を四けたごと区切る。 0111 1101 1010 0 * 2^3 = 0 1 * 2^2 = 4 1 * 2^1 = 2 1 * 2^0 = 1 0 + 4 + 2 + 1 = 7 1 * 2^3 = 8 1 * 2^2 = 4 0 * 2^1 = 0 1 * 2^0 = 1 8 + 4 + 9 + 1 = 13 1 * 2^3 = 8 0 * 2^2 = 0 1 * 2^1 = 2 0 * 2^0 = 0 8 + 0 + 2 + 0 = 10 16進数では13はD、10はAなので、0x7DAとなる。 よって、a解答と一致する。 2.プログラム問題 今回は問題A、B、Dを選択しました。 A.プログラム本体 #!/usr/koeki/bin/ruby $KCODE = 'e' # このプログラムの漢字コードは EUC である meisaku = Hash.new meisaku["谷崎潤一郎"] = "細雪" meisaku["川端康成"] = "雪国" meisaku["井伏鱒二"] = "山椒魚" meisaku["三島由紀夫"] = "美徳のよろめき" meisaku["安部公房"] = "砂の女" print("−日本文学名作選−\n") for name, title in meisaku printf("%s\t%s\n",name ,title) end 実行結果 pan{c107194}% ./hash_for.rb [~/Ruby] −日本文学名作選− 三島由紀夫 美徳のよろめき 安部公房 砂の女 谷崎潤一郎 細雪 川端康成 雪国 井伏鱒二 山椒魚 B.プログラム問題 #!/usr/koeki/bin/ruby $KCODE = 'e' # このプログラムの漢字コードは EUC である meisaku = Hash.new("未登録") meisaku["谷崎潤一郎"] = "細雪" meisaku["川端康成"] = "雪国" meisaku["井伏鱒二"] = "山椒魚" meisaku["三島由紀夫"] = "美徳のよろめき" meisaku["安部公房"] = "砂の女" print("−日本文学名作選−\n") print("作者名を入力:") name = gets.chomp if meisaku.key?(name) == false printf("%sは%sです\n",name,meisaku[name]) elsif meisaku.key?(name) printf("%sの代表作はb%sです\n",name,meisaku[name]) end 実行結果 pan{c107194}% ./hash_choice.rb [~/Ruby] −日本文学名作選− 作者名を入力:井伏鱒二 井伏鱒二の代表作はb山椒魚です pan{c107194}% ./hash_choice.rb [~/Ruby] −日本文学名作選− 作者名を入力:芥川龍之介 芥川龍之介は未登録です D.プログラム問題 #!/usr/koeki/bin/ruby $KCODE = 'e' # このプログラムの漢字コードは EUC である meisaku = Hash.new("未登録") open("hash_data.dat","r") do |bungaku| while sakuhin = bungaku.gets if /(\S+)\s+(\S+)/ =~ sakuhin meisaku[$1] = $2 end end end print("−日本文学名作選−\n") print("作者名を入力:") name = gets.chomp if meisaku.key?(name) == false printf("%sは%sです\n",name,meisaku[name]) elsif meisaku.key?(name) printf("%sの代表作は%sです\n",name,meisaku[name]) end データファイル 谷崎潤一郎 細雪 川端康成 雪国 井伏鱒二 山椒魚 三島由紀夫 美徳のよろめき 安部公房 砂の女 大江健三郎 万延元年のフットボール 寺山修司 毛皮のマリー 倉橋由美子 聖少女 澁澤龍彦 黒魔術の手帖 江戸川乱歩 人間椅子 北杜夫 楡家の人々 埴谷雄高 死霊 大岡昇平 レイテ戦記 有吉佐和子 恍惚の人 井上光晴 地の群れ 小島信夫 抱擁家族 深沢七郎 楢山節孝 中上健次 枯木灘 実行結果 pan{c107194}% ./hash_read.rb [~/Ruby] −日本文学名作選− 作者名を入力:寺山修司 寺山修司の代表作は毛皮のマリーです pan{c107194}% ./hash_read.rb [~/Ruby] −日本文学名作選− 作者名を入力:中上健次 中上健次の代表作は枯木灘です pan{c107194}% ./hash_read.rb [~/Ruby] −日本文学名作選− 作者名を入力:石原慎太郎 石原慎太郎は未登録です 感想 今回の課題に関しては、今日新しく授業でやったことが含まれていることは、 実際に取り組んでみて良く分かった。ただ、やってみて気になったのが、ある いは、前期の授業内容を心得ていて、その上、毎回出された課題もしっかりこ なしていたならば、さほど時間のかかるようなことはないのではないかという ことだった。それくらい、なんだかすらすらとはかどってしまった。 参考文献 基礎プログラミング II 第2回 なになにといえばこれこれ 「対にないものが呼び出されたとき」 http://roy/~madoka/2010/r2/02/02_05_theme_04_initialize.html 基礎プログラミング I 第7回 正規表現と Ruby 言語でのプログラミング 「券売機のしくみ」 http://roy/~madoka/2010/r1/07/07_13_theme_11_vendingmachine.html 協力してくれたTA 工藤智也