選択したプログラム問題の内容に誤りがあったため訂正しました。 第 3 回 情報の構造を分析しよう レポート課題 氏名: 土門千里 学籍番号: C1111122 語学クラス: 英語5 コース: 政策マネジメント 1. 筆記問題 A. 自分の名前をアルファベット表示に直すと、Domon Chisato となる。 これを、ASCIIコード表を参照にしてASCIIコードに直すと、 D = 0x44 o = 0x6f m = 0x6d o = 0x6f n = 0x6e C = 0x43 h = 0x68 i = 0x69 s = 0x73 a = 0x61 t = 0x74 o = 0x6f となる。 また、この結果が正しいかを調べるためプログラム name.rb を作成した。 a) 作成したプログラム #!/usr/koeki/bin/ruby # coding: euc-jp printf("%c%c%c%c%c %c%c%c%c%c%c%c\n", 0x44, 0x6f, 0x6d, 0x6f, 0x6e, 0x43, 0x68, 0x69, 0x73, 0x61, 0x74, 0x6f) b) プログラム実行結果 pan{c111112}% ./name.rb [~/Ruby] Domon Chisato c) 考察 ASCIIコード表を参考にして出した結果と、プログラム実行による結果が同じで あったため、ASCIIコード表を参考にして出した結果は正しいといえる。 次に、16 進数に変換したものを 10 進数に変換する。 0x は 16 進数、0d は 10 進数を表現する。 16 進数を 10 進数に変換するには、例えば 0x6f の場合には、「6」と「f」に 分ける。次に、右から 16 の 0乗、16 の 1乗 … を掛けていく。そして、最後 に全ての数字を足していくと 10 進数に変換した答えを求めることが出来る。 また、16 進数でアルファベットの A は 10、B は 11、C は 12、D は 13、E は 14、F は15 を表す。 0x44 = 4 * 16の1乗 + 4 *16の0乗 = 64 + 4 = 68 0x6f = 6 * 16の1乗 + f(15) * 16の0乗 = 96 + 15 = 111 0x6d = 6 * 16の1乗 + d(13) * 16の0乗 = 96 + 13 = 109 0x6f = 6 * 16の1乗 + f(15) * 16の0乗 = 96 + 15 = 111 0x6e = 6 * 16の1乗 + e(14) * 16の0乗 = 96 + 14 = 110 0x43 = 4 * 16の1乗 + 3 * 16の0乗 = 64 + 3 = 67 0x68 = 6 * 16の1乗 + 8 * 16の0乗 = 96 + 8 = 104 0x69 = 6 * 16の1乗 + 9 * 16の0乗 = 96 + 9 = 105 0x73 = 7 * 16の1乗 + 3 * 16の0乗 = 112 + 3 = 115 0x61 = 6 * 16の1乗 + 1 * 16の0乗 = 96 + 1 = 97 0x74 = 7 * 16の1乗 + 4 * 16の0乗 = 112 + 4 = 116 0x6f = 6 * 16の1乗 + f(15) * 16の0乗 = 96 + 15 = 111 上記の計算結果から、16 進数を 10 進数に変換すると、 0x44 = 0d68 0x6f = 0d111 0x6d = 0d109 0x6f = 0d111 0x6e = 0d110 0x43 = 0d67 0x68 = 0d104 0x69 = 0d105 0x73 = 0d115 0x61 = 0d97 0x74 = 0d116 0x6f = 0d111 となる。 また、この結果が正しいかを調べるためプログラム name_10.rb を作成した。 a) 作成したプログラム #!/usr/koeki/bin/ruby # coding: euc-jp printf("%c%c%c%c%c %c%c%c%c%c%c%c\n", 0d68, 0d111, 0d109, 0d111, 0d110, 0d67, 0d104, 0d105, 0d115, 0d97, 0d116, 0d111) b) プログラム実行結果 pan{c111112}% ./name_10.rb [~/Ruby] Domon Chisato c) 考察 プログラムを実行した結果、16 進数のときと同様に同じ文字が出力されたため、 16 進数を 10 進数に変換する計算は正しかったといえる。 B. "わたしはかいがすきだ"(3 例) ・わたし は かい が すきだ (私は貝が好きだ) ・わたし は かい が すきだ (私は絵画好きだ) ・わたし はかい が すきだ (私破壊が好きだ) "このどうぶつえんのしろくまはおもしろい"(2 例) ・このどうぶつえん の しろくま は おもしろい (この動物園の白熊は面白い) ・このどうぶつえん の しろくま は おも しろい (この動物園の白熊は尾も白い) "わたしはこうかいした"(4 例) ・わたし は こうかい した (私は後悔した) ・わたし は こう かいした (私はこう解した) ・わたし は こうかい した (私は航海した) ・わたし は こうかい した (私は公開した) C. 国家の名前を Hash 配列 country にした。 county の key と value はそれぞれ国名、その国の首都、その国の人口、国花、 その国で最も使用されている言語をとった。 その1: key イタリア に対して value は ["ローマ", 60200000, "デイジー", "イタリア語"] その2: key スイス に対して value は ["ベルン", 7870000, "エーデルワイス", "ドイツ語"] その3: key ドイツ に対して value は ["ベルリン", 81750000, "矢車菊", "ドイツ語"] その4: key 日本 に対して value は ["東京", 127800000, "菊と桜", "日本語"] その5: key フランス に対して value は ["パリ", 65000000, "百合とアイリス", "フランス語"] これらを Hash 配列で表記すると、 country["イタリア"] = "ローマ", 60.200.000, "デイジー", "イタリア語" country["スイス"] = "ベルン", 7.870.000, "エーデルワイス", "ドイツ語" country["ドイツ"] = "ベルリン", 81.750.000, "矢車菊", "ドイツ語" country["日本"] = "東京", 127.800.000, "菊と桜", "日本語" country["フランス"] = "パリ", 65.000.000, "百合とアイリス", "フランス語" また、2 つ目の表し方は、 country{"イタリア" => ["ローマ",60.200.000 , "デイジー", "イタリア語"], "スイス" => ["ベルン", 7.870.000, "エーデルワイス", "ドイツ語"], "ドイツ" => ["ベルリン", 81.750.000, "矢車菊", "ドイツ語"], "日本" => ["東京", 127.800.000, "菊と桜", "日本語"], "フランス" => ["パリ", 65.000.000, "百合とアイリス", "フランス語"]} 2. プログラム問題 A, B, C, を選択した。 選択: A a) 考えた設定 あらかじめ登録されているデータの対を表示させるプログラム b) 作成したプログラム #!/usr/koeki/bin/ruby # coding: euc-jp country = Hash.new # Hash 配列 を country と設定する country["イタリア"] = "ローマ", 60200000, "デイジー", "イタリア語" country["スイス"] = "ベルン", 7870000, "エーデルワイス", "ドイツ語" country["ドイツ"] = "ベルリン", 81750000, "矢車菊", "ドイツ語" country["日本"] = "東京", 127800000, "菊と桜", "日本語" country["フランス"] = "パリ", 60500000, "百合とアイリス", "フランス語" for countryname, tokutyou in country # 予め登録されているデータを表示させる printf("%s の首都は %s で、人口は %d 人です。\n", countryname, tokutyou[0], tokutyou[1]) printf("国花は %s であり、最も使われている言語は %s です。\n", tokutyou[2], tokutyou[3]) end # for の終了 c) プログラム実行結果 pan{c111112}% ./ary_print.rb [~/Ruby] イタリア の首都は ローマ で、人口は 60200000 人です。 国花は デイジー であり、最も使われている言語は イタリア語 です。 スイス の首都は ベルン で、人口は 7870000 人です。 国花は エーデルワイス であり、最も使われている言語は ドイツ語 です。 ドイツ の首都は ベルリン で、人口は 81750000 人です。 国花は 矢車菊 であり、最も使われている言語は ドイツ語 です。 日本 の首都は 東京 で、人口は 127800000 人です。 国花は 菊と桜 であり、最も使われている言語は 日本語 です。 フランス の首都は パリ で、人口は 60500000 人です。 国花は 百合とアイリス であり、最も使われている言語は フランス語 です。 d) 考察 あらかじめに登録されていたデータの対と、プログラムを実行した結果表示され たデータの対が同じであったため、プログラムは正しく動いているといえる。 このプログラムを初めて実行したときに、上手く表示されなかったが、tokutyou[] のカッコの中の数字を 1 から始めていたために上手く動かなかったことが分かっ たのでよかった。 選択: B a) 考えた設定 あらかじめ登録されているデータを、人口の少ない順に並び換えるプログラム。 b) もとにしたプログラムからの変更点 hash_ary_print.rb をもとにしてこプログラムは作成したが、変更点として、あ らかじめ登録されているデータを入力されている順に表示するだけではなく、人 口が少ない順に表示させるように設定したところである。 ・追加した点 print("\n人口が少ない順\n") country.keys.sort{|countryname, tokutyou| country[countryname][1] <=> country[tokutyou][1] }.each{|retail| printf("%sの人口\t%d人\n", retail, country[retail][1]) c) 作成したプログラム #!/usr/koeki/bin/ruby # coding: euc-jp country = Hash.new # Hash 配列を country と設定する country["イタリア"] = "ローマ", 60200000, "デイジー", "イタリア語" country["スイス"] = "ベルン", 7870000, "エーデルワイス", "ドイツ語" country["ドイツ"] = "ベルリン", 81750000, "矢車菊", "ドイツ語" country["日本"] = "東京", 127800000, "菊と桜", "日本語" country["フランス"] = "パリ", 60500000, "百合とアイリス", "フランス語" for countryname, tokutyou in country # あらかじめ登録されているデータを表示 printf("%s の首都は %s で、人口は %d 人です。\n", countryname, tokutyou[0], tokutyou[1]) printf("国花は %s で、最も使われている公用語は %s です。\n", tokutyou[2], tokutyou[3]) end # for の終了 print("\n人口が少ない順\n") country.keys.sort{|countryname, tokutyou| country[countryname][1] <=> country[tokutyou][1] }.each{|retail| printf("%sの人口\t%d人\n", retail, country[retail][1]) } # Hash.keys.sort{ # |並び換える前の key 変数, 並び換えた後の key 変数| # Hash[並び換える前rの key 変数][要素番号] <=> # hash配列[並び換えた後の key 変数][要素番号] # }.each{|配列の要素をしまう変数| # 配列の要素を使用して行う動作 # } d) プログラム実行結果 pan{c111112}% ./hash_ary_sort.rb [~/Ruby] イタリア の首都は ローマ で、人口は 60200000 人です。 国花は デイジー で、最も使われている公用語は イタリア語 です。 スイス の首都は ベルン で、人口は 7870000 人です。 国花は エーデルワイス で、最も使われている公用語は ドイツ語 です。 ドイツ の首都は ベルリン で、人口は 81750000 人です。 国花は 矢車菊 で、最も使われている公用語は ドイツ語 です。 日本 の首都は 東京 で、人口は 127800000 人です。 国花は 菊と桜 で、最も使われている公用語は 日本語 です。 フランス の首都は パリ で、人口は 60500000 人です。 国花は 百合とアイリス で、最も使われている公用語は フランス語 です。 人口が少ない順 スイスの人口 7870000人 イタリアの人口 60200000人 フランスの人口 60500000人 ドイツの人口 81750000人 日本の人口 127800000人 e) 考察 今回のプログラムでは、人口が少ない順に並べ替えをする設定をした。プログラ ム実行結果と、プログラムにあらかじめ登録されているデータを照らしあわせて みて、プログラムを実行した結果表示された並び替えは、人口が少ない順にちゃ んと表示してあったと確認できたため、プログラムは正しく動いていると言える。 選択: C a) 考えた設定 人口と国土面積から人口密度を計算するプログラム。 c) 作成したプログラム #!/usr/koeki/bin/ruby # coding: euc-jp country = Hash.new # Hash 配列 を country と設定する country["イタリア"] = "ローマ", 60200000, "デイジー", "イタリア語", 301000 country["スイス"] = "ベルン", 7870000, "エーデルワイス", "ドイツ語", 41000 country["ドイツ"] = "ベルリン", 81750000, "矢車菊", "ドイツ語", 357000 country["日本"] = "東京", 127800000, "菊と桜", "日本語", 378000 country["フランス"] = "パリ", 60500000, "百合とアイリス", "フランス語", 540000 for countryname, tokutyou in country # 予め登録されているデータを表示させる printf("%s の首都は %s で、人口は %d 人です。\n", countryname, tokutyou[0], tokutyou[1]) printf("国花は %s であり、最も使われている言語は %s です。\n", tokutyou[2], tokutyou[3]) printf("国土面積は %d 平方キロメートルです。\n", tokutyou[4]) end # for の終了 print("\n") print("各国の人口密度\n") for countryname, tokutyou in country # 予め登録されているデータの表示 people = tokutyou[1].to_f / tokutyou[4].to_f # to_f で小数点まで表示 # 人口 / 国土面積 = 人口密度 printf("%s の人口密度は\t%0.2f 人です。\n", countryname, people) end # for の終了 d) プログラム実行結果 pan{c111112}% ./hash_ary_calc.rb [~/Ruby] イタリア の首都は ローマ で、人口は 60200000 人です。 国花は デイジー であり、最も使われている言語は イタリア語 です。 国土面積は 301000 平方キロメートルです。 スイス の首都は ベルン で、人口は 7870000 人です。 国花は エーデルワイス であり、最も使われている言語は ドイツ語 です。 国土面積は 41000 平方キロメートルです。 ドイツ の首都は ベルリン で、人口は 81750000 人です。 国花は 矢車菊 であり、最も使われている言語は ドイツ語 です。 国土面積は 357000 平方キロメートルです。 日本 の首都は 東京 で、人口は 127800000 人です。 国花は 菊と桜 であり、最も使われている言語は 日本語 です。 国土面積は 378000 平方キロメートルです。 フランス の首都は パリ で、人口は 60500000 人です。 国花は 百合とアイリス であり、最も使われている言語は フランス語 です。 国土面積は 540000 平方キロメートルです。 各国の人口密度 イタリア の人口密度は 200.00 人です。 スイス の人口密度は 191.95 人です。 ドイツ の人口密度は 228.99 人です。 日本 の人口密度は 338.10 人です。 フランス の人口密度は 112.04 人です。 e) 考察 bc- l を使ってプログラムの人口密度の計算が正しいかを調べた。 ・イタリア pan{c111112}% bc -l [~/Ruby] 60200000 / 301000 200.00000000000000000000 quit ・スイス pan{DOMON Chisato}% bc -l [~/Ruby] 7870000 / 41000 191.95121951219512195121 quit ・ドイツ pan{DOMON Chisato}% bc -l [~/Ruby] 81750000 / 357000 228.99159663865546218487 quit ・日本 pan{DOMON Chisato}% bc -l [~/Ruby] 127800000 / 378000 338.09523809523809523809 quit ・フランス pan{DOMON Chisato}% bc -l [~/Ruby] 60500000 / 540000 112.03703703703703703703 quit bc -l による計算結果と、プログラムによる計算結果が同じであったためプログ ラムは正しく動いていると言える。 3. 感想 Amazon などで、自分の欲しい商品を探しているときに出てくるおすすめ商品や 関連商品の広告などが出てくるのは、検索するときにある特定のワードを入力す ると、その特定のワードが含まれている商品を表示させるようにしているからで はないかと思う。また、本などであれば、その著者が書いた他の本なども関連し て表示させているのではないかと思う。 プログラム問題の D を解こうとしてみたが、特定のデータのみを表示させて計 算することができなかった。また、これによって、自分は open 文が苦手である ということを改めて感じたため、もう一度チャレンジしようと思う。 4. 参考文献 西村 まどか 基礎プログラミング I 第 5 回 (配列の構造) "「ASCII コード表」" http://roy/~madoka/2012/r1/05/r1_05_01_theme_01_asciicode.html 上綱 秀治 CyberLibrarian より "2進数、16進数と10進数" http://www.asahi-net.or.jp/~ax2s-kmtn/ref/bdh.html 山本 純士 季節の花 300 より "世界の国花" http://www.hana300.com/aakokka.html#1 外務省Webページ "イタリア共和国" http://www.mofa.go.jp/mofaj/area/italy/data.html 外務省Webページ "スイス連邦" http://www.mofa.go.jp/mofaj/area/switzerland/data.html 外務省Webページ "ドイツ連邦共和国" http://www.mofa.go.jp/mofaj/area/germany/data.html 外務省Webページ "フランス共和国" http://www.mofa.go.jp/mofaj/area/france/data.html Wikipedia より "日本" http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC 西村 まどか 基礎プログラミング II 第 2 回 (なになにといえばこれこれ) より "「each を使って並び換え」" http://roy/~madoka/2012/r2/02/r2_02_08_appendix_01_each.html 西村 まどか 基礎プログラミング II 第 2 回 (なになにといえばこれこれ) より "「要素の一部分を使って入れ替えをするには」" http://roy/~madoka/2012/r2/02/r2_02_15_appendix_07_sorthasharraycomp.html 西村 まどか 基礎プログラミング II 第 3 回 (情報の構造を分析しよう) より "「一つずつ取り出すには / 並べ替えを詳しく行うには」" http://roy/~madoka/2012/r2/03/r2_03_04_review_04_each.html