第 2 回 なになにといえばこれこれ レポート課題 氏名:井上 宏美 学籍番号:c1110223 語学クラス:英語3 コース:政策マネジメント 1.筆記問題 A. 都道府県の県庁所在地をashとして配列名をkenkenとする。 keyには各県の名前を、valueには県庁所在地をいれた。 その1.keyは山形県 valueは山形市 その2.keyは沖縄県 valueは那覇市 その3.keyは福岡県 valueは福岡市 その4.keyは新潟県 valueは新潟市 その5.keyは愛知県 valueは名古屋市 これをhashで表示させると kenken["山形県"] = "山形市" kenken["沖縄県"] = "那覇市" kenken["福岡県"] = "福岡市" kenken["新潟県"] = "新潟市" kenken["愛知県"] = "名古屋市" もうひとつの表し方として {"山形県" => "山形市","沖縄県" => "那覇市","福岡県" => "福岡市", "新潟県" => "新潟市","愛知県" => "名古屋市"} と表示させることが出来る。 B. a.0d 2012 = 0x ?? 0dは10進数、0xは16進数を表す。 10進数を16進数に変換する場合は、10進数を割れなくなるまで16で割る。 その次に、割った時の余りを逆から読んで、10進数に直す。 2012 / 16 = 125 余り 12 125 / 16 = 7 余り 13 7 / 16 = 0 余り 7 これらをしたから順番に並べると 7 = 7, 13 = d, 12 =c となるので、 0d 2012 = 0x7dcとなる。 b.0d 2012 = 0b ?? 0dは10進数、0bは2進数である。10進数を2進数にするためには2で割る。 2012 / 2 = 1006 余り 0 1006 / 2 = 503 余り 0 503 / 2 = 251 余り 1 251 / 2 = 125 余り 1 125 / 2 = 62 余り 1 62 / 2 = 31 余り 0 31 / 2 = 15 余り 1 15 / 2 = 7 余り 1 7 / 2 = 3 余り 1 3 / 2 = 1 余り 1 1 / 2 = 0 余り 1 これらを下から順番に並べると 11111011100 と表示される。 0x2012 =0b11111011100 0b11111011100を16進数に変換する。2進数を16進数にするには 2進数を下から4桁ずつに区切って、その数字ごとに10進数に変換する。 0111/1101/1100 0111 = 0*2の3乗 + 1*2の2乗 + 1*2の1乗 + 1*2の0乗 = 0 + 4 + 2 + 1 = 7 1101 = 1*2の3乗 + 1*2の2乗 + 0*2の1乗 + 1*2の0乗 = 8 + 4 + 0 + 1 =13 1100 = 1*2の3乗 + 1*2の2乗 + 0*2の1乗 + 0*2の0乗 = 8 + 4 + 0 + 0 = 12 以上の計算からこれを下の表に当てはめると 2進数 10進数 16進数 0001 1 1 0010 2 2 0011 3 3 0100 4 4 0101 5 5 0110 6 6 0111 7 7 1000 8 8 1001 9 9 1010 10 a 1011 11 b 1100 12 c 1101 13 d 1110 14 e 1111 15 f 7は7、13はd、12はcとなる。 よって、答えは、0x7dcとなる。 この答えは前の問題と同じと言える。 2.プログラム問題 A i.考えた設定 あらかじめプログラムに登録してある対のデータを全て表示させる プログラムを作成する。 ii.作成したプログラム hash_for.rb #!/usr/koeki/bin/ruby #coding : euc-jp kenken = Hash.new #Hash 配列をkenkenとする kenken = { "山形県" => "山形市", #Hashの対を設定する "沖縄県" => "那覇市", "福岡県" => "福岡市", "新潟県" => "新潟市", "愛知県" => "名古屋市" } for ken, in kenken.keys #すべてのHashの対を表示させる # for ken(値) in kenken.keys(Hash配列名) printf("%sの県庁所在地は%s\n",ken,kenken[ken]) #表示させる文章をカッコ()とダブルコーテーション""で囲む。 #一つ目の%sはkentyoが入り、二つ目の%sにはkenken[ken]が入る。 end #forに対するend iii.もとにしたプログラムからの変更点 Hashのなかを各県と県庁所在地名に変更した。 iv.プログラムを実行した結果画面 pan{c111022}% ./hash_for.rb [~/Ruby] 山形県の県庁所在地は山形市 沖縄県の県庁所在地は那覇市 福岡県の県庁所在地は福岡市 新潟県の県庁所在地は新潟市 愛知県の県庁所在地は名古屋市 v.導き出された結果の考察 実行画面には「山形県の県庁所在地は山形県」、「沖縄県の県庁所在地は那覇 市」、「福岡県の県庁所在地は福岡市」、「新潟県の県庁所在地は新潟市」、愛 知県の県庁所在地は名古屋市」と表示されている。 Hashのなかは、「山形県、山形市」「沖縄県、那覇市」「福岡県、福岡市」「新 潟県、新潟市」「愛知県、名古屋市」となっているので、この結果は正しく実行 されたと言える。 B. i.考えた設定 ユーザが知りたい情報だけの結果を表示させるプログラムを考えた。 ii.作成したプログラム hash_choice.rb #!/usr/koeki/bin/ruby kenken = Hash.new #Hash.newで新しくHashを作る kenken = { "山形県" => "山形市", #Hashの対を設定する "沖縄県" => "那覇市", "福岡県" => "福岡市", "新潟県" => "新潟市", "愛知県" => "名古屋市" STDERR.print("あなたの知りたい県名入力してください。: ") #表示させる文章をカッコ()とダブルコーテーション""で囲む ken = gets.chomp #入力された文字の改行を切り取り変数kenの中に入れる if kenken.key?(ken) ==true #もしHash kenkenの中に入力された文字があったら #trueを繰り返し、なかったらfalseを返す #もしもtrueだとしたら printf("%sの県庁所在地%s\n",ken,kenken[ken]) #表示させる文章をダブルコーテーション""で囲む。 #一つ目の%sはken,二つ目の%sにはkenken[ken]が入る else #もしも違っていたら printf("%sはデータにありません\n", ken) printf("%s\n",kenken[ken]) end #ifに対するend iii.もとにしたプログラムからの変更点 Hash配列名をkenkenに変更した。 iv.プログラムを実行した結果画面 データがある場合 pan{c111022}% ./hash_choice.rb [~/Ruby] あなたの知りたい県名入力してください。: 福岡県 福岡県の県庁所在地福岡市 データがない場合 pan{c111022}% ./hash_choice.rb [~/Ruby] あなたの知りたい県名入力してください。: 北海道 北海道はデータにありません v.導き出された結果の考察 実行した画面では福岡県を選択した。福岡県と入力すると、福岡市と表示される ようになっている。また、データがない場合を試してみても、データがないとしっ かり明記されるのでこのプログラムは正しく動いていると言える。 C. i.考えた設定 知りたい情報が出てこない時に、ユーザに対を登録させてその結果を出力させる プログラムを考えた。 ii.作成したプログラム hash_register.rb #!/usr/koeki/bin/ruby kenken = Hash.new #Hash.newで新しくHashを作る kentya = Hash.new #Hash.newで新しく Hashを作る kenken = { "山形県" => "山形市", #Hashの対を設定する "沖縄県" => "那覇市", "福岡県" => "福岡市", "新潟県" => "新潟市", "愛知県" => "名古屋市" } STDERR.print("知りたい県名を入れて下さい。:") #表示させたい文章をカッコ()とダブルコーテーション""で囲む ken = gets.chomp # 入力された文字の改行を切り取り変数 ken の中に入れる if kenken.key?(ken) == true # Hash kentyou の中に入力された文字があったら # true を返し、なかったら false を返す # もし true だったら printf("%s の県庁は %s\n",ken, kenken[ken]) else # 違っていたら print("データがありません\n") print("新しくデータに加えます\n") while true # break するまで繰り返す STDERR.print("県名を入力してください(終了ならq): ") ken_i = gets.chomp # 入力された文字の改行を切取り変数 ken_i の中に # 入れる if ken_i == "q" # もし ken_i が q だとする break # while true を抜ける end # if に対する endをかく STDERR.print("県庁所在地を入力してください: ") kentya[ken_i] = gets.chomp # 入力された文字の改行を切り取る # 変数 kentya[ken_i] # の中に入れる end # while に対する end for ken_r in kentya.keys # すべての Hash の対を表示させる # for ken_r(値) in kentya.keys(Hash配列名) printf("%sの県庁所在地は%s\n",ken_r, kentya[ken_r]) # 表示させる文章をカッコ()とダブルコーテーション""で囲み一つ目の %s には # ken_b が入り二つ目の %s には kentya[ken_r] が入る end # for に対する end end # if に対する end iii.もとにしたプログラムからの変更点 データがなければそれで終わりではなくユーザに新しくデータを入力してもらう ことでHashの対を増やした。 iv.プログラムを実行した結果画面 pan{c111022}% ./hash_register.rb [~/Ruby] 知りたい県名を入れて下さい。:北海道 データがありません 新しくデータに加えます 県名を入力してください(終了ならq): 北海道 県庁所在地を入力してください: 札幌市 県名を入力してください(終了ならq): 神奈川県 県庁所在地を入力してください: 横浜市 県名を入力してください(終了ならq): 岩手県 県庁所在地を入力してください: 盛岡市 県名を入力してください(終了ならq): q 北海道の県庁所在地は札幌市です。 神奈川県の県庁所在地は横浜市です。 岩手県の県庁所在地は盛岡市です。 v.導き出された結果の考察 データにない県名を入力すると「データがありません。新しくデータに加えま す。」と表示されたので正しく表示されている。「北海道は札幌市」「神奈川県 は横浜市」「岩手県は盛岡市」と新しいデータを入力すると「北海道の県庁所在 地は札幌市です。」「神奈川県の県庁所在地は横浜市です。」「岩手県の県庁所 在地は盛岡市です。」と表示されるので正しく実行されたと言える。 D. i.データから読みようにしたものを、Hashにいれて表示させるプログラムを考え た。 ii.作成したプログラム hash_data.dat 北海道 札幌市 青森県 青森市 秋田県 秋田市 岩手県 盛岡市 山形県 山形市 福島県 福島市 宮城県 仙台市 新潟県 新潟市 東京都 新宿区 長野県 長野市 熊本県 熊本市 hash_read.rb #!/usr/koeki/bin/ruby #coding: euc-jp kenken = Hash.new #Hash の対を設定する print("各都道府県の県庁所在地の一覧表\n") #表示させる文章を""で囲む open("hash_data.dat","r") do |japan| #hash_data.datのファイルを読みこむ #|japan|という名前に置き換え while ken = japan.gets #hash_data.datの中が終わるまで繰り返す if/(\S+)\s+(\S+)/ =~ken #もしも ken が文字列、空白、文字列だったら ken_i = $1 #一つ目の文字列を変数 ken_i の中に入れる kenken[ken_i] = $2 #二つ目の文字列を変数 kenken[ken_i]の中にいれる end # if に対する end end #while に対する end end #open に対する end for ken_r in kenken.keys #すべてのhashの対を表示させる # for ken_r(値) in kenken_keys (hash配列名を表示) printf("%sの県庁所在地は %s\n",ken_r,kenken[ken_r]) #表示させる文章をカッコ()とダブルコーテーション""で囲む #一つ目の%sはken_rが入り、二つ目の%sはkenken[ken_r]が入る end #for に対する end iii.もとにしたプログラムからの変更点 openを使うためdatファイルから読みこむようにした。 iv.プログラムを実行した結果画面 pan{c111022}% ./hash_read.rb [~/Ruby] 各都道府県の県庁所在地の一覧表 北海道の県庁所在地は 札幌市 青森県の県庁所在地は 青森市 秋田県の県庁所在地は 秋田市 岩手県の県庁所在地は 盛岡市 山形県の県庁所在地は 山形市 福島県の県庁所在地は 福島市 宮城県の県庁所在地は 仙台市 新潟県の県庁所在地は 新潟市 東京都の県庁所在地は 新宿区 長野県の県庁所在地は 長野市 熊本県の県庁所在地は 熊本市 v.導き出された結果の考察 データでは「北海道は札幌市」「青森県は青森市」「秋田県は秋田市」「岩手県 は盛岡市」「山形県は山形市」「福島県は福島市」「宮城県は仙台市」「新潟県 は新潟市」「東京都は新宿区」「長野県は長野市」「熊本県は熊本市」である。 実行結果では「北海道の県庁所在地は 札幌市」「青森県の県庁所在地は 青森市」 「秋田県の県庁所在地は 秋田市」「岩手県の県庁所在地は 盛岡市」「山形県の 県庁所在地は 山形市」「福島県の県庁所在地は 福島市」「宮城県の県庁所在地 は 仙台市」「新潟県の県庁所在地は 新潟市」「東京都の県庁所在地は 新宿区」 「長野県の県庁所在地は 長野市」「熊本県の県庁所在地は 熊本市」と表示され る。以上の結果から、プログラムと実行結果は同じなのでプログラムは正しく実 行されたといえる。 E. i.考えた設定 K-term でプログラム hash_write.rbを出力させ、そこで入力した情報を、 hash_data.datに登録させるようにした。 ii.作成したプログラム hash_write.rb #!/usr/koeki/bin/ruby #coding: euc-jp kenken =Hash.new #hash.newで新しくhashを作る while true STDERR.print("探している県名は:\n") kentya = gets if kentya == nil print("登録終了です。\n") break else kentyo = kentya.chomp STDERR.print("県庁所在地は:\n") japan = gets.chomp kentyo = japan end end open("hash_data2.dat" , "w") do |ken| # hash_data2.dat というファイルを書込みモードで開き ken という名前に # 置き換える for nihon in kentyo # すべての hash の対を表示させる # for japan(値) in kenken.keys(hash配列名) ken.printf("%s の県庁所在地は %s\n",kentya, kenken[kentya]) # 表示させたい文章をカッコ()とダブルコーテーション""で囲む #一つ目の %s はkentyaが入り、二つ目の %s は kenken[kentya]が入る end #for に対する end end #openに対する end iii.もとにしたプログラムからの変更点 読みこみモード"r"から、書きこみモードの"w"に変更した。 iv.プログラムを実行した結果画面 pan{c111022}% ./hash_write.rb [~/Ruby] 探している県名は: 山形県 県庁所在地は: 山形市 探している県名は: 熊本県 県庁所在地は: 熊本市 探している県名は: 神奈川県 県庁所在地は: 横浜市 探している県名は: 長野県 県庁所在地は: 長野市 北海道 札幌市 青森県 青森市 秋田県 秋田市 岩手県 盛岡市 山形県 山形市 福島県 福島市 宮城県 仙台市 新潟県 新潟市 東京都 新宿区 長野県 長野市 熊本県 熊本市 沖縄県 那覇市 神奈川県 横浜市 v.導き出された結果の考察 データに登録していない新たな情報を、登録することが出来ると考えられる。 3.感想 クレジットカードや、券発行機などが使われていると考えられます。 クレジットは、個人情報などをまとめるときに使うわれていると思います。 また、券発行機は、押したボタンで自分のほしいものが自動的に出てくるので、 Hashが使われていると思いました。 今回の授業で習ったものも使いつつ、前回までの復習が多かったので忘れてしまっ ていたところを重点的に行なうようにしました。 プログラム問題では、身近なものに「これが使えたら便利だろうな」というもの が多く、勉強になり苦労しながらも楽しくとり組むことが出来ました。 今回は、一人でとり組みましたが、復習しながら自分の苦手な点を再確認出来て 良かったです。 次回からも頑張りたいです。 vi.参考文献 http://roy/~madoka/2012/r2/02/lec/resume.html 第 2 回 「なになにといえばこれこれ」 講義ノート 西村まどか先生 Ruby プログラミング基礎講座 広瀬雄二著 p101~106 http://roy/~madoka/2012/r2/01/lec/resume.html 第 1 回 「前期の復習」 講義ノート 西村まどか先生 http://roy/~madoka/2012/r2/02/r2_02_04_theme_03_existornot.html (なになにといえばこれこれ) 「あるかないか」 西村まどか先生