第3回 基礎プログラミング II レポート課題 氏名: xxxxxxxx 学籍番号: C109xxx 語学クラス: 英語3 コース(系): 政策マネジメント 1-A. Kaneta Asami を、ASCIIコードで表すと、 K = 0x4b a = 0x61 n = 0x6e e = 0x65 t = 0x74 a = 0x61 A = 0x41 s = 0x73 a = 0x61 m = 0x6d i = 0x69 である。 1-B. とうさん か つらかった な (倒産か。つらかったな。) とうさん かつらかった な (父さん、カツラ買ったな。) 1-C. 代表的な資源4つ(原油、天然ガス、ウラン、銅、金)とそのデータを、 配列 resource とした。 resource の key と value はそれぞれ資源名と、その資源のデータ (最大産出国、最も生産量の大きな企業、可採年数[年])とした。 1:key「原油」に対して、value「"サウジアラビア", "Exxon Mobil", "41"」 2:key「天然ガス」に対して 「"ロシア", "Gazprom", "67"」 3:key「ウラン」に対して 「"カナダ", "Cameco", "85"」 4:key「銅」に対して 「"チリ", "CODELCO", "36"」 5:key「金」に対して 「"中国", "Barrick Gold", "17"」 これに対応する Hash の表し方は2種類ある。1つはまとめて指定する方法、 resource = { "原油" => ["サウジアラビア", "Exxon Mobil", "41"], "天然ガス" => ["ロシア", "Gazprom", "67"], "ウラン" => ["カナダ", "Cameco", "85"], "銅" => ["チリ", "CODELCO", "36"], "金" => ["中国", "Barrick Gold", "17"] } 2つ目はひとつひとつ指定する方法、 resource["原油"] = ["サウジアラビア", "Exxon Mobil", "41"] resource["天然ガス"] = ["ロシア", "Gazprom", "67"] resource["ウラン"] = ["カナダ", "Cameco", "85"] resource["銅"] = ["チリ", "CODELCO", "36"] resource["金"] = ["中国", "Barrick Gold", "17"] である。 参考文献 「原油 -資源について-」 http://resource.ashigaru.jp/oil.html 「天然ガス -資源について-」 http://resource.ashigaru.jp/gas.html 「主要生産国 -ウラン-」 http://resource.ashigaru.jp/uranium_3.html 「主要生産国 -銅-」 http://resource.ashigaru.jp/copper_3.html 「主要生産国 -金-」 http://resource.ashigaru.jp/gold_3.html 以上すべてWEBサイト 「資源について」より 著者 DGX100. WEBサイト: 山賀 進のWeb Site 「金属資源」 http://www.s-yamaga.jp/kankyo/kankyo-shigen-1.htm 著者 山賀 進 ------------------------------------------------------ 2. Dを選択した。解説はDについてのみだが、A,B,C,Dのプログラムも添付した。 a. A-D問題で作成した hash_ary_print.rb , hash_ary_sort.rb , hash_ary_calc.rb を元に、4つの資源(原油、天然ガス、ウラン、銅、金)の、 最大産出国、最大生産企業、可採年数を表示した上で、 可採年数が短い順に並べ直し、さらに4つの資源の可採年数を合わせて 平均を演算するプログラム hash_ary_read.rb を作成した。 hash_ary_read.rb はデータとプログラムが分離しており、 hash_ary_data.dat と合わせて実行することで、 データを読み込み実行するようになっている。 なお、先に作成したA-D問題のファイルは授業で作成した hash_sesame.rb を参考に作成した。 b. *データファイル 原油 サウジアラビア Exxon_Mobil 41 天然ガス ロシア Gazprom 67 ウラン カナダ Cameco 85 銅 チリ CODELCO 36 金 中国 Barrick_Gold 17 ----------- *プログラムファイル #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語のコードを使用する指示 resource = Hash.new # Hash を resourceにしまう while data = gets # data にデータファイルの配列をしまう if /(\S+)\s+(\S+)\s+(\S+)\s+(\d+)/ =~ data # データファイルが、文字列 /空白/ 文字列 /空白/ 数列 という構成だったら resource[$1] = [$2, $3, $4.to_i] # Hash の key に1行目、value に2,3,4行目を順番にしまう end # while の end end # if の end for name, data in resource # key,value,Hash を定義し、行いたい操作(この場合 printf)を指示できるように。 printf("%s の最大の産出国は %s で、世界最大の生産企業は %s です。\nあと %d 年利用できるといわれています。\n\n", name, data[0], data[1], data[2]) # values の1つ目、2つ目、3つ目を代入。 end # for文のend print("\n可採年数が短い順に並べ替えます。\n\n") resource.keys.sort{|max, min| # sort で小さい順に並び替え。mは変更前、uは変更後の変数 resource[max][2] <=> resource[min][2] # 3番目のvalueを並べ替える(コンピュータの数え始めは0から)。 }.each{|year| # each でひとつずつ切り出す。year は仮の変数。 #p year #p resource[year] printf("%s の可採年数は %d 年です。\n\n", year, resource[year][2]) #並び替えたvalue(3番目)を代入。 } print("\n可採年数の平均を出します。\n\n") total = 0 # この時点での合計は0 avg =0 for name, data in resource # key,value,Hash を定義し、行いたい操作(この場合は計算)を指示できるように total += data[2] # 各 Hash の3つ目の value を足していく avg = total.to_f / resource.length # total を Hash の数(5)で割る。 end printf("5つの資源の可採年数を平均すると、%5.1f年です。\n", avg) # 小数点を含めて全体で5桁、小数点以下は1桁までを表示。 c. 元にしたC問題の hash_ary_calc.rb からの大きな変更点は、 データファイルを付け足して実行することで読み込むように、 while data = gets if /(\S+)\s+(\S+)\s+(\S+)\s+(\d+)/ =~ data resource[$1] = [$2, $3, $4.to_i] end end の部分を追加したことである。この部分は hash_sesame.rbを参考に作成した。 また、平均を算出する部分も、hash_sesame.rb を参考にしたが、 hash_sesame.rb が、Hash ごとの value0,1,2,3 の合計を算出するような 内容だったのに対し、全体のHashの value2を合計するように 作らなければならなかったので、+= で Hash の合計を積み立てるようにした。 その上で、平均を出す avg = total.to_f / resource.length を付け加えた。 その他は変数や条件部分など細々とした変更である。 d. pan{c109046}% ./hash_ary_read.rb hash_ary_data.dat [~/Ruby] 天然ガス の最大の産出国は ロシア で、世界最大の生産企業は Gazprom です。 あと 67 年利用できるといわれています。 銅 の最大の産出国は チリ で、世界最大の生産企業は CODELCO です。 あと 36 年利用できるといわれています。 金 の最大の産出国は 中国 で、世界最大の生産企業は Barrick_Gold です。 あと 17 年利用できるといわれています。 原油 の最大の産出国は サウジアラビア で、世界最大の生産企業は Exxon_Mobil です。 あと 41 年利用できるといわれています。 ウラン の最大の産出国は カナダ で、世界最大の生産企業は Cameco です。 あと 85 年利用できるといわれています。 可採年数が短い順に並べ替えます。 金 の可採年数は 17 年です。 銅 の可採年数は 36 年です。 原油 の可採年数は 41 年です。 天然ガス の可採年数は 67 年です。 ウラン の可採年数は 85 年です。 可採年数の平均を出します。 5つの資源の可採年数を平均すると、 49.2年です。 pan{c109046}% Hash が全て出力され、数値の小さい順に並び替えも行なわれている。 e 17 + 36 + 41 + 67 + 85 246 246 / 5 49.20000000000000000000 手計算の結果、正しい平均が算出されたことがわかった。 これ以外の部分について考察だが、A問題のように、print で表示させるだけの プログラムであれば、数列の valueに""をつけていても 問題なく表示されるのだが、sortで並べ替えや、計算させるように 書いた場合は""をつけると数字と認識されないために、 エラーが出ることがわかった。 また、最初にデータファイルで、"Exxon Mobil"のように 配列に空白を使ってしまったため、正しく切り取られない問題があった。 if /(\S+)\s+(\S+)\s+(\S+\d\S+)\s+(\d+)/ =~ data と変更したところ、きれいに切り取られるようになったのだが、 今度は空白を使用していない Hash が読み込めないようになってしまったため、 空白は_に置き換えることで対応した。 3 なかなか理解ができなかった Hashだが、問題に取り組んでいるうちに 把握できるようになってきた。 あとはもっと効率良くレポート作成ができるようにがんばりたい。 繰り返しで進行する物語としては、ギリシャ神話に登場する エロスの妻プシュケの物語が挙げられると思う。 プシュケは夫を裏切ったために2度と会えないことになってしまったが、後悔して、 もう一度会わせてほしいと姑アフロディテに申し出た。 それに対し激怒している姑は、与えた難題を乗り越えられたら会わせてやろうという。 試練:山積みの芥子と粟と麦粒(混ざっている)を選り分けろ → [夫に命じられた]大量の蟻がやってきて[試練を助けてしまう] → [夫が手を回したことがバレて姑激怒、新しい難題を出す] → 試練:狂暴な金の羊の毛を取って来い → [夫に命じられた]河辺の葦が取り方を教えて[試練を助けてしまう] → [夫が手を回したことがバレて姑激怒、新しい難題を出す] → 試練:冥界の王妃に美しさを分けてもらってこい → 今度は夫が自ら王妃にとりなしを頼み、了承をもらう。 色々あって姑も納得して、よりを戻すことができて、めでたしめでたし。 参考文献 *平均の出し方の参考 基礎プログラミング I 第7回 正規表現と Ruby 言語でのプログラミング 「新駅をどこにつくるか」 http://roy/~madoka/2010/r1/07/07_16_appendix_02_analysis.html 共同学習者: 笹原千珠子