講評: 筆記問題は hash 配列 animal で書き直す必要がありますが、 その記載がありませんでした。プログラムでは書いてあるのに .... p 文は自分の確認のためだけに必要です。ユーザーには必要でしょうか? cat して出力した結果を見せておくともっとよかったですね。 ランダムに問題を出力するようにするには、データを読みこんで、 それを Hash 配列に入れて、key 配列に rand をかける、などが 必要ではないでしょうか。 ---- 10 月 10 日 第 2 回レポート 「Hash 配列」 学籍番号 : C106XXXX 氏名 : XXXXXXXX 語学クラス : XXXX語XXクラス 系 : XXXX系 Q1 5つの対を考えよ。その対について、適切な hash 配列名を与え、本日学んだ記法を使用して書き下せ (2 通りあるので両方とも答えよ)。 1つ目 動物の特徴を hash 配列 animal としました。 animal の key と value はそれぞれ動物名とその特徴にとりました。 その 1: key["シマウマ"]に対して value は「縞模様」 その 2: key["クジラ"] に対して value は「長いヒゲ」 その 3: key["ライオン"]に対して value は「タテガミ」 その 4: key["チーター"]に対して value は「速い足」 その 5: key["サイ"] に対して value は「角」 その 6: key["サル"] に対して value は「ワル知恵」 その 7: key["キツネ"] に対して value は「ペテン師」 その 8: key["タヌキ"] に対して value は「詐欺師」 その 9: key["イヌ"] に対して value は「従順なペット」 その10: key["ネコ"] に対して value は「気分屋」 2つ目 {"シマウマ"=> 縞模様",クジラ"=>長いヒゲ,"ライオン"=>タテガミ,"チーター "=>速い足,"サイ"=>角,"サル"=>ワル知恵,"キツネ"=>ペテン師,"タヌキ"=>詐欺 師,"イヌ"=>従順なペット,"ネコ"=>気分屋} Q2 Q2.1 0d 1022 = 0x ?? Q2.2 0d 1022 = 0b ?? Q2.1 0d 1022 = 0x ?? 1022 / 2 = 511 … 0 511 / 2 = 255 … 1 255 / 2 = 127 … 1 127 / 2 = 63 … 1 63 / 2 = 31 … 1 31 / 2 = 15 … 1 15 / 2 = 7 … 1 7 / 2 = 3 … 1 3 / 2 = 1 … 1 0d 1022 = 0b 1111111110 16進数に変換のため 4桁に分ける 0011 1111 1110 0011 を 計算 1 * 1 = 1 1 * 2 = 2 0 * 4 = 0 0 * 8 = 0 1 + 2 + 0 + 0 = 3 16進数で 「3」は 「3」 になる。 1111 を 計算 1 * 1 = 1 1 * 2 = 2 1 * 4 = 4 1 * 8 = 8 1 + 2 + 4 + 8 = 15 16進数で 「15」は 「f」 になる 1110 を 計算 0 * 1 = 0 1 * 2 = 2 1 * 4 = 4 1 * 8 = 8 0 + 2 + 4 + 8 = 14 16進数で 「14」は 「e」 になる 0d 1022 = 0x 3fe Q2.2 0d 1022 = 0b ?? 上記の問題で解きましたが、確認ともう1度と言う形で解きました。 1022 / 2 = 511 … 0 511 / 2 = 255 … 1 255 / 2 = 127 … 1 127 / 2 = 63 … 1 63 / 2 = 31 … 1 31 / 2 = 15 … 1 15 / 2 = 7 … 1 7 / 2 = 3 … 1 3 / 2 = 1 … 1 0d 1022 = 0b 1111111110 上記の問題と同じでしたので、正解していると思います。 Q3.1 データから読み込むようにしたプログラム hash-for.rb 1. 考えた設定 作成したプログラムを具体的に説明する。 肉の名前を入力してもらい、その後必要な量も入力してもらうと 金額が弾き出される。 2. 作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' meet = Hash.new("非取扱商品") meet["豚肉"] = 80 meet["牛肉"] = 100 meet["鳥肉"] = 60 meet["鳥皮"] = 50 meet["砂肝"] = 100 meet["米沢牛"] = 3000 meet["前沢牛"] = 3500 meet["神戸牛"] = 4000 meet["松阪牛"] = 5000 meet["プラチナポーク"] = 4000 meet["薩摩の黒ブタ"] = 3500 meet["幻のマンモス"] = 10000 #p meet print("この店で取扱っているのは、こちらです。\n") for niku, price in meet printf("%-10s\t%10d\n", niku, price) end STDERR.print("どの有名なお肉を買いますか??\n肉名を正しく入力して下さい:\n") niku = gets.chomp STDERR.print("どれくらい必要ですか?:\n") weight = gets.chomp.to_f p meet.key?(niku) if meet.key?(niku) == false printf("%sは%sです\n",niku, meet[niku]) else printf("%s(%5.0f グラム)\t%5.0f円\n", niku, weight, meet[niku] * weight / 100) end 3. もとにしたプログラムからの変更点 最初に何を取扱っているを表示した。 4. プログラムを実行した結果画面 ミス入力した場合。 irsv{c106036}% ./hash-for.rb [~/Ruby] この店で取扱っているのは、こちらです。 薩摩の黒ブタ 3500 牛肉 100 幻のマンモス 10000 プラチナポーク 4000 神戸牛 4000 前沢牛 3500 鳥肉 60 鳥皮 50 松阪牛 5000 砂肝 100 豚肉 80 米沢牛 3000 どの有名なお肉を買いますか?? 肉名を正しく入力して下さい: ^O どれくらい必要ですか?: false は非取扱商品です ちゃんと入力した場合。 irsv{c106036}% ./hash-for.rb [~/Ruby] この店で取扱っているのは、こちらです。 薩摩の黒ブタ 3500 牛肉 100 幻のマンモス 10000 プラチナポーク 4000 神戸牛 4000 前沢牛 3500 鳥肉 60 鳥皮 50 松阪牛 5000 砂肝 100 豚肉 80 米沢牛 3000 どの有名なお肉を買いますか?? 肉名を正しく入力して下さい: 砂肝 どれくらい必要ですか?: 1000 true 砂肝( 1000 グラム) 1000円 5. 導き出された結果の考察 (ここで計算結果が合っているか調べる) 100 * 1000 / 100 = 1000 なので計算は合っている。 6. 参考文献 (参照した本、ホームページなど) プログラミングIIの 「唯一のキーワードをヒントに連想しよう」を参考に作成 プログラミングIIの 「データを呼び出すには」を参考に作成 プログラミングIIの 「key があるかないか返事をさせよう」を参考に作成 Q3.2 登録した情報をファイルデータとして出力するプログラム hash-register.rb 1. 考えた設定 作成したプログラムを具体的に説明する。 課題の項目を答える欄ではない。 肉の銘柄と金額を入力していくと、記憶して 終了のCtrl-Dで全てを出力する。 その際高い金額の順にも、表示される 2. 作成したプログラムコードそのもの #!/usr/koeki/bin/ruby niku = Hash.new("非取扱い商品") printf("肉の名前を入力して下さい。\n") printf("** 終了は Ctrl-D\n") while true STDERR.print("肉の銘柄を入力して下さい。") meigara = gets if meigara == nil then break else meigara = meigara.chomp end STDERR.print("値段はいくらでしょうか??") price = gets.chomp.to_i niku[meigara] = price end STDERR.print("入力終了 \n") $KCODE = 'e' #p niku for meigara, price in niku do printf("%-10s\t%10d\n", meigara, price) end print("本日の高値のお肉は???\n") niku.keys.sort{ |prim,sorted| niku[prim] <=> niku[sorted] }.reverse.each{ |meigara| printf("%s\t%d\n", meigara, niku[meigara]) } 3. もとにしたプログラムからの変更点 半角10ずつの間隔を空けて綺麗に表示されるようにした。 4. プログラムを実行した結果画面 irsv{c106036}% ./hash-register.rb [~/Ruby] 肉の名前を入力して下さい。 ** 終了は Ctrl-D 肉の銘柄を入力して下さい。松阪 値段はいくらでしょうか??10000 肉の銘柄を入力して下さい。前沢 値段はいくらでしょうか??3000 肉の銘柄を入力して下さい。マンモス 値段はいくらでしょうか??1000000^D 肉の銘柄を入力して下さい。入力終了 前沢 3000 松阪 10000 マンモス 1000000 本日の高値のお肉は??? マンモス 1000000 松阪 10000 前沢 3000 5. 導き出された結果の考察 (ここで計算結果が合っているか調べる) ちゃんと起動したので、成功と見える 6. 参考文献 (参照した本、ホームページなど) プログラミングIIの 「value を使って並び換え」を参考に作成 Q4 wordbook.rb words.dat wordquiz.rb 1. 考えた設定 作成したプログラムを具体的に説明する。 課題の項目を答える欄ではない。 wordbook.rb で文字を入力し、それが words.dat に保存され wordquiz.rb と words.dat を同時に起動するとクイズが始まる。 2.1 作成したプログラムコードそのもの wordbook.rb #!/usr/koeki/bin/ruby open("words.dat","w") do |words| end print("単語帳\n") while true STDERR.print(" 単語入力!!!\n") print(" 終了と同時に単語を覚えます!!!\n ") mondai = gets.chomp if mondai == "" then break end open("words.dat","a") do |words| words.print("",mondai) words.print("\t") end STDERR.print(" 単語の意味を入力!!!\n") print(" 終了と同時に単語の意味を覚えます!!終了は何も入力せずEnterです!\n ") imi = gets.chomp open("words.dat","a") do |words| words.print("",imi) words.print("\n") end end 3.1 もとにしたプログラムからの変更点 前期にグループで作成した「レジ」プログラムを元にした。 何も入力せずに Enter を押していくと終了するように変更。 4.1 プログラムを実行した結果画面 irsv{c106036}% ./wordbook.rb 単語帳 単語入力!!! 終了と同時に単語を覚えます!!! 竜頭蛇尾 単語の意味を入力!!! 終了と同時に単語の意味を覚えます!!終了は何も入力せずEnterです! 最初は良いが、最後はダメになってしまう。 単語入力!!! 終了と同時に単語を覚えます!!! ちゃんと words.dat に保存されているか確認 竜頭蛇尾 最初は良いが、最後はダメになってしまう。 5.1 導き出された結果の考察 ちゃんと記憶されていた。 2.2 作成したプログラムコードそのもの wordquiz.rb #!/usr/koeki/bin/ruby combi = Array.new while words_data= gets if /(\S+)\s+(\S+)/ =~ words_data combi[1] = $1 combi[2] = $2 end printf("%s\n\n",combi[1]) STDERR.print("この言葉の意味は???\n\n") sleep 5 printf("答え、%s\n\n",combi[2]) end 3.2 もとにしたプログラムからの変更点 sleep 5 を使い 「某クイズ番組 ミ○オネア」のような 緊張感を与えた。 しかし、本当であればちゃんと入力し、当たっていれば「正解」 ハズレていれば「不正解」など出力されるようにしたかった。 それとランダム変数をどこに入力したらいいのかも検討がつかなかった。 4.2 プログラムを実行した結果画面 irsv{c106036}% ./wordquiz.rb words.dat [~/Ruby] 竜頭蛇尾 この言葉の意味は??? 答え、最初は良いが、最後はダメになってしまう。 5.2 導き出された結果の考察 ちゃんと起動したので良かった。 6. 参考文献 (参照した本、ホームページなど) プログラミングIの 「データとプログラムの分離」を参考に作成 Ribenren の HP より 「実用プログラム: レジ〜Ribenren風〜」を参考に作成 Q5.感想 今回は初めての hash というものを使ったので、少しと惑ったがなんとかできたので良かった。 ただ最後の Q4 のクイズが思うように完成させることが出来なかったので、頑張っ ていきたい。 何かと忙しい後期も頑張って試験免除にしていきたい。