講評: 購入した価格をしまう変数を用意して、足していけば よさそうです。 ---- 10 月 17 日 第 3 回レポート 「Value が配列のとき」 学籍番号:C106XXXX 氏名:XXXXXXXX 語学クラス:XXXX語クラスXX 系:XXXX系 1. A. 花の特徴を hash 配列 hana としました。 hana の key と value は それぞれ花と、値段、花言葉、その花が咲いている季節にとりました。 その 1: key 「マリーゴールド」に対して valueは「150, "かわいい" , "春"」 その 2: key 「ヒヤシンス」に対して valueは「300, "しとやか", "春"」 その 3: key 「ダリア」に対して valueは「400, "華麗" , "夏"」 その 4: key 「コスモス」に対して valueは「200, "愛情、真心" , "秋"」 その 5: key 「ピンクッション」に対して valueは「400, "成功" , "冬"」 これらを hash 配列で表記すると、 hana["マリーゴールド"] = 150,"かわいい","春" hana["ヒヤシンス"] = 300,"しとやか","春" hana["ダリア"] = 400,"華麗","夏" hana["コスモス"] = 200,"愛情、真心","秋" hana["ピンクッション"] = 400,"成功","冬" B.ASCII コードを調べるには、 Emacs で、知りたい文字の上にカーソルをあてて、Ctrl-x = と入力する。 入力すると、 Char:に 知りたい文字 (8 進数表示, 10 進数表示, 16 進数表示, file ...) エディタ上の場所 が、表示される。よって、以下のようになる。 Endo Sayaka 8 進数表示 10 進数表示 16 進数表示 E : 0105 69 0x45 n : 0156 110 0x6e d : 0144 100 0x64 o : 0157 111 0x6f S : 0123 83 0x53 a : 0141 97 0x61 y : 0171 121 0x79 a : 0141 97 0x61 k : 0153 107 0x6b a : 0141 97 0x61 小文字の場合 e : 0145 101 0x65 s : 0163 115 0x65 2. ○hash-for.rb ・考えた設定 あらかじめプログラムに登録してある対を表示するものを作った。 花の値段と花言葉と、咲いている季節を表示するものを作った。 ・作成したプログラムコードそのもの hash-for.rb #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コード hana = Hash.new # Hash 配列を hana と定義する hana["マリーゴールド"] = 150, "かわいい", "春" hana["ヒヤシンス"] = 300, "しとやか", "春" hana["ダリア"] = 400, "華麗", "夏" hana["コスモス"] = 500, "愛情、真心", "秋" hana["ピンクッション"] = 400, "成功", "冬" hana.keys{ # hash 配列.keys. }.each{ |nedan| printf("%-15s は %d 円で売られていて、花言葉は 「%s」で、 咲いている季節は 「%s」 です\n", nedan,hana[nedan][0],hana[nedan][1],hana[nedan][2]) # [0]は値段を取って くる [1]は花言葉を取っ てくる [2]は季節を取って くる } ・もとにしたプログラムからの変更点 value の一部を使って sort する例を使って、並べ替えの部分を削除し、 文字が表示されるようにした。 ・プログラムを実行した結果画面 irsv{c106037}% ./hash-for.rb [~/Ruby] ピンクッション は 400 円で売られていて、花言葉は 「成功」で、 咲いている季節は 「冬」 です ダリア は 400 円で売られていて、花言葉は 「華麗」で、 咲いている季節は 「夏」 です マリーゴールド は 150 円で売られていて、花言葉は 「かわいい」で、 咲いている季節は 「春」 です ヒヤシンス は 300 円で売られていて、花言葉は 「しとやか」で、 咲いている季節は 「春」 です コスモス は 500 円で売られていて、花言葉は 「愛情、真心」で、 咲いている季節は 「秋」 です ・導き出された結果の考察 最初 1 行で表示するようにしたところできなく、1 行に 1 つの組み合わせ でプログラムを作ったらできた。 また、for in end で表示するようにしたところ、出来なかった。 文字を揃えるために、-15 を用いた。 ・参考文献 西村まどか先生のホームページ http://roy/~madoka/2007/r2/03/03-07-sort-hash-array-02.html ○hash-for_a.rb ・考えた設定 ある値について並べ替えるプログラムへ変更する。 花の値段を安い順番に並べ替えた。 ・作成したプログラムコードそのもの hash-for_a.rb #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コード hana = Hash.new # Hash 配列を hana と定義する hana["マリーゴールド"] = 150, "かわいい", "春" hana["ヒヤシンス"] = 300, "しとやか", "春" hana["ダリア"] = 400, "華麗", "夏" hana["コスモス"] = 500, "愛情、真心", "秋" hana["ピンクッション"] = 400, "成功", "冬" print("値段の安い順に並べ替えます。\n\n") hana.keys.sort{ # hash 配列.keys.sort{ |lows,high| # |並び替え前の key 変数, 並び替え後の key 変数| hana[lows][0] <=> hana[high][0] # hash 配列[並び替え前の key 変数] [要素番号] <=> hash 配列[並び替え後の key 変数] [要素番号] }.each{ |nedan| printf("%-15s は %d 円で売られていて、花言葉は 「%s」で、 咲いている季節は 「%s」 です\n\n", nedan,hana[nedan][0],hana[nedan][1],hana[nedan][2]) } ・もとにしたプログラムからの変更点 value の一部を使って sort する例を参考にした。要素番号を変更した。 ・プログラムを実行した結果画面 irsv{c106037}% ./hash-for_a.rb [~/Ruby] 値段の安い順に並べ替えます。 マリーゴールド は 150 円で売られていて、花言葉は 「かわいい」で、 咲いている季節は 「春」 です ヒヤシンス は 300 円で売られていて、花言葉は 「しとやか」で、 咲いている季節は 「春」 です ピンクッション は 400 円で売られていて、花言葉は 「成功」で、 咲いている季節は 「冬」 です ダリア は 400 円で売られていて、花言葉は 「華麗」で、 咲いている季節は 「夏」 です コスモス は 500 円で売られていて、花言葉は 「愛情、真心」で、 咲いている季節は 「秋」 です ・導き出された結果の考察 要素番号を最初 [1]にしていたら、値段の安い順に並び換えれず、この番号 が、valueの文字が並んでいる順番だということが分かった。 ・参考文献 西村まどか先生のホームページ http://roy/~madoka/2007/r2/03/03-07-sort-hash-array-02.html ○hash-array-calc.rb ・考えた設定 何本花を買ったかの値段を調べるプログラムを作った。 while true を使って繰り返しをした。また、非取扱い商品も出るようにし た。 ・作成したプログラムコードそのもの hash-array-calc.rb #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コード hana = Hash.new # Hash 配列を hana と定義する hana["マリーゴールド"] = 150 hana["ヒヤシンス"] = 300 hana["ダリア"] = 400 hana["コスモス"] = 500 hana["ピンクッション"] = 400 #p hana while true # 繰り返し STDERR.print("買いたい花を入力してください:\n") print("終了は Ctrl-D:\n") flower = gets if flower == nil # 入力した文字が Ctrl-D なら then break # 終了する else flower = flower.chomp end print("\n") STDERR.print("何本欲しいですか?:\n") hon = gets.chomp.to_i if hana.key?(flower) == false #入力した品物が Hash 対の key でないとき 取り扱っていない商品であるとする printf("%s は非取扱い商品です\n", flower,hana[flower]) else printf("%s\t(%5.0f 本)\t %4.0f円\n", flower, hon, hana[flower] * hon) end print("\n") end print("ありがとうございました!\n") ・もとにしたプログラムからの変更点 「入力したデータを取り出そう」と「あるかないか」と「該当しないキーが 呼び出されたとき」のプログラムを組み合わせて、作った。 ・プログラムを実行した結果画面 irsv{c106037}% ./hash-array-calc.rb [~/Ruby] 取扱っている花は、こちらです ピンクッション 400円 ダリア 400円 マリーゴールド 150円 ヒヤシンス 300円 コスモス 500円 買いたい花を入力してください: 終了は Ctrl-D: ピンクッション 何本欲しいですか?: 2 ピンクッション ( 2 本) 800円 買いたい花を入力してください: 終了は Ctrl-D: ダリア 何本欲しいですか?: 3 ダリア ( 3 本) 1200円 買いたい花を入力してください: 終了は Ctrl-D: チューリップ 何本欲しいですか?: 2 チューリップ は非取扱い商品です 買いたい花を入力してください: 終了は Ctrl-D: ありがとうございました! ・導き出された結果の考察 本当は最後に全部の合計金額を出したかったが、どのようにしたらいいか分 らずできなかった。 非取扱い商品はしっかりと出たので良かった。 ・参考文献 西村まどか先生のホームページを参考にした ■入力したデータを取り出そう http://roy/~madoka/2007/r2/02/02-03-call-hash.html ■あるかないか http://roy/~madoka/2007/r2/02/02-04-check-hash.html ■該当しないキーが呼び出されたとき http://roy/~madoka/2007/r2/02/02-05-default.html 3.感想 今回はすぐにできるかと思ったが、忘れていることが多く、思ったより時間 がかかってしまった。プログラムに計算をさせるというのをよく復習した。 ASCII コードの調べ方を忘れていたが、授業講義を復習して思い出すことが できた。また、色々なプログラムを組み合わせて、ひとつのプログラムを作 れて楽しかった。