第2回 基礎プログラミング II レポート課題 氏名:大島 藍 学籍番号:C1090331 語学クラス:中国語 コース(系):福祉コース 1、筆記問題 A、 レジの商品を Hash 配列名 reji とした。 key には 商品の名前 value には値段をいれた。 1、 key は ガム value には 100円 key は アメ value には 200円 key は ポテチ value には 300円 key は ぷっちょ value には 120円 key は ちょこ value には 150円 これを Hash で表すと reji["ガム"] = 100 reji["アメ"] = 200 reji["ポテチ"] = 300 reji["ぷっちょ"] = 120 reji["ちょこ"] = 150 もう1つの表し方は… {"ガム" => "100円","アメ" => "200円","ポテチ" => "300円","ぷっちょ" => "120円","ちょこ" => "150円"} 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 コードで漢字 reji = Hash.new # Hash.new で新しく Hash を作る reji = { "ガム" => "100円", # Hash の対を設定する "アメ" => "200円", "ポテチ" => "300円", "ぷっちょ" => "120円", "ちょこ" => "150円" } for tabemono in reji.keys # すべての Hash の対を表示させる # for tabemono(値) in reji.keys(ハッシュ配列) printf("%s の値段は %s\n",tabemono,reji[tabemono]) # 表示させたい文章をカッコとダブルコーテーションで囲み、1つ目の %s # には tabemono が入り 2つ目の %s には reji[tabemono] が入る end # for に対する end 3、もとにしたプログラムからの変更点 for を使って全てのものを表示させた。 4、プログラムの実行 pan{c109033}% ./hash_for.rb [~/Ruby] ガム の値段は 100円 アメ の値段は 200円 ちょこ の値段は 150円 ぷっちょ の値段は 120円 ポテチ の値段は 300円 5、考察 プログラムを作って実行してみると商品と値段がでてくるので、このプログラ ムは正しかったといえる。 B、 1、考えた設定 知りたい情報だけを表示させるプログラム 2、作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' # 文字コードの設定。この場合は EUC コードで漢字 reji = Hash.new # Hash.new で新しく Hash を作る reji = { "ガム" => "100円", # Hash の対を設定する "アメ" => "200円", "ポテチ" => "300円", "ぷっちょ" => "120円", "ちょこ" => "150円" } STDERR.print("買いたい商品をいれてください: ") # 表示させたい文章をカッコとダブルコーテーションで囲む kaitaimono = gets.chomp # 入力された文字の改行を切取り変数 kaitaimono の中に入れる if reji.key?(kaitaimono) == true # Hash reji の中に入力された文字があったら # true を返し、なかったら false を返す # もし true だったら printf("%s の値段は %s\n",kaitaimono,reji[kaitaimono]) # 表示させたい文章をダブルコーテーションで囲み、1つ目の %s には tabemono # が入り2つ目の %s には reji[kaitaimono] が入る else # 違っていたら print("データにありません\n") end # if に対する end 3、もとにしたプログラムからの変更点 Hash の配列名を reji に変えた。 4、実行画面 pan{c109033}% ./hash_choice.rb [~/Ruby] 買いたい商品をいれてください: ガム ガム の値段は 100円 5、考察 買いたい商品と値段が出てくる。 pan{c109033}% ./hash_choice.rb [~/Ruby] 買いたい商品をいれてください: ガム ガム の値段は 100円 このように出てくるので、このプログラムは正しかったといえる。 C、 1、考えた設定 知りたいデータがなかった場合新しく相手に登録させ、登録したものを表示させ るプログラムを考えた。 2、作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' # 文字コードの設定。この場合は EUC コードで漢字 reji = Hash.new # Hash.new で新しく Hash を作る nedann = Hash.new # Hash.new で新しく Hash を作る reji = { "ガム" => "100円", # Hash の対を設定する "アメ" => "200円", "ポテチ" => "300円", "ぷっちょ" => "120円", "ちょこ" => "150円" } STDERR.print("買いたい商品をいれてください: ") # 表示させたい文章をカッコとダブルコーテーションで囲む kaitaimono = gets.chomp # 入力された文字の改行を切取り変数 kaitaimono の中に入れる if reji.key?(kaitaimono) == true # Hash reji の中に入力された文字があったら # true を返し、なかったら false を返す # もし true だったら printf("%s の値段は %s\n",kaitaimono,reji[kaitaimono]) # 表示させたい文章をダブルコーテーションで囲み、1つ目の %s には tabemono # が入り2つ目の %s には reji[kaitaimono] が入る else # 違っていたら print("データにありません\n") print("新しくデータを加えます\n") while true # break するまで繰り返す STDERR.print("商品をいれてください(終了なら q ): ") reji_s = gets.chomp # 入力された文字の改行を切取り変数 reji_a の中に # いれる if reji_s == "q" # もし reji_a が q だったら break # while true を抜ける end # if に対する end STDERR.print("値段をいれてください: ") nedann[reji_s] = gets.chomp # 入力された文字の改行を切取り # 変数 nedann[reji_a] の中にいれる end # while に対する end for reji_t in nedann.keys # すべての Hash の対を表示させる # for reji_t(値) in nedann.keys(ハッシュ配列名) printf("%s の値段は %s円\n",reji_t,nedann[reji_t]) # 表示させたい文章をカッコとダブルコーテーションで囲み、1つ目の %s には # reji_t が入り2つ目の %s には nedann[reji_t]が入る end # for に対する end end # if に対する end 3、もとにしたプログラム データになかったら、それで終わりでは無く、その後新しく相手に Hash の対を 作ってもらうようにした。 4、実行画面 pan{c109033}% ./hash_register.rb [~/Ruby] 買いたい商品をいれてください: 卵 データにありません 新しくデータを加えます 商品をいれてください(終了なら q ): おかし 値段をいれてください: 100 商品をいれてください(終了なら q ): q おかし の値段は 100円 5、考察 プログラムでは、商品の名前と値段を打ってもらったものを全て表示させる。 pan{c109033}% ./hash_register.rb [~/Ruby] 買いたい商品をいれてください: 卵 データにありません 新しくデータを加えます 商品をいれてください(終了なら q ): おかし 値段をいれてください: 100 商品をいれてください(終了なら q ): q おかし の値段は 100円 このプログラムと実行結果があっていたといえる。 D、 1、考えた設定 データから読み込んだものをすべて表示させるプログラムを考えた。 2、作成したプログラム ガム 100円 アメ 200円 ポテチ 300円 ぷっちょ 120円 ちょこ 150円 人参 298円 玉葱 350円 キャベツ 500円 #!/usr/koeki/bin/ruby $KCODE = 'e' # 文字コードの設定。この場合は EUC コードで漢字 reji = Hash.new # Hash.new で新しく Hash を作る print("商品の一覧\n") # 表示させたい文章をダブルコーテーションで囲む open("hash_data.dat" , "r") do |ame| # hash_data.dat というファイルを # 読みこみモードで開き ame という # 名前に置き換える while mono = ame.gets # hash_data.dat の中が無くなるまで繰り返す if /(\S+)\s+(\S+)/ =~ mono # もし reji が文字列、空白、文字列、だったら reji_s = $1 # 一つ目の文字列を変数 reji_s の中に入れる reji[reji_s] = $2 # 二つ目の文字列を変数 reji[reji_s] の中に入れる end # if に対する end end # while に対する end end # open に対する end for reji_t in reji.keys # すべての Hash の対を表示させる # for reji_t(値) in reji.keys(ハッシュ配列名) printf("%s の値段は %s\n",reji_t, reji[reji_t]) # 表示させたい文章をカッコとダブルコーテーションで囲み、一つ目の %s には # reji_t が入り二つ目の %s には reji[reji_t] が入る end # for に対する end 3、もとのプログラムからの変更点 openを使ってファイルを読みこませた。 4、実行画面 pan{c109033}% ./hash_read.rb [~/Ruby] 商品の一覧 ガム の値段は 100円 キャベツ の値段は 500円 人参 の値段は 298円 アメ の値段は 200円 ちょこ の値段は 150円 玉葱 の値段は 350円 ぷっちょ の値段は 120円 ポテチ の値段は 300円 5、考察 商品と値段が出てくる。 pan{c109033}% ./hash_read.rb [~/Ruby] 商品の一覧 ガム の値段は 100円 キャベツ の値段は 500円 人参 の値段は 298円 アメ の値段は 200円 ちょこ の値段は 150円 玉葱 の値段は 350円 ぷっちょ の値段は 120円 ポテチ の値段は 300円 このように出てくるので実行結果は正しかったといえる。 E、 1、 考えた設定 Hash の中にあるものを hash_data_2.dat に出力するプログラムを考えた。 2、作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' # 文字コードの設定。この場合は EUC コードで漢字 reji = Hash.new # Hash.new で新しく Hash を作る reji["煎餅"] = 100 reji["卵"] = 200 reji["ガム"] = 100 reji["アメ"] = 200 reji["ポテチ"] = 300 reji["ぷっちょ"] = 120 reji["ちょこ"] = 150 open("hash_data_2.dat" , "w") do |choko| # hash_data.dat というファイルを # 書きこみモードで開き ame という # 名前に置き換える for reji_t in reji.keys # すべての Hash の対を表示させる # for reji_t(値) in reji.keys(ハッシュ配列名) choko.printf("%s の値段は %s円\n",reji_t, reji[reji_t]) # 表示させたい文章をカッコとダブルコーテーションで囲み、一つ目の %s には # reji_t が入り二つ目の %s には reji[reji_t] が入る end # for に対する end end # open 3、もとにしたプログラムからの変更点 open を使ってファイルを書きこむようにした。 4、実行結果 pan{c109033}% ./hash_write.rb [~/Ruby] pan{c109033}% cat hash_data_2.dat [~/Ruby] 煎餅 の値段は 100円 ガム の値段は 100円 アメ の値段は 200円 ちょこ の値段は 150円 ぷっちょ の値段は 120円 卵 の値段は 200円 ポテチ の値段は 300円 5、考察 商品を入れると値段がでてくる。 煎餅 の値段は 100円 ガム の値段は 100円 アメ の値段は 200円 ちょこ の値段は 150円 ぷっちょ の値段は 120円 卵 の値段は 200円 ポテチ の値段は 300円 このようになるのでプログラムと実行結果は正しかったといれる。 本当は、 Hash_data.dat だったのがすでにあったので、Hash_data_2.dat とし た。 ・感想 商品の値段がわからない時値段がでてくる。 理由は、商品の名前を入れたら値段が出てくるから Hash を使っているのではな いかと思った。 ・参考文献 西村 まどか http://roy/~madoka/2010/r2/02/02_04_theme_03_existornot.html 基礎プログラミング II 第 2 回 「なになにといえばこれこれ」あるかないか 西村 まどか http://roy/~madoka/2010/r2/02/02_06_theme_05_hash_pair.html 基礎プログラミング II 第 2 回 「なになにといえばこれこれ」Hash の対 を入力するには 西村 まどか http://roy/~madoka/2010/r2/02/02_11_theme_10_sortinkey.html 基礎プログラミング II 第 2 回 「なになにといえばこれこれ」key を使って並び換え ・共同学習者 佐竹 聡美 / 横山 広樹