講評: 頑張りました。筆記問題のほうで、 p 文で実行したときの方法が記載されていませんでした。 プログラムには記載されていました。 tab キーを使って、* -- end のものは行頭を揃えると、 間違いが減ります。 まず wordquiz.rb ですが、STDERR.print で出力された文が クイズに答えてみよう!! 終了は Ctrl+D だけではユーザーが何をしたいのか分からないので、もう一度出だしを くふうしなければなりません。 先にデータを読ませて、Hash 配列に組み込む作業をしてから、 この出だしを工夫したものを作るとよいのではないでしょうか。 ---- 10 月 10 日 第 2 回レポート 「Hash 配列」 学籍番号:c106XXXX 氏名: XXXXXXXX 語学クラス:XXXX語 系: XXXX系 1、5 つの対を考えよ。その対について、適切な hash 配列名を与え、本日学んだ記法を使用して書き下せ (2 通りあるので両方とも答えよ)。 ●1つめ 食べ物の特徴を hash 配列 mesi としました。 mesi の key と value はそれぞれ食品名とその分類にしました。 その 1: key 「ラーメン」に対して 「中華料理」 その 2: key 「海鮮丼」に対して 「魚料理」 その 3: key 「てんぷら」に対して 「揚げ物」 1その 4: key 「カレー」に対して「インド料理」 その 5: key 「刺身」に対して「生物」 ●2つめ mesi = Hash.new # Hash 配列を mesi と定義する mesi["ラーメン"] = ("中華料理") mesi["海鮮丼"] = ("魚料理") mesi["てんぷら"] = ("揚げ物") mesi["カレー"] = ("インド料理") mesi["刺身"] = ("生物") 2、計算問題。2 問目については、さらに 16 進法に変換してみよ。 (4 桁ごと に区切り、1 問目と同じ答えになるかどうか確かめる)。 1.2進数を16進数にするには、まず、16で割って、繰り返していき最後に余りを 下から並べる。 ● 0d 1022 = 0x ?? 1022 ÷ 16 = 68 余り 14 63 ÷ 16 = 3 余り 15 3 ÷ 16 = 0 余り 3 となり、余りを並べると、3 15 14となる。 その後、授業で習った10進数の表を見て対応させる したがって、 つまり、0d 1022 = 0x 3fe となる。 2.2進数を10進数にするには、2で割っていき、繰り返していき、最後に余りをし たから並べる。 ● 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 1 ÷ 2 = 0 余り 1 よって、0d 1022 = 0b 1111111110 ここから、2進数を 下位の桁から4桁ずつ区切り、区切った数字ごとに、変更し 、10進数に直します。 下位から、1110 = 1*2の3乗 + 1*2の2乗 + 1*2の1乗 + 0*2の0乗 = 8 + 4 + 2 + 0 = 14 1111 = 1*2の3乗 + 1*2の2乗 + 1*2の1乗 + 1*2の0乗 = 8 + 4 + 2 + 1 = 15 11 = 1*2の1乗 + 1*2の0乗 = 2 + 1 = 3 よって、3 15 14 となり、表で照らし合わせると、0x3feとなる事が確かめられ る。 3、 ( 1 ) ●a、考えた設定 前問で考えた対を使い、あらかじめプログラムに登録してある対を表示するも のを作った。 ●b、作成したプログラムコード hash-for.rb ●c、もとにしたプログラムからの変更点 1行に1つの組み合わせを後に次々に対を足していくものから、後に次々に対を 足していくものから、いくつも 1 行で書き込む方法へ変更した。 ●d、プログラム本体 #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コード EUC で出力する mesi = Hash.new # Hash 配列を mesi と定義する mesi = {"ラーメン" => "中華料理", "海鮮丼" => "魚料理", # Hash 配列 = {"key_1" => "value_1", "key_2" = > "value_2", ...} "てんぷら" => "揚げ物", "カレー" => "インド料理", "刺身" => "生物"} # いくつも 1 行で書き込む方法 STDERR.print("料理の種類を紹介します\n\n") # \n\n 改行 for syurui, name in mesi do printf("%-10sといえば %-10sです\n", syurui, name) end # for キー名, in 値 ハッシュ配列名 # -10 左づめする ●e、 プログラムを実行した結果画 irsv{c106029}% ./hash-for.rb [~/Ruby] 料理の種類を紹介します 海鮮丼 といえば 魚料理 です 刺身 といえば 生物 です カレー といえば インド料理です てんぷら といえば 揚げ物 です ラーメン といえば 中華料理 です irsv{c106029}% ●f 、導き出された結果の考察 思ったより、少ない数字で右づめ出来ることがわかった。 ●g、参考文献 西村先生のホームページ ( 2 ) ●a、考えた設定 あらかじめプログラムに登録してあるデータから読み込むようにしたプログラ ム。 ●b、作成したプログラムコード hash-for1.rb ●c、もとにしたプログラムからの変更点 プログラム本体からではなく、データから読み込むようにしたプログラムへの変更。 ●d、プログラム本体 #!/usr/koeki/bin/ruby open("syokuhin.dat", "r") do |setumei| # open("ファイル名","モード") do |変数| while kome = setumei.gets # setumei を kome に gets し、 文字列、空白、文字列の順で表示さ れしまう if /(\S+)\s+(\S+)/ =~ kome # print syokuhin printf("%-10s は、%-10s です。\n" , $1,$2) # $1、$2の順でしまって いく # -10 左づめする end end end ●e、 プログラムを実行した結果画 irsv{c106029}% ./hash-for1.rb [~/Ruby] ラーメン は、中華料理 です。 海鮮丼 は、魚料理 です。 てんぷら は、揚げ物 です。 カレー は、インド料理 です。 刺身 は、生物 です。 ●f 、導き出された結果の考察 "r"は、読み込みの記号だという事を忘れていたので改めて確認できた。 また、"w"は書き込みの記号だということも確認できた。 ●g、参考文献 西村先生の前期のホームページ。 ( 3 ) ●a、考えた設定 あらかじめプログラムに登録してある対から、ユーザが知りた い情報だけを表示するプログラ厶。 ●b、作成したプログラムコード hash-for2.rb ●c、もとにしたプログラムからの変更点 ユーザーが知りたい情報だけを表示する。 存在しない場合は、「ない」と表示する。 ●d、プログラム本体 #!/usr/koeki/bin/ruby mesi = Hash.new # Hash 配列を mesi と定義する print("食品名を入力して下さい\n") print("** 入力は Ctrl - D\n") mesi["ラーメン"] = ("中華料理") mesi["海鮮丼"] = ("魚料理") mesi["てんぷら"] = ("揚げ物") mesi["カレー"] = ("インド料理") mesi["刺身"] = ("生物") while true STDERR.print("食品名:") syurui = gets if syurui == nil # nil 空っぽという意味 then break そのときは、終了 else でなくて、 syurui = syurui.chomp syourui なら しまう end # ハッシュ.key?(key) # 文字列 key があるかどうか調べる if mesi.key?(syurui) == false # syuruiになかった場合、ない と 表示させる printf("%sは%sないです\n" , syurui, mesi[syurui]) end STDERR.print("種類:") # 種類の入力を指示する mono = gets.chomp # mono にしまう mesi[syurui] = mono # miseの中の[syurui]が、 = mono end STDERR.print("入力終了 \n") ●e、 プログラムを実行した結果画 irsv{c106029}% ./hash-for2.rb [~/Ruby] 食品名を入力して下さい ** 入力は Ctrl - D 食品名:ra^? raはないです 種類: 食品名:ラーメン 種類:麺類 食品名:入力終了 ●f 、導き出された結果の考察 日本語に限らず、入力したものに対して、間違っていることを、そのまま表示 していた。 ●g、参考文献 西村先生のホームページ、該当しないキーが呼び出されたときを参考にした。 http://roy/~madoka/2007/r2/02/02-05-default.html 4、 ●a、考えた設定 単語帳 wordbook.rb を作成し、覚えた単語をデータファイル words.dat に書 き込むプログラム。ひらがな入力を促し、その後漢字入力させる。 ●b、作成したプログラムコード プログラム本体→ wordbook.rb データ → words.dat ●c、もとにしたプログラムからの変更点 計算式を取り除いた。 書き込みから、追加書込み専用に変更。 nil を用いた。 ●d、プログラム ○本体 → wordbook.rb○ #!/usr/koeki/bin/ruby while true # 繰り返し print("ひらがなを入力してください!!\n") printf("終了は Ctrl+D\n") hira = gets # 文字とりだし open("words.dat", "a") do |words| # "a" :追加書き込み専用。指定ファイルが存 在しない場合は新規作成し、既存ファイルを 指定した場合はデータの末尾に続けて書き込 みを行う。 words.printf("%s\n",hira) # open("ファイル名","モード") do |変数| end if hira == nil #key が存在しないときには nil が返る then break else hira = gets.chomp # でなければ、hira にしまう end print("登録したい単語を漢字で入力してください\n") kan = gets.chomp # kan にしまう open("words.dat", "a") do |words| # open("ファイル名","モード") do |変数| words.printf("%s\n\n",kan) # "a" :追加書き込み専用。 end # words.datに、追加書き込みをし、変数words end にしまう ○データ → words.dat○ ふらんす 仏蘭西 いんど 印度 あひる 鶩 うぐいす 鶯 ●e、 プログラムを実行した結果画 irsv{c106029}% ./wordbook.rb [~/Ruby] ひらがなを入力してください!! 終了は Ctrl+D ふらんす 登録したい単語を漢字で入力してください 仏蘭西 ひらがなを入力してください!! 終了は Ctrl+D いんど 登録したい単語を漢字で入力してください 印度 ひらがなを入力してください!! 終了は Ctrl+D あひる 登録したい単語を漢字で入力してください 鶩 ひらがなを入力してください!! 終了は Ctrl+D うぐいす 登録したい単語を漢字で入力してください 鶯 ひらがなを入力してください!! 終了は Ctrl+D ●a、考えた設定 データの中の単語を使って、クイズに答えて、正解だったら「正解」、間違いだっ たら、「ないです」と表示させる。 ●b、作成したプログラムコード wordquiz.rb ●c、もとにしたプログラムからの変更点 ture か false かを加えた。 ●d、プログラム #!/usr/koeki/bin/ruby while true # 問題文の繰り返し print("クイズに答えてみよう!!\n") printf("終了は Ctrl+D\n") mon = gets # 文字とりだし open("words.dat", "r") do |situ| # "r" 読み込み専用。 while situ = situ.gets if /(S+)/ =~situ # 文字列が1個なので words.printf("%sはなんと読む??\n",$1) #しかし、実際は文字列が1列だが、 改行スペースで空白が多かったり、 文字が多かったのか表示されなかっ た。 end end end if mon == nil # 質問が終わったら終了 then break else mon = gets.chomp # mon にしまう end print("正解\n") # 正解だったら、正解と表示 ok = gets.chomp if words.key?(mon) == false # もしも、正解以外の答えだったら、間違っ ていることを知らせる printf("%sは%sないです\n" , mon, words[situ]) end open("words.dat", "a") do |words| # 果してこれはいるのか。。。。 printf("%s\n\n",ok) # ここもいらない気が。。。 end end ●e、 プログラムを実行した結果画 irsv{c106029}% ./wordquiz.rb [~/Ruby] クイズに答えてみよう!! 終了は Ctrl+D ./wordquiz.rb:9: private method `gets' called for "\244\325\244\351\244\363\244\271\n":String (NameError) from ./wordquiz.rb:7:in `open' from ./wordquiz.rb:7 ●f 、導き出された結果の考察 単語帳は作成できたが、クイズのプログラムは作成出来なかった。文字列や空 白を漢字と、ひらがなときちんと分けて表示できるようにdatを作れば良かっ たが、できなかった。 途中までやったが、解らず断念した。 ●g、参考文献 前期チームプロジェクト、チーム「Ribenren」のレシートプログラムより。 ホームページ → http://roy/~c106089/ribenren/jituyou.html 前門のプログラム。 ●h、このような仕組みは何に使われているか ・電子辞書などの単語帳のゲーム 5、感想 追加書き込み専用や、読み込みなど、モードの意味を忘れていたので、その部 分をよく復習した。また、今回の授業でならった、Hash配列や、nilの復習もし た。西村先生の授業の講義ノートを参考にし、該当しないキーが呼び 出されたときなどを見て解決した。 まだまだ使いこなせていない事が多すぎて、Rubyの幅の広さに、自分の知識が どこまでついていけるか気になった。