第2回 基礎プログラミング II レポート課題 氏名: xxxxxxxx 学籍番号: C109xxx 語学クラス: 英語 1 コース(系): 環境サイエンス 1.A 各県の県庁所在地を hash 配列名 kentyou とした。 key には 県の名前 value には県庁所在地をいれた。 1.key は岩手県 value には盛岡市 2.key は長野県 value には長野市 3.key は大分県 value には大分市 4.key は愛知県 value には名古屋市 5.key は岡山県 value には岡山市 これを hash で表すと kentyou["岩手県"] = "盛岡市" kentyou["長野県"] = "長野市" kentyou["大分県"] = "大分市" kentyou["愛知県"] = "名古屋市" kentyou["岡山県"] = "岡山市" もう一つの表し方は {"岩手県" => "盛岡市","長野県" => "長野市","大分県" => "大分市", "愛知県" => "名古屋市","岡山県" => "岡山市"} B a.0d 2010 = 0x ?? 0d は 10 進数で 0x は 16 進数という意味。10 進数の 2010という数字 を 16 進数に変えるために商が 0 になるまで 16 で割り続け、余りを右 の方に書いておく。すると下のようになる。 16)2010 16) 125 10 16) 7 13 0 7 ↑ これを矢印方に読み 7、13、10 となる。まだこれは 16 進数ではないので 下の表を参考にして 7 は 7、13 は d、10 は aになる。 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 よって答えは、0d 2010 = 0x 7da b.0d 2010 = 0b ?? 0d は前も書いたように 10 進数 0b は 2 進数という意味。2 進数に直すため には、商が 1 になるまで 2 で割り続け余りを右の方に書いておく。すると 下のようになる。 2)2010 2)1005 0 2) 502 1 2) 251 0 2) 125 1 2) 62 1 2) 31 0 ↑ 2) 15 1 | 2) 7 1 | 2) 3 1 | 1 1 | --------- これを矢印の方に読み 11111011010 となる。 よって答えは 0d 2010 = 0b 11111011010 さらにこれを 16 進数に直してみる。まずこの 11111011010 を右から 4 つに 区切る。すると 111 1101 1010 これを 10 進数に直す。111 は 1*4+1*2+1*1 で 7。1101 は 1*8+1*4+0*2+1*1 で 13。1010 は 1*8+0*4+1*2+1*1 で 10。 これを下の表にあてはめ 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 になり、10 は a になる。 よって答えは 0x 7da。この答えは前の問題と同じになっているので正しく計 算されているといえる。 2 A 1.考えた設定 あらかじめ設定した Hash をすべて表示させるプログラムを考えた 2.作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' # 文字コードの設定。この場合は EUC コードで漢字 kentyou = Hash.new # Hash.new で新しく Hash を作る kentyou = { "岩手県" => "盛岡市", # Hash の対を設定する "長野県" => "長野市", "大分県" => "大分市", "愛知県" => "名古屋市", "岡山県" => "岡山市" } for ken in kentyou.keys # すべての Hash の対を表示させる # for ken(値) in kentyou.keys(ハッシュ配列名) printf("%s の県庁は %s\n",ken, kentyou[ken]) # 表示させたい文章をカッコとダブルコーテーションで囲み、一つ目の %s # には ken が入り 二つ目の %s にはkentyou[ken] が入る end # for に対する end 3.もとにしたプログラムからの変更点 Hash の中のものを県名と県庁所在地に変えた。 4.プログラムの実行画面 pan{c109149}% ./hash_for.rb [~/Ruby] 大分県 の県庁は 大分市 岡山県 の県庁は 岡山市 岩手県 の県庁は 盛岡市 愛知県 の県庁は 名古屋市 長野県 の県庁は 長野市 5.考察 Hash の中に入っているのは「大分県、大分市」、「岡山県、岡山市」、 「岩手県、盛岡市」、「愛知県、名古屋市」、「長野県、長野市」である。 実行画面にも同じように「大分県 の県庁は 大分市」、「岡山県 の県庁は 岡山市」、「岩手県 の県庁は 盛岡市」、「愛知県 の県庁は 名古屋市」、 「長野県 の県庁は 長野市」と表示されている。なのでこのプログラムは、 正しく実行されたといえる。 B 1.考えた設定 相手が知りたい情報だけを表示するプログラムを考えた 2.作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' # 文字コードの設定。この場合は EUC コードで漢字 kentyou = Hash.new # Hash.new で新しく Hash を作る kentyou = { "岩手県" => "盛岡市", # Hash の対を設定する "長野県" => "長野市", "大分県" => "大分市", "愛知県" => "名古屋市", "岡山県" => "岡山市" } STDERR.print("知りたい県名をいれていください: ") # 表示させたい文章をカッコとダブルコーテーションで囲む ken = gets.chomp # 入力された文字の改行を切取り変数 ken の中に入れる if kentyou.key?(ken) == true # Hash kentyou の中に入力された文字があったら # true を返し、なかったら false を返す # もし true だったら printf("%s の県庁は %s\n",ken, kentyou[ken]) # 表示させたい文章をダブルコーテーションで囲み、 一つ目の %s には ken # が入り二つ目の %s には kentyou[ken] が入る else # 違っていたら print("データにありません\n") end # if に対する end 3.もとにしたプログラムからの変更点 ハッシュ配列名を kentyou に変えた。 4.実行画面 pan{c109149}% ./hash_choice.rb [~/Ruby] 知りたい県名をいれていください: 岩手県 岩手県 の県庁は 盛岡市 5.考察 実行画面では岩手県を選択した。プログラムでは岩手県と打つと、岩手県 と盛岡市が表示されるようになっている。実行結果では「岩手県 の県庁は 盛岡市」と表示されている。なのでこのプログラムは正しく実行されたと いえる。 C 1.考えた設定 知りたいデータが無かった場合新しく相手に登録させ、登録したものを 表示させるプログラムを考えた 2.作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' # 文字コードの設定。この場合は EUC コードで漢字 kentyou = Hash.new # Hash.new で新しく Hash を作る kentyousyozaiti = Hash.new # Hash.new で新しく Hash を作る kentyou = { "岩手県" => "盛岡市", # Hash の対を設定する "長野県" => "長野市", "大分県" => "大分市", "愛知県" => "名古屋市", "岡山県" => "岡山市" } STDERR.print("知りたい県名をいれていください: ") # 表示させたい文章をカッコとダブルコーテーションで囲む ken = gets.chomp # 入力された文字の改行を切取り変数 ken の中に入れる if kentyou.key?(ken) == true # Hash kentyou の中に入力された文字があったら # true を返し、なかったら false を返す # もし true だったら printf("%s の県庁は %s\n",ken, kentyou[ken]) else # 違っていたら print("データにありません\n") print("新しくデータを加えます\n") while true # break するまで繰り返す STDERR.print("県名を入力してください(終了ならq): ") ken_a = gets.chomp # 入力された文字の改行を切取り変数 ken_a の中に # 入れる if ken_a == "q" # もし ken_a が q だったら break # while true を抜ける end # if に対する end STDERR.print("県庁所在地を入力してください: ") kentyousyozaiti[ken_a] = gets.chomp # 入力された文字の改行を切取り # 変数 kentyousyozaiti[ken_a] # の中に入れる end # while に対する end for ken_b in kentyousyozaiti.keys # すべての Hash の対を表示させる # for ken_b(値) in kentyousyozaiti.keys(ハッシュ配列名) printf("%s の県庁は %s\n",ken_b, kentyousyozaiti[ken_b]) # 表示させたい文章をカッコとダブルコーテーションで囲み、一つ目の %s には # ken_b が入り二つ目の %s には kentyousyozaiti[ken_b] が入る end # for に対する end end # if に対する end 3.もとにしたプログラムからの変更点 データに無かった場合それで終わりでは無く、その後新しく相手に Hash の対を 作ってもらうようにした。 4.実行画面 pan{c109149}% ./hash_register.rb [~/Ruby] 知りたい県名をいれていください: 群馬県 データにありません 新しくデータを加えます 県名を入力してください(終了ならq): 群馬県 県庁所在地を入力してください: 前橋市 県名を入力してください(終了ならq): 神奈川県 県庁所在地を入力してください: 横浜市 県名を入力してください(終了ならq): 新潟県 県庁所在地を入力してください: 新潟市 県名を入力してください(終了ならq): q 群馬県 の県庁は 前橋市 新潟県 の県庁は 新潟市 神奈川県 の県庁は 横浜市 5.考察 実行画面で群馬県と打ったがデータにありませんといわれた。実際に プログラムを見ると群馬県は無い。なので正しく表示されている。 そして、新しく「群馬県、前橋市」、「神奈川県、横浜市」、「新潟県、 新潟市」と打った。すると最後の行に「群馬県 の県庁は 前橋市」、 「新潟県 の県庁は 新潟市」、「神奈川県 の県庁は 横浜市」と新しく 打った県名と県庁所在地が表示された。よってこのプログラムは正しく 実行されたといえる。 D 1.考えた設定 データから読み込み込んだものを、Hash にいれて表示させるプログラムを 考えた。 2.作成したプログラム hash_data.dat 岩手県 盛岡市 長野県 長野市 大分県 大分市 愛知県 名古屋市 岡山県 岡山市 滋賀県 大津市 熊本県 熊本市 富山県 富山市 hash_read.rb #!/usr/koeki/bin/ruby $KCODE = 'e' # 文字コードの設定。この場合は EUC コードで漢字 kentyou = Hash.new # Hash の対を設定する print("各県の県庁所在地の一覧\n") # 表示させたい文章をダブルコーテーション # で囲む open("hash_data.dat" , "r") do |nihon| # hash_data.dat というファイルを # 読みこみモードで開き nihon という # 名前に置き換える while ken = nihon.gets # hash_data.dat の中が無くなるまで繰り返す if /(\S+)\s+(\S+)/ =~ ken # もし ken が文字列、空白、文字列、だったら ken_a = $1 # 一つ目の文字列を変数 ken_a の中に入れる kentyou[ken_a] = $2 # 二つ目の文字列を変数 kentyou[ken-a] の中に入れる end # if に対する end end # while に対する end end # open に対する end for ken_b in kentyou.keys # すべての Hash の対を表示させる # for ken_b(値) in kentyou.keys(ハッシュ配列名) printf("%s の県庁は %s\n",ken_b, kentyou[ken_b]) # 表示させたい文章をカッコとダブルコーテーションで囲み、一つ目の %s には # ken_b が入り二つ目の %s には kentyou[ken_b] が入る end # for に対する end 3.もとのプログラムからの変更点 dat ファイルから読み込むように open を使った。 4.実行結果 pan{c109149}% ./hash_read.rb [~/Ruby] 各県の県庁所在地の一覧 大分県 の県庁は 大分市 富山県 の県庁は 富山市 岡山県 の県庁は 岡山市 岩手県 の県庁は 盛岡市 愛知県 の県庁は 名古屋市 熊本県 の県庁は 熊本市 滋賀県 の県庁は 大津市 長野県 の県庁は 長野市 5.考察 データの中身は「岩手県、盛岡市」、「長野県、長野市」「大分県、 大分市」、「愛知県、名古屋市」、「岡山県、岡山市」、「滋賀県、 大津市」、「熊本県、熊本市」、「富山県、富山市」である。 実行結果は「大分県 の県庁は 大分市」、「富山県 の県庁は 富山市」、 「岡山県 の県庁は 岡山市」、「岩手県 の県庁は 盛岡市」、「愛知県 の県庁は 名古屋市」、「熊本県 の県庁は 熊本市」、「滋賀県 の県庁 は 大津市」、「長野県 の県庁は 長野市」である。このようにプログラムと 実行結果が同じになったので、このプログラムは正しく実行されたといえる。 D 1.考えた設定 新しくデータをつけたし、データを hash_data_2.dat として出力するプログラ ムを考えた。 2.作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' # 文字コードの設定。この場合は EUC コードで漢字 kentyou = Hash.new # Hash.new で新しく Hash を作る kentyou = { "岩手県" => "盛岡市", # Hash の対を設定する "長野県" => "長野市", "大分県" => "大分市", "愛知県" => "名古屋市", "岡山県" => "岡山市", "滋賀県" => "大津市", "熊本県" => "熊本市", "富山県" => "富山市" } open("hash_data_2.dat" , "w") do |ken| # hash_data_2.dat というファイルを書込みモードで開き ken という名前に # 置き換える for nihon in kentyou.keys # すべての Hash の対を表示させる # for nihon(値) in kentyou.keys(ハッシュ配列名) ken.printf("%s の県庁は %s\n",nihon, kentyou[nihon]) # 表示させたい文章をカッコとダブルコーテーションで囲み、一つ目の %s には # nihon が入り二つ目の %s には kentyou[nihon]が入る # print の前にある ken は書込みモードで開いた hash_data_2.dat に # 書きこむためのもの end # for に対する end end # open に対する end 3.もとにしたプログラムからの変更点 hash_data_2.dat というファイルを作りそこに出力させるようにした。 4.実行結果 pan{c109149}% ./hash_write.rb [~/Ruby] hash_data_2.dat 大分県 の県庁は 大分市 富山県 の県庁は 富山市 岡山県 の県庁は 岡山市 岩手県 の県庁は 盛岡市 愛知県 の県庁は 名古屋市 熊本県 の県庁は 熊本市 滋賀県 の県庁は 大津市 長野県 の県庁は 長野市 5.考察 プログラムで「岩手県、盛岡市」、「長野県、長野市」、「大分県、 大分市」、「愛知県、名古屋市」、「岡山県、岡山市」、「滋賀県、 大津市」、「熊本県、熊本市」、「富山県、富山市」である。 hash_data_2.dat では「大分県 の県庁は 大分市」、「富山県 の県庁は 富山市」、「岡山県 の県庁は 岡山市」、「岩手県 の県庁は 盛岡市」、 「愛知県 の県庁は 名古屋市」、「熊本県 の県庁は 熊本市」、「滋賀県 の県庁は 大津市」、「長野県 の県庁は 長野市」である。このようにプ ログラムと実行結果が同じになったので、このプログラムは正しく実行さ れたといえる。 本当は hash_data.dat だったがすでにあったので hash_data_2.dat とした。 3 感想 券売機があると思う。理由は買いたい券の場所を押すとそれに合った券が 出てくる。そのため Hash が使われているのではないかと思う。 4 参考文献 http://roy/~madoka/2010/r2/02/02_04_theme_03_existornot.html 基礎プログラミング II 第 2 回 「なになにといえばこれこれ」あるかないか 西村 まどか先生 http://roy/~madoka/2010/r2/02/02_07_theme_06_forprint.html 基礎プログラミング II 第 2 回 「なになにといえばこれこれ」Hash の対を 表示するには 西村 まどか先生 5 共同学習者 小松 由里 青木 千紗 久保田 瑛一郎 6 添付