講評: 復習は大事です。 4 の方針の立て方などはきちんとしていましたが、 こちらの説明文を書いてはいけないというルールに反していたので、減点です。 前期よりずっとよい感じになっています。次週もこの調子で頑張りましょう。 ---- 10 月 10 日 第 2 回レポート 「Hash 配列」 学籍番号:c106XXXX 氏名:XXXXXXXX 語学クラス:XXXX語XX 系: XXXX系 1.5 つの対を考えよ。その対について、適切な hash 配列名を与え、本日学んだ 記法を使用して書き下せ (2 通りあるので両方とも答えよ)。 食べ物の特長を hash 配列 food としました。 food の key と value はそれぞれ食べ物名とその特徴にとりました。 その 1 : key 「レモン」 に対して value は「すっぱい」 その 2 : key 「ピーマン」 に対して value は「苦い」 その 3 : key 「メロン」 に対して value は「甘い」 その 4 : key 「ネギ」 に対して value は「辛い」 その 5 : key 「ドリアン」 に対して value は「臭い」 food["レモン"] = すっぱい food["ピーマン"] = 苦い food["メロン"] = 甘い food["ネギ"] = 辛い food["ドリアン"] = 臭い 2.計算問題。2 問目については、さらに 16 進法に変換してみよ。 a. 0d 1022 = 0x ?? 10進数を2進数に変換し、2進数を16進数に変換する。 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 0b1111111110を16進数に直すと 0x3fe となる。 参考 : http://roy/~madoka/2007/r1/04/04-12-binary2.html b. 0d 1022 = 0b ?? 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 0b1111111110 となる。 3.前問で考えた対を使ってよい。ある hash 配列について、登録したプログラム を「key といえば value である」と表示するようにせよ。 key, value の組 み合わせを表示してあるならば、どのような文章でもよい。できる問題まで 答えよ。また、工夫できる点を思いついた場合、どのように工夫したか述べ、 適宜発表せよ。 *あらかじめプログラムに登録してある対を表示するもの hash-for.rb (C) a.考えた設定 項目がキーワード(key)となり、それに対になるものを表示させるので、 hash 配列を使ってプログラムを作成する。 b.作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' food = Hash.new food["レモン"] = "すっぱい" food["ピーマン"] = "苦い" food["メロン"] = "甘い" food["ネギ"] = "辛い" food["ドリアン"] = "臭い" #p food sleep 2 print("食べ物の味を教えてあげます!\n") sleep 2 print("単純だけど次の中から選んでね\n") sleep 2 print("レモン、ピーマン、メロン、ネギ、ドリアン\n") STDERR.print("食べ物入力↓\n") name = gets.chomp #p food.key?(name) if food.key?(name) == false sleep 2 #2秒後に表示させる printf("え?\n",name) sleep 2 printf("なにそれ?\n",name) sleep 2 printf("%s??そんな食べ物登録してねーよ!\n",name) else printf("%sはね%sんだよ!\n",name,food[name]) end # if文の終り c.もとにしたプログラムからの変更点 参考にしたプログラムの shop をfood に変え、valrue を naem に変更し、 それに合わせて print の内容も変更しました。 d.実行した結果画面 irsv{c106115}% ./hash-for.rb [~/Ruby] 食べ物の味を教えてあげます! 単純だけど次の中から選んでね レモン、ピーマン、メロン、ネギ、ドリアン 食べ物入力↓ レモン レモンはねすっぱいんだよ! irsv{c106115}% ./hash-for.rb [~/Ruby] 食べ物の味を教えてあげます! 単純だけど次の中から選んでね レモン、ピーマン、メロン、ネギ、ドリアン 食べ物入力↓ メロン メロンはね甘いんだよ! irsv{c106115}% ./hash-for.rb [~/Ruby] 食べ物の味を教えてあげます! 単純だけど次の中から選んでね レモン、ピーマン、メロン、ネギ、ドリアン 食べ物入力↓ 直樹 え? なにそれ? 直樹??そんな食べ物登録してねーよ! e.結果の考察 sleep で2秒後に表示なりました。登録した通りに表示されました。 間違った入力をすると、ちゃんと怒られるようになりました。 f.参考文献 西村先生HP : http://roy/~madoka/2007/r2/02/02-02-hash.html *データから読み込むようにしたプログラムへ変更する a.考えた設定 一つだけを指定してデータから読み込ませるプログラムで、食べ物の 名前と特徴が表示されるようにしました。 b.作成したプログラム #!/usr/koeki/bin/ruby STDERR.print "食べ物の名前 : " pattern = STDIN.gets.chomp request = Regexp.new(pattern, true, "e") open("food.dat","r") do |candidate| while food = candidate.gets if request =~ food # print food if /(\S+)\s+(\S+)/ =~ food printf("%s\n", $1) #datのデータの一行目を表示 printf("%s\n", $2) #datのデータの二行目を表示 end end end end c.もとにしたプログラムからの変更点 open-end のプログラムを参考にして、food.dat のデータを読み込むように 設定しました。 d.実行した結果画面 irsv{c106115}% ./hash-food.rb food.dat [~/Ruby] 検索パターン : レモン すっぱい irsv{c106115}% ./hash-food.rb food.dat [~/Ruby] 食べ物の名前 : メロン メロン 甘い irsv{c106115}% ./hash-food.rb food.dat [~/Ruby] 食べ物の名前 : ピーマン ピーマン 苦い irsv{c106115}% ./hash-food.rb food.dat [~/Ruby] 食べ物の名前 : 甘い メロン 甘い irsv{c106115}% ./hash-food.rb food.dat [~/Ruby] 食べ物の名前 : ネギ ネギ 辛い irsv{c106115}% ./hash-food.rb food.dat [~/Ruby] 食べ物の名前 : 臭い ドリアン 臭い e.結果の考察 予定通りその食べ物を指定すると、その食べ物の特徴が表示されました。 また、ある食べ物の特徴を入力するとその食べ物が表示されました。 f.参考文献 西村先生HP : http://roy/~madoka/2007/r1/07/07-10-readdata.html *プログラムで対を登録し、表示させるプログラム hash-register.rb (C) a.考えた設定 食べ物の名前を入力して、その食べ物の特徴を入力します。すると、 Ctrl-D を押すと今まで入力した食べ物名とその特徴が表示されます。 b.作成したプログラム #!/usr/koeki/bin/ruby food = Hash.new("") # Hash 配列を food と定義する printf("食べ物名を入力して下さい \v 終了は Ctrl D\n") while true STDERR.print("食べ物の名前:") name = gets if name == nil #Ctrl-D が入力されたら終了 then break else name = name.chomp end STDERR.print("食べ物の味:") taste = gets.chomp food[name] = taste end STDERR.print("入力終了\n") $KCODE = 'e' #漢字コードはEUCで #p food #確認のためfoodにはいっている for name, taste in food printf("%s\t%s\n", name, taste) end c.もとにしたプログラムからの変更点 print の中を設定した内容に合わせて変更しました。food,name,taste を 使って、作成しました。 d.実行した結果画面 irsv{c106115}% ./hash-register.rb [~/Ruby] 食べ物名を入力して下さい 終了は Ctrl D 食べ物の名前:レモン 食べ物の味:すっぱい 食べ物の名前:メロン 食べ物の味:甘い 食べ物の名前:入力終了 メロン 甘い レモン すっぱい irsv{c106115}% ./hash-register.rb [~/Ruby] 食べ物名を入力して下さい 終了は Ctrl D 食べ物の名前:ドリアン 食べ物の味:臭い 食べ物の名前:ピーマン 食べ物の味:苦い 食べ物の名前:入力終了 ドリアン 臭い ピーマン 苦い e.結果の考察 しっかり文字がそろって表示できました。入力した通りに表示しました。 f.参考文献 西村先生HP : http://roy/~madoka/2007/r2/02/02-report.html 4.単語帳 wordbook.rb を作成せよ。これは覚えた単語をデータファイル words.dat に書き込むプログラムである。毎回このデータファイルを呼び出し て、適宜クイズを出すプログラム wordquiz.rb も作成せよ。このような仕組 みは何に使われているか、答えよ。プログラムを組めなくとも、思い付いたこ とがあれば、何かしら記せ。 単語帳のようなプログラムは、非常に便利であるため日常にも多くの 場面で出回っていると思います。 例えば、おそらくケータイ電話のメールなどの文字入力画面の予測変換 でもこれに似たようなプログラムがなされていると思います。 あと、電子辞書にも使用されていると思います。 作成するにあたっては、open-end を使って作成すればいいのかなと思い ましたが、プログラムを組むには至りませんでした。 5.感想。忘れていたところや、よく復習したところについて述べ、どこの何を参 考に解決したか、などを記せ。 授業でギリギリでわかったところは、すぐ忘れてしまうので今週習った hash のところをよく復習しました。参考は西村先生のホームページの hash のプロ グラムの hash 対を新しく登録する方法と、key があるかないか返事をさせる 方法などをみて解決するように努力しました。 進数の計算はかなり忘れていたので、基礎プロ1の進数のところを復習して 頑張りました。