第 2 回 なになにといえばこれこれ レポート課題 氏名:鈴木椎菜 学籍番号:C1101276 語学クラス:英語6 コース(系):社会福祉 1.筆記問題 A. ある物語の題名とヒロインを対にする。 hash配列をhanashiとする。 1…key "アラジン" に対して value "ジャスミン" 2…key "リトルマーメイド" に対して value "アリエル" 3…key "美女と野獣" に対して value "ベル" 4…key "眠れる森の美女" に対して value "オーロラ姫" 5…key "君に届け" に対して value "多部未華子" 表し方その1 hanashi["アラジン"] = "ジャスミン" hanashi["リトルマーメイド"] = "アリエル" hanashi["美女と野獣"] = "ベル" hanashi["眠れる森の美女"] = "オーロラ姫" hanashi["君に届け"] = "多部未華子" 表し方その2 hanashi = {"アラジン" => "ジャスミン", "リトルマーメイド" => "アリエル", "美女と野獣" => "ベル", "眠れる森の美女" => "オーロラ姫", "君に届け"=> "多部未華子"} B. 計算問題 a. 16)2010 10(a) ----- 16) 125 13(d) ----- 7 答.0x7da b. 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 ------ 1 答.0b1111011010 確認 0b0111 = 0x7 0b1101 = 0xd 0b1010 = 0xa 2 プログラム問題 提出する問題: D <設定> Hash配列を使用して物語の題名とそのヒロインを対にしたプログラム。 hash_date.datは初めにopenメソッドで読み込むようにした。 その後、プログラム実行者に物語の題名を入力してもらい、そのヒロインを表示するプログラム。 <プログラム本体> (1)hash_read.rb #!/usr/koeki/bin/ruby $KCODE = 'e' hanashi = Hash.new # 変数hanashi を Hash変数にする print"\nどどん!!\n\n" open("hash_date.dat","r")do |a| # データhash_date.datを読み取り専用で読みこみむ while line = a.gets # 読みこんだものを一行ずつ取り出してlineに代入 /(\S+)\s(\S+)/e =~line # lineのデータから、一部分を取り出す sto = $1 # 一行上の一個目の(S+)を$1として取り出し、変数stoに代入 hir = $2 # 二行上の二個目の(S+)を$2として取り出し、変数hirに代入 hanashi[sto] = hir # stoとhirをそれぞれHash変数hanashiのkey,valueに入れていく end end while true print"○●○ヒロインわかるかな!○●○\n" # ""でくくられたものを表示する。\nは改行。 print"---------------------------------\n" hanashi.keys.each{|pipipi| # hanashiのkeyの要素を変数pipipiに入れる printf("%s\n",pipipi) } print"---------------------------------\n" print"どの物語のヒロイン知りたいですか??\n全部知りたかったら ぜんぶ を入力!!\n終わりたくなったらe\n" print"→" j = gets.chomp # 変数jに入力したものを代入 if j == "e" # もし変数jがeなら break # 繰り返し(while true)から抜ける elsif j == "ぜんぶ" # もし変数jが"ぜんぶ"なら print"じゃあ表にしてあげるよ!!ほほ!!\n" sleep(1) # 2秒休む print" 物語 ヒロイン\n" print"-------------------- ----------------\n" for story,hiroine in hanashi # hanashiのkeyの要素をstoryに、valueの要素をhiroineに入れる printf("%20s %19s\n\n", story, hiroine) end sleep(2) # 2秒休む elsif hanashi.key?(j) == false # (jに代入されているもの)がhanashiのkeyの中になかったら print"選択肢にはありません。\n" # この処理 else # それ以外なら print"---------------------------------\n" printf("%sのヒロインは…\n%sちゃんです\n\n", j, hanashi[j]) sleep(2) # 2秒休む end end print"ありがとうございましたあ\n" (2)hash_date.dat アラジン ジャスミン リトルマーメイド アリエル 美女と野獣 ベル 眠れる森の美女 オーロラ姫 君に届け 多部未華子 <実行結果> その1 スムーズに終わる pan{SUZUKI Shiina}% ./hash_read.rb [~/Ruby] どどん!! ○●○ヒロインわかるかな!○●○ --------------------------------- 眠れる森の美女 アラジン リトルマーメイド 美女と野獣 君に届け --------------------------------- どの物語のヒロイン知りたいですか?? 全部知りたかったら ぜんぶ を入力!! 終わりたくなったらe →リトルマーメイド --------------------------------- リトルマーメイドのヒロインは… アリエルちゃんです ○●○ヒロインわかるかな!○●○ --------------------------------- 眠れる森の美女 アラジン リトルマーメイド 美女と野獣 君に届け --------------------------------- どの物語のヒロイン知りたいですか?? 全部知りたかったら ぜんぶ を入力!! 終わりたくなったらe →美女と野獣 --------------------------------- 美女と野獣のヒロインは… ベルちゃんです ○●○ヒロインわかるかな!○●○ --------------------------------- 眠れる森の美女 アラジン リトルマーメイド 美女と野獣 君に届け --------------------------------- どの物語のヒロイン知りたいですか?? 全部知りたかったら ぜんぶ を入力!! 終わりたくなったらe →e ありがとうございましたあ その2 間違える+ぜんぶのデータをみる pan{c110127}% ./hash_read.rb [~/Ruby] どどん!! ○●○ヒロインわかるかな!○●○ --------------------------------- 眠れる森の美女 アラジン リトルマーメイド 美女と野獣 君に届け --------------------------------- どの物語のヒロイン知りたいですか?? 全部知りたかったら ぜんぶ を入力!! 終わりたくなったらe →arajin 選択肢にはありません。 ○●○ヒロインわかるかな!○●○ --------------------------------- 眠れる森の美女 アラジン リトルマーメイド 美女と野獣 君に届け --------------------------------- どの物語のヒロイン知りたいですか?? 全部知りたかったら ぜんぶ を入力!! 終わりたくなったらe →ぜんぶ じゃあ表にしてあげるよ!!ほほ!! 物語 ヒロイン -------------------- ---------------- 眠れる森の美女 オーロラ姫 アラジン ジャスミン リトルマーメイド アリエル 美女と野獣 ベル 君に届け 多部未華子 ○●○ヒロインわかるかな!○●○ --------------------------------- 眠れる森の美女 アラジン リトルマーメイド 美女と野獣 君に届け --------------------------------- どの物語のヒロイン知りたいですか?? 全部知りたかったら ぜんぶ を入力!! 終わりたくなったらe →e ありがとうございましたあ <考察> その1 プログラムの初めに、選択してもらう項目(つまり、Hash配列hanashiのkeyの要 素)を表示したかった。 -----1回目---------- print"○●○ヒロインわかるかな!○●○\n" print"---------------------------------\n" print"リトルマーメイド\n美女と野獣\nアラジン\n眠れる森の美女\n君に届け\n" print"---------------------------------\n" print"どの物語のヒロイン知りたいですか??\n全部知りたかったら ぜんぶ を入力!!\n終わりたくなったらe\n" print"→" -------------------- もしHash配列のkey要素が増えたら対応できないな… と思い、考えなおした。 -----2回目---------- print"○●○ヒロインわかるかな!○●○\n" print"---------------------------------\n" hanashi.keys.each{|pipipi| printf("%s\n",pipipi) } print"---------------------------------\n" print"どの物語のヒロイン知りたいですか??\n全部知りたかったら ぜんぶ を入力!!\n終わりたくなったらe\n" print"→" -------------------- Hash変数.keys.each{|変数| printf("%s\n",変数) } とすれば、Hash配列の要素が増えても対応できると思った。 思った通りに作動した。 その2 キーボードで入力したあと、if文を使用して "e"の時はbreak "ぜんぶ"の時はHash配列hanashiの中身を全部表示 上記二つ以外で、Hash配列hanashiのkeyの中の文字列と一致しなかった時はその時専用の表示 それ以外(つまりhanashiのkeyの中の文字列と一致した時)はその時専用の表示 がしたかったのだが、うまく作動しなかった。 ------1回目-------------------------- if hanashi.key?(j) == false print"選択肢にはありません。\n" elsif j == "e" break elsif j == "ぜんぶ" print"じゃあ表にしてあげるよ!!ほほ!!\n" sleep(1) print" 物語 ヒロイン\n" print"-------------------- ----------------\n" for story,hiroine in hanashi printf("%20s %19s\n\n", story, hiroine) end redo sleep(2) end else print"---------------------------------\n" printf("%sのヒロインは…\n%sちゃんです\n\n", j, hanashi[j]) sleep(2) end ------------------------------------- これだと、変数jが"e"でも"ぜんぶ"の場合でも「選択肢にはありません」と表示されてしまう。 ------2回目-------------------------- if j == "e" break end if j == "ぜんぶ" print"じゃあ表にしてあげるよ!!ほほ!!\n" sleep(1) print" 物語 ヒロイン\n" print"-------------------- ----------------\n" for story,hiroine in hanashi printf("%20s %19s\n\n", story, hiroine) end sleep(2) end if hanashi.key?(j) == false print"選択肢にはありません。\n" else print"---------------------------------\n" printf("%sのヒロインは…\n%sちゃんです\n\n", j, hanashi[j]) sleep(2) end end -------------------------------------- 順番を入れ替えた。 j == "e" はうまく作動したが、 j == "ぜんぶ"では、 sleep(1) print" 物語 ヒロイン\n" print"-------------------- ----------------\n" for story,hiroine in hanashi printf("%20s %19s\n\n", story, hiroine) end sleep(2) の処理は行ったが、その後に「選択肢にはありません。」も表示された。 そのため、if j == "ぜんぶ" の部分だけ修正した。 ------3回目-------------------------- if j == "ぜんぶ" print"じゃあ表にしてあげるよ!!ほほ!!\n" sleep(1) print" 物語 ヒロイン\n" print"-------------------- ----------------\n" for story,hiroine in hanashi printf("%20s %19s\n\n", story, hiroine) end redo sleep(2) end -------------------------------------- これだとうまくいった。 redoをいれたことにより、次のifに進む前に繰り返しをやり直したため if hanashi.key?(j) == false には該当しなかった。 しかし、なんだかifが多い。 そのため順番を整理した。 ------4回目-------------------------- if j == "e" break elsif j == "ぜんぶ" print"じゃあ表にしてあげるよ!!ほほ!!\n" sleep(1) print" 物語 ヒロイン\n" print"-------------------- ----------------\n" for story,hiroine in hanashi printf("%20s %19s\n\n", story, hiroine) end sleep(2) elsif hanashi.key?(j) == false print"選択肢にはありません。\n" else print"---------------------------------\n" printf("%sのヒロインは…\n%sちゃんです\n\n", j, hanashi[j]) sleep(2) end end -------------------------------------- 今度こそすっきりとしたプログラムでうまくいった。 elsif hanashi.key?(j) == false print"選択肢にはありません。\n" の処理がされる前に同じifメソッドの中で他の処理をしておけば良い。 気が付くのが少し遅かった。 しかし、redoやifの順番について改めて考え、学ぶことができたので 遠回りして良かったと思う。 3.感想 Hash配列が実際に使われていそうだと思ったものは、私が働いているアルバイト先で、 コンピューターに顧客の番号を入力するとその顧客の情報がでてくるので、 顧客の番号がkeyで情報がvalueになっていれば、使われている可能性もあるのではないかと思った。 電話番号や住所などの多くの細かい情報は一つの対ではできないとしても、 顧客番号と名前を対にして、その先は他のメソッドなどを使っているとも考えられると思う。 4.参考文献など 筆記問題Bの計算問題(進数の対応表) ・基礎プログラミングI(神田クラス)第9回講義ノート URL http://roy/~naoya/ruby/9.html 筆記問題Aとプログラム ・基礎プログラミングII(西村クラス)第2回講義ノート URL http://roy/~madoka/2011/r2/02/ ・前期にとった自分のノート ・講義でとった自分のノート --------------------------- 東北公益文科大学 公益学部 公益学科 2年 鈴木椎菜 c110127@f.koeki-u.ac.jp