第2回 なになにといえばこれこれ レポート課題 氏名:伊藤桜子 学籍番号:c1100265 語学クラス:英語6 コース(系):政策マネジメント 1、 A 陰暦をhash配列inrekiとした。 inrekiのkeyは1月から5月、valueは睦月から皐月とした。 その1:key 「1月」に対してvalueは「睦月」 その2:key 「2月」に対してvalueは「如月」 その3:key 「3月」に対してvalueは「弥生」 その4:key 「4月」に対してvalueは「卯月」 その5:key 「5月」に対してvalueは「皐月」 これに対するHashの表しかたは inreki["1月"] = "睦月" inreki["2月"] = "如月" inreki["3月"] = "弥生" inreki["4月"] = "卯月" inreki["5月"] = "皐月" もう一つの表し方は {"1月"=>"睦月","2月"=>"如月","3月"=>"弥生","4月"=>"卯月","5月"=>"皐月"} B a, 0d 2010 = 0x ?? 10進数を16進数にする計算である。この計算をするには 2010を16で割り、その商を16で割っていく。最後に余りを 下から並べる。 16 ) 2010 10 -------- 16 ) 125 13 -------- 16 ) 7 7 -------- 0 → 7 13 10 これを16進数で表すと 7 = 7 13 = d 10 = a よって答えは 0d 2010 = 0x7da b, 0d 2010 = 0b ?? 10進数を2進数にする計算である。 この計算をするには2010を2で割り、その商を2で割っていく。 最後に余りを下から並べる。 2 ) 2010 0 -------- 2 ) 1005 1 -------- 2 ) 502 0 -------- 2 ) 251 1 -------- 2 ) 125 1 -------- 2 ) 62 0 -------- 2 ) 31 1 -------- 2 ) 15 1 -------- 2 ) 7 1 -------- 2 ) 3 1 -------- 2 ) 1 1 -------- 0 → 11111011010 よって答えは 0d 2010 = 0b11111011010 16進数に変換するにはまずbの答えを4桁に区切る。 →1010 1101 111 111は4けたに満たないので0を足して0111とする。 16進数に変換すると 0111 = 7 1101 = 13 1010 = 10 となる。 aの答えと一致したので正しい。 2、 A ○考えた設定 1月から5月までに対して睦月から皐月までの陰暦を表示する ○プログラム #!/usr/koeki/bin/ruby $KCODE = 'e' inreki = Hash.new #Hash配列をinrekiとする。 inreki["1月"] = "睦月" inreki["2月"] = "如月" inreki["3月"] = "弥生" inreki["4月"] = "卯月" inreki["5月"] = "皐月" for tsuki, koyomi in inreki # key = tsuki value = koyomi printf("%s は %s です。\n",tsuki, koyomi) end ○実行結果 pan{c110026}% ./hash_for.rb [~/Ruby] 4月 は 卯月 です。 5月 は 皐月 です。 1月 は 睦月 です。 2月 は 如月 です。 3月 は 弥生 です。 ○考察 プログラムのkeyとvalueの対が正しく実行されているため、この プログラムは正しいといえる。 B ○考えた設定 hash_for.rbのプログラムに加えてユーザーに聞かれたものだけを 表示する ○プログラム #!/usr/koeki/bin/ruby $KCODE = 'e' inreki = Hash.new #Hash配列をinrekiとする。 inreki["1月"] = "睦月" inreki["2月"] = "如月" inreki["3月"] = "弥生" inreki["4月"] = "卯月" inreki["5月"] = "皐月" STDERR.print("1月、2月、3月、4月、5月のいずれかを入力してください。\n") tsuki = gets.chomp if inreki.key?(tsuki) == false print("データがないです。\n") else printf("%s は %s です。\n",tsuki, inreki[tsuki]) end ○もとにしたプログラムの変更点 ・hash_for.rbをもとにした。printメソッドを使って、知りたい陰暦の 「月」を入力してもらった。 ・ifメソッドを使い、データにないものを入力されたときに「データに ないです」と表示できるようにした。 ○実行結果 pan{c110026}% ./hash_choice.rb [~/Ruby] 1月、2月、3月、4月、5月のいずれかを入力してください。 1月 1月 は 睦月 です。 pan{c110026}% ./hash_choice.rb [~/Ruby] 1月、2月、3月、4月、5月のいずれかを入力してください。 2月 2月 は 如月 です。 pan{c110026}% ./hash_choice.rb [~/Ruby] 1月、2月、3月、4月、5月のいずれかを入力してください。 3月 3月 は 弥生 です。 pan{c110026}% ./hash_choice.rb [~/Ruby] 1月、2月、3月、4月、5月のいずれかを入力してください。 4月 4月 は 卯月 です。 pan{c110026}% ./hash_choice.rb [~/Ruby] 1月、2月、3月、4月、5月のいずれかを入力してください。 5月 5月 は 皐月 です。 pan{c110026}% ./hash_choice.rb [~/Ruby] 1月、2月、3月、4月、5月のいずれかを入力してください。 6月 データがないです。 ○考察 知りたい陰暦の月を入力してもらい、正しい陰暦が表示されたので 対が正しく表示されたといえる。また、データにないものは「データ にないです」と表示された。よってこのプログラムは正しいと言える。 D ○考えた設定 hash_data.datにデータを保存し、hash_read.rbで入力された対の データを読みこみ、表示させるようにする ○プログラム #!/usr/koeki/bin/ruby $KCODE = 'e' inreki = Hash.new #Hash配列をinrekiとする。 open("hash_data.dat","r") do |koyomi| while line = koyomi.gets if/(\S+)\s+(\S+)\s+/ =~line inreki[$1] = $2 end end STDERR.print("1月、2月、3月、4月、5月のいずれかを入力してください。\n") tsuki = STDIN.gets.chomp if inreki.key?(tsuki) == false print("データがないです。\n") else printf("%sは%sです。\n",tsuki, inreki[tsuki]) end end ○データのプログラム 1月 睦月 2月 如月 3月 弥生 4月 卯月 5月 皐月 ○もとにしたプログラムの変更点 hash_choice.rbをもとにした。openメソッドを使ってhash_data.dat を読みこみ、入力された対のデータを表示できるようにした。 ○実行結果 pan{c110026}% ./hash_read.rb [~/Ruby] 1月、2月、3月、4月、5月のいずれかを入力してください。 1月 1月は睦月です。 pan{c110026}% ./hash_read.rb [~/Ruby] 1月、2月、3月、4月、5月のいずれかを入力してください。 2月 2月は如月です。 pan{c110026}% ./hash_read.rb [~/Ruby] 1月、2月、3月、4月、5月のいずれかを入力してください。 3月 3月は弥生です。 pan{c110026}% ./hash_read.rb [~/Ruby] 1月、2月、3月、4月、5月のいずれかを入力してください。 4月 4月は卯月です。 pan{c110026}% ./hash_read.rb [~/Ruby] 1月、2月、3月、4月、5月のいずれかを入力してください。 5月 5月は皐月です。 pan{c110026}% ./hash_read.rb [~/Ruby] 1月、2月、3月、4月、5月のいずれかを入力してください。 11月 データがないです。 ○考察 知りたい陰暦の月を入力すると別ファイルのデータを読みこみ、対の データが表示されたのでこのプログラムは正しいといえる。 また、データにないものを入力されると「データにないです。」と表示された ので正しいプログラムだといえる。 E ○考えた設定 入力された他の月のデータも登録し、既存のデータと一緒に表示できるようにした。 ○プログラム #!/usr/koeki/bin/ruby $KCODE = 'e' inreki = Hash.new #Hash配列をinrekiとする。 while true STDERR.print("知りたい陰暦の月を入力してください。終了はCtrl-D\n") tsuki = STDIN.gets open("hash_data.dat","a+") do |koyomi| while line = koyomi.gets if/(\S+)\s+(\S+)\s+/ =~line inreki[$1] = $2 end end end if tsuki == nil print("終了\n") break else tsuki = tsuki.chomp end print("登録したい陰暦を入力して下さい。\n") inreki[tsuki] = gets.chomp printf("%sは%sです。\n",tsuki, inreki[tsuki]) end for gatsu, reki in inreki printf("%s \t %s \n",gatsu, reki) end ○もとにしたプログラムの変更点 D問題をもとにした。 ・Ctrl-Dを押すと終了できるようにした。 ・登録したい月と陰暦を入力してもらい、最後にforメソッドで一覧表示 できるようにした。 ○実行結果 pan{c110026}% ./hash_write.rb [~/Ruby] 知りたい陰暦の月を入力してください。終了はCtrl-D 3月 登録したい陰暦を入力して下さい。 やよい 3月はやよいです。 知りたい陰暦の月を入力してください。終了はCtrl-D 6月 登録したい陰暦を入力して下さい。 水無月 6月は水無月です。 知りたい陰暦の月を入力してください。終了はCtrl-D 9月 登録したい陰暦を入力して下さい。 長月 9月は長月です。 知りたい陰暦の月を入力してください。終了はCtrl-D 12月 登録したい陰暦を入力して下さい。 師走 12月は師走です。 知りたい陰暦の月を入力してください。終了はCtrl-D 2月 登録したい陰暦を入力して下さい。 如月 2月は如月です。 知りたい陰暦の月を入力してください。終了はCtrl-D 終了 4月 卯月 5月 皐月 12月 師走 6月 水無月 9月 長月 1月 睦月 2月 如月 3月 弥生 ○考察 登録してあるデータをひらがなで入力するとどうなるかと思ったが、 きちんともとのデータの通り、漢字に変換されて表示されていた。 新しく入力した言葉もデータに加えて表示されていたのでこの プログラムは正しいといえる。 3、感想 課題を通して、インターネットで検索するとそのワードに関連する ページが表示されることが実際使われているものだと考えた。 今回の課題も私にとっては難しく、時間もかかった。しかし、計算問題 は忘れているところもあり、復習ができて良かったと思う。 プログラミングの問題ではD問題がなかなか実行できずに時間がかかってしまっ た。正規表現については友だちと教え合いながらでき、理解することができて良 かった。また、openメソッドでは今まで読みこみ専用のモードしか使ったことが なかったのでモードをどれにするか迷ったが、何度も試してみると「a+」でうま くいき、それぞれのモードの意味も再確認することができて良かった。 4、参考文献 神田先生の前期の7回目授業ページ http://roy/~naoya/ruby/7.html 神田先生の前期の8回目授業ページ http://roy/~naoya/ruby/8.html 神田先生の前期の9回目授業ページ http://roy/~naoya/ruby/9.html 西村先生の後期の2回目授業ページ http://roy/~madoka/2011/r2/02/ 協同学習者 畠山 貴衣 東北公益文科大学 公益学部 公益学科 2年 伊藤桜子 c110026@f.koeki-u.ac.jp