第2回 なになにといえばこれこれ レポート課題 氏名: 村上茉奈美 学籍番号: C1111352 語学クラス: 英語3 コース: 社会福祉 1. A. 果物の特徴をhash配列の fruit とした。 fruit の key と value は果物の名前とその果物の色にした。 1: key 「いちご」に対して value は「赤」 2: key 「桃」に対して value は「ピンク」 3: key 「みかん」に対して value は「オレンジ」 4: key 「メロン」に対して value は「黄緑」 5: key 「ぶどう」に対して value は「紫」 これに対応する Hash の表し方は次のようになる。 fruit["いちご"] = "赤" fruit["桃"] = "ピンク" fruit["みかん"] = "オレンジ" fruit["メロン"] = "黄緑" fruit["ぶどう"] = "紫" もう一つの表し方は次のようになる。 {"いちご" => "赤", "桃" => "ピンク", "みかん" => "オレンジ", "メロン" => "黄緑", "ぶどう" => "紫"} B. 0d は 10進数、0x は 16進数、0b は 2進数を表す。 a. 0d 2012 を 16進数に変換する。 もとの数(2012)を商が 0 になるまで 16 で割る。 そして、余りを下から順に拾う。 2012 / 16 = 125 余り … 12 125 / 16 = 7 余り … 13 7 / 16 = 0 余り … 7 ここで計算が一致しているか bc -l で確認する。 pan{c111135}% bc -l [~] 2012/16 125.75000000000000000000 125/16 7.81250000000000000000 7/16 .43750000000000000000 quit 小数点以下が発生するのは余りを 16 で割っているためであり、 商を求める上で影響はない。 よって、計算が一致していることが分かる。 余りを下から拾うと 7 13 12 となる。 これを16進数に置き換えると 7 = 7 13 = d 12 = c となる。 よって、0d 2012 = 0x 7dc 。 b. まず最初に、0d 2012 を 2進数に変換する。 もとの数(2012)を商が 0 になるまで 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 ここで計算が一致しているか bc -l で確認する。 pan{c111135}% bc -l [~] 2012/2 1006.00000000000000000000 1006/2 503.00000000000000000000 503/2 251.50000000000000000000 251/2 125.50000000000000000000 125/2 62.50000000000000000000 62/2 31.00000000000000000000 31/2 15.50000000000000000000 15/2 7.50000000000000000000 7/2 3.50000000000000000000 3/2 1.50000000000000000000 1/2 .50000000000000000000 quit 小数点以下が発生するのは余りを 2 で割っているためであり、 商を求める上で影響はない。 よって、計算が一致していることが分かる。 余りを下から拾うと 11111011100 となる。 よって、 0d 2012 = 0b 11111011100 。 a (一問目) と同じ答えかどうか確かめるには 上記で出た答え (0b 11111011100) を右側から4桁ずつ区切る。 そして、16進数に変換する。 4桁ずつ区切ると、 111, 1101, 1100 となるが (一番左の3桁は先頭に 0 をつけて4桁にしなければ変換ができないので) 0111, 1101, 1100 となる。 これを16進数に置き換えると 0111 = 7 1101 = d 1100 = c となる。 よって、 7dcとなり、a の答えと一致する。 B の 参考文献 「Rubyプログラミング基礎講座」 広瀬雄二著 第8講 計算機の内部表現 8-1 2進数と16進数 p101~106 2. A. 1. 考えた設定 プログラムに登録してある対を全て表示するプログラム (hash_for.rb)を作成。 2. 作成したプログラム(hash_for.rb) #!/usr/koeki/bin/ruby #coding: euc-jp fruit = Hash.new #Hash 配列を fruit とする fruit["いちご"] = "赤" fruit["桃"] = "ピンク" fruit["みかん"] = "オレンジ" fruit["メロン"] = "黄緑" fruit["ぶどう"] = "紫" for kuda in fruit.keys # for キー名, ハッシュ配列名.keys printf("%s の色は %s です。\n", kuda, fruit[kuda]) #行う操作 end # for に対する end(終わり) 3. もとにしたプログラムからの変更点 hash_pair.rb をもとにした。 プログラムの構造は同じだが、キー名とハッシュ配列名を変更した。 4. 実行結果 pan{c111135}% ./hash_for.rb [~/Ruby] いちご の色は 赤 です。 桃 の色は ピンク です。 みかん の色は オレンジ です。 メロン の色は 黄緑 です。 ぶどう の色は 紫 です。 5. 考察 上記の筆記問題 A に対応する結果が出るようにした。 実行してみたところ、5つの対全てが正しく表示された。 よって、このプログラムは正しいということができる。 6. 参考文献 ・http://roy/~madoka/2012/r2/02/r2_02_07_theme_06_forprint.html 2012年度 基礎プログラミングII 第2回 (なになにといえばこれこれ) 「Hashの対を表示するには」 作者: 西村まどか B. 1. 考えた設定 ユーザが知りたい情報だけを結果表示するプログラム (hash_choice.rb)を作成。 2. 作成したプログラム(hash_choice.rb) #!/usr/koeki/bin/ruby #coding: euc-jp fruit = Hash.new #Hash 配列を fruit とする fruit["いちご"] = "赤" fruit["桃"] = "ピンク" fruit["みかん"] = "オレンジ" fruit["メロン"] = "黄緑" fruit["ぶどう"] = "紫" print("果物とその色が表示されます。\n") print("いちご、桃、みかん、メロン、ぶどう の中から選んでください。\n") STDERR.print("果物の名前を入れてください。: ") #ユーザからの入力を促す kuda = gets.chomp #入力された文字を kuda に取りこむ if fruit.key?(kuda) == true #文字列 key があるかどうか調べ、存在すれば true という値を返す printf("%s の色は %s です。\n", kuda, fruit[kuda]) else printf("%s はデータにありません。\n", kuda) #文字列 key が存在しなければ false という値を返す end #if文に対する end (終わり) 3. もとにしたプログラムからの変更点 プログラム問題 A の hash_for.rb と授業で作成した hash_shop.rb をもとにした。 構造は同じく、配列の名前を変更した。 4. 実行結果 pan{MURAKAMI Manami}% ./hash_choice.rb [~/Ruby] 果物とその色が表示されます。 いちご、桃、みかん、メロン、ぶどう の中から選んでください。 果物の名前を入れてください。: いちご いちご の色は 赤 です。 pan{c111135}% ./hash_choice.rb [~/Ruby] 果物とその色が表示されます。 いちご、桃、みかん、メロン、ぶどう の中から選んでください。 果物の名前を入れてください。: 桃 桃 の色は ピンク です。 pan{c111135}% ./hash_choice.rb [~/Ruby] 果物とその色が表示されます。 いちご、桃、みかん、メロン、ぶどう の中から選んでください。 果物の名前を入れてください。: みかん みかん の色は オレンジ です。 pan{c111135}% ./hash_choice.rb [~/Ruby] 果物とその色が表示されます。 いちご、桃、みかん、メロン、ぶどう の中から選んでください。 果物の名前を入れてください。: メロン メロン の色は 黄緑 です。 pan{c111135}% ./hash_choice.rb [~/Ruby] 果物とその色が表示されます。 いちご、桃、みかん、メロン、ぶどう の中から選んでください。 果物の名前を入れてください。: ぶどう ぶどう の色は 紫 です。 pan{c111135}% ./hash_choice.rb [~/Ruby] 果物とその色が表示されます。 いちご、桃、みかん、メロン、ぶどう の中から選んでください。 果物の名前を入れてください。: レモン レモン はデータにありません。 5. 考察 今回は入力に基づいて結果を表示させるものだったので、 5つの対全てについて実行した。 また、その5つ以外のものも入力し、データに存在しないことを伝える メッセージが表示されるかも確認した。 実行してみたところ、全てが正しく表示された。 よって、このプログラムは正しいということができる。 6. 参考文献 ・http://roy/~madoka/2012/r2/02/r2_02_04_theme_03_existornot.html 2012年度 基礎プログラミングII 第2回 (なになにといえばこれこれ) 「あるかないか」 作者: 西村まどか C. 1. 考えた設定 知りたい情報が出てこない場合に、ユーザに対を登録させ、登録した結 果を出力するプログラム(hash_register.rb)を作成。 2. 作成したプログラム(hash_register.rb) #!/usr/koeki/bin/ruby #coding: euc-jp fruit = Hash.new #Hash配列を fruit とする STDERR.print("果物の名前と色を入力して下さい。(Ctrl-Dで終了)\n") while true #繰り返し STDERR.print("果物の名前: \n") #果物の名前の入力を促す kuda = gets if kuda == nil #Ctrl-D が押されたら break #繰り返しから抜ける else kuda = kuda.chomp end STDERR.print("色: \n") #果物の色の入力を促す color = gets.chomp fruit[kuda] = color end STDERR.print("入力終了\n") for kuda,color in fruit # for キー名, 値 in ハッシュ配列名 printf("%s の色は %s です。\n", kuda, color) #行う操作 end 3. もとにしたプログラムからの変更点 hash_pair.rb をもとにした。 キー名、ハッシュ配列名を変更し、sort や reverse などの 並べ替えは行わなかった。 4. 実行結果 pan{c111135}% ./hash_register.rb [~/Ruby] 果物の名前と色を入力して下さい。(Ctrl-Dで終了) 果物の名前: レモン 色: 黄色 果物の名前: 柿 色: オレンジ 果物の名前: 入力終了 レモン の色は 黄色 です。 柿 の色は オレンジ です。 5. 考察 A や B の問題に挙げた5つの対に登録されていなかったものを入力した。 Ctrl-D を押してきちんと入力を終えることができるかどうかも確認する ため、2つの対を入力した。 実行してみたところ、結果にしっかりと反映されていたので、 このプログラムは正しいということができる。 6. 参考文献 以下に示すものはどちらも 2012年度 基礎プログラミングII 第2回 (なになにといえばこれこれ) 作者: 西村まどか である。 ・http://roy/~madoka/2012/r2/02/r2_02_03_theme_02_hash_input.html 「入力したデータを取り出そう」 ・http://roy/~madoka/2012/r2/02/r2_02_07_theme_06_forprint.html 「Hashの対を表示するには」 D. 1. 考えた設定 データ(hash_data.dat)から読みこむようにしたプログラム (hash_read.rb)を作成。 2. 作成したデータ・プログラム ・データ(hash_data.dat) いちご 赤 桃 ピンク みかん オレンジ メロン 黄緑 ぶどう 紫 ・プログラム(hash_read.rb) #!/usr/koeki/bin/ruby #coding: euc-jp fruit = Hash.new print("果物の名前とその色を表示します。\n") open("hash_data.dat","r") do |f| # hash_data.dat というファイルを読みこみモードで開く while sweet = f.gets #ファイルの中身がなくなるまで繰り返す if /(\S+)\s+(\S+)/ =~ sweet #もし 文字列 空白 文字列 という並びだったら fruit[$1] = $2 #2つ目の文字列を fruit[$1]の中に入れる end # if に対するend(終わり) end # while に対するend(終わり) end # open に対するend(終わり) for color in fruit.keys # for 値, in ハッシュ配列名 printf("%s の色は %s です。\n", color, fruit[color]) #行う操作 end # for に対するend(終わり) 3. もとにしたプログラムからの変更点 対を表示する部分(for~end)は、B の問題のhash_choice.rb を もとにした。 それに、データを読みこませて表示する open~end を付け加えた。 4. 実行結果 pan{c111135}% ./hash_read.rb [~/Ruby] 果物の名前とその色を表示します。 いちご の色は 赤 です。 桃 の色は ピンク です。 みかん の色は オレンジ です。 メロン の色は 黄緑 です。 ぶどう の色は 紫 です。 5. 考察 上記の問題と同様の結果が一度に出るようにした。 確認したところ、5つの対全てが正しく表示されていたので、 このプログラムは正しいということができる。 6. 参考文献 ・http://roy/~madoka/2012/r1/07/r1_07_10_theme_08_fileread.html 2012年度 基礎プログラミングI 第7回 (正規表現とRuby言語でのプログラミング) 「データを読みこむようにするには」 作者: 西村まどか ・http://roy/~madoka/2012/r2/02/r2_02_07_theme_06_forprint.html 2012年度 基礎プログラミングII 第2回 (なになにといえばこれこれ) 「Hashの対を表示するには」 作者: 西村まどか E. 1. 考えた設定 新規のデータも含め、登録した情報を hash_data.dat として 出力するプログラム(hash_write.rb)を作成。 2. 作成したプログラム(hash_write.rb) #!/usr/koeki/bin/ruby #coding: euc-jp fruit = Hash.new #Hash配列を fruit とする print("新たに登録したい果物の名前と色を入力して下さい。(Ctrl-Dで終了)\n") while true #繰り返し STDERR.print("果物の名前: \n") #果物の名前の入力を促す kuda = gets if kuda == nil #ユーザが Ctrl-D を押したら break #繰り返しの終わり else kuda = kuda.chomp end # if に対するend(終わり) STDERR.print("色: \n") #色の入力を促す color = gets.chomp fruit[kuda] = color end # while に対するend(終わり) STDERR.print("入力終了\n") # Ctrl-D が押されたら表示する for kuda,color in fruit # for キー名, 値, in ハッシュ配列名 printf("%s の色は %s です。\n", kuda, color) #行う操作 end # for に対するend(終わり) open("hash_data.dat","w") do |r| # hash_data.dat に書きこみモードで書きこむ for sweet in fruit # for 値 in ハッシュ配列名 r.printf("%s \t %s \n", sweet, fruit[sweet]) #行う操作 end # for に対するend(終わり) end # open に対するend(終わり) 3. もとにしたプログラムからの変更点 C の問題の hash_register.rb をもとにした。 また、D の問題の hash_read.rb もファイルを開く際に参考にした。 今回はファイルを読みこむのではなく、書きこむため、 w (書きこみモード)に変更した。 4. 実行結果 pan{MURAKAMI Manami}% ./hash_write.rb [~/Ruby] 新たに登録したい果物の名前と色を入力して下さい。(Ctrl-Dで終了) 果物の名前: りんご 色: 赤 果物の名前: 柿 色: オレンジ 果物の名前: レモン 色: 黄色 果物の名前: 入力終了 りんご の色は 赤 です。 柿 の色は オレンジ です。 レモン の色は 黄色 です。 5. 考察 今回は新しく「りんご、柿、レモン」の情報を加えた。 すると hash_data.dat はこのようになった。 ["りんご", "赤"] ["柿", "オレンジ"] ["レモン", "黄色"] プログラムに入力した情報と同じ内容が表示されたので このプログラムは正しいということができる。 KTerm上で書き込みを確認したかったのだが、上手く表示されなかったの で、今後改善していきたい。 6. 参考文献 ・http://roy/~madoka/2012/r1/07/r1_07_10_theme_08_fileread.html 2012年度 基礎プログラミングI 第7回 (正規表現とRuby言語でのプログラミング) 「データを読みこむようにするには」 作者: 西村まどか ・http://roy/~madoka/2012/r2/02/r2_02_07_theme_06_forprint.html 2012年度 基礎プログラミングII 第2回 (なになにといえばこれこれ) 「Hashの対を表示するには」 作者: 西村まどか 3. 私は、スーパーのレジに実際に使われていると考える。 その理由は、あらかじめ登録されている情報があるから レジではいちいち商品の値段を打ったりせずに、バーコードをかざすだけで 会計をすることができるのではないかと考えたからだ。 共同学習者: 浅沼佑香 ・ 伊藤詩野