講評: ファイル入出力は、プログラムの仕上げに入れる行です。 プログラムの開始は、仕様通りのプログラムに仕上げる部分から 始めます。 ---- 10 月 17 日 第 3 回レポート 「Value が配列のとき」 学籍番号: c106XXXX 氏名: XXXXXXXX 語学クラス: XXXX語XX 系: XXXX系 1-A 歴史上の人物(女性)のプロフィールを hash 配列 woman とした。 woman の key と value はそれぞれ 名前とその活躍した時代、出身地、職業、没年齢とした。 その1 * key [ 卑弥呼 ] に対して value は [ "弥生時代","邪馬台国","巫女 ","65" ] その2 * key [ 推古天皇 ] に対して value は [ "飛鳥時代","大和国","天皇 ","74" ] その3 * key [ 藤原彰子 ] に対して value は [ "平安時代","平安京","中宮 ","76" ] その4 * key [ 北条政子 ] に対して value は [ "鎌倉時代","伊豆","尼将軍 ","68" ] その5 * key [ 静御前 ] に対して value は [ "鎌倉時代","吉野","白拍子 ","46" ] その6 * key [ 春日局 ] に対して value は [ "江戸時代","美濃","大奥総取締 役","64" ] これらを hash 配列で表記すると woman["卑弥呼"] = "弥生時代","邪馬台国","巫女","65" woman["推古天皇"] = "飛鳥時代","大和国","天皇","74 " woman["藤原彰子"] = "平安時代","平安京","中宮","76" woman["北条政子"] = "鎌倉時代","伊豆","尼将軍","68" woman["静御前"] = "鎌倉時代","吉野","白拍子","46" woman["春日局"] = "江戸時代","美濃","大奥総取締役","64" となる。 ※ 一部名前が本名ではなく、位や称号の部分があります。また、卑弥呼の年 齢に関しては、記述が無くて良くわからなかったので、勝手に設定。同じく 静御前に関しても生年没が不明であったため推定年齢です。 [ 参考資料 ] Wikipedia http://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2 1-B Mai Sato M → 4D a → 61 i → 69 S → 53 a → 61 t → 74 o → 6F 2 a-1[ あらかじめプログラムに登録してある対を表示 ] a-2[ 作成したプログラム ] #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コード EUC で表示する woman = Hash.new # Hash 配列を woman と定義 woman["卑弥呼"] = "弥生時代","邪馬台国","巫女","65" woman["推古天皇"] = "飛鳥時代","大和国","天皇","74 " woman["藤原彰子"] = "平安時代","平安京","中宮","76" woman["北条政子"] = "鎌倉時代","伊豆","尼将軍","68" woman["静御前"] = "鎌倉時代","吉野","白拍子","46" woman["春日局"] = "江戸時代","美濃","大奥総取締役","64" p woman a-3[ 元にしたプログラム & 変更点 ] 元にしたプログラムは shop.rb 変更点は、Hash 配列を woman としたところと、value の数を4つに増やした。 a-4[ 結果画面 ] % ./hash-for2.rb [~/Ruby] {"春日局"=>["江戸時代", "美濃", "大奥総取締役", "64"], "推古天皇"=>["飛鳥時代", "大和国", "天皇", "74 "], "卑弥呼"=>["弥生時代", "邪馬台国", "巫女", "65"], "静御前"=>["鎌倉時代", "吉野", "白拍子", "46"], "藤原彰子"=>["平安時代", "平安京", "中宮", "76"], "北条政子"=>["鎌倉時代", "伊豆", "尼将軍", "68"]} b-1[ ある値について並び変えるプログラム ] b-2[ 作成したプログラム ] [ hash-for21.rb ] #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コードを EUC に変える woman = Hash.new # Hash 配列を woman と定義 while act = gets # act を gets してくる if /(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\d+)/ =~ act # 1個目の(\S+) 歴史上の人物の名前が入る # 2個目の(\S+) 活躍した時代が入る # 3個目の(\S+) 出身地が入る # 4個目の(\S+) 職業が入る # 最後の(\S+) 没年齢が入る woman[$1] = [$2,$3,$4,$5.to_i] # 配列を代入する end end STDERR.printf("私の好きな歴史上の人物(女性)を紹介します。\n") for name in woman.keys.sort{ |s,y| woman[s][0] <=> woman[y][0] } # for in Hash の配列を綺麗に並べる # keys.sort value にもとづいて並び変える printf("%s は %s に活躍し %s の生まれです。職業は %s で、享年 %d 歳です\n",name, woman[name][0], woman[name][1], woman[name][2], woman[name][3], woman[name][4]) end [ hash-for2.dat ] 卑弥呼 弥生時代 邪馬台国 巫女 65 推古天皇 飛鳥時代 大和国 天皇 74 藤原彰子 平安時代 平安京 中宮 76 北条政子 鎌倉時代 伊豆 尼将軍 68 巴御前 戦国時代 信濃 女武将 46 春日局 江戸時代 美濃 大奥総取締役 64 b-3[ 元にしたプログラム & 変更点 ] 元にしたプログラムは 神田先生のホームページにある softball2.rb と言うプ ログラムを参考にした。 変更点は、Hash の配列を woman としたこと。また、ただデータの部分が表示さ れても分らないので、printf を使い文章として表示されるようにした。 b-4[ 結果画面 ] % ./hash-for21.rb hash-for2.dat [~/Ruby] 私の好きな歴史上の人物(女性)を紹介します。 北条政子 は 鎌倉時代 に活躍し 伊豆 の生まれです。職業は 尼将軍 で、享年 68 歳です 春日局 は 江戸時代 に活躍し 美濃 の生まれです。職業は 大奥総取締役 で、享年 64 歳です 巴御前 は 戦国時代 に活躍し 信濃 の生まれです。職業は 女武将 で、享年 46 歳です 推古天皇 は 飛鳥時代 に活躍し 大和国 の生まれです。職業は 天皇 で、享年 74 歳です 藤原彰子 は 平安時代 に活躍し 平安京 の生まれです。職業は 中宮 で、享年 76 歳です 卑弥呼 は 弥生時代 に活躍し 邪馬台国 の生まれです。職業は 巫女 で、享年 65 歳です c-1[ 数値の入った配列成分を計算する ] c-2[ 作成したプログラム ] #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コード EUC に変える knit = Hash.new # Hash 配列を woman と定義 knit["マフラー"] = 890,6,"一目ゴム編み" # ["編む予定のもの"] = 費用, 日数, "編み方" knit["アームウォーマー"] = 780, 7, "メリヤス編み" knit["帽子"] = 1080, 14, "模様編み" knit["セーター"] = 1950, 20, "ガーター編み" knit["膝掛"] = 1960, 7, "二目ゴム編み" # p knit stick = Array.new print("編物(作る予定)のリスト♪\n") print("----- 品物 ------------------- 費用 -- 日数 --- 編み方 -----\n") knit.keys.sort{ # keys.sort で並び変える |money,day| knit[money][2] <=> knit[day][2] # 日数を各成分に代入させる }.reverse.each { # reverse.each で反対に並び変える |stick| printf("%-26s\t%d\t%d\t%s\n", stick, knit[stick][0], knit[stick][1], knit[stick][2], knit[stick][3]) } c-3[ 元にしたプログラム & 変更点 ] sesame.rb を元として作った. 変更点は、 hash 配列を sesaem から knit に変更。 並び替え前の key の変数を second から money に変更。 並び替え後の key の変数を lowest から day に変更。 c-4[ 結果画面 ] % ./hash-array-calc.rb [~/Ruby] 編物(作る予定)のリスト♪ ----- 品物 ------------------- 費用 -- 日数 --- 編み方 ----- 帽子 1080 14 模様編み 膝掛 1960 7 二目ゴム編み マフラー 890 6 一目ゴム編み アームウォーマー 780 7 メリヤス編み セーター 1950 20 ガーター編み d-1[ for 文を使ったプログラム ] d-2[ 作成したプログラム ] #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コード EUC に変える knit = Hash.new # Hash 配列を woman と定義 knit["マフラー"] = 890, 6,"一目ゴム編み" # ["編む予定のもの"] = 費用, 日数, "編み方" knit["アームウォーマー"] = 780, 7, "メリヤス編み" knit["帽子"] = 1080, 14, "模様編み" knit["セーター"] = 1950, 20, "ガーター編み" knit["膝掛"] = 1960, 7, "二目ゴム編み" # p knit print("一日でどのくらいの金額を編む予定なのか!!\n") for money, day in knit # for 文で hash の対を繰り返し呼ぶ total = day[0] / day[1] # value の配列 day[0] と day[1] を呼び出して割り算をさせる printf("%-24s\t%10d[円]\n",money, total) end # for 文に対する end d-3[ 元にしたプログラム & 変更点 ] sesame.rb を元として作った。 変更点は、 total の所を足算ではなくて、割り算になるようにした。 d-4[ 結果画面 ] % ./hash-each.rb [~/Ruby] 一日でどのくらいの金額を編む予定なのか!! アームウォーマー 111[円] マフラー 148[円] 膝掛 280[円] 帽子 77[円] セーター 97[円] [ 考察 ] a))予想通りの結果を得ることが出来た。 b))間違ってデータを作ってプログラムを作ってしまった。という事を後から気 づいてしまったので、今度はちゃんとデータを使わずに作りたいと思う。 c))予想通りの結果を得ることが出来た。 d))予想通りの結果を得ることが出来た。 [ 参考資料 ] 西村先生のホームページ ((03:得意先の情報を分析しよう 神田先生のホームページ ((ハッシュ[2] wikipedia http://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2 3,[ 感想 ] 始め全てデータを使って作るのだと思っていたので、途中でデータを使わずに作 るのだと知りショックだった。でも、わからないところを西村先生や神田先生の ホームページを見ながら一人で作れたときはすごく嬉しかった。 特に今回は、sort について良く勉強したと思う。西村先生のホームページを見 て、講義中に作ったプログラムを眺めてこれはこういった意味なんだと理解するこ とができた。