講評: 筆記問題で p 文での実行結果のような書き方が抜けていました。 データの読みこみで学んだように、CSV 形式のデータとして 書きこむならば、 読み 漢字 の 1 行としてファイル出力する必要があります。 そうしないと、読みこませることができません。 よく復習したらしいことが読み取れるよいレポートでした。 ---- 10 月 10 日 第 2 回レポート 「Hash 配列」 学籍番号:C106XXXX 氏名: XXXXXXXX 語学クラス:XXXX語クラスXX 系:XXXX系 1. 花の色を hash 配列 hana としました。 hana の key と value はそれぞれ花の名前とその色にとりました。 その 1 : key 「たんぽぽ」に対して「黄色」 その 2 : key 「カスミソウ」に対して「白」 その 3 : key 「薔薇」に対して「赤」 その 4 : key 「ツユクサ」に対して「青」 その 5 : key 「桜」に対して「桃色」 hana["たんぽぽ"] = ("黄色") hana["カスミソウ"] = ("白") hana["薔薇"] = ("赤") hana["ツユクサ"] = ("青") hana["桜"] = ("桃色") 2. A. 0d 1022 = 0x ?? 0d は 10 進数で、0x は 16 進数である。 10 進数から 16 進数にするには、16で割ってさらに商を16で割って、 余りを下から順番に並べる。 つまり、 余り 1022 ÷ 16 = 63 14 63 ÷ 16 = 3 15 3 ÷ 16 = 0 3 となる。 0x3 15 14 となるので、0x 3feとなる。 B. 0d 1022 = 0b ?? 10 進数から 2 進数にする。 10 進数から 2 進数にするには、2 で割っていく。 余り 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 となり、余りを下から順番に並べる。 つまり、0b 1111111110 となる。 2進数から16進数にするには、2進数を 下位の桁から4桁ずつに区切り、 区切った数字ごとに、10進数に変更する。 11 = 2の1乗 × 1 + 2の0乗 × 1 = 3 1111 = 2の3乗 × 1 + 2の2乗 × 1 + 2の1乗 × 1 2の0乗 × 1 = 15 1110 = 2の3乗 × 1 + 2の2乗 × 1 + 2の1乗 × 1 2の0乗 × 0 =14 つまり、0x 3fe となり、1問目と同じになる。 3. ○hash-for.rb ・考えた設定 hash 配列について、登録したプログラムを 「key といえば value である」と表示するようにした。 ・もとにしたプログラムからの変更点 授業で作った shop.rb を参考にした。 1 行に 1 つの組み合わせで、後ろに次々に対を足していくものから、いく つも 1 行で書き込む方法に書き変えた。 ・プログラム本体 #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コード EUC で出力する hana = Hash.new # Hash 配列 hana = {"黄色" => "たんぽぽ", # いくつも 1 行で書き込む "白色" => "カスミソウ", "赤色" => "薔薇", "青色" => "ツユクサ", "桃色" => "桜"} for iro, name in hana do # 全ての Hash の対をきれいに出力し、 項目の一覧表を作る for キー名, 値 in ハッシュ配列名 printf("%s の花といえば 「%s」 です\n", iro, name) end ・プログラムを実行した結果画面 irsv{c106037}% ./hash-for.rb [~/Ruby] 青色 の花といえば 「ツユクサ」 です 白色 の花といえば 「カスミソウ」 です 桃色 の花といえば 「桜」 です 黄色 の花といえば 「たんぽぽ」 です 赤色 の花といえば 「薔薇」 です ・結果の考察 すべてを表示するには、一つ一つを区切らずに、全てを一つの括弧で区切れ ばいいのだと思った。 ○hash-for1.rb hash-for1.dat ・考えた設定 データから読み込むようにしたプログラムへ変更した。 ・もとにしたプログラムからの変更点 前期で勉強した、「データを読み込むようにするには」を参考に、open - endを使って、作成した。 ・プログラム本体 □hash-for1.rb #!/usr/koeki/bin/ruby open("hash-for1.dat","r")do |iro| # open("ファイル名","モード") do |変数| while hana = iro.gets # 読み込むのでモードは r if /(\S+)\s+(\S+)/ =~ hana # 変数 に対して行う処理 printf(" %s の花といえば %s です\n", $1, $2) end end end □hash-for1.dat 黄色 たんぽぽ 白色 カスミソウ 赤色 薔薇 青色 ツユクサ 桃色 桜 ・実行結果 irsv{c106037}% ./hash-for1.rb [~/Ruby] 黄色 の花といえば たんぽぽ です 白色 の花といえば カスミソウ です 赤色 の花といえば 薔薇 です 青色 の花といえば ツユクサ です 桃色 の花といえば 桜 です ・結果の考察 読み込むファイルのやり方を忘れていたが、前期の授業での講義ノートを見 たりして、思い出すことができた。 ○hash-for2.rb ・考えた設定 ユーザが知りたい情報だけを表示するプログラムへ変更した。 ・元にしたプログラムからの変更点 授業で学んだ、「該当しないキーが呼び出されたとき」を参考にした。 ・プログラム本体 □hash-for2.rb #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コード EUC で出力する hana = Hash.new hana["黄色"] = "たんぽぽ" hana["白色"] = "カスミソウ" hana["赤色"] = "薔薇" hana["青色"] = "ツユクサ" hana["桃色"] = "桜" print("色から花を見てみよう!!\n") print("入力終了は Ctrl-D \n") while true STDERR.print("花の色は?:\n") iro = gets if iro == nil # 入力した文字が Ctrl-D なら、入力終了 then break else iro = iro.chomp end STDERR.print("花の名前は?:\n") name = gets.chomp if hana.key?(iro) == false # 文字列 key があるかどうか調べる # 存在しなければ false という値を返す printf("%sはありません\n", iro, hana[iro]) else printf( " %s の花といえば %s です\n", iro, name) end end STDERR.print("入力終了\n") ・実行結果 irsv{c106037}% ./hash-for2.rb [~/Ruby] 色から花を見てみよう!! 入力終了は Ctrl-D 花の色は?: 赤色 花の名前は?: 薔薇 赤色 の花といえば 薔薇 です 花の色は?: 桃色 花の名前は?: 桜 桃色 の花といえば 桜 です 花の色は?: 黄色 花の名前は?: たんぽぽ 黄色 の花といえば たんぽぽ です 花の色は?: 緑色 花の名前は?: 草 緑色はありません 花の色は?: 入力終了 ・結果の考察 色々なプログラムを組み合わせることで、新たなプログラムができるのだと 思った。 4. ・考えた設定 単語帳を作って、覚えた単語をデータに書き込むプログラムを作った。 ・元にしたプログラムからの変更点 前期に行なったグループ発表の Ribenren のレジプログラムを参考にし、 open-endを使った。 計算するプログラムを除き、書込みから、追加書込みにした。 ・プログラム本体 □wordbook.rb #!/usr/koeki/bin/ruby printf("登録したい単語を入力してください\n") print("終了は Ctrl-D :\n") while true STDERR.print("登録したい単語をひらがなで入力してください:\n") tango = gets open("words.dat","a")do |words| # open("ファイル名","モード") do |変数| # 書き込むのでモードは "a" words.printf( "%s ",tango) end if tango == nil # もし入力された文字が Ctrl-D なら then break # 入力終了する else tango = tango.chomp end STDERR.print("登録したい単語を漢字で入力してくだい:\n") kanji = gets.chomp open("words.dat","a")do |words| words.printf("%s \n",kanji) end end ・実行結果 irsv{c106037}% ./wordbook.rb [~/Ruby] 登録したい単語を入力してください 終了は Ctrl-D : 登録したい単語をひらがなで入力してください: あわび 登録したい単語を漢字で入力してくだい: 鮑 登録したい単語をひらがなで入力してください: きす 登録したい単語を漢字で入力してくだい: 鱚 登録したい単語をひらがなで入力してください: たい 登録したい単語を漢字で入力してくだい: 鯛 登録したい単語をひらがなで入力してください: にしん 登録したい単語を漢字で入力してくだい: 鰊 登録したい単語をひらがなで入力してください: はたはた 登録したい単語を漢字で入力してくだい: 鰰 登録したい単語をひらがなで入力してください: はぜ 登録したい単語を漢字で入力してくだい: 鯊 登録したい単語をひらがなで入力してください: さんしょううお 登録したい単語を漢字で入力してくだい: 鯢 登録したい単語をひらがなで入力してください: ぼら 登録したい単語を漢字で入力してくだい: 鰡 登録したい単語をひらがなで入力してください: □words.dat あわび 鮑 きす 鱚 たい 鯛 にしん 鰊 はたはた 鰰 はぜ 鯊 さんしょううお 鯢 ぼら 鰡 ・導き出された結果の考察 文字を書き込むやり方は "a" というのを改めて知ることができた。 words.dat に書き込まれる時に、改行が多かったが、最終的には文字を綺麗 に書き込めたのでよかった。 □wordquiz.rb ・考えた設定 適宜クイズを出すプログラムを作る。 ・元にしたプログラムからの変更点 今回の課題で作った hash-for1.rb のプログラムの open-end を使った。 ・プログラム本体 #!/usr/koeki/bin/ruby printf("問題を解いてみよう!!\n") pattern = STDIN.gets.chomp quiz = Regexp.new(pattern, true, "e") while true open("words.dat","r")do |words| while quiz = words.gets if toi =~ quiz if /(\S+)\s+/ =~ quiz printf("%s \n", $1) end end end end end ・結果の考察 どのように作ったら良いのか分からず、途中までしか出来なかった。 ・このような仕組みは何に使われているか? 社員名簿で、読み方が合っているのかを調べるプログラム 電子辞書 5.感想 今回は難しかったです。最初はどのプログラムを使ったら良いのか分からな かったけれど、前の授業の講義ノートを見たりして、思い出すことが出来ま した。 4番の単語帳の問題で、最初は "q" を入力して終わるようにしていたところ、 words.datにも "q" が書き込まれてしまっていました。その "q" を取り除 くために、Ctrl-D で終わるように工夫しました。 前期の授業の「データを読み込むようにするには」のところをよく復習し、 open-endの使い方を復習しました。