第 3 回 情報の構造を分析しよう レポート課題 氏名:菊地 桃子 学籍番号:C1110482 語学クラス:英語 3 コース:社会福祉 1. 筆記問題 A. ASCIIコードの表参考 0 1 2 3 4 5 6 7 8 9 a b c d e f 0 nul soh stx etx eot enq ack bel bs ht lf vt ff cr so si 1 dle dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us 2 ! " # $ % & ' ( ) * + , - . / 3 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 4 @ A B C D E F G H I J K L M N O 5 P Q R S T U V W X Y Z [ \ ] ^ _ 6 ' a b c d e f g h i j k l m n o 7 p q r s t u v w x y z { } ~ del 名前 Kikuchi Momoko を ASCIIコードで表示にすると K = 0x4b i = 0x69 k = 0x6b u = 0x75 c = 0x63 h = 0x68 i = 0x69 M = 0x4d o = 0x6f m = 0x6d o = 0x6f k = 0x6b o = 0x6f となる。 16進数を10進数になおす場合には、16をかけていく。 10 進 数 16 進 数 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 a 11 b 12 c 13 d 14 e 15 f 16 10 0x4b = 4*16+11*16 = 240 0x69 = 6*16+9*16 = 240 0x6b = 6*16+11*16 = 272 0x75 = 7*16+5*16 = 192 0x63 = 6*16+3*16 = 144 0x68 = 6*16+8*16 = 224 0x69 = 6*16+9*16 = 240 0x4d = 4*16+13*16 = 272 0x6f = 6*16+15*16 = 336 0x6d = 6*16+13*16 = 304 0x6f = 6*16+15*16 = 336 0x6b = 6*16+11*16 = 272 0x6f = 6*16+15*16 = 336 となり 10進数表記に変換すると K = 0d240 i = 0d240 k = 0d272 u = 0d192 c = 0d144 h = 0d224 i = 0d240 M = 0d304 o = 0d336 m = 0d304 o = 0d336 k = 0d272 o = 0d336 となる B. 「きょうはおおきいきをかう」 きょうは おおきいき を かう (今日は 大きい木 を 買う) きょうは おおき いき を かう(今日は 大木 息 を 買う きょうは おおきいき を かう(今日 は 大きい器 を 買う) 「このえいがこわいです」 この えいが こわい です(この 映画 怖い です) この えい が こわいです(この エイ が 恐い です) このえ いが こわいです(この絵 胃が 怖いです) 「ふたとおりあります」 ふたとおり あります(二通りあります) ふた とおり に あります(蓋 通り に あります) ふたと おり に あります(蓋と 檻 に あります) C. 第2回のプログラムを参考にし、新たに項目を付け加えました。 旧暦を hash配列 month としました。 month の key と value はそれぞれ月(1月〜8月)、月に対応する旧暦、2012年 毎月9日の 六曜、月齢をとりました。 その1 : key「1月」に対してvalueは「睦月、先負(己巳)、15.4」 その2 : key「2月」に対してvalueは「如月、赤口(庚子)、16.8」 その3 : key「3月」に対してvalueは「弥生、赤口(己巳)、16.2」 その4 : key「4月」に対してvalueは「卯月、先負(庚子)、17.5」 その5 : key「5月」に対してvalueは「皐月、先負(庚午)、17.8」 その6 : key「6月」に対してvalueは「水無月、大安(辛丑)、19.1」 その7 : key「7月」に対してvalueは「文月、赤口(辛未)、19.5」 その8 : key「8月」に対してvalueは「葉月、先負(壬寅)、20.9」 これに対応する Hash の表し方は month["1"] = "睦月" , 先負(己巳) , 15.4 month["2"] = "如月" , 赤口(庚子) , 16.8 month["3"] = "弥生" , 赤口(己巳) , 16.2 month["4"] = "卯月" , 先負(庚子) , 17.5 month["5"] = "皐月" , 先負(庚午) , 17.8 month["6"] = "水無月" , 大安(辛丑) , 19.1 month["7"] = "文月" , 赤口(辛未) , 19.5 month["8"] = "葉月" , 先負(壬寅) , 20.9 もうひとつの表し方は moonth{"1" =>["睦月" , 先負(己巳) , 15.4],"2" =>[ "如月" , 赤口(庚子) , 16.8],"3" =>["弥生" , 赤口(己巳) , 16.2],"4" =>["卯月" , 先負(庚子) , 17.5],"5" =>["皐月" , 先負(庚午) , 17.8],"6" =>["水無月" , 大安(辛丑) , 19.1],"7" =>[ "文月" , 赤口(辛未) , 19.5],"8"=>["葉月" , 先負(壬寅) , 20.9]} -------------------------------------------------------------------------------- 2. プログラム問題(A〜D問題選択) A. 考えた設定 : あらかじめプログラムに登録してある対を表示するプログラム (ash_ary_print.rb) 作成したプログラム : #!/usr/koeki/bin/ruby #coding: euc-jp month = Hash.new # Hash を新しく定義する month["1"] = "睦月" , "先負(己巳)" , 15.4 month["2"] = "如月" , "赤口(庚子)" , 16.8 month["3"] = "弥生" , "赤口(己巳)" , 16.2 month["4"] = "卯月" , "先負(庚子)" , 17.5 month["5"] = "皐月" , "先負(庚午)" , 17.8 month["6"] = "水無月" , "大安(辛丑)" , 19.1 month["7"] = "文月" , "赤口(辛未)" , 19.5 month["8"] = "葉月" ,"先負(壬寅)" , 20.9 printf("※この情報は2012年のものです。\n\n") sleep 2 for name , tuki in month # or キー名、値、in ハッシュ配列 printf("%s月の旧暦は%sです。六曜は%sで、9日の月齢は%5.1fです。\n", name ,tuki[0],tuki[1],tuki[2]) # value の項目を表示 end # for の終了 もとにしたプログラムからの変更点 : 前回作成した hash_for.rbを参考。 ・valueの項目を追加した ・for 文のまえに説明を加えた。 プログラムを実行した結果画面 : pan{c111048}% ./ash_ary_print.rb [~/Ruby] ※この情報は2012年のものです。 1月の旧暦は睦月です。六曜は先負(己巳)で、9日の月齢は 15.4です。 2月の旧暦は如月です。六曜は赤口(庚子)で、9日の月齢は 16.8です。 3月の旧暦は弥生です。六曜は赤口(己巳)で、9日の月齢は 16.2です。 4月の旧暦は卯月です。六曜は先負(庚子)で、9日の月齢は 17.5です。 5月の旧暦は皐月です。六曜は先負(庚午)で、9日の月齢は 17.8です。 6月の旧暦は水無月です。六曜は大安(辛丑)で、9日の月齢は 19.1です。 7月の旧暦は文月です。六曜は赤口(辛未)で、9日の月齢は 19.5です。 8月の旧暦は葉月です。六曜は先負(壬寅)で、9日の月齢は 20.9です。 考察 : 結果表示のみだと9日は何年のときのデータか分からないので、 最初に説明を入れた上で表示させたら分かりやすくなったと思う。 実行したら正常に作動したのでプログラムは正しいといえる。 -------------------------------------------------------------------------------- B. 考えた設定 : ある値について並べ替えるプログラムへ変更するプログラム (hash_ary_sort.rb) 作成したプログラム : #!/usr/koeki/bin/ruby #coding: euc-jp month = Hash.new # Hash を新しく定義する month["1"] = "睦月" , "先負(己巳)" , 15.4 month["2"] = "如月" , "赤口(庚子)" , 16.8 month["3"] = "弥生" , "赤口(己巳)" , 16.2 month["4"] = "卯月" , "先負(庚子)" , 17.5 month["5"] = "皐月" , "先負(庚午)" , 17.8 month["6"] = "水無月" , "大安(辛丑)" , 19.1 month["7"] = "文月" , "赤口(辛未)" , 19.5 month["8"] = "葉月" ,"先負(壬寅)" , 20.9 printf("※この情報は2012年のものです。\n\n") sleep 2 # 指定された杪数の間は実行しない(この場合は2秒) for reki , tuki in month # or キー名、値、in ハッシュ配列 printf("%s月の旧暦は%sです。六曜は%sで、9日の月齢は%5.1fです。\n", reki ,tuki[0],tuki[1],tuki[2]) # value の項目を表示 end # for の終了 print("\n") # 1行空ける print("\n1月〜8月の9日の月齢が低い順に並び変えます。\n\n") month.keys.sort{|max,min| # sort で小さい順に並び替え。 month[max][2]<=> month[min][2]}.each{|retail| # 3番目のvalueを並べ替え(コンピュータの数え始めは0)。 printf("%s月の月齢は%5.1fです。\n", retail,month[retail][2])} もとにしたプログラムからの変更点: 先輩のレポートを参考に作成した。 変数などを自分なりに変更した。 プログラムを実行した結果画面 : ※この情報は2012年のものです。 1月の旧暦は睦月です。六曜は先負(己巳)で、9日の月齢は 15.4です。 2月の旧暦は如月です。六曜は赤口(庚子)で、9日の月齢は 16.8です。 3月の旧暦は弥生です。六曜は赤口(己巳)で、9日の月齢は 16.2です。 4月の旧暦は卯月です。六曜は先負(庚子)で、9日の月齢は 17.5です。 5月の旧暦は皐月です。六曜は先負(庚午)で、9日の月齢は 17.8です。 6月の旧暦は水無月です。六曜は大安(辛丑)で、9日の月齢は 19.1です。 7月の旧暦は文月です。六曜は赤口(辛未)で、9日の月齢は 19.5です。 8月の旧暦は葉月です。六曜は先負(壬寅)で、9日の月齢は 20.9です。 1月〜8月の9日の月齢が低い順に並び変えます。 1月の月齢は 15.4です。 3月の月齢は 16.2です。 2月の月齢は 16.8です。 4月の月齢は 17.5です。 5月の月齢は 17.8です。 6月の月齢は 19.1です。 7月の月齢は 19.5です。 8月の月齢は 20.9です。 考察 : 何番目のvalueをもってくるかのやり方が分からなく何度もエラーが発生して くじけそうになったが先輩のレポートでひとつひとつの構文に説明が入っていた おかげで自分の間違いに気づけた。 実行結果も低い順になっているので正しく作動しているといえる。 -------------------------------------------------------------------------------- C. 考えた設定 : 前問において数値の入った配列成分を計算するプログラム 1月〜8月9日の平均月齢を出す (hash_ary_calc.rb) 作成したプログラム : #!/usr/koeki/bin/ruby #coding: euc-jp total = 0 # total の初期値を0 month = Hash.new # Hash を新しく定義する month["1"] = "睦月" , "先負(己巳)" , 15.4 month["2"] = "如月" , "赤口(庚子)" , 16.8 month["3"] = "弥生" , "赤口(己巳)" , 16.2 month["4"] = "卯月" , "先負(庚子)" , 17.5 month["5"] = "皐月" , "先負(庚午)" , 17.8 month["6"] = "水無月" , "大安(辛丑)" , 19.1 month["7"] = "文月" , "赤口(辛未)" , 19.5 month["8"] = "葉月" ,"先負(壬寅)" , 20.9 month.keys.sort{|max,min| # sort で小さい順に並び替え。 month[max][2]<=> month[min][2]}.each{|retail| # 3番目のvalueを並べ替え(コンピュータの数え始めは0)。 printf("%s月の月齢は%5.1fです。\n", retail,month[retail][2])} for reki , tuki in month total += tuki[2] end average = total.to_f/month.length # 平均を求める # to_f 文字列を小数へ printf("\n1月〜8月9日の平均月齢は%4.1f です。\n",average) プログラムを実行した結果画面 : pan{c111048}% ./hash_ary_calc.rb [~/Ruby] 1月の月齢は 15.4です。 3月の月齢は 16.2です。 2月の月齢は 16.8です。 4月の月齢は 17.5です。 5月の月齢は 17.8です。 6月の月齢は 19.1です。 7月の月齢は 19.5です。 8月の月齢は 20.9です。 1月〜8月9日の平均月齢は17.9 です。 考察 : 合っているか実際に計算 pan{c111048}% bc -l [~/Ruby] (15.4+16.2+16.8+17.5+17.8+19.1+19.5+20.9)/8 17.90000000000000000000 よって、このプログラムは正常に作動しているといえる。 -------------------------------------------------------------------------------- D. 考えた設定: データ hash_ary_data.dat を読み込んで前問と同じことを実行する プログラム (hash_ary_read.rb) 作成したプログラム: #!/usr/koeki/bin/ruby #coding: euc-jp month = Hash.new while data = gets # data にデータファイルの配列をしまう if/(\S+)\s+(\S+)\s+(\S+)\s+(\d+)/ =~data # データファイルが、文字列 /空白/ 文字列 /空白/ 数列 という構成なら month[$1] = [$2, $3, $4.to_f] end # while の end end # if の end for reki , tuki in month # or キー名、値、in ハッシュ配列 printf("%s月の旧暦は%sです。六曜は%sで、9日の月齢は%4.1fです。\n", reki ,tuki[0],tuki[1],tuki[2]) # value の項目を表示 end # for の終了 print("\n") # 1行空ける print("\n1月〜8月の9日の月齢が低い順に並び変えます。\n\n") month.keys.sort{|max,min| # sort で小さい順に並び替え。 month[max][2]<=> month[min][2]}.each{|retail| # 3番目のvalueを並べ替え(コンピュータの数え始めは0)。 printf("%s月の月齢は%4.1fです。\n", retail,month[retail][2])} print("\n1月〜8月9日の平均月齢を出します。\n\n") total = 0 avg = 0 for reki , tuki in month total += tuki[2] end average = total.to_f/month.length # 平均を求める # to_f 文字列を小数へ printf("\n1月〜8月9日の平均月齢は%4.1f です。\n",average) プログラムを実行した結果画面 : pan{c111048}% ./hash_ary_read.rb hash_ary_data.dat [~/Ruby] 1月の旧暦は睦月です。六曜は先負(己巳)で、9日の月齢は15.0です。 2月の旧暦は如月です。六曜は赤口(庚子)で、9日の月齢は16.0です。 3月の旧暦は弥生です。六曜は赤口(己巳)で、9日の月齢は16.0です。 4月の旧暦は卯月です。六曜は先負(庚子)で、9日の月齢は17.0です。 5月の旧暦は皐月です。六曜は先負(庚午)で、9日の月齢は17.0です。 6月の旧暦は神無月です。六曜は大安(辛丑)で、9日の月齢は19.0です。 7月の旧暦は文月です。六曜は赤口(辛未)で、9日の月齢は19.0です。 8月の旧暦は葉月です。六曜は先負(壬寅)で、9日の月齢は20.0です。 1月〜8月の9日の月齢が低い順に並び変えます。 1月の月齢は15.0です。 2月の月齢は16.0です。 3月の月齢は16.0です。 4月の月齢は17.0です。 5月の月齢は17.0です。 6月の月齢は19.0です。 7月の月齢は19.0です。 8月の月齢は20.0です。 1月〜8月9日の平均月齢を出します。 1月〜8月9日の平均月齢は17.4 です。 考察: 先輩のレポートを参考にしたら分かりやすくすぐ実行できたが小数点以下が全 部切り捨てられて表示されてしまった。小数点まで読み取るプログラムを足さ なきゃうまく出力されないのかなと思った。しかし、平均についてはちゃんと表示できているので、なにが間違っているか分からなかった。 結果じたいはdataを読みこんでいるので正しく作動しているといえる。 ------------------------------------------------------------------------------- 3. 感想 Webページなどに出てくる広告はどのように出力されているのか全く分からな いが、広告を出したい人と、広告をのせる場所を提供してくれる人とが連携し ていて、広告を出力する際には、あらかじめ準備しているデータを読みこむよ うな形で出力しているのではないかと考える。 また、広告には画像があったり、クリックすると公式ページや関連ページにリ ンクするように出来ている場合が多い。 その場合にはif構文を使ったりしてリンクさせているのかなと思った。 私が今まで学んだプログラム方法が使われていると考えると実際の広告を出力 するためのプログラムを見てみたいと思った。 今回のプログラム問題は先週作成したプログラムにvalueを追加させて作成し たので、あまり悩まず順調に作成できたが、並び替えや計算するプログラムを 作成するところでだいぶつまづいてしまった。 前期でも計算させるプログラムを作成することが一番苦手だったので今回も実 行してもエラーばかりで本当に苦労した。 しかし、諦めずになぜエラーが出るか何度も自分が作成したプログラムを確認 して時間はかかったが、最終的に自分の間違いに気付けて良かったと思う。 やはり、プログラムひとつひとつに説明を加えて後から見てもすぐに分かるよ うにしておくことが大事だと痛感した。 ------------------------------------------------------------------------------- 参考文献 ・ 基礎プログラミング II 第 3 回 (情報の構造を分析しよう) 「keys や values のデータ表現」 http://roy/~madoka/2012/r2/03/r2_03_01_review_01_arysort.html ・基礎プログラミング II 第 3 回 (情報の構造を分析しよう) 「Hash の作りかた」 http://roy/~madoka/2012/r2/03/r2_03_02_review_02_hash.html ・基礎プログラミング II 第 3 回 (情報の構造を分析しよう) 「データの切り取りかた」 http://roy/~madoka/2012/r2/03/r2_03_03_review_03_regularexp.html ・基礎プログラミング II 第 3 回 (情報の構造を分析しよう) 「一つずつ取り出すには / 並べ替えを詳しく行うには」 http://roy/~madoka/2012/r2/03/r2_03_04_review_04_each.html ・先輩のレポート http://roy/~madoka/2010/r2/03/rpt/c109046.txt http://roy/~madoka/2010/r2/03/rpt/c109066.txt ・基礎プログラミング I 第 5 回 (配列の構造) 「ASCII コード表」 http://roy/~madoka/2012/r1/05/r1_05_01_theme_01_asciicode.html ・http://www.ajnet.ne.jp/dairy/ -------------------------------------------------------------------------------- 共同学習者 : 伊藤 静香 ******************************* Momoko Kikuchi / 菊地桃子 c111048@g.koeki-u.ac.jp *******************************