講評: 「ある書店」での売れる本の平均値などを最後に出せると よかったですね。 ---- 学籍番号:C106XXXX 氏名:XXXXXXXX 語学クラス:XXXX語XX 系: XXXX系 1. A. 少女まんがの詳細を hash 配列 manga としました。 manga の key と value は、 それぞれ作品名とその著者名、出版社名、ある書店での1ヵ月の売上げ冊数[冊] にとりました。 =その1の方法= manga = ["花より男子"] = "神尾葉子" ,"集英社" ,52 manga = ["NANA-ナナ-"] = "矢沢あい" ,"集英社" ,67 manga = ["ヤマトナデシコ七変化"] = "はやかわともこ" ,"講談社" ,34 manga = ["花ざかりの君たちへ"] = "中条比紗也" ,"白泉社" ,58 manga = ["ハチミツとクローバー"] = "羽海野チカ" ,"集英社" ,40 manga = ["のだめカンタービレ"] = "二ノ宮知子" ,"講談社" ,46 =その2の方法= manga ={"花より男子"=>"神尾葉子","集英社",52,"NANA-ナナ-"=>"矢沢あい"," 集英社",52,"ヤマトナデシコ七変化"=>"はやかわともこ","講談社",34,"花ざか りの君たちへ"=>"中条比紗也","白泉社",58,"ハチミツとクローバー"=>羽海野チ カ,"集英社",58,"のだめカンタービレ"=>"二ノ宮知子","講談社",46} B. ●すべて小文字の場合「yamada naomi」 y → 0x79 a → 0x61 m → 0x6d a → 0x61 d → 0x64 a → 0x61 n → 0x6e a → 0x61 o → 0x6f m → 0x6d i → 0x69 よって、 「yamada naomi」= 0x79,0x61,0x6d,0x61,0x64,0x61,0x6e,0x61,0x6f,0x6d,0x69 となる。 参考 西村先生のHP「ASCIIコード」http://roy/~madoka/2007/r1/05/05-03-ascii.html ○これを10進数で表した場合 0x79 → 0d79 0x61 → 0d61 0x6d → 0d613 0x61 → 0d61 0x64 → 0d64 0x61 → 0d61 0x6e → 0d614 0x61 → 0d61 0x6f → 0d615 0x6d → 0d613 0x69 → 0d69 参考 西村先生のHP 「2 進数, 16 進数変換 (2)」http://roy/~madoka/2007/r1/04/04-12-binary2.html ●すべて大文字の場合 「YAMADA NAOMI」 Y → 0x59 A → 0x41 M → 0x4d A → 0x41 D → 0x44 A → 0x41 N → 0x4e A → 0x41 O → 0x4f M → 0x4d I → 0x49 よって 「YAMADA NAOMI」= 0x59,0x41,0x4d,0x41,0x44,0x41,0x4e,0x41,0x4f,0x4d,0x49 となる。 参考 西村先生のHP「ASCIIコード」http://roy/~madoka/2007/r1/05/05-03-ascii.html ○これを10進数で表した場合 0x59 → 0d59 0x41 → 0d41 0x4d → 0d413 0x41 → 0d41 0x44 → 0d44 0x41 → 0d41 0x4e → 0d414 0x41 → 0d41 0x4f → 0d415 0x4d → 0d413 0x49 → 0d49 参考 西村先生のHP 「2 進数, 16 進数変換 (2)」http://roy/~madoka/2007/r1/04/04-12-binary2.html 2. ●あらかじめプログラムに登録してある対を表示するもの hash-for.rb a. ある書店でのデータ(作品名、著者名、出版社名、1ヵ月の売上げ冊数)を作成し て、それをprint文で表示させるプログラムにしました。Hash配列のデータを切 り出して、print文にくいこませました。 b. #!/usr/koeki/bin/ruby manga = Hash.new $KCODE = 'e' while manga_data = gets if /(\S+)\s+(\S+)\s+(\S+)\s+(\d+)/ =~ manga_data manga[$1] = [$2,$3,$4.to_i] end end for sakuhin,detail in manga printf("[%s]といえば、\n著者名:%s\t出版社名:%s\nある書店での1ヵ月売上げ冊数:%d\tである\n\n",sakuhin,detail[0],detail[1],detail[2]) end c. もとにしたプログラムは、sesame.rb です。 配列の数を減らしたので、それにともなって、配列を切り出す際に使ったif文の ところを、変更しました。 また、sesame.rb では、for文のところで合計を出す式をプログラムしていまし たが、式を作らないでprint文に配列を組み込ませるだけのプログラムにしまし た。 d. irsv{c106186}% ./hash-for.rb manga.dat [~/Ruby] [ハチミツとクローバー]といえば、 著者名:羽海野チカ 出版社名:集英社 ある書店での1ヵ月売上げ冊数:40 である [のだめカンタービレ]といえば、 著者名:二ノ宮知子 出版社名:講談社 ある書店での1ヵ月売上げ冊数:46 である [NANA-ナナ-]といえば、 著者名:矢沢あい 出版社名:集英社 ある書店での1ヵ月売上げ冊数:67 である [花より男子]といえば、 著者名:神尾葉子 出版社名:集英社 ある書店での1ヵ月売上げ冊数:52 である [ヤマトナデシコ七変化]といえば、 著者名:はやかわともこ 出版社名:講談社 ある書店での1ヵ月売上げ冊数:34 である [花ざかりの君たちへ]といえば、 著者名:中条比紗也 出版社名:白泉社 ある書店での1ヵ月売上げ冊数:58 である e. print文で、データを間違いなく出力できていました。 f. 西村先生のHP「Hash 配列にしまえるもの」 http://roy/~madoka/2007/r2/03/03-04-value-array.html 前回の授業で作ったプログラム 「sesame.rb」 ●ある値について並べ替えるプログラムへ変更する a. hash-for.rbのプログラムに、売上げ冊数が多い順に並び変えるプログラムにし ました。 b. #!/usr/koeki/bin/ruby manga = Hash.new $KCODE = 'e' while manga_data = gets if /(\S+)\s+(\S+)\s+(\S+)\s+(\d+)/ =~ manga_data manga[$1] = [$2,$3,$4.to_i] end end for sakuhin,detail in manga printf("[%s]といえば、\n著者名:%s\t出版社名:%s\nある書店での1ヵ月売上げ冊数:%d\tである\n\n",sakuhin,detail[0],detail[1],detail[2]) end print("\n" * 2) print("売上げ冊数について\n") manga.keys.sort{ |second,lowest| manga[second][2] <=> manga[lowest][2] }.reverse.each{ |detail| printf("%s\t%d\n", detail, manga[detail][2]) } c. もとにしたプログラムは、sesame.rb です。 sesame.rb では、少ないもの順の並び替えだったのを、このプログラムでは、多 いもの順に並び替えました。each の前に reverseを置きました。 d. irsv{c106186}% ./hash-for.rb manga.dat [~/Ruby] [ハチミツとクローバー]といえば、 著者名:羽海野チカ 出版社名:集英社 ある書店での1ヵ月売上げ冊数:40 である [のだめカンタービレ]といえば、 著者名:二ノ宮知子 出版社名:講談社 ある書店での1ヵ月売上げ冊数:46 である [NANA-ナナ-]といえば、 著者名:矢沢あい 出版社名:集英社 ある書店での1ヵ月売上げ冊数:67 である [花より男子]といえば、 著者名:神尾葉子 出版社名:集英社 ある書店での1ヵ月売上げ冊数:52 である [ヤマトナデシコ七変化]といえば、 著者名:はやかわともこ 出版社名:講談社 ある書店での1ヵ月売上げ冊数:34 である [花ざかりの君たちへ]といえば、 著者名:中条比紗也 出版社名:白泉社 ある書店での1ヵ月売上げ冊数:58 である 売上げ冊数について NANA-ナナ- 67 花ざかりの君たちへ 58 花より男子 52 のだめカンタービレ 46 ハチミツとクローバー 40 ヤマトナデシコ七変化 34 e. 多いもの順に並び替えられていました。 f. 西村先生のHP 「value の一部を使って sort する例」 http://roy/~madoka/2007/r2/03/03-07-sort-hash-array-02.html 前回作ったプログラム 「sesame.rb」 ●数値の入った配列成分を計算するプログラム hash-array-calc.rb a. ある書店でのデータ(作品名、1ヵ月ごとの売上げ冊数3ヵ月分)を組み込ませて 計算させるプログラムにしました。1冊400円として、3ヵ月分の売上げ金額を計 算しました。 b. #!/usr/koeki/bin/ruby manga = Hash.new $KCODE = 'e' while manga2_data = gets if /(\S+)\s+(\d+)\s+(\d+)\s+(\d+)/ =~ manga2_data manga[$1] = [$2.to_i,$3.to_i,$4.to_i] end end print("3ヵ月の売上げ金額を計算します。\n") for sakuhin, data in manga total = data[0] + data[1] + data[2] uriage = 400 * total printf("%s\t%10d[円]\n", sakuhin, uriage) end c. もとにしたプログラムは sesame.rb です。 total した後に、さらに400をかけるプログラムに変更しました。 d. irsv{c106186}% ./hash-array-calc.rb manga2.dat [~/Ruby] 3ヵ月の売上げ金額を計算します。 ハチミツとクローバー 49200[円] のだめカンタービレ 45200[円] NANA-ナナ- 73200[円] 花より男子 48000[円] ヤマトナデシコ七変化 36000[円] 花ざかりの君たちへ 70800[円] e. irsv{c106186}% bc -l [~] 40 + 36 + 47 123 123 * 400 49200 46 + 30 + 37 113 113 * 400 45200 67 + 56 + 60 183 183 * 400 73200 52 + 45 + 23 120 120 * 400 48000 34 + 25 + 31 90 90 * 400 36000 58 + 66 + 53 177 177 * 400 70800 計算合っていました。 f. 西村先生のHP「key を叩いて value の一部を取り出すには」 http://roy/~madoka/2007/r2/03/03-05-for-hash-array.html 前回作ったプログラム「sesame.rb」 3. ASCII コードは、すっかり忘れていました。初めから勉強し直すようにHPを参考 にして解いていきました。復習することができて良かったです。 今回の課題のすべてを、manga.dat を使おうと思っていたのですが、計算プログ ラムのところで、配列に数値が一つしか含まれていないので、バリエーションが 広がらず、新しくデータを作ってやってみました。出力されたとき、より見やす いように工夫してはみたのですが、いたらないところもありました。今後はもう 少し細かいところまで、工夫できるように頑張りたいとおもいます。