第 2 回 なになにといえばこれこれ レポート課題 氏名:高田美咲 学籍番号:C1110909 語学クラス:英語1 コース:政策マネジメントコース 1. A. 食材の特徴を Hash 配列 eat とする。 eat の key と value はそれぞれ 食べ物 と 栄養素 にとる。 その 1: key 「米」 に対して value は 「炭水化物」 その 2: key 「卵」 に対して value は 「たんぱく質」 その 3: key 「バター」 に対して value は 「脂質」 その 4: key 「レモン」 に対して value は 「ビタミン」 その 5: key 「しいたけ」 に対して value は 「食物繊維」 これに対応する Hash の表し方は color["米"] = "炭水化物" color["卵"] = "たんぱく質" color["バター"] = "脂質" color["レモン"] = "ビタミン" color["しいたけ"] = "食物繊維" また、もう一つの表し方は { "米" => "炭水化物", "卵" => "たんぱく質", "バター" => "脂質", "レモン" => "ビタミン", "しいたけ" => "食物繊維" } B. < 10進数から16進数へ変換 > a.0d 2012 = 0x ?? 10進数を16で割り、余りを下から並べる。 10以上の数は次のように変換する。 10 = a 11 = b 12 = c 13 = d 14 = e 15 = f 2012 / 16 = 125 余り 12 ↑ cに変換 125 / 16 = 7 余り 13 dに変換 7 / 16 = 0 余り 7 ↑ 0d 2012 = 0x 7dc となる。 < 10進数から2進数に変換 > b.0d 2012 = 0b ?? 10進数を2で割り、余りを下から並べる。 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 ↑ 0d 2012 = 0b 11111011100となる。 < 0b 11111011100を16進数に変換 > 右から4桁ずつに区切り、2の0乗、2の1乗、2の2乗、2の3乗を掛ける。 それぞれで出た値を区切りごとに足す。 1 1 1 / 1 1 0 1 / 1 1 0 0 * * * * * * * * * * * 2^2 2^1 2^0 2^3 2^2 2^1 2^0 2^3 2^2 2^1 2^0 ------------- ------------------ ------------------ 4 + 2 + 1 = 7 8 + 4 + 0 + 1 = 13 8 + 4 + 0 + 0 = 12 ------------- ------------------ ------------------ 7 13 = d に変換 12 = c に変換 0b 11111011100 = 0x 7dc となり、問aと問bは同じ答えになった。 2. A < 設定 > 食材と栄養素が表示される。 < プログラム > hash_for.rb #!/usr/koeki/bin/ruby #coding: euc-jp eat = Hash.new #Hashで配列 eat["米"] = "炭水化物" #配列の中身 eat["卵"] = "たんぱく質" eat["バター"] = "脂質 " eat["レモン"] = "ビタミン" eat["しいたけ"] = "食物繊維" for food,nutrient in eat #for in で何なに の これこれ printf("%s\tは %s\tが豊富に含まれています。\n",food,nutrient) end #endで終了 < もとにしたプログラム、変更点 > hash_shop.rb と hash_pair.rb をもとにして、 「shop」を 「eat」 「item」 「price」 を 「food」 「nutrient」にそれぞれ変更した。 < 実行結果 > pan{c111090}% ./hash_for.rb [~/Ruby] 米 は 炭水化物 が豊富に含まれています。 卵 は たんぱく質 が豊富に含まれています。 バター は 脂質 が豊富に含まれています。 レモン は ビタミン が豊富に含まれています。 しいたけ は 食物繊維 が豊富に含まれています。 < 考察 > Hash 配列の eatで作成した部分がすべて表示された。 正しく機能している。 --------------------------------------------------- B < 設定 > 知りたい情報のみを結果として表示する。 < プログラム > hash_choice.rb #!/usr/koeki/bin/ruby #coding: euc-jp print("米 * 卵 * バター * レモン * しいたけ のことがわかります!\n\n") eat = Hash.new #Hash 配列 eat["米"] = "炭水化物" #配列の中身 eat["卵"] = "たんぱく質" eat["バター"] = "脂質 " eat["レモン"] = "ビタミン" eat["キノコ"] = "食物繊維" STDERR.print("食材を入力:") #入力部分 menu = gets.chomp #入力内容をとりこむ print("\n") if eat.key?(menu) == true #入力内容がeat配列にあったら printf("%s\tは %s\tが豊富に含まれています。\n",menu,eat[menu]) else #それ以外は printf("%sは..只今、調査中です。\n",menu) end #endで終了 < もとにしたプログラム、変更点 > Aで作成したhash_for.rbをもとに、入力部分と表示する文を付け加えた。 < 実行結果 > pan{c111090}% ./hash_choice.rb [~/Ruby] 米 * 卵 * バター * レモン * しいたけ のことがわかります! 食材を入力:レモン レモン は ビタミン が豊富に含まれています。 < 考察 > 正しく検索された場合は結果も正しく表示されている。 しかし、入力間違いがあったときや全く違う食材を検索されたときに対応する表 示がでるか確かめる。 pan{c111090}% ./hash_choice.rb [~/Ruby] 米 * 卵 * バター * レモン * しいたけ のことがわかります! 食材を入力:ぶどう ぶどうは..只今、調査中です。 この場合の対応文も表示され正しく機能した。 ---------------------------------------------- C < 設定 > ユーザに情報を登録させて結果をまとめて表示する。 < プログラム > hash_register.rb #!/usr/koeki/bin/ruby #coding: euc-jp eat = Hash.new #Hash 配列 STDERR.print("食材と栄養素を入力して下さい。\n")#STDERRでエラー時メッセージ表示 STDERR.print("入力終了はctrl D です。\n\n") #説明文 while true #繰り返し STDERR.print("食材を入力: ") #入力部分 food = gets #入力内容とりこむ if food == nil #ctrl dを入力されたら終了させる break else food = food.chomp #foodにとりこむ end STDERR.print("栄養素を入力: ") #入力部分 eat[food] = gets.chomp end STDERR.print("入力終了\n\n") for food, nutrient in eat #for in 何なに の これこれ printf("%s は %s を豊富に含んでいます。\n",food,nutrient) #表示文 end #endで終了 < もとにしたプログラム、変更点 > hash_pair.rbをもとにして「shop」「item」「price」部分を 「eat」「food」「nutrient」に変更した。 < 実行結果 > pan{c111090}% ./hash_register.rb [~/Ruby] 食材と栄養素を入力して下さい。 入力終了はctrl D です。 食材を入力: 米 栄養素を入力: 炭水化物 食材を入力: 卵 栄養素を入力: たんぱく質 食材を入力: バター 栄養素を入力: 脂質 食材を入力: レモン 栄養素を入力: ビタミン 食材を入力: しいたけ 栄養素を入力: 食物繊維 食材を入力: 入力終了 米 は 炭水化物 を豊富に含んでいます。 卵 は たんぱく質 を豊富に含んでいます。 バター は 脂質 を豊富に含んでいます。 レモン は ビタミン を豊富に含んでいます。 しいたけ は 食物繊維 を豊富に含んでいます。 < 考察 > 入力した情報が多くなると、見づらいため改行を1行増やす「\n」を プログラムに加えた。そして再度、実行した。 pan{c111090}% ./hash_register.rb [~/Ruby] 食材と栄養素を入力して下さい。 入力終了はctrl D です。 食材を入力: 米 栄養素を入力: 炭水化物 食材を入力: 卵 栄養素を入力: たんぱく質 食材を入力: バター 栄養素を入力: 脂質 食材を入力: レモン 栄養素を入力: ビタミン 食材を入力: しいたけ 栄養素を入力: 食物繊維 食材を入力: 入力終了 米 は 炭水化物 を豊富に含んでいます。 卵 は たんぱく質 を豊富に含んでいます。 バター は 脂質 を豊富に含んでいます。 レモン は ビタミン を豊富に含んでいます。 しいたけ は 食物繊維 を豊富に含んでいます。 改行を増やしたことで見やすく、結果もわかりやすいと思われる。 ------------------------------------------------ D < 設定 > データとプログラムを分離させ、入力された内容に関連する情報をデータから読 み取る。 < データ > hash_data.dat 米 炭水化物 卵 たんぱく質 バター 脂質 レモン ビタミン しいたけ 食物繊維 < プログラム > hash_read.rb #!/usr/koeki/bin/ruby #coding: euc-jp print("栄養素を調べることができます。\n") print("米 * 卵 * バター * レモン * しいたけ\n\n") #説明文 STDERR.print("食材を入力: ") #入力部分 food = STDIN.gets.chomp #STDINで標準入力 re = Regexp.new(food,true) #Regexpで文字列を正規表現に変換 print("\n") open("hash_data.dat","r") do |data| #ファイル読みこみ while hash = data.gets #繰り返し if re =~ hash #if もし~なら if /(\S+)\s+(\S+)/ =~ hash #正規表現 printf("%s は、%s が豊富に含まれています。\n",$1,$2) #表示文 end end end end #endで終了 < もとにしたプログラム、変更点 > 前期に作成した ary_stdin.rb をもとにして、そこに open -- do を加えて データ読み取り機能をつけた。 < 実行結果 > pan{c111090}% ./hash_read.rb [~/Ruby] 栄養素を調べることができます。 米 * 卵 * バター * レモン * しいたけ 食材を入力: 卵 卵 は、たんぱく質 が豊富に含まれています。 < 考察 > データに入力した通りに結果が表示された。そして、米、卵、バター、レモン以 外を入力した時に間違った情報が表示されないか確認する。 pan{c111090}% ./hash_read.rb [~/Ruby] 栄養素を調べることができます。 米 * 卵 * バター * レモン * しいたけ 食材を入力: ごま 結果、何も表示されなかったため、正しく機能したといえる。 ------------------------------------------ E < 設定 > データとプログラムを分離させてユーザが入力した情報をデータに追加させる。 < 初期データ > hash_data.dat 米 炭水化物 卵 たんぱく質 バター 脂質 レモン ビタミン しいたけ 食物繊維 < プログラム > hash_write.rb #!/usr/koeki/bin/ruby #coding: euc-jp print("食材と栄養素を入力して下さい。\n") #説明文 print("入力終了は ctrl d です。\n\n") eat = Hash.new #Hash 配列 while true #繰り返し STDERR.print("食材を入力: ") #入力部分 food = gets #foodに入力 if food == nil #ctrl dを入力で終了させる break else #それ以外なら food = food.chomp #foodにとりこむ end STDERR.print("栄養素を入力: ") #入力部分 eat[food] = gets open("hash_data.dat","a") do |data| #データ追加書き込み data.printf("%s\t\t%s",food,eat[food]) #datファイルに書きこまれる文 end end #endで終了 print("入力終了\n\n") #表示文 for food,nutrient in eat #for in で何なに の これこれ printf("%s\t\t%sをデータとして追加しました。\n\n",food,nutrient) end #endで終了 < もとにしたプログラム、変更点 > 問題 D で作成した hash_read.rb をもとにして open -- do のモードを "r"から"a"に変更した。 < 実行結果 > pan{c111090}% ./hash_write.rb [~/Ruby] 食材と栄養素を入力して下さい。 入力終了は ctrl d です。 食材を入力: ぶどう 栄養素を入力: ビタミン 食材を入力: 豆 栄養素を入力: たんぱく質 食材を入力: ひじき 栄養素を入力: ミラネル 食材を入力: 入力終了 ぶどう ビタミン をデータとして追加しました。 豆 たんぱく質 をデータとして追加しました。 ひじき ミラネル をデータとして追加しました。 < 考察 > プログラム本体は正しく機能したが、データの方に情報が正しく追加されている か確認する。 * データ追加後 * hash_data.dat 米 炭水化物 卵 たんぱく質 バター 脂質 レモン ビタミン しいたけ 食物繊維 ぶどう ビタミン 豆 たんぱく質 ひじき ミラネル 食材、栄養素ともに指定した場所に追加されている。 このことからプログラム、データともに正常に作動したといえる。 3. 感想 携帯電話の中の電話帳は名前、電話番号、メールアドレスなどをデータとしてま とめる時に使われていると思う。 今回の課題はプログラム問題のA、B、Cくらいまでは講義で学んだ内容を思い出 して作成した。D、Eについては前期に学んだことを復習しつつ、自分なりに作成 出来たと思う。来週の講義に向けて、今のうちに分からないところは友達に聞い たり前の講義ページを確認するなどして理解しておきたいと思う。 4. 参考資料 西村まどか 基礎プログラミングI 第7回 正規表現とRuby言語でのプログラミング 「自動印刷を行うには」 http://roy/~madoka/2012/r1/07/r1_07_16_theme_13_filewrite.html 基礎プログラミングII 第2回 なになにといえばこれこれ 「入力したデータを取り出そう」 http://roy/~madoka/2012/r2/02/r2_02_03_theme_02_hash_input.html 「Hash の対を表示するには」 http://roy/~madoka/2012/r2/02/r2_02_07_theme_06_forprint.html 「プログラムを書く際の約束事」 http://roy/~madoka/2012/r2/02/r2_02_01_review_01_program.html