第 3 回 情報の構造を分析しよう レポート課題 氏名:高田美咲 学籍番号:C1110909 語学クラス:英語1 コース:政策マネジメントコース 1. A. alphabet T A K A D A M I S A K I ASCII コード 0x54 0x41 0x4b 0x41 0x44 0x41 0x4d 0x49 0x53 0x41 0x4b 0x49 ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ 10進数表記 0d84 0d65 0d75 0d65 0d68 0d65 0d77 0d73 0d83 0d65 0d75 0d73 alphabet t a k a d a m i s a k i ASCII 0x74 0x61 0x6b 0x61 0x64 0x61 0x6d 0x69 0x73 0x61 0x6b 0x69 ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ 10進数 0d116 0d97 0d107 0d97 0d100 0d97 0d109 0d105 0d115 0d97 0d107 0d105 B. "おしょくじけんをはっけんする"( 3 例 ) おしょくじ けん を はっけん する (お食事券を発券する) おしょくじ けん を はっけん する (お食事券を発見する) おしょく じけん を はっけん する (汚職事件を発見する) 同じ文章でできる内容が変なもの ( 2 例 ) おしょくじ けん を はっけん する (お食事犬を発見する) お しょくじ けん を はっけん する (お食餌犬を発見する) C. 食材の特徴を Hash 配列 food とする。 foodのkeyとvalueはそれぞれ食材名とその栄養素、カロリー、英語表記にとる。 その 1: key 「米」 に対して value は 「炭水化物,252,rice」 その 2: key 「卵」 に対して value は 「たんぱく質,106,egg」 その 3: key 「バター」 に対して value は 「脂質,98,butter」 その 4: key 「レモン」 に対して value は 「ビタミン,30,lemon」 その 5: key 「しいたけ」 に対して value は 「食物繊維,10,shiitake mushroom」 これに対応する Hash の表し方は food["米"] = "炭水化物",252,"rice" food["卵"] = "たんぱく質",106,"egg" food["バター"] = "脂質",98,"butter" food["レモン"] = "ビタミン",30,"lemon" food["しいたけ"] = "食物繊維",10,"shiitake mushroom" また、もう一つの表し方は { "米" => "炭水化物",252,"rice", "卵" => "たんぱく質",106,"egg", "バター" => "脂質",98,"butter", "レモン" => "ビタミン",30,"lemon", "しいたけ" => "食物繊維",10,"shiitake mushroom" } 2. A < 設定 > 食材、栄養素、カロリー、英語表記をすべて表示する。 < プログラム > hash_ary_print.rb #!/usr/koeki/bin/ruby # coding: euc-jp food = Hash.new #Hashで配列 food["米"] = "炭水化物",252,"rice" #配列の中身 food["卵"] = "たんぱく質",106,"egg" food["バター"] = "脂質 ",98,"butter" food["レモン"] = "ビタミン",30,"lemon" food["しいたけ"] = "食物繊維",10,"shiitake mushroom" for eat,nutrient in food #for in で何なに の これこれ printf("%s(%s)\tは %s\tが豊富に含まれています。\n",eat,nutrient[2],nutrient[0]) printf("1食分、または1個あたりのカロリーは %s [kcal] です。\n\n",nutrient[1]) end #endで終了 < もとにしたプログラム、変更点 > hash_for.rb をもとにして、valueの内容を追加した。 < 実行結果 > pan{TAKADA Misaki}% ./hash_ary_print.rb [~/Ruby] 米(rice) は 炭水化物 が豊富に含まれています。 1食分、または1個あたりのカロリーは 252 [kcal] です。 卵(egg) は たんぱく質 が豊富に含まれています。 1食分、または1個あたりのカロリーは 106 [kcal] です。 バター(butter) は 脂質 が豊富に含まれています。 1食分、または1個あたりのカロリーは 98 [kcal] です。 レモン(lemon) は ビタミン が豊富に含まれています。 1食分、または1個あたりのカロリーは 30 [kcal] です。 しいたけ(shiitake mushroom) は 食物繊維 が豊富に含まれています。 1食分、または1個あたりのカロリーは 10 [kcal] です。 < 考察 > プログラムに登録した対がすべて表示された。 正しく機能している。 ----------------------------------------------- B < 設定 > カロリーを低い順に表示する。 < プログラム > hash_ary_sort.rb #!/usr/koeki/bin/ruby # coding: euc-jp food = Hash.new #Hashで配列 food["米"] = "炭水化物",252,"rice" #配列の中身 food["卵"] = "たんぱく質",106,"egg" food["バター"] = "脂質 ",98,"butter" food["レモン"] = "ビタミン",30,"lemon" food["しいたけ"] = "食物繊維",10,"shiitake mushroom" print("カロリーが低い順に表示します。\n\n") food.keys.sort{|c,e| #sortで低い順 food[c][1] <=> food[e][1] }.each{|nu| #eachで並べ替え printf("%sは、%d [kcal] です。\n",nu,food[nu][1]) } < もとにしたプログラム、変更点 > hash_pair.rb をもとにして、「価格の高い順」を「カロリーの低い順」 に変更した。 < 実行結果 > pan{c111090}% ./hash_ary_sort.rb [~/Ruby] カロリーが低い順に表示します。 しいたけは、10 [kcal] です。 レモンは、30 [kcal] です。 バターは、98 [kcal] です。 卵は、106 [kcal] です。 米は、252 [kcal] です。 < 考察 > プログラムに登録した対がすべて低い順に正しく表示された。 ----------------------------------------------- C < 設定 > 問Bに付け加えて、カロリーの合計を表示する。 < プログラム > hash_ary_calc.rb #!/usr/koeki/bin/ruby # coding: euc-jp food = Hash.new #Hashで配列 food["米"] = "炭水化物",252,"rice" #配列の中身 food["卵"] = "たんぱく質",106,"egg" food["バター"] = "脂質 ",98,"butter" food["レモン"] = "ビタミン",30,"lemon" food["しいたけ"] = "食物繊維",10,"shiitake mushroom" print("カロリーが低い順に表示します。\n\n") food.keys.sort{|c,e| #sortで小さい順 food[c][1] <=> food[e][1] }.each{|nu| #eachで並べ替え printf("%sは、%d [kcal] です。\n",nu,food[nu][1]) } print("\n") total = 0 #total初期値 for eat,nutrient in food #何なにのこれこれ total += nutrient[1] #totalの計算 end print("この5つを全部食べたとすると。。\n") printf("カロリーの合計は %d [kcal]です。\n",total) #print文で表示 < もとにしたプログラム、変更点 > hash_ary_sort.rb をもとにして、合計の計算を付け加えた。 < 実行結果 > pan{c111090}% ./hash_ary_calc.rb [~/Ruby] カロリーが低い順に表示します。 しいたけは、10 [kcal] です。 レモンは、30 [kcal] です。 バターは、98 [kcal] です。 卵は、106 [kcal] です。 米は、252 [kcal] です。 この5つを全部食べたとすると。。 カロリーの合計は 496 [kcal]です。 < 考察 > 合計の数値が正しいか確認する。 pan{c111090}% bc -l [~/Ruby] 10 + 30 + 98 + 106 + 252 496 quit 確認の結果、プログラムでの数値と等しくなったため、 カロリー計算部分も正常に作動している。 ------------------------------------ D < 設定 > データとプログラムを分離させる。 そして、カロリーが低い順、合計の計算を表示する。 < データ > hash_ary_data.dat 米 炭水化物 252 rice 卵 たんぱく質 106 egg バター 脂質 98 butter レモン ビタミン 30 lemon しいたけ 食物繊維 10 shiitake mushroom < プログラム > hash_ary_read.rb #!/usr/koeki/bin/ruby # coding: euc-jp food = Hash.new open("hash_ary_data.dat","r") do |data| #ファイル読みこみ while hash = data.gets #繰り返し if /(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/ =~ hash #正規表現 food[$1] = [$2,$3.to_i,$4] end end end #endで終了 print("カロリーが低い順に表示します。\n\n") food.keys.sort{|c,e| #sortで小さい順 food[c][1] <=> food[e][1] }.each{|nu| #eachで並べ替え printf("%sは、%d [kcal] です。\n",nu,food[nu][1]) } print("\n") total = 0 #total初期値 for eat,nutrient in food #何なにのこれこれ total += nutrient[1] #totalの計算 end print("この5つを全部食べたとすると。。\n") printf("カロリーの合計は %d [kcal]です。\n",total) #print文で表示 < もとにしたプログラム、変更点 > 問C hash_ary_calc.rb をデータとプログラムに分離させた。 < 実行結果 > pan{c111090}% ./hash_ary_read.rb [~/Ruby] カロリーが低い順に表示します。 しいたけは、10 [kcal] です。 レモンは、30 [kcal] です。 バターは、98 [kcal] です。 卵は、106 [kcal] です。 米は、252 [kcal] です。 この5つを全部食べたとすると。。 カロリーの合計は 496 [kcal]です。 < 考察 > データとプログラムを分離させても問Cと同じく表示された。 そしてカロリー合計の計算部分を確認する。 pan{c111090}% bc -l [~/Ruby] 10 + 30 + 98 + 106 + 252 496 quit こちらも実行結果と確認計算が同じになったため問題はなかった。 -------------------------------------------- E < 設定 > 問Dに付け加えて、平均値を表示する。 < データ > 問Dと同じものを使用する(hash_ary_data.dat) 米 炭水化物 252 rice 卵 たんぱく質 106 egg バター 脂質 98 butter レモン ビタミン 30 lemon しいたけ 食物繊維 10 shiitake mushroom < プログラム > hash_each_func.rb #!/usr/koeki/bin/ruby # coding: euc-jp food = Hash.new open("hash_ary_data.dat","r") do |data| #ファイル読みこみ while hash = data.gets #繰り返し if /(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/ =~ hash #正規表現 food[$1] = [$2,$3.to_f,$4] end end end #endで終了 print("カロリーが低い順に表示します。\n\n") food.keys.sort{|c,e| #sortで小さい順 food[c][1] <=> food[e][1] }.each{|nu| #eachで並べ替え printf("%sは、%d [kcal] です。\n",nu,food[nu][1]) } print("\n") total = 0 #total初期値 ave = 0 for eat,nutrient in food #何なにのこれこれ total += nutrient[1] #totalの計算 end ave = total / 5 print("この5つを全部食べたとすると。。\n") printf("カロリーの合計は %d [kcal]です。\n\n",total) #print文で表示 printf("カロリーの平均は %3.1f [kcal]です。\n",ave) < もとにしたプログラム、変更点 > 問D hash_ary_read.rb に平均値が表示されるプログラムを追加した。 < 実行結果 > pan{c111090}% ./hash_each_func.rb [~/Ruby] カロリーが低い順に表示します。 しいたけは、10 [kcal] です。 レモンは、30 [kcal] です。 バターは、98 [kcal] です。 卵は、106 [kcal] です。 米は、252 [kcal] です。 この5つを全部食べたとすると。。 カロリーの合計は 496 [kcal]です。 カロリーの平均は 99.2 [kcal]です。 < 考察 > 平均値の部分を確認する。 pan{c111090}% bc -l [~/Ruby] 10 + 30 + 98 + 106 + 252 496 496 / 5 99.20000000000000000000 quit 実行結果と小数部分まで同じ値になった。 -------------------------------------- -------------------------------------- F( 未完成 ) < 設定 > ユーザに選択された情報と似た情報も別個に表示する。 < プログラム > hash_rec.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_ary_data.dat","r") do |data| #ファイル読みこみ while hash = data.gets #繰り返し if re =~ hash #if もし~なら if /(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/ =~ hash #正規表現 printf("%s(%s) は、%s が豊富に含まれています。\n",$1,$4,$2) printf("1食分または、1個のカロリーは %s [kcal]です。\n",$3) end end end end #endで終了 < もとにしたプログラム、変更点 > hash_choice.rb と hash_read.rb をもとにして作成した。 < 実行結果 > pan{c111090}% ./hash_rec.rb [~/Ruby] 一つ選択して下さい。 米 * 卵 * バター * レモン * しいたけ 食材を入力: バター バター(butter) は、脂質 が豊富に含まれています。 1食分または、1個のカロリーは 98 [kcal]です。 < 考察 > ユーザに一つ選択させて表示するまでは完成して正しく機能した。 しかし似た情報を別個に出力するまでは進めなかった。 ------------------------------------- 3. 感想 Webのメールサービスについては、本人に必要な情報が記載される部分とその他 に分離させて、その他の部分に広告を出力させていると思った。 今回はプログラム問題のFが完成出来なかった。作成し始めた時の考えはユーザ に選択してもらい、if文を使って何とかできないかとも考えたがその後分からず 完成までに至らなかった。この問題については他の人のプログラムを見て学びた いと思う。 4. 参考資料 西村まどか 基礎プログラミングII 第2回 なになにといえばこれこれ 「key の並び換え」 http://roy/~madoka/2012/r2/02/r2_02_11_appendix_04_sortinkey.html 「each を使って並び換え」 http://roy/~madoka/2012/r2/02/r2_02_08_appendix_01_each.html 基礎プログラミングII 第3回 情報の構造を分析しよう 「一つずつ取り出すには / 並べ替えを詳しく行うには」 http://roy/~madoka/2012/r2/03/r2_03_04_review_04_each.html MIYABIダイエットオンライン 食材別カロリー表 http://www.miyabi.com/diet/doc/cal_20.html