第2回 基礎プログラミング II レポート課題 氏名: xxxxxxxx 学籍番号: c109xxx 語学クラス: 英語3 コース(系): 地域共創 1.筆記問題 A. 調味料「さしすせそ」の特徴を hash 配列 azi としました。 azi の key と value はそれぞれ名前とその味にとりました。 その 1: key 「砂糖」に対して value は「甘い」 その 2: key 「塩」 に対して value は「しょっぱい」 その 3: key 「酢」 に対して value は「すっぱい」 その 4: key 「醤油」に対して value は「しょっぱい」 その 5: key 「味噌」に対して value は「甘じょっぱい」 これに対する Hash の表し方は、 azi["砂糖"] = "甘い" azi["塩"] = "しょっぱい" azi["酢"] = "すっぱい" azi["醤油"] = "しょっぱい" azi["味噌"] = "甘じょっぱい" また、もう一つの表し方は、 { "砂糖" => "甘い", "塩" => "しょっぱい", "酢" => "すっぱい", "醤油" => "しょっぱい", "味噌" => "甘じょっぱい" } B. a.0d 2010 = 0x ?? 0d は10進数、0x は16進数。 10進数を16進数に変換する場合は、10進数を割れなくなるまで16で割る。 そして、割った時の余りを逆から読んでいき、10進数に直す。 2010 / 16 = 125 余り10 125 / 16 = 7 余り13 7 / 16 = 0 余り 7 10進数 16進数 7 → 7 13 → d 10 → a よって、0d 2010 = 0x 7da となる。 b.0d 2010 = 0b ?? 0b は2進数なので、10進数を割れなくなるまで2で割る。 そして、割った時の余りを逆から読んでいくだけ。 2010 / 2 = 1005 余り0 1005 / 2 = 502 余り1 502 / 2 = 251 余り0 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 余りを並べると、11111011010となる。 よって、0d 2010 = 0b 11111011010 となる。 1問目の答えと同じになるか確かめてみる。 2進数を16進数に変換する場合、2進数を1の位から4桁ごとに区切り、 16進数に変換していく。 区切って2桁や3桁になったものは、0 が省略されている。 111 1101 1010 → 0111 1101 1010 2進数 16進数 0111 → 7 1101 → d 1010 → a よって、0b 11111011010 = 0x 7da となり、1問目と答えは同じである と確認できた。 2.プログラム問題 A.◯考えた設定 調味料の名前とその味の対を、全て表示するようにした。 ◯プログラム本体「hash_for.rb」 ---------------------------------------------------------------- #!/usr/koeki/bin/ruby $KCODE = 'e' #文字化け防止 azi = Hash.new # 配列を azi にする azi["砂糖"] = "甘い" azi["塩"] = "しょっぱい" azi["酢"] = "すっぱい" azi["醤油"] = "しょっぱい" azi["味噌"] = "甘じょっぱい" for tyomiryo,mikaku in azi # 全てのものを表示する # for key名, 値 in Hash配列名 printf("%sは %s味ですよ!\n", tyomiryo, mikaku) end ---------------------------------------------------------------- ◯もとにしたプログラムからの変更点 講義で作成した「hash_deta.rb」「hash_pair.rb」をもとにした。 「shop」を「azi」、「list」を「tyomiryo,mikaku」に変更。 ◯実行結果 ---------------------------------------------------------------- pan{c109014}% ./hash_for.rb [~/Ruby] 醤油は しょっぱい味ですよ! 酢は すっぱい味ですよ! 砂糖は 甘い味ですよ! 味噌は 甘じょっぱい味ですよ! 塩は しょっぱい味ですよ! ---------------------------------------------------------------- ◯考察 初めは「for tyomiryo,mikaku in azi」の続きに「.keys」と入力して 実行してみたが、 pan{c109014}% ./hash_for.rb [~/Ruby] 醤油は 味ですよ! 酢は 味ですよ! 砂糖は 味ですよ! 味噌は 味ですよ! 塩は 味ですよ! となり、味が出る部分が表示されなかった。「.keys」を消去して実行 してみると、 pan{c109014}% ./hash_for.rb [~/Ruby] 醤油は しょっぱい味ですよ! 酢は すっぱい味ですよ! 砂糖は 甘い味ですよ! 味噌は 甘じょっぱい味ですよ! 塩は しょっぱい味ですよ! となり、プログラムに入力した通りに実行できた。初めの実行結果は、 key名からしか検索しなかったので、味の部分が表示されなかったのだ と思われる。 B. ◯考えた設定 知りたい情報を検索して、結果を表示するプログラム。 5つの調味料のうちのどれかを入力すると、その味が分かる。 ◯プログラム本体「hash_choice.rb」 ---------------------------------------------------------------- #!/usr/koeki/bin/ruby $KCODE = 'e' #文字化け防止 azi = Hash.new # 配列を azi にする azi["砂糖"] = "甘い" azi["塩"] = "しょっぱい" azi["酢"] = "すっぱい" azi["醤油"] = "しょっぱい" azi["味噌"] = "甘じょっぱい" print("「 砂糖・塩・酢・醤油・味噌 」\n") STDERR.print("味を知りたい調味料を入力: ") sina = gets.chomp #入力された文字を sina として取り込む if azi.key?(sina) == true #文字列 sina があり、true であれば調べる printf("\n%sは %sですよ!\n", sina, azi[sina]) else printf("\n%sは、今だ未知の味です。\n", sina) end ---------------------------------------------------------------- ◯もとにしたプログラムからの変更点 講義で作成した「hash_deta.rb」をもとにした。 入力する場所の上にリストを表示するように変更。 他は文字を色々変更。 ◯実行結果 ---------------------------------------------------------------- pan{c109014}% ./hash_choice.rb [~/Ruby] 「 砂糖・塩・酢・醤油・味噌 」 味を知りたい調味料を入力: 砂糖 砂糖は 甘いですよ! ---------------------------------------------------------------- pan{c109014}% ./hash_choice.rb [~/Ruby] 「 砂糖・塩・酢・醤油・味噌 」 味を知りたい調味料を入力: 塩 塩は しょっぱいですよ! ---------------------------------------------------------------- pan{c109014}% ./hash_choice.rb [~/Ruby] 「 砂糖・塩・酢・醤油・味噌 」 味を知りたい調味料を入力: 酢 酢は すっぱいですよ! ---------------------------------------------------------------- pan{c109014}% ./hash_choice.rb [~/Ruby] 「 砂糖・塩・酢・醤油・味噌 」 味を知りたい調味料を入力: 水 水は、今だ未知の味です。 ---------------------------------------------------------------- ◯考察 プログラムにあるもの、そうでないものの両方の結果を実行できた。 C. ◯考えた設定 ◯プログラム本体「hash_register.rb」 ---------------------------------------------------------------- #!/usr/koeki/bin/ruby $KCODE = 'e' # 文字化け防止 azi = Hash.new print("登録する商品とその味を入力( 終了はCtrl-D )\n") while true printf("商品名: \n") sina = gets if sina == nil # Ctrl-D で while 文を抜ける break else sina = sina.chomp # sina を取り込む end printf("どんな味?: \n") azi[sina] = gets.chomp end for syohin in azi.keys # syohin から取ってきて、覚えたものを全て表示 printf("%s \t %s \n\n", syohin, azi[syohin]) end ---------------------------------------------------------------- ◯もとにしたプログラムからの変更点 講義で作成した「hash_pair.rb」をもとにした。 「shop」を「azi」、「item」を「sina」、「list」を「syohin」に変更。 ◯実行結果 ---------------------------------------------------------------- pan{c109014}% ./hash_register.rb [~/Ruby] 登録する商品とその味を入力( 終了はCtrl-D ) 商品名: 砂糖 どんな味?: 甘い 商品名: 塩 どんな味?: しょっぱい 商品名: 酢 どんな味?: すっぱい 商品名: 醤油 どんな味?: しょっぱい 商品名: 醤油 しょっぱい 酢 すっぱい 砂糖 甘い 塩 しょっぱい ---------------------------------------------------------------- ◯考察 一応実行できたが、最初の実行結果では入力結果が見にくかったので、 printf("%s \t %s \n", syohin, azi[syohin]) ↓ printf("%s \t %s \n\n", syohin, azi[syohin]) と、\n を一つ増やした。 その結果、行と行の間隔が開いて、前よりも入力結果を見やすくする ことが出来た。 D. ◯考えた設定 ◯データ本体「hash_data.dat」 ---------------------------------------------------------------- 砂糖 甘い 塩 しょっぱい 酢 すっぱい 醤油 しょっぱい 味噌 甘じょっぱい ---------------------------------------------------------------- ◯プログラム本体 「hash_read.rb」 ---------------------------------------------------------------- #!/usr/koeki/bin/ruby print("調味料の味調べます。\n") STDERR.print("どれ?(砂糖・塩・酢・醤油・味噌) : ") azi = STDIN.gets.chomp #入力したものを文字列にする request = Regexp.new(azi, true, "e") sleep 1.5 open("hash_data.dat", "r") do |tyomiryo| while mikaku = tyomiryo.gets if request =~ mikaku if /(\S+)\s+(\S+)/=~ mikaku printf("\n\n %s の味は……\n「%s!」\n", $1,$2) end end end end ---------------------------------------------------------------- ◯もとにしたプログラムからの変更点 前回に提出したレポート課題「summer_c.rb」をもとにした。 変更点は、読みこむデータ、print文の内容の一部。 ◯実行結果 ---------------------------------------------------------------- pan{c109014}% ./hash_read.rb [~/Ruby] 調味料の味調べます。 どれ?(砂糖・塩・酢・醤油・味噌) : 砂糖 砂糖 の味は…… 「甘い!」 pan{c109014}% ./hash_read.rb [~/Ruby] 調味料の味調べます。 どれ?(砂糖・塩・酢・醤油・味噌) : 塩 塩 の味は…… 「しょっぱい!」 pan{c109014}% ./hash_read.rb [~/Ruby] 調味料の味調べます。 どれ?(砂糖・塩・酢・醤油・味噌) : 水 ---------------------------------------------------------------- ◯考察 データに入力した通りに結果が表示された。データに入力した以外のもの 以外の「水」を入力しても何も表示されなかったので、正常に作動したと 言える。 3.感想 クレジットカードなどを作って、登録した個人情報をまとめる際に使われてい ると思います。 今回のレポートは前にやったことの復習が多い感じがしたので、前のプログラ ムなどを見ながら作業ができました。データを作る際にも、身近にあるものを 題材にしてやると複雑にならず、スムーズにできました。 プログラミングのA、B問題は結構友人と協力しながらやりました。 次回の講義にやったことを忘れないようにしていきたいです。 4.参考文献 ・Rubyプログラミング基礎講座 P101〜106 著:広瀬雄二 共同学習者 ・藤井駿 ・遠藤孝之 ・佐藤裕康