第2回 基礎プログラミング II レポート課題 氏名: xxxxxxxxx 学籍番号:C10xxxx 語学クラス:英語xx コース(系):社会 1.花札の月と植物を hash 配列 hanafuda とした。 hanafuda の key と value はそれぞれの月とその月の花にした。 その 1: key「一月」に対し value は「松」 その 2: key「二月」に対し value は「梅」 その 3: key「三月」に対し value は「桜」 その 4: key「四月」に対し value は「藤」 その 5: key「五月」に対し value は「菖蒲」 これに対応する Hash の表し方は hanafuda["一月"] = "松" hanafuda["二月"] = "梅" hanafuda["三月"] = "桜" hanafuda["四月"] = "藤" hanafuda["五月"] = "菖蒲" {"一月" => "松","二月" => "梅","三月" => "桜","四月" => "藤", "五月" => "菖蒲"} B. a.0d2010 = 0x?? 2010 / 16= 125 あまり 10 125 / 16 = 7 あまり 13 7 / 16 = 0 あまり 7 余りを下から付けていくので 7 13 10 13と10を16進数になおすとd aになるので 0d2010 = 0x7da 0d2010 =0b?? 2010を2で割り、余りを出す 2010 / 2 = 1005 あまり 0 1005 / 2 = 502 あまり 1 502 / 2 = 251 あまり 0 251 / 2 = 125 あまり 1 125 / 2 = 62 あまり 1 62 / 2 = 31 あまり 0 31 / 2 = 15 あまり 1 15 / 2 = 7 あまり 1 7 / 2 = 3 あまり 1 3 / 2 = 1 あまり 1 1 / 2 = 0 あまり 1 あまりを下から付けて行くので 0d2010 = 0b11111011010 0b11111011010を16進数に変換する。 4桁ごとに区切り、10進数にする。 0111 = 2^3*0 + 2^2*1 + 2^1*1 + 2^0*1 = 4+2+1=7 1101 = 2^3*1 + 2^2*1 + 2^1*0 + 2^0*1 = 8+4+1=13 0d13=0xd 1010 = 2^3*1 + 2^2*0 + 2^1*1 + 2^0*0 = 8+2=10 0d10=0xa 上からつけていくと7da なので 0b1111011010=0x7da 2. A a.登録してある花札の月と描いてある植物を表示するプログラムhash_for.rb b.作成プログラム hash_for.rb #!/usr/koeki/bin/ruby $KCODE = 'e' # 機械の言語でなく日本語で hanafuda = Hash.new #Hashを使う。変数はhanafudaとする hanafuda["1"] = "松" #1月札に描かれているのは松 hanafuda["2"] = "梅" #2月は梅 hanafuda["3"] = "桜" #3月は桜 hanafuda["4"] = "藤" #4月は藤 hanafuda["5"] = "菖蒲" #5月は菖蒲 hanafuda["6"] = "牡丹" #6月は牡丹 hanafuda["7"] = "萩" #7月は萩 hanafuda["8"] = "薄" #8月は薄 hanafuda["9"] = "菊" #9月は菊 hanafuda["10"] = "紅葉" #10月は紅葉 hanafuda["11"] = "柳" #11月は柳 hanafuda["12"] = "桐" #12月は桐 for month,plant in hanafuda #hanafuda内のkeyをmonthに、valueをplantにする printf("%d月札に描かれた植物は%sです。\n",month,plant) #結果表示。上で設定した変数で表示させる。 end #終了 c.変更点 hash_data.rb を参考に作成。 ・Hashの変数をhanafudaとした。 ・forでkeyとvalueを変え、結果表示のときそれを表示させるようにした。 ・p での表示でなくprintfで表示させるようにした。 d.実行結果 roy{c108203}% ./hash_for.rb [~/Ruby] 花札で 11月札に書かれた植物は柳です。 花札で 6月札に書かれた植物は牡丹です。 花札で 12月札に書かれた植物は桐です。 花札で 7月札に書かれた植物は萩です。 花札で 8月札に書かれた植物は薄です。 花札で 9月札に書かれた植物は菊です。 花札で 1月札に書かれた植物は松です。 花札で 2月札に書かれた植物は梅です。 花札で 3月札に書かれた植物は桜です。 花札で 10月札に書かれた植物は紅葉です。 花札で 4月札に書かれた植物は藤です。 花札で 5月札に書かれた植物は菖蒲です。 e.考察 あらかじめ設定していたものが表示された。 表示はコンピュータが記録した順なので、登録した順番と違うが問題はない。 なので正常に動くと言える。 B a.あらかじめ登録しておいた「花札で何月札に何の植物が描かれているか」のデー タを表示させるプログラム hash_choice.rb b.作成プログラム hash_choice.rb #!/usr/koeki/bin/ruby $KCODE = 'e' #日本語を使う宣言 hanafuda = Hash.new #Hashを使う。変数はhanafudaとする hanafuda["1"] = "松" hanafuda["3"] = "桜" hanafuda["5"] = "菖蒲" hanafuda["7"] = "萩" hanafuda["9"] = "菊" hanafuda["11"] = "柳" #各月と描かれた植物。 #「登録されていない」というのも表したいため、偶数は登録していない。 STDERR.print("花札の何月の植物が知りたいですか?: ") # month = gets.chomp # 入力された文字の改行文字を切り取り、変数monthとして取り入れる。 if hanafuda.key?(month)== true # hanafuda に入力されたものがある場合 printf("%s月の札には%sが描かれています。\n", month,hanafuda[month]) # 結果表示 else # hanafuda に入力されたものが無い場合 print("登録されていません\n") # メッセージ表示 end # if文の終了 c.変更点 hash_pair.rbを参考に作成 ・変数をプログラム内容に合わせ変更。 ・p文でなくprintf文で結果表示させるようにした。 d.実行結果 roy{c108203}% ./hash_choice.rb [~/Ruby] 花札の何月の植物が知りたいですか?: 1 1月の札には松が描かれています。 roy{c108203}% ./hash_choice.rb [~/Ruby] 花札の何月の植物が知りたいですか?: 2 登録されていません roy{c108203}% ./hash_choice.rb [~/Ruby] 花札の何月の植物が知りたいですか?: 3 3月の札には桜が描かれています。 e.考察 roy{c108203}% ./hash_choice.rb [~/Ruby] 花札の何月の植物が知りたいですか?: 1 1月の札には松が描かれています。 roy{c108203}% ./hash_choice.rb [~/Ruby] 花札の何月の植物が知りたいですか?: 3 3月の札には桜が描かれています。 roy{c108203}% ./hash_choice.rb [~/Ruby] 花札の何月の植物が知りたいですか?: 5 5月の札には菖蒲が描かれています。 roy{c108203}% ./hash_choice.rb [~/Ruby] 花札の何月の植物が知りたいですか?: 7 7月の札には萩が描かれています。 roy{c108203}% ./hash_choice.rb [~/Ruby] 花札の何月の植物が知りたいですか?: 9 9月の札には菊が描かれています。 roy{c108203}% ./hash_choice.rb [~/Ruby] 花札の何月の植物が知りたいですか?: 11 11月の札には柳が描かれています。 1から11までの奇数を入力すると登録しておいたものが出た。 roy{c108203}% ./hash_choice.rb [~/Ruby] 花札の何月の植物が知りたいですか?: 2 登録されていません roy{c108203}% ./hash_choice.rb [~/Ruby] 花札の何月の植物が知りたいですか?: 19 登録されていません 1 3 5 7 9 11以外の数字が入力された場合、「登録されていません」とでた。 なのでこのプログラムは正常に動いているといえる。 C a.設定 知りたい花札の月と植物を検索し、ない場合月と植物を登録できるhash_register.rb b.作成プログラム hash_register.rb #!/usr/koeki/bin/ruby $KCODE = 'e' #日本語で hanafuda = Hash.new # hanafudaを変数にHashを使う hanafuda["1"] = "松" hanafuda["3"] = "桜" hanafuda["5"] = "菖蒲" hanafuda["7"] = "萩" hanafuda["9"] = "菊" hanafuda["11"] = "柳" #各月と描かれた植物。偶数は登録していない。 STDERR.print("何月の植物が知りたいですか?: ") #月を尋ねる。 month = gets.chomp #入力されたものから改行文字を取る。 if hanafuda.key?(month)== true # hanafuda に入力されたものがある場合 printf("%s月の札には%sが描かれています。\n", month,hanafuda[month]) #入力された月と同じ数字の、hanafudaに登録したものを表示。 else # 入力されたものがない場合 printf("%s月の花は登録されていません\n",month) print("登録したい月とその植物を入力してください(Ctrl-D で終了)\n") while true #ある一定のものが入力されるまで続ける printf("何月か入力してください(Ctrl-D で終了): \n") tsuki = gets #入力されたものをtsukiとして取り込む。 if tsuki == nil #Ctrl-dが入力されたら break #終了する else #それ以外の場合 tsuki = tsuki.chomp #tsukiとして入力されたものの改行文字を取る end # if tsuki〜 文 終了 printf("その月の花を入力: \n") #植物を入力してもらう hanafuda[tsuki] = gets.chomp #改行文字を取る end #while true 終了 STDERR.print("入力終了 \n") for list in hanafuda.keys #hanafuda の 中のものをリストにする printf("%d月 \t %s \n", list, hanafuda[list])#リストを全て表示 end #for終了 end #終了 c. hash_pair.rbをもとに作成 変更点 ・変数名を今回のプログラムの内容に合わせた ・登録項目で、二つ目は数字でなく文字をいれるので gets.to_iからgets.chompにした d.実行結果 pan{c108203}% ./hash_register.rb [~/Ruby] 何月の植物が知りたいですか?: 1 1月の札には松が描かれています。 e.考察 登録されているものの場合 pan{c108203}% ./hash_register.rb [~/Ruby] 何月の植物が知りたいですか?: 1 1月の札には松が描かれています。 知りたいものが表示された。 登録されていないものの場合 pan{c108203}% ./hash_register.rb [~/Ruby] 何月の植物が知りたいですか?: 2 2月の花は登録されていません 登録したい月とその植物を入力してください(Ctrl-D で終了) 何月か入力してください(Ctrl-D で終了): 2 その月の花を入力: 梅 何月か入力してください(Ctrl-D で終了): 入力終了 11月 柳 7月 萩 9月 菊 1月 松 2月 梅 3月 桜 5月 菖蒲 登録されたものを変更した場合 わざと始めに偶数月を入れ、聞かれたら奇数月を答える。 pan{c108203}% ./hash_register.rb [~/Ruby] 何月の植物が知りたいですか?: 2 2月の花は登録されていません 登録したい月とその植物を入力してください(Ctrl-D で終了) 何月か入力してください(Ctrl-D で終了): 5 その月の花を入力: あやめ 何月か入力してください(Ctrl-D で終了): 入力終了 11月 柳 7月 萩 9月 菊 1月 松 3月 桜 5月 あやめ なのでこのプログラムは正確に動いているといえる。 D. a.設定 アニメキャラクターの年齢データhash_data.datを読みこみ、使用者の知りたい データを表示するプログラムhash_read.rb b.作成プログラム #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語を使用すると宣言する。 chara = Hash.new # Hash 配列を charaとする open("hash_data.dat","r") do |age| #hash_data.dat を開きデータを読み込みデータをageとして取り入れる while hash_data = age.gets if /(\S+)\s+(\S+)/ =~ hash_data # 文字列 空白 文字列 のとき chara[$1] = $2 end # if文のend end # while文のend end # open文のend STDERR.print("キャラクターの名前を入れて下さい : ") name = gets.chomp if chara.key?(name) == false print("そのようなキャラクターは登録されていません\n") # key(name) に該当データがなかった場合この文が表示される。 else printf("%s は %s です\n",name,chara[name]) end # if文のend ########################### hash.data.dat #キャラ名 #年齢 野原しんのすけ 5歳 田畑小穂 5歳 芦屋アシベ 7歳 さくらももこ 9歳 木之本桜 9歳 野比のび太 11歳 フグ田サザエ 24歳 マリオ 26歳 c.変更点 std.egrexpを参考に作成。 ・始めにHashを使う宣言をした ・(\S+)と\s+の数を変更 ・変数名を変更 ・入力されたものがない場合メッセージを表示 d.実行結果 pan{c108203}% ./hash_read.rb [~/Ruby] キャラクターの名前を入れて下さい : マリオ マリオ は 26歳 です pan{c108203}% ./hash_read.rb [~/Ruby] キャラクターの名前を入れて下さい : ルイージ そのようなキャラクターは登録されていません e.考察 登録したものを入力。その年齢が出てくるか確認。 pan{c108203}% ./hash_read.rb [~/Ruby] キャラクターの名前を入れて下さい : フグ田サザエ フグ田サザエ は 24歳 です pan{c108203}% ./hash_read.rb [~/Ruby] キャラクターの名前を入れて下さい : さくらももこ さくらももこ は 9歳 です pan{c108203}% ./hash_read.rb [~/Ruby] キャラクターの名前を入れて下さい : 木之本桜 木之本桜 は 9歳 です 登録したキャラクターの年齢が出てきた 登録していないものをいれる pan{c108203}% ./hash_read.rb [~/Ruby] キャラクターの名前を入れて下さい : サザエ そのようなキャラクターは登録されていません 設定したメッセージが出てきた。 なのでこのプログラムは正常に動くといえる。 3. 今回の課題プログラム作成で使ったkeyやvalueは、実用性のないものを設定して しまった。このシステムは色々な役立つ使い方があるはずなのでそれをよく考え たい。 実際に使われているものとして、携帯電話のアドレス帳があると考えた。 名前をkeyとして、valueにアドレス、番号等があるのではないかと思う。 また、漢字変換の単語登録もその一つだと考えた。 使用者が登録した読みをkeyに、valueの漢字を出すように見えるためである。 4. 参考文献 基礎プログラミング II 第2回 なになにといえばこれこれ 「入力したデータを取り出そう」 http://roy/~madoka/2010/r2/02/02_03_theme_02_hash_input.html 「対にないものが呼び出されたとき」 http://roy/~madoka/2010/r2/02/02_05_theme_04_initialize.html 「Hash の対を入力するには」 hash_pair.rb http://roy/~madoka/2010/r2/prog/hash_pair.rb 基礎プログラミング I 第7回 正規表現と Ruby 言語でのプログラミング 「データを読み込むようにするには」 http://roy/~madoka/2010/r1/07/07_09_theme_08_fileread.html 作成者:西村まどか先生 協力者 妹(問1のB)