第 2 回 なになにといえばこれこれ レポート課題 氏名:浅沼佑香 学籍番号:C1110039 語学クラス:英語1 コース:社会福祉コース 1.A.暦の特徴を hash 配列 calender としました。 calender の key と value はそれぞれ月名と昔の読み方(旧暦)をとりました。 その 1:key「1月」に対して value は「睦月」 その 2:key「2月」に対して value は「如月」 その 3:key「3月」に対して value は「弥生」 その 4:key「4月」に対して value は「卯月」 その 5:key「5月」に対して value は「皐月」 これに対応する Hash の表し方は calender["1月"] = "睦月" calender["2月"] = "如月" calender["3月"] = "弥生" calender["4月"] = "卯月" calender["5月"] = "皐月" また、もう一つの表し方は {"1月" => "睦月", "2月" => "如月", "3月" => "弥生", "4月" => "卯月", "5月" => "皐月"} B.a.0d 2012 = 0x?? 10進数2012を割れなくなるまで16で割り、割ったときの余りを下から上に読 むと16進数の答えが出てくる。結果は下の通りである。 2012 / 16 = 125 … 12 125 / 16 = 7 … 13 ↑下から上に読む 7 / 16 = 0 … 7 このとき、12→c、13→d と表現することができるから、 16進数の答えは、 0d2012 = 0x7dc である。 〜bc -lで計算確認〜 pan{c111003}% bc -l [~/Ruby] 2012/16 125.75000000000000000000 125/16 7.81250000000000000000 7/16 .43750000000000000000 計算は上とあっていたので、答えは正しいといえる。 b.0d 2012 = 0b?? 10進数を2進数に変換するには、10進数2012を割れなくなるまで2でわり続け る。割ったときの余りを下から上に4つずつ区切って読むと16進数の答えが 出てくる。結果は下の通りである。 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 下から上に読むと、 11111011100 と表すことができる。 よって、0d 2012 = 0b11111011100 が2進数の答えになる。 〜bc -lで計算確認〜 pan{c111003}% bc -l [~/Ruby] 2012/2 1006.00000000000000000000 1006/2 503.00000000000000000000 503/2 251.50000000000000000000 251/2 125.50000000000000000000 125/2 62.50000000000000000000 62/2 31.00000000000000000000 31/2 15.50000000000000000000 15/2 7.50000000000000000000 7/2 3.50000000000000000000 3/2 1.50000000000000000000 1/2 .50000000000000000000 上の計算とあっていたので、答えは正しいといえる。 また、これを右から4つに区切ると、 0111 | 1101 | 1100 と分けることができる。 それぞれ 0111→7、1101→d、 1100→c と16進数変換できるので、 答えは、0d2012 = 0x7dc である。 問aと問bどちらの計算方法も答えが一致したので、16進数は、0x7dc である。 2.筆記問題1で作った対を利用して、プログラムを作成した。 A.登録してある対をすべて表示するプログラム。 <プログラム(hash_for.rb)> #!/usr/koeki/bin/ruby #couding: euc-jp calender = Hash.new #Hash配列はcalender calender["1月"] = "睦月" calender["2月"] = "如月" calender["3月"] = "弥生" calender["4月"] = "卯月" calender["5月"] = "皐月" for tuki in calender.keys #for 値(キー名) in hash配列名.keys printf("%s の旧暦は %s です。\n", tuki, calender[tuki]) #文字を表示 end #forの文終わり <実行結果> pan{c111003}% ./hash_for.rb [~/Ruby] 1月 の旧暦は 睦月 です。 2月 の旧暦は 如月 です。 3月 の旧暦は 弥生 です。 4月 の旧暦は 卯月 です。 5月 の旧暦は 皐月 です。 <考察> 対のデータをプログラムで実行した際に、正しく表示された。なので、このプロ グラムは、正しいといえる。 <参考文献> 最後に記載 B.知りたい情報だけを表示するプログラム。 <プログラム(hash_choice.rb)> #!/usr/koeki/bin/ruby #couding: euc-jp calender = Hash.new #Hash配列はcalender calender["1月"] = "睦月" calender["2月"] = "如月" calender["3月"] = "弥生" calender["4月"] = "卯月" calender["5月"] = "皐月" print("ようこそ!!暦検索へ\n") #文を表示 print("\n1月〜5月の中から1つ選んで入力して下さい。\n") #文を表示 STDERR.print("\n調べたい月は?: ") #文を表示 tuki = gets.chomp #tukiを読みこませる if calender.key?(tuki) == true #keyを調べ、なければvalueの値を返す printf("\n %s の旧暦は「 %s」 です。\n", tuki, calender[tuki]) #文字を表示 else #そうでない場合 print("\nデータはありません\n") end #if文は終わり <前のプログラムとの変更点> for文のところをif文に変えて、検索できるプログラムにした。 <実行結果> 〜検索できる場合〜 pan{ASANUMA Yuka}% ./hash_choice.rb [~/Ruby] ようこそ!!暦検索へ 1月〜5月の中から1つ選んで入力して下さい。 調べたい月は?: 1月 1月 の旧暦は 睦月 です。 pan{c111003}% ./hash_choice.rb [~/Ruby] ようこそ!!暦検索へ 1月〜5月の中から1つ選んで入力して下さい。 調べたい月は?: 2月 2月 の旧暦は「 如月」 です。 pan{c111003}% ./hash_choice.rb [~/Ruby] ようこそ!!暦検索へ 1月〜5月の中から1つ選んで入力して下さい。 調べたい月は?: 3月 3月 の旧暦は「 弥生」 です。 pan{c111003}% ./hash_choice.rb [~/Ruby] ようこそ!!暦検索へ 1月〜5月の中から1つ選んで入力して下さい。 調べたい月は?: 4月 4月 の旧暦は「 卯月」 です。 pan{c111003}% ./hash_choice.rb [~/Ruby] ようこそ!!暦検索へ 1月〜5月の中から1つ選んで入力して下さい。 調べたい月は?: 5月 5月 の旧暦は「 皐月」 です。 〜検索できない場合〜 pan{c111003}% ./hash_choice.rb [~/Ruby] ようこそ!!暦検索へ 1月〜5月の中から1つ選んで入力して下さい。 調べたい月は?: 6月 データはありません <考察> 文字をきちんと打たないと、プログラムが実行されないことがわかった。表示さ れるものとされないものの区別がされていて、プログラムは正しく表示されたと いえる。 <参考文献> 最後に記載 C.知りたい情報が出てこない場合に、ユーザに対を登録させ、結果を出力するプ ログラム。 <プログラム(hash_register.rb)> #!/usr/koeki/bin/ruby #couding: euc-jp calender = Hash.new #Hash配列はcalender calender["1月"] = "睦月" calender["2月"] = "如月" calender["3月"] = "弥生" calender["4月"] = "卯月" calender["5月"] = "皐月" print("ようこそ!!暦検索へ\n") #文を表示 print("\n1月〜5月の中から1つ選んで入力して下さい。\n") #文を表示 STDERR.print("\n調べたい月は?: ") #文を表示 tuki = gets.chomp #tukiを読みこませる if calender.key?(tuki) == true #keyを調べ、なければvalueの値を返す printf("\n %s の旧暦は「 %s」 です。\n", tuki, calender[tuki]) #文字を表示 else #そうでない場合 print("\nデータはありません。\n") #文を表示 print("\n新しいデータが必要です。\n") #文を表示 while true #while文始まり STDERR.print("\n月名を入力して下さい(終了はCtrl-D): ") #文字を表示 tukimei = gets #改行をtukiの中に入れる if tukimei == nil #もしtukimeiがnilである場合 break #while trueを抜ける else #そうでない場合 tukimei = tukimei.chomp #改行をtukimeiの中に入れる end #if文の終わり STDERR.print("\n旧暦を入力して下さい: ") #文を表示 calender[tukimei] = gets.chomp #改行をcalender[tukimei]の中に入れる end #while文終わり STDERR.print("入力終了\n") for tukimei in calender.keys #Hashの中にkey,value printf("\n %s\tは 「%s」です。\n",tukimei, calender[tukimei]) #文を表示 end #for文終わり end #if文は終わり <前のプログラムとの変更点> ぷろぐらむ(hash_choice.rb)の下に「print("\n新しいデータが必要です。\n")」 から 「printf("\n %s\tは 「%s」です。\n",tukimei, calender[tukimei])」ま で、whlie文やif文を使用して付け加えた。 <実行結果> pan{c111003}% ./hash_register.rb [~/Ruby] ようこそ!!暦検索へ 1月〜5月の中から1つ選んで入力して下さい。 調べたい月は?: 6月 データはありません。 新しいデータが必要です。 月名を入力して下さい(終了はCtrl-D): 6月 旧暦を入力して下さい: 水無月 月名を入力して下さい(終了はCtrl-D): 入力終了 1月 は 「睦月」です。 2月 は 「如月」です。 3月 は 「弥生」です。 4月 は 「卯月」です。 5月 は 「皐月」です。 6月 は 「水無月」です。 <考察> 最初は、新しく入力した文字が表示されなくて、苦労した。気づいた点は、デー タを読みこませるために、「gets.chomp」にすると日本語に表示され、 「gets.to_i」にすると、数字が表示されることがわかった。また、入力した文 字が表示されたため、正しいプログラムだといえる。 <参考文献> 最後に記載 D.データ(hash_data.dat)から読みこむようにしたプログラム。 <データ(hash_data.dat)> 1 睦月 2 如月 3 弥生 4 卯月 5 皐月 <プログラム(hash_read.rb)> #!/usr/koeki/bin/ruby #couding: euc-jp calender = Hash.new #Hash配列はtuki print("\n月名と旧暦を表示します。\n") #文を表示 open("hash_data.dat","r") do |gatu| #データを読みこみ、gatuに置き換える while hash_data = gatu.gets #繰り返し、gatuがなくなったら終わる if/(\S+)\s+(\S+)/=~hash_data # 数字、空白、文字の順 calender[$1] = $2 #1列目はcalender end #if文終わり end #while文終わり end #open文終わり for tukimei in calender.keys #Hashの中にkey,value printf("\n %d月の旧暦は%sです。\n", tukimei, calender[tukimei]) #文を表示 end #for文終わり <前のプログラム・データとの変更点> Hashの対では、「1月」のように数字と漢字で表現していたが、データでは、「1」 のように、数字だけにした。 プログラムでは、open文とfor文を使い、データとプログラムを読みこませるよ うにした。 <実行結果> pan{ASANUMA Yuka}% ./hash_read.rb [~/Ruby] 月名と旧暦を表示します。 1月の旧暦は睦月です。 2月の旧暦は如月です。 3月の旧暦は弥生です。 4月の旧暦は卯月です。 5月の旧暦は皐月です。 <考察> 最初は、プログラムがなかなか読みこまなかった。データの配列を別けて、プロ グラムを起動していたことと、for文が抜けていることがわかり、直したところ 起動した。正しく実行されたため、結果は正しいといえる。 <参考文献> 最後に記載 E.新規データも含め、登録した情報(データ)を出力するプログラム。 <プログラム(hash_write.rb)> #!/usr/koeki/bin/ruby #couding: euc-jp calender = Hash.new print("新しいデータを入力しよう!!\n") #文を表示 while true #while文の始まり STDERR.print("\n月名を入力して下さい(終了はCtrl-D): ") #文を表示 tukimei = gets #改行をtukimeiの中に入れる if tukimei == nil #もしtukimeiがnilである場合 break #while trueを抜ける else #そうでない場合 tukimei = tukimei.chomp #改行をtukimeiの中に入れる end #if文の終わり STDERR.print("\n旧暦を入力して下さい: ") #文を表示 calender[tukimei] = gets.chomp #改行をcalender[tukimei]の中に入れる end #while文終わり STDERR.print("入力終了\n") #文を表示 open("hash_data.dat","w") do |gatu| #データを書きこみ、gatuに置き換える for tukimei in calender.keys #Hashの中にkey,value gatu.printf(" %s \t %s\n",tukimei, calender[tukimei]) #文を表示 end #for文終わり end #open文終わり <前のプログラムとの変更点> 問Cで作成したプログラム(hash_register.rb)にopen文を付け加えた。データ (hash_data.dat)に書きこむため、"w"モードにした。 <実行結果> 〜kterm上で〜 pan{ASANUMA Yuka}% ./hash_write.rb [~/Ruby] 新しいデータを入力しよう!! 月名を入力して下さい(終了はCtrl-D): 6月 旧暦を入力して下さい: 水無月 月名を入力して下さい(終了はCtrl-D): 7月 旧暦を入力して下さい: 文月 月名を入力して下さい(終了はCtrl-D): 8月 旧暦を入力して下さい: 葉月 月名を入力して下さい(終了はCtrl-D): 入力終了 〜データ(hash_data.dat)〜 6月 水無月 7月 文月 8月 葉月 <考察> データに入力通り書きこまれたので、プログラムは正しいといえる。 また、「printf」の前に、「|ここにいれたもの|.printf」と打たなければ、デー タに書きこまれないことがわかった。 <参考文献> 最後に記載 3.実際に使われているものは、携帯電話や電子辞書があてはあまると感じた。携 帯電話は電話する際にあらかじめ登録してから、電話をかけると繋がるしくみ になっているからである。電子辞書は、最初から調べられるものが決っており、 自分が調べたいものを打つと、それに当てはまるものが表示されたり、表示さ れなかったりするからである。 4.参考文献 ○「Ruby プログラミング基礎講座」 広瀬雄二 著 第 8 講 計算機の内部表現 8-1 2進数と16進数 p101〜106 ○基礎プログラミングII 第2回 (なになにといえばこれこれ) 西村 まどか ・対にないものが呼び出されたとき http://roy/~madoka/2012/r2/02/r2_02_05_theme_04_default.html ・Hashの対を表示するには http://roy/~madoka/2012/r2/02/r2_02_07_theme_06_forprint.html ・覚える順番は違うけれど答えは正しい http://roy/~madoka/2012/r2/02/r2_02_10_appendix_03_memory.html <共同学習者> 村上茉奈美 / 伊藤詩野 / 佐藤祐子