第 3 回 情報の構造を分析しよう レポート課題 氏名:鈴木椎菜 学籍番号:c1101276 語学クラス:英語6 コース(系):社会福祉 レポートの提出先アドレスを間違えていました。 そのことに第 4 回の講義時に気が付いたため、 遅刻で提出させていただきます。 こちらのミスで申し訳ありませんが、採点よろしくお願いします。 1 筆記問題 A shiina suzuki s 0x73 10進数 115 h 0x68 10進数 104 i 0x69 10進数 105 i 0x69 10進数 105 n 0x6e 10進数 110 a 0x61 10進数 97 s 0x73 10進数 115 u 0x75 10進数 117 z 0x7a 10進数 122 u 0x75 10進数 117 k 0x6b 10進数 107 i 0x69 10進数 105 B (1つ目) このこねこがすきらしいよ →このこ ねこが すき らしいよ(この子ねこが好きらしいよ) →このこねこが すき らしいよ(この子ねこが好きらしいよ) →このこね こがすき らしいよ(この子ね焦がす気らしいよ) (2つ目) それがいこつ →それ がいこつ(それ骸骨) →それが いこつ(それが遺骨) (3つ目) すずきしいなかった →すずきしいな かった(鈴木椎菜勝った) →すずきしいな いなかった(鈴木氏いなかった) C 歴史の偉人とその人の情報をHash配列starとしました。 starの key は偉人の名前 value[0] は生まれた年 value[1] は亡くなった年 value[2] はその人が何をした人か としました。 設定したもの key "織田信長"に対し、 value 1841, 1909, "初代総理大臣" key "伊藤博文"に対し、 value 1534, 1582, "本能寺の変" key "聖徳太子"に対し、 value 573, 622, "憲法十七条制定" key "アインシュタイン"に対し、 value 1879, 1955, "1905年相対性理論" key "キング牧師"に対し、 value 1929, 1968, "黒人解放運動・公民権運動の指導者" 表記方法その1 star["伊藤博文"] = 1841, 1909, "初代総理大臣" star["織田信長"] = 1534, 1582, "本能寺の変" star["聖徳太子"] = 574, 622, "憲法十七条制定" star["アインシュタイン"] = 1879, 1955, "1905年相対性理論" star["キング牧師"] = 1929, 1968,"黒人解放運動・公民権運動の指導者" 表記方法その2 star = {"伊藤博文" => [1841, 1909, "初代総理大臣"] "織田信長" => [1534, 1582, "本能寺の変"] "聖徳太子" => [574, 622, "憲法十七条制定"] "アインシュタイン" => [1879, 1955, "1905年相対性理論"] "キング牧師" => [1929, 1968, "黒人解放運動・公民権運動の指導者"]} 2.プログラム問題 <選択した問題> D <設定> 歴史的偉人の名前と生まれた年、亡くなった年、特徴のデータ が入っているhash_ary_data.datを読みこみ、 生まれた年順に表示、また、今年の西暦を入力してもらい、 歴史的偉人が現在も生きていたら何歳なのかを表示するプログラム。 <プログラム本体> その1 hash_ary_read.rb #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コード star = Hash.new # 変数starをHash配列にする open("hash_ary_data.dat","r")do |hensu| # データhash_ary_date.datを読み取り専用で読みこみむ while line = hensu.gets # 読みこんだものを一行ずつ取り出してlineに代入 if/(\S+)\s(\S+)\s(\S+)\s(\S+)/ =~line # lineから部分的に四ヶ所取り出す star[$1] = $2.to_i, $3.to_i, $4 # 取り出したものをstarのHash配列に入れていく。 end # if文をとじる end # whileをとじる end # openメソッドをとじる print"お年を召した順に歴史の偉人を紹介します。\n" # 文字を表示させる sleep(1) # 1秒休む star.keys.sort{|ijin,hensin| # star配列のkeyを、次の行で選択したvalueに対応させて小さい順に並び変える準備 star[ijin][0] <=> star[hensin][0]}.each{|hensin| # 変更前の形<=> 変更後の形(いずれも変更したい要素番号を指定) printf("%sさん\n生まれは%d年 亡くなったのは%d年 %sをした人\n", hensin, star[hensin][0], star[hensin][1], star[hensin][2]) # 数値や文字を表示 sleep(1) # 1秒休む } print"では今もし生きていたら何歳でしょうか。\n" print"今年は西暦何年ですか??\n" nen = STDIN.gets.to_i # 変数nenに入力された値を代入 star.keys.sort{|ijin,hensin| # star配列のkeyを小さい順に並び帰る準備 star[ijin][0] <=> star[hensin][0]}.each{|hensin| # 変更前の形<=> 変更後の形(いずれも変更したい要素番号を指定) age = nen - star[hensin][0] # nen - star[hensin][0]の結果をageに代入 printf("%sさんは今、%d歳です!!\n", hensin, age) } その2 hash_ary_data.dat 伊藤博文 1841 1909 初代総理大臣 織田信長 1534 1582 本能寺の変で自殺 聖徳太子 574 622 憲法十七条制定 アインシュタイン 1879 1955 1905年相対性理論 キング牧師 1929 1968 黒人解放運動・公民権運動の指導者 <実行結果> 一回目 pan{SUZUKI Shiina}% ./hash_ary_read.rb [~/Ruby] お年を召した順に歴史の偉人を紹介します。 聖徳太子さん 生まれは574年 亡くなったのは622年 憲法十七条制定をした人 織田信長さん 生まれは1534年 亡くなったのは1582年 本能寺の変で自殺をした人 伊藤博文さん 生まれは1841年 亡くなったのは1909年 初代総理大臣をした人 アインシュタインさん 生まれは1879年 亡くなったのは1955年 1905年相対性理論をした人 キング牧師さん 生まれは1929年 亡くなったのは1968年 黒人解放運動公民権運動の指導者をした人 では今もし生きていたら何歳でしょうか。 今年は西暦何年ですか?? 2011 聖徳太子さんは今、1437歳です!! 織田信長さんは今、477歳です!! 伊藤博文さんは今、170歳です!! アインシュタインさんは今、132歳です!! キング牧師さんは今、82歳です!! 二回目 pan{c110127}% ./hash_ary_read.rb [~/Ruby] お年を召した順に歴史の偉人を紹介します。 聖徳太子さん 生まれは574年 亡くなったのは622年 憲法十七条制定をした人 織田信長さん 生まれは1534年 亡くなったのは1582年 本能寺の変で自殺をした人 伊藤博文さん 生まれは1841年 亡くなったのは1909年 初代総理大臣をした人 アインシュタインさん 生まれは1879年 亡くなったのは1955年 1905年相対性理論をした人 キング牧師さん 生まれは1929年 亡くなったのは1968年 黒人解放運動公民権運動の指導者をした人 では今もし生きていたら何歳でしょうか。 今年は西暦何年ですか?? 1929 聖徳太子さんは今、1355歳です!! 織田信長さんは今、395歳です!! 伊藤博文さんは今、88歳です!! アインシュタインさんは今、50歳です!! キング牧師さんは今、0歳です!! <考察> 正規表現について、 --------- open("hash_ary_data.dat","r")do |hensu| if/(\S+)\s(\S+)\s(\S+)\s(\S+)/ =~hensu star[$1] = $2.to_i, $3.to_i, $4 end end --------- うまく作動しない。 助言を得ながら、おそらく一行ずつ読みこむ作業が必要であるのではないかと思 い、修正をした。 whileメソッドを使用し、一行ずつ変数lineに代入していく作業を行った。 ---------------- open("hash_ary_data.dat","r")do |hensu| while line = hensu.gets ←ここ if/(\S+)\s(\S+)\s(\S+)\s(\S+)/ =~line star[$1] = $2.to_i, $3.to_i, $4 end end end ----------------- これでうまく作動した。 Hash配列の並び替えについて 1.valueの配列を並び替える処理 star.keys.sort{|ijin,hensin| star[ijin][0] <=> star[hensin][0]} 2.valueに配列が入っている場合にそれを一つずつ取り出すeachメソッドの処理 この二つをうまく組み合わせることがうまくいかなかった。 そこで助言を得、 配列を並び替えた1の作業ごと、2のeachメソッドで要素をとりだすようにしたら うまくプログラムが作動した。 3.感想 三匹の子ブタ あるところに三匹の子ブタが住んでいました。 三匹はそれぞれおうちを建てました。 それを見ていた狼は、一匹ずつ訪ねていって、食べてしまおうと考えました。 <"一匹目"のおうち> 狼「"一匹目"、"わらの家"だ。こんにちは。開けておくれ。」 "一匹目"「いやだよう。」 狼「なんだと!?こんな"わらの家"、"吹き飛ば"してやる!!」 "ふー" "一匹目"は食べられてしまいました。 <"二匹目"のおうち> 狼「"二匹目"、"木の家"だ。こんにちは。開けておくれ。」 "二匹目"「いやだよう。」 狼「なんだと!?こんな"木の家"、"体当り"してやる!!」 "ばーん" "二匹目"は食べられてしまいました。 <"三匹目"のおうち> 狼「"三匹目"、"レンガの家"だ。こんにちは。開けておくれ。」 "三匹目"「いやだよう。」 狼「なんだと!?こんな"レンガの家"、"煙突から浸入"してやる!!」 "ぼちゃーん" なんと、煙突の下には沸騰したお湯がありました。 狼「助けてくれー!!」 三匹目「もう悪いこともしないで、お兄さんたちもかえしてくれる??」 狼「わかったから、助けてくれ!!」 そして三匹目は狼を助けてあげると、狼は逃げていき、 三匹の子ブタはレンガの家で仲良く暮らしました。 ""に入る文字が繰り返される部分です。 4.参考文献など ASCIIコード 初心者のためのポイント学習C言語 URL http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html プログラム 基礎プラミングII西村クラス講義ノート URL http://roy/~madoka/2011/r2/03/lec/resume.html 感想 福娘童話集 三匹の子ブタ URL http://hukumusume.com/douwa/pc/world/11/22.htm 助言 東北公益文科大学2年 伊藤桜子 東北公益文科大学2年 武田拓也 --------------------------- 東北公益文科大学 公益学部 公益学科 2年 鈴木椎菜 c110127@f.koeki-u.ac.jp