第3回 基礎プログラミング II レポート課題 氏名:遠藤裕貴 学籍番号:c1090294 語学クラス:中国語 コース(系):政策マネ 1.筆記問題 A. 自分の名前のアルファベット: Endo Yuki これをASCIIコードで調べると E = Ox45 n = Ox6e d = Ox64 o = Ox6f Y = 0x59 u = 0x75 k = 0X6b i = 0x69 となる。 B. 「にわにはにわにわとりがいる」 (6例) にわ に は にわ にわとり が いる (庭には二羽ニワトリが居る) にわ に は にわ にわとり が いる (庭には二羽ニワトリが要る) にわ に はにわ にわとり が いる (庭に埴輪、ニワトリが居る) にわ に はにわ にわとり が いる(庭に埴輪、ニワトリが要る) にわ に は にわ にわとり が いる (二話には二羽ニワトリが要る) にわ に はにわ にわとり が いる (二話に埴輪、ニワトリが要る) C. 海外で活躍するサッカー選手を hash 配列 の sensyu とした。 sensyu の key と value は選手の名前とその所属チーム、身長、体重にした。 1:key「川島永嗣」に対してvalueは 「リールセ,185,80」 2:key「長友佑都」 に対してvalueは 「チェゼーナ,170,68」 3:key「松井大輔」 に対してvalueは 「FC トム・トムスク,175,64」 4:key「本田圭祐」に対してvalueは 「CSKAモスクワ,182,76」 5:key「森本貴幸」に対してvalueは 「カターニャ,180,76」 sensyu["川島永嗣"]="リールセ",185,80 sensyu["長友佑都"]="チェゼーナ",170,68 sensyu["松井大輔"]="FC トム・トムスク",175,64 sensyu["本田圭祐"]="CSKAモスクワ",182,76 sensyu["森本貴幸"]="カターニャ",180,76 {"川島永嗣"=>"リールセ",185,80,"長友佑都"=>"チェゼーナ",170,68,"松井大輔 "=>"FC トム・トムスク",175,64,"本田圭祐"=>"CSKAモスクワ",182,76,"森本貴 幸"=>"カターニャ",180,76} 2.プログラム問題 A. ◯考えた設定 あらかじめプログラムに登録してある対を表示するもの「hash_ary_print.rb 」 1の筆記問題のCを用いた。 ◯作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コード EUC で出力する。 sensyu = Hash.new # Hash配列 sensyu["川島永嗣"]="リールセ",185,80 sensyu["長友佑都"]="チェゼーナ",170,68 sensyu["松井大輔"]="FC トム・トムスク",175,64 sensyu["本田圭祐"]="CSKAモスクワ",182,76 sensyu["森本貴幸"]="カターニャ",180,76 print("\nデータを全て表示します。\n\n") for tall , weight in sensyu printf("「%s」は『%s』のチームに所属しています。 身長は %d センチで、体重は %dキロ です。\n\n",tall,weight[0],weight[1],weight[2]) end ◯変更点 前回作成した「hash_for_rb」を今回のものに合うようにした。 ◯実行結果 pan{c109029}% ./hash_ary_print.rb [~/Ruby] データを全て表示します。 「松井大輔」は『FC トム・トムスク』のチームに所属しています。 身長は 175 センチで、体重は 64キロ です。 「森本貴幸」は『カターニャ』のチームに所属しています。 身長は 180 センチで、体重は 76キロ です。 「長友佑都」は『チェゼーナ』のチームに所属しています。 身長は 170 センチで、体重は 68キロ です。 「川島永嗣」は『リールセ』のチームに所属しています。 身長は 185 センチで、体重は 80キロ です。 「本田圭祐」は『CSKAモスクワ』のチームに所属しています。 身長は 182 センチで、体重は 76キロ です。 pan{c109029}% ◯考察 プログラムを実行すると選手名と対になっている所属チーム、身長、体重が それぞれ表示された。このことから設定通りにプログラムを作成できたといえる。 B. ◯考えた設定 選手の身長が低い順に並び換えるプログラム「hash_ary_sort.rb 」 ◯作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コード EUC で出力する。 sensyu = Hash.new # Hash配列 sensyu["川島永嗣"]="リールセ",185,80 sensyu["長友佑都"]="チェゼーナ",170,68 sensyu["松井大輔"]="FC トム・トムスク",175,64 sensyu["本田圭祐"]="CSKAモスクワ",182,76 sensyu["森本貴幸"]="カターニャ",180,76 print("\n 身長の低い順に並び変えます。 \n\n") sensyu.keys.sort{|a,b| sensyu[a][1]<=> sensyu[b][1]}.each{|tall| printf("%s の身長は %d センチです。\n",tall,sensyu[tall][1])} # 身長が低い順に並べ替えた状態で表示する。 # hash配列.key.sort を使う。 # {|並び変える前の key に変数を与える,並び変えた後の key に変数を与える| # hash配列[並び変える前の key に与えた変数][並び換えをする要素番号] # <=> # hash配列[並び換えた後の key に与えた変数][並び換えをする要素番号] # 配列.each{|配列の要素を代入する変数を与える| ◯変更点 授業で作成した hash_sesame.rb を参考にして自分のプログラムに合うように 変更した。 ◯実行結果 pan{c109029}% ./hash_ary_sort.rb [~/Ruby] 身長の低い順に並び変えます。 長友佑都 の身長は 170 センチです。 松井大輔 の身長は 175 センチです。 森本貴幸 の身長は 180 センチです。 本田圭祐 の身長は 182 センチです。 川島永嗣 の身長は 185 センチです。 pan{c109029}% [~/Ruby] ◯考察 身長の低い順に表示されているのでこのプログラムは正しいと言える。 C. ◯考えた設定 身長が低い順に表示し、そのあとに身長の平均を計算するプログラム。 ◯作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コード EUC で出力する。 sensyu = Hash.new # Hash配列 sensyu["川島永嗣"]="リールセ",185,80 sensyu["長友佑都"]="チェゼーナ",170,68 sensyu["松井大輔"]="FCトム・トムスク",175,64 sensyu["本田圭祐"]="CSKAモスクワ",182,76 sensyu["森本貴幸"]="カターニャ",180,76 print("\n 身長の低い順に並び変えます。 \n\n") sleep 2 sensyu.keys.sort{|a,b| sensyu[a][1]<=> sensyu[b][1]}.each{|take| printf("%s の身長は %d センチです。\n",take,sensyu[take][1])} total = 0 for soccer , tall in sensyu total += tall[1] end average = total.to_f/sensyu.length # 平均を求める。 print("\n 5人の平均身長を表示します。\n") print("ただいま計算しています。もうしばらくお待ち下さい。\n") sleep 3 printf("\n 身長の平均は %4.1f センチです。\n",average) ◯変更点 sleep を使って表示に時間差を出した。 ◯実行結果 pan{c109029}% ./hash_ary_calc.rb [~/Ruby] 身長の低い順に並び変えます。 長友佑都 の身長は 170 センチです。 松井大輔 の身長は 175 センチです。 森本貴幸 の身長は 180 センチです。 本田圭祐 の身長は 182 センチです。 川島永嗣 の身長は 185 センチです。 5人の平均身長を表示します。 ただいま計算しています。もうしばらくお待ち下さい。 身長の平均は 178.4 センチです。 pan{c109029}% ◯考察 身長が低い順に表示されている。 pan{c109029}% bc -l [~/Ruby] 170+175+180+182+185 892 892/5 178.40000000000000000000 quit pan{c109029}% [~/ 小数点第2位を四捨五入し、小数点第1位まで表示すると178.4なので、 作成したプログラムは正しいと言える。 D. ◯考えた設定 プログラムをデータとファイルに分け、読みこませて表示させるようにする。 ◯作成したプログラム「hash_ary_read.rb」 $KCODE = 'e' # 日本語コード EUC で出力する。 total = 0 sensyu = Hash.new # Hash配列 print("\n身長が低い順に表示します。\n\n") open("hash_ary_dat","r") do |z| # open "hash_ary_dat" を開いて # "r" でデータを読み込む。 # 読み込んだデータを "z" にしまう。 while soccer = z.gets # soccer 変数に hash_ary_dat からデータを持って来る。 if/(\S+)\s+(\S+)\s+(\d+)\s+(\d+)/ =~soccer sensyu[$1] = [$2, $3.to_i, $4.to_i] end # if文の end end # while文の end end # open文の end sensyu.keys.sort{|a,b| sensyu[a][1]<=> sensyu[b][1]}.each{|tall| printf("%s の身長は %d センチです。\n",tall,sensyu[tall][1])} for soccer , tall in sensyu total += tall[1] end average = total.to_f/sensyu.length printf("\n 5人の平均身長は %4.1f センチです。\n",average) ◯hash_ary_dat 川島永嗣 リールセ 185 80 長友佑都 チェゼーナ 170 68 松井大輔 FCトム・トムスク 175 64 本田圭祐 CSKAモスクワ 182 76 森本貴幸 カターニャ 180 76 ◯変更点 Cで作成した hash_ary_clac.rb をもとにして、open文を付け、 データを読み込むようにした。 ◯実行結果 pan{c109029}% ./hash_ary_read.rb [~/Ruby] 身長が低い順に表示します。 長友佑都 の身長は 170 センチです。 松井大輔 の身長は 175 センチです。 森本貴幸 の身長は 180 センチです。 本田圭祐 の身長は 182 センチです。 川島永嗣 の身長は 185 センチです。 5人の平均身長を表示します。 ただいま計算しています。もうしばらくお待ち下さい。 5人の平均身長は 178.4 センチです。 pan{c109029}% [~/ ◯考察 身長が低い順に表示されている。 pan{c109029}% bc -l [~/Ruby] 170+175+180+182+185 892 892/5 178.40000000000000000000 quit pan{c109029}% [~/ 小数点第2位を四捨五入し、小数点第1位まで表示すると178.4なので、 作成したプログラムは正しいと言える。 ◯感想 いろいろと聞いたり教えてもらったりしてhashについて理解が深まった。 「水が無いので」 水が無いので作物が育たない 作物が育たないので収穫が出来ない 収穫が出来ないので出荷が出来ない 出荷が出来ないので給料が入らない 給料が入らないので貧乏になる ◯参考文献 基礎プログラミング I 第5回 配列の構造 「ASCII コード表」 http://roy/~madoka/2010/r1/05/05_01_theme_01_asciicode.html Hatene::Question http://q.hatena.ne.jp/1148181739/12375/#i12375 基礎プログラミング II 第2回 なになにといえばこれこれ 「覚える順番は違う けれど答えは正しい」 http://roy/~madoka/2010/r2/02/02_10_theme_09_memory.html 基礎プログラミング II 第2回 なになにといえばこれこれ 「key を使って並び 換え」 http://roy/~madoka/2010/r2/02/02_11_theme_10_sortinkey.html 基礎プログラミング II 第3回 情報の構造を分析しよう 「keys や values のデー タ表現」 http://roy/~madoka/2010/r2/03/03_01_review_01_arysort.html 基礎プログラミング II 第2回 なになにといえばこれこれ 「対の情報を使って 並び換え」 http://roy/~madoka/2010/r2/02/02_08_theme_07_each.html ◯共同研究者 木内君、青木さん、英一郎君、横山君 ◯ファイルを添付します