講評: 筆記問題で Hash 配列の記法がきちんと書けませんでした。 プログラムでは書いていたのに ... 整列には sort method を用います。 参考にしたプログラムをそのまま載せるのは引用とは呼びません。 いろいろ考えていることがわかる、よいレポートだと思います。 ---- 10月10日のレポート 第2回レポート 「Hash 配列」 学籍番号: C106XXXX 氏名: XXXXXXXX 語学クラス: XXXX語XX 系: XXXX系 1.名探偵コナンの作品、主要キャラクターの特徴を hash 配列 konan としまし た。 konan の key と value はそれぞれキャラクター名とその特徴にとりしま りました。 その1:key 「江戸川 コナン」 に対して value は 「眼鏡の子供」 その2:key 「毛利 蘭」 に対して value は 「喧嘩が強い女の子」 その3:key 「毛利 小五郎」 に対して value は 「眠らされる探偵」 その4:key 「服部 平次」 に対して value は 「関西弁の青年」 その5:key 「灰原 哀」 に対して value は 「頭が切れる子供」 2.10進数である0dを2進数に直す。2進数で直すとBの答えが出る。 そこから2進数を16進数に直す。16進数に直すとAの答えが出る。 計算をしていく 0d 1022 を 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 よって、2進数は、0b 1111111110 となる。 Bの答えは 0b 1111111110 次に、2進数を16進数にするので右から4桁ずつ区切ると 11 1111 1110 に分けられる。 この分けた数を16進数の表で変換すると http://roy/~madoka/2007/r1/04/04-12-binary2.html 11 = 3 1111 = f 1110 = e となるので、答えは 0x 3feとなる よって、A 0x 3fe B 0b 1111111110 3 hash-for.rbについて 考えた設定 講義で習った hash 配列を使うことで表示できると考えた。 名探偵コナンのキャラクターとその特徴を起動することでみること ができるプログラムになっている。 作成したプログラムコードそのもの #!/usr/koeki/bin/ruby $KCODE = 'e' konan = Hash.new # hash 配列を konan と定義する konan["江戸川 コナン"] = "眼鏡の子供" konan["毛利 蘭"] = "喧嘩が強い少女" konan["毛利 小五郎"] = "眠らされる探偵" konan["服部 平次"] = "関西弁の青年" konan["灰原 哀"] = "頭が切れる女の子" p konan もとにしたプログラムからの変更点 #!/usr/koeki/bin/ruby $KCODE = 'e' shop = Hash.new # Hash 配列を shop と定義する shop["押し麦"] = 250 shop["あわ"] = 180 shop["ひえ"] = 130 shop["きび"] = 210 shop["クコの実"] = 230 shop["そばの実"] = 170 shop["白ごま"] = 150 shop["黒ごま"] = 150 shop["玄米"] = 30 shop["七分付き"] = 40 shop["白米"] = 130 shop["干し椎茸"] = 500 p shop のプログラムを参考に書き変えました。 このプログラムでは、起動することによりプログラムにある Hash配列を表示させることができるので 名探偵コナンのキャラクターと 特徴に書き変え表示できるようにしました。 プログラムを実行した結果画面 irsv{c106054}% ./hash-for.rb [~/Ruby] {"江戸川 コナン"=>"眼鏡の子供", "灰原 哀"=>"頭が切れる女の子", "毛利 蘭"=>"喧嘩が強い少女", "服部 平次"=>"関西弁の青年", "毛利 小五郎"=>"眠らされる探偵"} 導き出された結果の考察 結果はうまくいった。しかし、順番が気になるので何か整列させる方法はないか と考えた。 ifで、名前を順番通りに整列させれるのではないかと考えた。 このプログラムでの工夫はあまりできなかった。しかし、いくつも 1 行で書き 込む方法の書き方もあるので試してみたい。 参考文献 西村まどか先生のホームページを参考にかかせてもらいました。 URLはこちらです。 http://roy/~madoka/2007/r2/02/02-02-hash.html hash-for.rbをユーザーが知りたい情報だけを表示するプログラムに作ります。 ちなみに、hash-for1.rbにプログラムを作っていきます。 考えた設定 作成したプログラムは名探偵コナンのキャラクターの中から選択をして その選択したキャラクターの特徴を答えてくれるプログラムを作りました。 選択することによってキャラクターの特徴を答えてくれるので、 前のプログラムより進歩したと思います。 もとにしたプログラムからの変更点 #!/usr/koeki/bin/ruby print(" 自分の幼少時代の思い出を語りたいと思います\n") sleep 2 print(" 聞きたいですか?\n") print(" 1:yes 2:no\n") summer0 = gets.chomp.to_i #summer0から取ってくる if summer0 == 2 #ifを使う(summer0) そして、2を選んだ場合 print(" そうですかーー残念ですね\n") exit elsif summer0 == 1 #elsifを使う そして、1を選んだ場合 print(" 分かりました聞かせましょうーー\n") end sleep 2 print(" 6〜12歳までの間で思い出を答えますよーー\n") print(" 聞きたい年の数を入力してくださいねーーー。\n") summer1 = gets.chomp.to_i #summer1から取ってくる if summer1 == 6 #ifを使う(summer1) そして、6を選んだ場合 print(" 小学生1年生、夏の思い出は・・・・・・\n") sleep 2 print(" 自分の家の近くの川に落ちた・・・親が必死に助けに来ていた。\n") sleep 2 print(" その時の父の顔が怖かった。\n") elsif summer1 == 7 #ifを使う(summer1) そして、7を選んだ場合 print(" 小学生2年生、夏の思い出は・・・・・・\n") sleep 2 print(" サッカースポーツ少年団に入る\n") sleep 2 print(" サッカーはつらい事を知る・・・・\n") elsif summer1 == 8 #ifを使う(summer1) そして、8を選んだ場合 print(" 小学生3年生、夏の思い出は・・・・・・\n") sleep 2 print(" 友達が体育館で鬼ごっこ中にネットにからまる・・・・\n") sleep 2 print(" 友達、死にそうになる\n") elsif summer1 == 9 #ifを使う(summer1) そして、9を選んだ場合 print(" 小学生4年生、夏の思い出は・・・・・・\n") sleep 2 print(" サッカーの大会に出る・・・・\n") sleep 2 print(" プレッシャーに負けて、泣く・・・・\n") elsif summer1 == 10 #ifを使う(summer1) そして、10を選んだ場合 print(" 小学生5年生、夏の思い出は・・・・・・\n") sleep 2 print(" 松島旅行に行く・・・・\n") sleep 2 print(" 船の移動の時、吐きそうになりグロッキー。横になる。\n") elsif summer1 == 11 #ifを使う(summer1) そして、11を選んだ場合 print(" 小学生6年生、夏の思い出は・・・・・・\n") sleep 2 print(" 女の子から告白される\n") sleep 2 print(" 嬉しかったので、付き合うが・・・・・\n") sleep 2 print(" その先は聞かないで下さい\n") elsif summer1 == 12 #ifを使う(summer1) そして、12を選んだ場合 print(" 中学1年生、夏の思い出は・・・・・・\n") sleep 2 print(" 友達と離れ離れになり悲しくなる・・・\n") sleep 2 print(" が、しかしすぐに友達ができて中学生活が薔薇色に!!!\n") sleep 2 print(" しかし、その友達は・・・・\n") sleep 2 print(" 今の悪友だった。\n") else summer1 == #elseを使う. 他の選択肢の選んだ場合 print("違う年齢は入力しないで下さいーーなのでやり直し\n") end のプログラムを参考にしました。 前回作ることができたのを改良しました。 名探偵コナンのデータに書き変えて検索するプログラムへと変更しました。 プログラムを実行した結果画面 irsv{c106054}% ./hash-for1.rb [~/Ruby] 名探偵コナンのキャラクターと特徴を検索します よろしいですか? 1:yes 2:no 2を選んだ場合 2 分かりました。プログラムを終了します。 1を選んだ場合 1 分かりました。検索を始めます。 江戸川 コナンについて調べるなら1を押して下さい 毛利 蘭 について調べるなら2を押して下さい 毛利 小五郎 について調べるなら3を押して下さい 服部 平次 について調べるなら4を押して下さい 灰原 哀 について調べるなら5を押して下さい 1を選んだ場合 1 江戸川 コナンの特徴は 眼鏡の子供 2を選んだ場合 2 毛利 蘭の特徴は 喧嘩が強い少女 3を選んだ場合 3 毛利 小五郎の特徴は 眠らされる探偵 4を選んだ場合 4 服部 平次の特徴は 関西弁の青年 5を選んだ場合 5 灰原 哀の特徴は 頭が切れる女の子 他の数字を選んだ場合 0 検索ができないので、やり直して下さい。 導き出された結果の考察 うまく検索ができたが、もう少し内容が濃くても良かった。 しかし、別のやり方があったのではないかとも考えている。 今回習ったものを工夫すればできるのではないかと試してみたい。 そして、このプログラムをデータを読み込む事ができるのではないかとも 考えている。 参考文献 参考にしたプログラムsummer_b.rbを添付しておきます。 hash-for.rbをデータを読み込むプログラムに作ります。 ちなみに、hash-for2.rbにプログラムを作っていきます。 考えた設定 検索をするプログラムになってしまったが、名探偵コナンの キャラクターの名前を入れれば キャラクターの名前と特徴が検索されてくるプログラムになった。 openを使っているので読み込む必要はない。 作成したプログラムのコードそのもの #!/usr/koeki/bin/ruby STDERR.print "名探偵コナンのキャラクターを入力してください " pattern = STDIN.gets.chomp request = Regexp.new(pattern, true, "e") open("hash.dat","r") do |candidate| while hash = candidate.gets if request =~ hash # print hash if /(\S+)\s+(\S+)\s+/ =~ hash printf("%s\n", $1) printf("%s\n", $2) end end end end もとにしたプログラムからの変更点 #!/usr/koeki/bin/ruby STDERR.print "検索パターン : " pattern = STDIN.gets.chomp request = Regexp.new(pattern, true, "e") open("station.dat","r") do |candidate| while station = candidate.gets if request =~ station # print station if /(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/ =~ station printf("%s駅\n", $1) end end end end のreaddat.rbを参考にプログラムを作りました。 データを読み込む必要があったので、openを使えばいいと思いこのプログラムを 改良しました。 導き出された結果の考察 今回はデータを読み込み検索するプログラムができた。 検索することで相手がしりたいデータを取り寄せらようにした。 しかし、内容を濃くすることで相手に与える情報量も増え 楽しめるプログラムになると考えた。さらに、もう一つの データを作り組み合わせたりするとさらに良くなるかも知れない。 そして、次はデータだけを読み込んでのデータを表示させるプログラムを作りたい。 他にも、openを使ったプログラムを積極的に取り入れていきたい。 参考文献 プログラムのreaddat.rbを参考にしたので添付します hash-register.rbについて 考えた設定 名探偵コナンのキャラクター名と特徴を入力すると最後にまとめて 表示されるプログラムを作りました。 作成したプログラム #!/usr/koeki/bin/ruby konan = Hash.new printf("名探偵コナンについて入力してください\n") printf("キャラクター名と特徴を入力お願いします\n") printf("終了は Ctrl-D\n") while true STDERR.print("キャラクター名:") name = gets if name == nil # Ctrl-D が押されたら終了 then break else # Ctrl-D 以外の文字列はここに進む name = name.chomp # 改行を取る end STDERR.print("特徴:") karada = gets.chomp konan[name] = karada end STDERR.print("入力終了 \n") $KCODE = 'e' # 漢字コードは EUC で #p konan # 確認のため konan に入っているデータを全て見る for name, karada in konan printf("%s\t%s\n",name,karada) end もとにしたプログラムからの変更点 #!/usr/koeki/bin/ruby shop = Hash.new("非取扱い商品") printf("本日の価格を入力してください\n") printf("** 終了は Ctrl-D\n") while true STDERR.print("取扱商品名:") item = gets if item == nil then break else item = item.chomp end STDERR.print("100グラムあたりの価格:") price = gets.chomp.to_i shop[item] = price end STDERR.print("入力終了 \n") $KCODE = 'e' p shop の一つと for item, price in shop printf("%s\t%d\n", item, price) end の二つを参考にプログラムを作りました。 このプログラムを自分のプログラムにあうように改良しました。 自分のは日本語で表示させるように変えたり 表示にあうようにしました。 プログラムを実行した結果画面 irsv{c106054}% ./hash-register.rb [~/Ruby] 名探偵コナンについて入力してください キャラクター名と特徴を入力お願いします 終了は Ctrl-D キャラクター名:江戸川コナン 特徴:眼鏡の子供 キャラクター名:毛利蘭 特徴:喧嘩が強い少女 キャラクター名:毛利小五郎 特徴:眠らされる探偵 キャラクター名:服部平次 特徴:関西弁の青年 キャラクター名:灰原哀 特徴:頭が切れる女の子 キャラクター名:入力終了 服部平次 関西弁の青年 毛利蘭 喧嘩が強い少女 毛利小五郎 眠らされる探偵 灰原哀 頭が切れる女の子 江戸川コナン 眼鏡の子供 導き出された結果の考察 今回はうまく書くことができた。 工夫があまりなされていないのが目立った。 それに、プログラムを実行するまで 時間がかかってしまった。その原因は%s\t%d\nを忘れていたこと が遅くしてしまった。プログラムをまた理解する必要があった。 参考文献 西村先生のホームページを参考させてもらいました。 URLを貼ります http://roy/~madoka/2007/r2/02/02-07-for-hash.html http://roy/~madoka/2007/r2/02/02-06-input-hash.html 4 プログラムを作成することができなかった。 このプログラムでは必要なものはこのレポートで作ったhash-register.rb を改良すればいいのではないかと考えています。 そこでます、データを取り出す必要があるのでopenが必要になってくるので openをとりいれる。openで取り入れたデータがユーザーによって書き込むと同時に 書き込まれる必要がある。よって、書き込まれたデータをwords.datを書き込む プログラムが必要だと考えています。 この、方法が分かればさらにレポートでの工夫ができるので調べておきます。 この仕組みは、電子辞書やにんてんどーDSなどのしくみに使われていると考え ています 5 忘れていたことは%s\t%d\nの意味など、プログラムでは 重要な所だったので、今後は忘れないでいきたい。 参考にしたのは、自分が作成したプログラムやまどか先生のホーム ページです。貼り付けておきます。 今回は忘れていたプログラムのせいで時間が潰れたので こまかい所まで復習を行ないました。 またこのような事があったらさらに復習していきたいと思います。 http://roy/~madoka/2007/r2/02/02-07-for-hash.html http://roy/~madoka/2007/r2/02/02-06-input-hash.html http://roy/~madoka/2007/r2/02/02-02-hash.html