第 3 回 情報の構造を分析しよう レポート課題 氏名:齋藤允貴 学籍番号:C111069A 語学クラス:英語 2 コース:地域共創コース 1、筆記問題 A、自分の名前をアルファベットで表記すると、 SAITO MASATAKA となる。 それぞれのアルファベットを ASCII コードで調べると以下のようになった。 S = 0x53 A = 0x41 I = 0x49 T = 0x54 O = 0x4f M = 0x4d A = 0x41 S = 0x53 A = 0x41 T = 0x54 A = 0x41 K = 0x4b A = 0x41 次に、それらの16 進数を 10 進数表記に変換した。 S = 5 * 16 + 3 * 1 = 80 + 3 = 83 A = 4 * 16 + 1 * 1 = 64 + 1 = 65 I = 4 * 16 + 9 * 1 = 64 + 9 = 73 T = 5 * 16 + 4 * 1 = 80 + 4 = 84 O = 4 * 16 + 15 * 1 = 64 + 15 = 79 M = 4 * 16 + 13 * 1 = 64 + 13 = 77 A = 4 * 16 + 1 * 1 = 64 + 1 = 65 S = 5 * 16 + 3 * 1 = 80 + 3 = 83 A = 4 * 16 + 1 * 1 = 64 + 1 = 65 T = 5 * 16 + 4 * 1 = 80 + 4 = 84 A = 4 * 16 + 1 * 1 = 64 + 1 = 65 K = 4 * 16 + 11 * 1 = 64 + 11 = 75 A = 4 * 16 + 1 * 1 = 64 + 1 = 65 したがって、自分の名前のアルファベットで表記したさいの 10 進数は、以 下のとおりである。 S = 0d83 A = 0d65 I = 0d73 T = 0d84 O = 0d79 M = 0d77 A = 0d65 S = 0d83 A = 0d65 T = 0d84 A = 0d65 K = 0d75 A = 0d65 B、"きょうかいにいく" きょう かい に いく (今日買いに行く) きょうかい に いく (教会にいく) きょうかい に いく (協会にいく) きょう かい に いく (今日飼いに行く) C、日本にある島の名前を hash 配列 island としました。 island の key と、value はそれぞれの島の場所と、その島の最高標高(m)、 その島の面積(平方キロメートル)にした。 その 1:key 「飛島」に対して value は「山形県 ,68 ,3」 その 2:key 「佐渡島」に対して value は「新潟県 ,1172 ,855」 その 3:key 「佐久島」に対して value は「愛知県 ,38 ,2」 その 4:key 「諏訪大島」に対して value は「山口県 ,691 ,128」 その 5:key 「屋久島」に対して value は「鹿児島県 ,1936 ,505」 これに対する hash の表し方は、以下の通りである。 island["飛島"] = "山形県", 68, 3 island["佐渡島"] = "新潟県", 1172, 855 island["佐久島"] = "愛知県", 38, 2 island["諏訪大島"] = "山口県", 691, 128 island["屋久島"] = "鹿児島県", 1936, 505 そして、もう一つの表し方が以下のようになる。 {"飛島" => "山形県", 68, 3, "佐渡島" => "新潟県", 1172, 855, "佐久島" => "愛知県", 38, 2, "諏訪大島" => "山口県", 691, 128, "屋久島" => "鹿児島県", 1936, 505 2、プログラム問題 今回僕が挑戦したのは、A、B、C である。 筆記問題の C の問題のときに作成した対を用いた。 A、前回のプログラム問題 A でやったプログラムを参考に「for」を用いて作成 した。 ただ、今回は value が 3 項目入っているため、print 文には、名前、場所 と、最高標高と、面積を代入しなければいけないので、「sima[0], sima[1] sima[2]」をつけて代入してみた。 作成したプログラムは以下のとおりである。 #!/usr/koeki/bin/ruby #coding: euc-jp island = Hash.new # Hash 配列 island["飛島"] = "山形県", 68, 3 # 島の名前 = 場所、最高標高、面積 island["佐渡島"] = "新潟県", 1172, 855 island["佐久島"] = "愛知県", 38, 2 island["諏訪大島"] = "山口県", 691, 128 island["屋久島"] = "鹿児島県", 1936, 505 for name , sima in island # name は key、sima は value にそれぞれ変 数「island」に代入する。 printf("%s は、%sにある島で、最高標高は %d [m]、 # %d には整数を代入する 面積は %d [平方キロメートル]です。\n\n",name, sima[0], sima[1], sima[2]) # 名前 場所 最高標高 面積 end 実行結果 pan{c111069}% ./hash_ary_print.rb [~/Ruby] 飛島 は、山形県にある島で、最高標高は 68 [m]、 面積は 3 [平方キロメートル]です。 佐渡島 は、新潟県にある島で、最高標高は 1172 [m]、 面積は 855 [平方キロメートル]です。 佐久島 は、愛知県にある島で、最高標高は 38 [m]、 面積は 2 [平方キロメートル]です。 諏訪大島 は、山口県にある島で、最高標高は 691 [m]、 面積は 128 [平方キロメートル]です。 屋久島 は、鹿児島県にある島で、最高標高は 1936 [m]、 面積は 505 [平方キロメートル]です。 考察 登録しておいた島の名前と、場所、最高標高、面積が配列どおりにきちんと 表示することができたので、このプログラムは成立する。 B、B のプログラムは、ある値に注目し並べ替えるというプログラムである。 僕がこのプログラムで作成したのは、島の面積を小さい順に並びかえるもの である。 小さい順に並び替えるには、 Hash 名.keys.sort{|変更前の key 変数,変更後の key 変数| Hash 名[変更前の key 変数][要素番号] <=> Hash 名[変更後の key 変数] [要素番号] } を利用して作成した。 その項目が以下のとおりである。 island.keys.sort{|big, small| # A を big、B を small とした。 island[big][2] <=> island[small][2] # <=> は並べ替え演算子を表す。 並べ替えの対象は「面積」である。 面積は value2 に掲載したので、[2] を用いた。 } そして、小さい順に表示させなければならないので、「each」を使って、 作成した。 配列.each{|配列の要素を代入する内部変数| 内部変数に入った文字列について実行したい動作 } この項目を参考にして、以下のようになった。 .each{|menseki| printf("%s の面積は %d 平方キロメートルです。\n",menseki, # %d に整数を代入する。 島の名前 island[menseki][2]) 面積 } すると、プログラムに登録しておいた配列が、面積の小さい順に並べ替えら れて表示することができる。 作成したプログラムは以下のとおりである。 #!/usr/koeki/bin/ruby #coding: euc-jp island = Hash.new # Hash 配列 island["飛島"] = "山形県", 68, 3 island["佐渡島"] = "新潟県", 1172, 855 island["佐久島"] = "愛知県", 38, 2 island["諏訪大島"] = "山口県", 691, 128 island["屋久島"] = "鹿児島県", 1936, 505 print("それぞれの島の面積を小さい順に並べると…\n") print("\n") island.keys.sort{|big, small| island[big][2] <=> island[small][2] }.each{|menseki| printf("%s の面積は %d 平方キロメートルです。\n",menseki, island[menseki][2]) } # 指定して並び替えるものと取り出すものを合体させ た。 実行結果 pan{c111069}% ./hash_ary_sort.rb [~/Ruby] それぞれの島の面積を小さい順に並べると… 佐久島 の面積は 2 平方キロメートルです。 飛島 の面積は 3 平方キロメートルです。 諏訪大島 の面積は 128 平方キロメートルです。 屋久島 の面積は 505 平方キロメートルです。 佐渡島 の面積は 855 平方キロメートルです。 考察 それぞれの配列に記入した島の名前と面積が同じ配列のなかにしっかりと 表示することができ、面積の小さい順に並べることができたのでこのプロ グラムは成立する。 C、C のプログラム問題は、あらかじめ数値の入った部分を計算するプログラム を作成しなければならない。 そこで僕が考えたプログラムは、数値のもう一つの項目である、それぞれの 島の「最高標高」の平均を計算するプログラムを作成した。 まず、最高標高を小さい順に並び替えて表示したかったので、B のプログラ ムで作成した並び替えの項目を最高標高を表示したいので、value [1] を代 入した。 island.keys.sort{|high, low| island[high][1] <=> island[low][1] # 並べ替えるために <=> を用いて作成 }.each{|hyoko| printf("%s の最高標高は %d (m)である。\n",hyoko, island[hyoko][1]) # %d に整数を代入する。 島の名前 最高標高の値 } 平均を計算する際には、まず、該当する項目の値をすべて足し、その項目数 で割るという計算をしなければならない。 そこで、「for」を用いて最高標高の合計を計算する項目を作成した。 for make , takai in island total += takai[1] # += は該当する項目の数値をすべて足す end # for の終わり そして、その合計の平均を表示しなければならないので平均を求める計算方 法を入力した。 average = total.to_f / island.length # 合計 / 項目数 作成したプログラムは以下のとおりである。 #!/usr/koeki/bin/ruby #coding: euc-jp total = 0 island = Hash.new island["飛島"] = "山形県", 68, 3 island["佐渡島"] = "新潟県", 1172, 855 island["佐久島"] = "愛知県", 38, 2 island["諏訪大島"] = "山口県", 691, 128 island["屋久島"] = "鹿児島県", 1936, 505 print("それぞれの島の最高標高を小さい順に並べると…\n") print("\n") island.keys.sort{|high, low| island[high][1] <=> island[low][1] }.each{|hyoko| printf("%s の最高標高は %d (m)である。\n",hyoko, island[hyoko][1]) } for make , takai in island total += takai[1] end average = total.to_f / island.length print("-----------------------------\n") printf("これらの島の平均最高標高は %4.1f (m) です。\n", average) # %fは小数を表示するもの 小数第一位までを表示したいので%fの間 に4.1を入力した。 実行結果 pan{c111069}% ./hash_ary_calc.rb [~/Ruby] それぞれの島の最高標高を小さい順に並べると… 佐久島 の最高標高は 38 (m)である。 飛島 の最高標高は 68 (m)である。 諏訪大島 の最高標高は 691 (m)である。 佐渡島 の最高標高は 1172 (m)である。 屋久島 の最高標高は 1936 (m)である。 ----------------------------- これらの島の平均最高標高は 781.0 (m) です。 考察 「bc -l」を用いて計算を確認してみた。 pan{c111069}% bc -l [~/Ruby] 38 + 68 + 691 + 1172 + 1936 3905 3905 / 5 781.00000000000000000000 quit 最高標高を小さい順に並び替えて表示することができ、平均もしっかりと表 示することができ、計算も合っていたので、このプログラムは成立する。 3、感想 新聞記事やおすすめ商品を出力させたいときには、配列を代入し、その配列 に入っている項目を実行させるものだと思う。 今回は前回の受業でやったプログラムを参考に作成してみたが、今後並び替 えたり、項目を取り出す内容を作成することができたので、今日習ったこと を別のプログラムを作成する際にも思い出して、しっかりと入力するように したい。 4、参考文献 http://roy/~madoka/2012/r2/02/r2_02_07_theme_06_forprint.html 西村まどか 基礎プログラミングII 第 2 回 なになにといえばこれこれ 「Hash の対を表示するには」 http://roy/~madoka/2012/r2/03/r2_03_01_review_01_arysort.html 西村まどか 基礎プログラミングII 第 3 回 情報の構造を分析しよう 「keys や values のデータ表現」 http://roy/~madoka/2012/r2/03/r2_03_04_review_04_each.html 西村まどか 基礎プログラミングII 第 3 回 情報の構造を分析しよう 「一つずつ取り出すには / 並べ替えを詳しく行うには」 http://roy/~madoka/2012/r2/03/r2_03_05_review_05_valueasary.html 西村まどか 基礎プログラミングII 第 3 回 情報の構造を分析しよう 「value に配列が入る場合の処理」 http://roy/~madoka/2012/r1/05/r1_05_01_theme_01_asciicode.html 西村まどか 基礎プログラミングI 第 5 回 配列の構造 「ASCII コード表」 http://ja.wikipedia.org/wiki/%E5%B3%B6%E3%81%AE%E4%B8%80%E8%A6%A7 ウィキペディア 「島の一覧」