講評: #!/usr/koeki/bin/ruby のつづりをもう一度確認して下さい。 追記: 問題文をまるまる載せていることによる減点がありました。 ---- 10 月 10 日 第 2 回レポート 「Hash 配列」 学籍番号:C106XXXX 氏名:XXXXXXXX 語学クラス:XX語 XX 系:XXXX系 1. 5 つの対を考えよ。その対について、適切な hash 配列名を与え、本日 学んだ記法を使用して書き下せ ( 2 通りあるので両方とも答えよ。) 記法 その 1 1. key 「情報表現E」 = value 「101」 2. key 「リーディング」= value 「206」 3. key 「リスニング」 = value 「209」 4. key 「環境の哲学・倫理」= value 「301」 5. key 「公益法人論」 = value 「301」 記法 その 2 1.{key 情報表現E => value 101} 2.{key リーディング => value 206} 3.{key リスニング => value 209} 4.{key 環境の哲学・倫理 => 301} 5.{key 公益法人論 => value 301} 2. 計算問題。2 問目については、さらに 16 進法に変換してみよ。 ( 4 桁ごとに区切り、1 問目と同じ答えになるかどうか確かめる。) A. 0d 1022 = 0x ?? 下記の確かめ算をもとに、 31 となるので、 答えは 31 となる。 B. 0d 1022 = 0b ?? 1022 / 2 = 511 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 よって、111111111 となる。 確かめ 1 1111 1111 1 + 15 + 15 1 + 15 + 15 = 31 3. 前問で考えた対を使ってよい。ある hash 配列について、登録したプログラ ムを「key といえば value である」と表示するようにせよ。 key 、value の組み合わせを表示してあるならば、どのような文章でもよい。できる問題 まで答えよ。また、工夫できる点を思いついた場合、どのように工夫したか 述べ、適宜発表せよ。 ○あらかじめプログラムに登録してある対を表示するもの hash-for.rb a. 考えた設定 講義名を入力することで、その講義はどこの教室で行なわれるのかを表示 させるプログラム。 b. 作成したプログラムコードそのもの #!/usr/koeki/bin/ruby $KCODE = 'e' # 漢字コードは EUC lecture = Hash.new("やっていません") # Hash 配列を lecture とする lecture["情報表現E"] = 101 lecture["リーディング"] = 206 lecture["リスニング"] = 209 lecture["環境の哲学・倫理"] = 301 lecture["公益法人論"] = 301 print("履修したい講義を選択して下さい。\n") STDERR.print("講義を入力して下さい。\n") kougi = gets.chomp p lecture STDERR.print("入力終了 \n") if lecture.key?(kougi) == false printf("%sという講義は%s\n", kougi, lecture[kougi]) else lecture.key?(kougi) printf("%sは%s教室で講義はあります\n", kougi, lecture[kougi]) end c.もとにしたプログラムからの変更点 授業で作成したプログラム shop.rb を基にして作成した。 key や value の文字列を変更した。 d. プログラムを実行した結果画面 irsv{c106080}% ./hash-for.rb [~/Ruby] 履修したい講義を選択して下さい。 講義を入力して下さい。 リスニング {"環境の哲学・倫理"=>301, "公益法人論"=>301, "リスニング"=>209, "情報表現E"=>101, "リーディング"=>206} 入力終了 リスニングは209教室で講義はあります irsv{c106080}% ./hash-for.rb [~/Ruby] 履修したい講義を選択して下さい。 講義を入力して下さい。 公益法人論 {"環境の哲学・倫理"=>301, "公益法人論"=>301, "リスニング"=>209, "情報表現E"=>101, "リーディング"=>206} 入力終了 公益法人論は301教室で講義はあります irsv{c106080}% ./hash-for.rb [~/Ruby] 履修したい講義を選択して下さい。 講義を入力して下さい。 情報表現E {"環境の哲学・倫理"=>301, "公益法人論"=>301, "リスニング"=>209, "情報表現E"=>101, "リーディング"=>206} 入力終了 情報表現Eは101教室で講義はあります irsv{c106080}% ./hash-for.rb [~/Ruby] 履修したい講義を選択して下さい。 講義を入力して下さい。 ガイダンス {"環境の哲学・倫理"=>301, "公益法人論"=>301, "リスニング"=>209, "情報表現E"=>101, "リーディング"=>206} 入力終了 ガイダンスという講義はやっていません e. 導き出された結果の考察(ここで計算結果が合っているか調べる) 検索したものを表示させることが出来た。しかし、講義名を入力し 講義名や講義が行なわれる教室が表示された後に入力終了と出てし まい、解決策がわからなかった。 f. 参考文献(参照した本、ホームページなど) 西村先生のホームページ: http://roy/~madoka/2007/r2/02/02-02-hash.html http://roy/~madoka/2007/r2/02/02-04-check-hash.html http://roy/~madoka/2007/r2/02/02-05-default.html □データから読み込むようにしたプログラム□ a.考えた設定 上記のプログラムをデータから読み込むようにしたプログラム。 b.作成したプログラムコードそのもの #!/usr/kouki/bin/ruby kumi = Array.new # 配列を与える method n = 0 print("講義が行なわれる教室を検索します:\n") while hash_data = gets if /(\S+)\s+(\S+)\s+(\S+)/ =~ hash_data kumi[0] = $1 kumi[1] = $2 kumi[2] = $3 end printf("講義選択 %d \n", n+1) printf("カフェから %s は、%s があるので %s で講義を受けます \n", kumi[0],kumi[1],kumi[2]) n += 1 end print("検索結果が出ました。\n") c.もとにしたプログラムからの変更点 授業で作成したプログラム train_b.rb を基に文字列を変更した。 d.プログラムを実行した結果画面 irsv{c106080}% ./hash-for_b.rb hash-for.dat [~/Ruby] zsh: ファイルもディレクトリもありません。: ./hash-for_b.rb irsv{c106080}% ./hash-for_b.rb hash-for.dat [~/Ruby] zsh: ファイルもディレクトリもありません。: ./hash-for_b.rb irsv{c106080}% ./hash-for_b.rb hash-for.dat [~/Ruby] zsh: ファイルもディレクトリもありません。: ./hash-for_b.rb irsv{c106080}% chmod +x hash-for_b.rb hash-for.dat [~/Ruby] irsv{c106080}% ./hash-for_b.rb hash-for.dat [~/Ruby] zsh: ファイルもディレクトリもありません。: ./hash-for_b.rb irsv{c106080}% ./hash-for_b.rb hash.dat [~/Ruby] zsh: ファイルもディレクトリもありません。: ./hash-for_b.rb irsv{c106080}% chmod +x hash-for_b.rb hash.dat [~/Ruby] irsv{c106080}% ./hash-for_b.rb hash.dat [~/Ruby] zsh: ファイルもディレクトリもありません。: ./hash-for_b.rb e.導き出された結果の考察 何度か自分なりに改善して見たものの、上記のようなエラーメッセージが出た。 考えられる原因がわからないため、このような結果になってしまった。 f.参考文献(参照した本、ホームページなど) 西村先生のホームページ: http://roy.e.koeki-u.ac.jp/~madoka/2007/r1/05/05-13-form3.html ○プログラムで対を登録し、表示させるプログラム hash-register.rb a. 考えた設定 講義名と講義が行なわれる教室を入力し、表示させるプログラム。 b. 作成したプログラムコードそのもの #!/usr/koeki/bin/ruby lecture = Hash.new # Hash 配列を lecture と定義 printf("講義名を入力:") while true STDERR.print("講義の名前:") kougi = gets if kougi == nil then break # Ctrl-D を押したら終了 else kougi = kougi.chomp # Ctrl-D 以外の文字列は進む end # 改行文字 STDERR.print("講義が行なわれる教室:") classroom = gets.chomp lecture[kougi] = classroom end STDERR.print("入力終了\n") $KCODE = 'e' # 漢字コードは EUC p lecture # 確認のための lecture for kougi, classroom in lecture do printf("%s\t%s\n", kougi, classroom) end c.もとにしたプログラムからの変更点 授業で作成したプログラム pair.rb を基に作成した。 キー名 値 ハッシュ配列名の名称を変更した。 d. プログラムを実行した結果画面 irsv{c106080}% ./hash-register.rb [~/Ruby] 講義の名前:講義名を入力:リーディング 講義が行なわれる教室:206 講義の名前:リスニング 講義が行なわれる教室:209 講義の名前:入力終了 {"リスニング"=>"209", "リーディング"=>"206"} リスニング 209 リーディング 206 irsv{c106080}% ./hash-register.rb [~/Ruby] 講義の名前:講義名を入力:公益法人論 講義が行なわれる教室:301 講義の名前:情報表現E 講義が行なわれる教室:101 講義の名前:入力終了 {"公益法人論"=>"301", "情報表現E"=>"101"} 公益法人論 301 情報表現E 101 e. 導き出された結果の考察(ここで計算結果が合っているか調べる) 検索したものが表示された。 また、存在しないものを検索した際には 存在しないという メッセージを表示させることが出来た。 f. 参考文献(参照した本、ホームページなど) 西村先生のホームページ: http://roy/~madoka/2007/r2/02/02-06-input-hash.html http://roy/~madoka/2007/r2/02/02-07-for-hash.html 4. 単語帳 wordbook.rb を作成せよ。これは覚えた単語をデータファイル words.dat に書き込むプログラムである。毎回このデータファイルを 呼び出して、適宜クイズを出すプログラム wordquiz.rb も作成せよ。 このような仕組みは何に使われているか、答えよ。プログラムを組め なくとも、思い付いたことがあれば、何かしら記せ。 プログラムを組めなかったので、思い付いたことを書きます。 このような単語帳のようなプログラムは社会の中で活躍していると思う。 例えば、電子辞書・パソコンや携帯電話にある辞書、そしてテレビでは このようなプログラムを基にクイズ番組をしているのだと思った。 また、このようなプログラムはこれからの時代には欠かせないものと なるのだろうと思った。それは今の C M に検索をしているものが多く ある。これからは検索社会になっていくのだろう… 5. 感想。忘れていたところや、よく復習したところについて述べ、どこの 何を参考に解決したか、などを記せ。 今回は、いつもよりエラーメッセージの表示が少なかったです。 しかし、 kterm でプログラムを実行した際に私が予想していた ものとは違った結果が表示され苦戦しました。少しでも私が考え ていたものに近づけようと努力したのですが、 parse error が 出てしまい、このような結果になってしまいました。 しかし、先生のホームページを参考に問題を解決することが 出来ました。 今回のレポートでやったことは社会の多くで使われているもの ばかりなので、このようなプログラムを沢山学びたいと思い ました。次回も頑張りたいと思います。