第 3 回 情報の構造を分析しよう レポート課題 氏名:浅沼佑香 学籍番号:C1110039 語学クラス:英語1 コース:社会福祉コース 1.A.私の名前は浅沼佑香である。名前をアルファベットに直すと、「asanuma yuka」と「ASANUMA YUKA」の 2種類がある。これをASCIIコードで直す。 a → 0x61 s → 0x73 a → 0x61 n → 0x6e u → 0x75 m → 0x6d a → 0x61 y → 0x79 u → 0x75 k → 0x6b a → 0x61 もしくは、 A → 0x41 S → 0x53 A → 0x41 N → 0x4e U → 0x55 M → 0x4d A → 0x41 Y → 0x59 U → 0x55 K → 0x4b A → 0x41 で表される。 これを10進数表記に変換する。10進数表記にするには、16進数に16の倍数を かけたものを足せば良い。なので、 0x61 → 6 * 16 + 1 * 1 = 67 0x73 → 7 * 16 + 3 * 1 = 51 0x61 → 6 * 16 + 1 * 1 = 67 0x6e → 6 * 16 + 14(e) * 1 = 110 0x75 → 7 * 16 + 5 * 1 = 117 0x6d → 6 * 16 + 13(d) * 1 = 109 0x61 → 6 * 16 + 1 * 1 = 67 0x79 → 7 * 16 + 9 * 1 = 121 0x75 → 7 * 16 + 5 * 1 = 117 0x6b → 6 * 16 + 11(b) * 1 = 107 0x61 → 6 * 16 + 1 * 1 = 67 もしくは 0x41 → 4 * 16 + 1 * 1 = 65 0x53 → 5 * 16 + 3 * 1 = 83 0x41 → 4 * 16 + 1 * 1 = 65 0x4e → 4 * 16 + 14(e) * 1 = 78 0x55 → 5 * 16 + 5 * 1 = 85 0x4d → 4 * 16 + 13(d) * 1 = 77 0x41 → 4 * 16 + 1 * 1 = 65 0x59 → 5 * 16 + 9 * 1 = 89 0x55 → 5 * 16 + 5 * 1 = 85 0x4b → 4 * 16 + 11(b) * 1 = 75 0x41 → 4 * 16 + 1 * 1 = 65 で10進数に変換できる。だから、10進数表記にすると、 a → 0d67 s → 0d51 a → 0d67 n → 0d110 u → 0d117 m → 0d109 a → 0d67 y → 0d121 u → 0d117 k → 0d107 a → 0d67 もしくは A → 0d65 S → 0d83 A → 0d65 N → 0d78 U → 0d85 M → 0d77 A → 0d65 Y → 0d89 U → 0d85 K → 0d75 A → 0d65 と表される。 B."かみきれる"(3例) かみ きれる (紙切れる) かみきれる (噛み切れる) かみ きれる (髮切れる) "くるまでおう"(2例) くる まで おう (来るまで追う) くるま で おう (車で追う) "わたしみた"(3例) わたし みた (私、見た) わたし みた (私、三田) わた しみた (棉、染みた) C.山形県にある大学を hash 配列 university としました。 university の key と value はそれぞれ大学名と場所、創立年、学部の数 をとりました。 その 1:key「東北公益文科大学」に対して valueは「酒田、2001、1」 その 2:key「山形大学」に対して valueは「山形、1878、5」 その 3:key「東北文教大学」に対して valueは「山形、1962、1」 その 4:key「東北芸術工科大学」に対して valueは「山形、1991、2」 その 5:key「県立保健医療大学」に対して valueは「山形、1997、1」 これらを hash 配列で表記すると、 university["東北公益文科大学"] = "酒田",2001,1 university["山形大学"] = "山形",1878,5 university["東北文教大学"] = "山形",1962,1 university["東北芸術工科大学"] = "山形",1991,2 university["県立保健医療大学"] = "山形",1997,1 もう1つの表し方は {"東北公益文科大学" => "酒田",2001,1, "山形大学" => "山形",1878,5, "東北文教大学" => "山形",1962,1, "東北芸術工科大学" => "山形", 1991,1, "県立保健医療大学" => "山形",1997,1} で表記できる。 2.設問A〜Dを選択した。 A.登録してある対を表示するプログラム。 <プログラム(hash_ary_print.rb)> #!/usr/koeki/bin/ruby #couding: euc-jp university = Hash.new #Hash配列はuniversity university["東北公益文科大学"] = "酒田",2001,1 university["山形大学"] = "山形",1878,5 university["東北文教大学"] = "山形",1962,1 university["東北芸術工科大学"] = "山形",1991,2 university["県立保健医療大学"] = "山形",1997,1 for name,daigaku in university #for 値(キー名) in hash 配列名 printf("%s は %s市にあり、%d 年に創設されました。学部は %d つあります。\n\n",name,daigaku[0],daigaku[1],daigaku[2]) #文を表示 end #for文終わり <前のプログラムとの変更点> 前回作成したプログラム(hash_for.rb)を参考に作成した。 printf文が長いので、改行をつけた。 <実行結果> pan{c111003}% ./hash_ary_print.rb [~/Ruby] 東北公益文科大学 は 酒田市にあり、2001 年に創設されました。学部は 1 つあります。 山形大学 は 山形市にあり、1878 年に創設されました。学部は 5 つあります。 東北文教大学 は 山形市にあり、1962 年に創設されました。学部は 1 つあります。 東北芸術工科大学 は 山形市にあり、1991 年に創設されました。学部は 2 つあります。 県立保健医療大学 は 山形市にあり、1997 年に創設されました。学部は 1 つあります。 <考察> 対のデータをプログラムが正しく表示されたので、このプログラムは正しいとい える。 <参考文献> 最後に記載 B.ある値を並べ替えるプログラムへ変更するプログラム。 <プログラム(hash_ary_sort.rb)> #!/usr/koeki/bin/ruby #couding: euc-jp university = Hash.new #Hash配列はuniversity university["東北公益文科大学"] = "酒田",2001,1 university["山形大学"] = "山形",1878,5 university["東北文教大学"] = "山形",1962,1 university["東北芸術工科大学"] = "山形",1991,2 university["県立保健医療大学"] = "山形",1997,1 print("各大学の創設年を表示させます。\n") #文表示 print("年号の古い順に並び替えます。\n") #文表示 print("並び替えると下のような結果になります。\n\n") #文表示 university.keys.sort{|new,old| university[new][1]<=>university[old][1] }.each{|nengou| printf("%s の創設は %d 年です。\n",nengou,university[nengou][1]) } #Hash 名.keys.sort{ #|変更前の key 変数,変更後の key 変数| #Hash 名[変更前の key 変数][要素番号] <=> Hash 名[変更後の key 変数][要素番号]} #配列.each{ #|配列の要素を代入する内部変数|内部変数に入った文字列について実行したい動作 #} #文表示 <前のプログラムとの変更点> 先生のホームページの「一つずつ取り出すには/並べ替えを詳しく行うには」を 参考に作成した。 <実行結果> pan{c111003}% ./hash_ary_sort.rb [~/Ruby] 各大学の創設年を表示させます。 年号の古い順に並び替えます。 並び替えると下のような結果になります。 山形大学 の創設は 1878 年です。 東北文教大学 の創設は 1962 年です。 東北芸術工科大学 の創設は 1991 年です。 県立保健医療大学 の創設は 1997 年です。 東北公益文科大学 の創設は 2001 年です。 <考察> 年号が古い順に並べ替えることができた。だから、プログラムは正しく実行され たといえる。 <参考文献> 最後に記載 C.各学校の学部を平均するプログラム。 <プログラム(hash_ary_calc.rb)> #!/usr/koeki/bin/ruby #couding: euc-jp university = Hash.new #Hash配列はuniversity university["東北公益文科大学"] = "酒田",2001,1 university["山形大学"] = "山形",1878,5 university["東北文教大学"] = "山形",1962,1 university["東北芸術工科大学"] = "山形",1991,2 university["県立保健医療大学"] = "山形",1997,1 for name,daigaku in university #for 値(キー名) in hash 配列名 printf("%s は %s市にあり、%d 年に創設されました。学部は %d つあります。\n\n",name,daigaku[0],daigaku[1],daigaku[2]) #文表示 end #for文終わり print("\n続いて、各大学の学部の平均を表示させます。\n\n") #文表示 total = 0 #totalは初め0 for name,daigaku in university #for 値(キー名) in hash 配列名 total += daigaku[2] #daigaku[2]の合計 end #for文終わり avg = total.to_f / university.length #合計をuniversityの対で割る printf("大学の学部の平均は %4.1f つです。\n",avg) #文を表示 <前のプログラムとの変更点> プログラム(hash_ary_print.rb)の下に合計と計算の文を追加した。 <実行結果> pan{c111003}% ./hash_ary_calc.rb [~/Ruby] 東北公益文科大学 は 酒田市にあり、2001 年に創設されました。学部は 1 つあります。 山形大学 は 山形市にあり、1878 年に創設されました。学部は 5 つあります。 東北文教大学 は 山形市にあり、1962 年に創設されました。学部は 1 つあります。 東北芸術工科大学 は 山形市にあり、1991 年に創設されました。学部は 2 つあります。 県立保健医療大学 は 山形市にあり、1997 年に創設されました。学部は 1 つあります。 続いて、各大学の学部の平均を表示させます。 大学の学部の平均は 2.0 つです。 pan{c111003}% bc -l [~/Ruby] 1+5+1+2+1 10 10/5 2.00000000000000000000 quit <考察> 平均を求めるので、小数点にするために「to_f」にした。実際のプログラムと 「bc -l」での計算があっていたので、プログラムは正しいといえる。 <参考文献> 最後に記載 D.データを読みこんで設問Cと同じことを実行するプログラム。 <データ(hash_ary_data.dat)> 東北公益文科大学 酒田 2001 1 山形大学 山形 1878 5 東北文教大学 山形 1962 1 東北芸術工科大学 山形 1991 2 県立保健医療大学 山形 1997 1 <プログラム(hash_ary_read.rb)> #!/usr/koeki/bin/ruby #couding: euc-jp university = Hash.new open("hash_ary_data.dat","r") do |daigaku| #データを読みこみ、daigakuに置き換える while hash_ary_data = daigaku.gets 繰り返し、daigakuがなくなったら終わる if /(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/ =~ hash_ary_data # 文字、空白の順 university[$1] = [$2,$3.to_i,$4.to_i] #1列目はuniversity end #if文終わり end #while文終わり end #open文終わり print("各大学の学部の平均を表示させます。\n\n") #文表示 total = 0 #totalは初め0 university.keys.sort{|new,old| university[new][1]<=>university[old][1] }.each{|nengou| printf("%s の創設は %d 年です。\n",nengou,university[nengou][1]) } #Hash 名.keys.sort{ #|変更前の key 変数,変更後の key 変数| #Hash 名[変更前の key 変数][要素番号] <=> Hash 名[変更後の key 変数][要素番号]} #配列.each{ #|配列の要素を代入する内部変数|内部変数に入った文字列について実行したい動作 #} #文表示 for name,daigaku in university #for 値(キー名) in hash 配列名 total += daigaku[2].to_i #daigaku[2]の合計 end #for文終わり avg = total.to_f / university.length #合計をuniversityの対で割る printf("\n大学の学部の平均は %4.1f つです。\n",avg) #文を表示 <前のデータ・プログラムとの変更点> 前回作成したプログラム(hash_read.rb)と設問Cのプログラムを参考に作成した。 <実行結果> pan{c111003}% ./hash_ary_read.rb [~/Ruby] 各大学の学部の平均を表示させます。 山形大学 の創設は 1878 年です。 東北文教大学 の創設は 1962 年です。 東北芸術工科大学 の創設は 1991 年です。 県立保健医療大学 の創設は 1997 年です。 東北公益文科大学 の創設は 2001 年です。 大学の学部の平均は 2.0 つです。 <考察> 文字を打ったとおりに、プログラムを表示することができた。だから、プログラ ムは正常だといえる。しかし、実行してから数字が小数だと気がつき、「to_i」 に変えると、小数点がなくなると思った。 <参考文献> 最後に記載 3.何かのデータを出力させるしくみには、設問Dみたいにあらかじめデータを作っ ておいてから決められたページを開くと、決った広告や関連記事がでてくると 感じた。そう考えると、プログラムはそのままで、データだけを書き換えてつ くっているのではないかと思った。 <参考文献> ◯ Ruby プログラミング基礎講座 広瀬雄二 著 ・第8講 計算機の内部表現 8-2 文字コード p107 ・第8講 計算機の内部表現 8-1 2進数と16進数 p104 ○基礎プログラミングII 第2回 (なになにといえばこれこれ) 西村 まどか ・対にないものが呼び出されたとき http://roy/~madoka/2012/r2/02/r2_02_05_theme_04_default.html ・Hashの対を表示するには http://roy/~madoka/2012/r2/02/r2_02_07_theme_06_forprint.html ・覚える順番は違うけれど答えは正しい http://roy/~madoka/2012/r2/02/r2_02_10_appendix_03_memory.html ◯基礎プログラミングII 第3回 (情報の構造を分析しよう) 西村 まどか ・一つずつ取り出すには / 並べ替えを詳しく行うには http://roy/~madoka/2012/r2/03/r2_03_04_review_04_each.html ・Value に配列が入る場合の処理 http://roy/~madoka/2012/r2/03/r2_03_05_review_05_valueasary.html