第3回 基礎プログラミングII 演習問題 氏名:久保田 瑛一郎 学籍番号:c109058 語学クラス:英語1 コース:社会福祉 解いた順に示す 1 a考えた設定 事故を起こす過程には様々な要素がからみあうが、ただ事実だけを表示するプロ グラムhash_exist.rbを作成した b元にしたプログラム hash_strawhich.rbを参考とした。内容と変数を変更した c 作成したプログラム #!/usr/koeki/bin/ruby #インタプリタであることを宣言する trouble =Hash.new #troubleはハッシュ(登録=◯◯といったらこれこれ)である $KCODE="e" #文字コードをEUCに指定する trouble={"自動車を運転していた"=>"アクセルを踏んだ", "アクセルを踏んだ"=>"スピードが出た", "スピードが出た"=>"坂にさしかかった", "坂にさしかかった"=>"ブレーキを踏むのを忘れた", "ブレーキを踏むのを忘れた"=>"止まれなくなった", "止まれなくなった"=>"林にぶつかった", "林にぶつかった"=>"救急車が来た", "救急車が来た"=>"病院に着いた", "救急車が来た"=>"入院した" } #以上登録内容(◯◯がおこったらこれこれ)である for genin in trouble.keys #geninという変数名にしてtroubleのキーを全部コピーする=表示する(=内部変数名の指定) if trouble.value?(genin)==false #もしtroubleすべてのバリューの中にgeninと同じバリューがなかったら printf("%s。そして",genin) #結果表示 end #forのおわり end #ifのおわり for kekka in trouble.values #kekkaという変数名にしてtroubleのバリューを全部コピーする=表示する(=内部変数名の指定) if trouble.key?(kekka)==false #もしtroubleすべてのバリューの中にgeninと同じキーがなかったら printf("%s\n",kekka) #結果表示 end #forのおわり end #ifのおわり d実行結果 pan{c109058}% ./hash_exist.rb [~/Ruby] 自動車を運転していた。そして入院した e考察 正しく結論のみ表示されているのでこのプログラムの正確性が示される 2 a考えた設定 ロールプレイングゲームのバトルを考えたhash_while.rbを作成した b元としたプログラム hash_mouse.rbを参考として、変数名を変えた c作成したプログラム #!/usr/koeki/bin/ruby #インタプリタであることを宣言する $KCODE="e" #文字コードをEUCに指定 tatakai={"1ターン目"=>["魔法","ホールミスト"], "2ターン目"=>["剣技","ホールブレイク"], "3ターン目"=>["必殺技","ルビ緒フラッシュ"] } #以上ハッシュ登録内容 (●ターン目は●という技をする) kaisuu="1ターン目" while true if kaisuu=="ルビ緒フラッシュ" break end print("敵はダメージを受けている!!\n") printf("%s:「ルビ緒は%s、%sを使った!!」\n",kaisuu,tatakai[kaisuu][0],tatakai[kaisuu][1]) kaisuu=tatakai[kaisuu][0] end printf("ルビ緒は%sで敵を倒した!!\n",kaisuu) d 実行結果 pan{c109058}% ./hash_while.rb [~/Ruby] 敵はダメージを受けている!! 1ターン目:「ルビ緒は魔法、ホールミストを使った!!」 敵はダメージを受けている!! ./hash_while.rb:24: undefined method `[]' for nil:NilClass (NoMethodError) e考察 以上のようにうまく作動しなかった。1ターン目から2ターン目に行く原理が理解 できなかったため出来なかったと考える。 3 a考えた設定 日本の第1種空港(規模の一番大きい空港)の3レターコードを全て表示するプログ ラムhash_each.rb を作成した b元としたプログラム 特にないが、プログラムのネタは前期で作成したものを参考としている c作成したプログラム #!/usr/koeki/bin/ruby #インタプリタであることを宣言する airport=Hash.new #airportはハッシュである airport["成田国際空港"]="NRT" airport["中部国際空港"]="NGO" airport["関西国際空港"]="KIX" airport["東京国際空港"]="HND" airport["大坂国際空港"]="ITM" #ハッシュの登録内容(◯◯空港と言えば◯◯(3レターコード) airport.keys.each{|kuukou| #airportのキーをコピーしその名前をkuukouとする(for文とおなじ役割) 内部変数指定 printf("%sの3レターコードは%sです\n",kuukou,airport[kuukou]) #結果表示 } #eachの終了(endが } となる) d実行結果 pan{c109058}% ./hash_each.rb [~/Ruby] 東京国際空港の3レターコードはHNDです 関西国際空港の3レターコードはKIXです 大坂国際空港の3レターコードはITMです 成田国際空港の3レターコードはNRTです 中部国際空港の3レターコードはNGOです e考察 正しく表示されているのでこのプログラムの正確性が証明された 4 a考えた設定 新人刑事の犯人の聞き込み調査をするプログラムhash_detective.rbを作成した b元としたプログラム hash_chatterbot.rbを参考として聞き方を変更した c 作成したプログラム #!/usr/koeki/bin/ruby #インタプリタであることを宣言する $KCODE="e" #文字コードをEUCに指定する 文字化け帽子 sousa=Hash.new #sousaはハッシュである print("私は新人です。手際の悪さは許して下さいね\n") #おまけの表示 STDERR.print("犯人の特徴を教えて下さい:") #犯人の特徴を聞く tokutyou=gets.chomp #それをtokutyouに入れ、改行文字を取り除く if /^(\S+)(は|が|と|を|の|に乗った|を被った)(\S+)(ね*|よ||だ)/=~ tokutyou #もし入力されたものが単語→(特定の単語|叉は特定の接続詞)→単語→(特定の単語|叉は特定の接続詞)だったら key_one=$1 #key_oneとは取って来た単語の1個目の単語である key_two=$3 #key_twoとは取って来た単語の1個目の単語である end #ifのおわり while true #条件なしに(永遠に)繰り返し STDERR.printf("%sとはどういうことですか?\n",key_one) #さらにくわしい情報を聞く tokutyou=gets.chomp! #tokutyouにその情報を取り込み、改行文字を取る if /(\S+)(だ|が|の|で|を|も|こと|の|です)/=~tokutyou #もし入力されたものが単語→(特定の単語|叉は特定の接続詞)だったら sousa[$1]=key_one #sousa配列に今の1個目の要素を入れ,それをkeyにコピーする sousa.each{|kikitori| #sousaのハッシュ(登録内容)を全部、内部変数kikitoriにコピーする if key_one==kikitori[1] #もしkey_oneがkikitoriの1個目の要素と同じだったら if sousa[key_one]==nil #もしkey_oneに入力されたものと一致しなかったら(からだったら) break #while trueからぬける else printf("「%s」は「%s」ということですね\n\n\n",sousa[key_one],kikitori[1]) #結果表示 end #ifのおわり end #ifのおわり } #eachのおわり key_one=key_two #key_oneの内容をkey_twoにコピーする key_two=$1 end #ifのおわり end #whileのおわり d実行結果 pan{c109058}% ./hash_detective.rb [~/Ruby] 私は新人です。手際の悪さは許して下さいね 犯人の特徴を教えて下さい:黒い車に乗った男です 黒い車とはどういうことですか? ホンダの車です 男ですとはどういうことですか? 30代くらいの男です ホンダの車とはどういうことですか? ステップワゴンです 「黒い車」は「ホンダの車」ということですね 30代くらいの男とはどういうことですか? 髭が生えた男です 「男です」は「30代くらいの男」ということですね ステップワゴンとはどういうことですか? スパーダです 「ホンダの車」は「ステップワゴン」ということですね 髭が生えた男とはどういうことですか? もじゃもじゃの髭です 「30代くらいの男」は「髭が生えた男」ということですね スパーダとはどういうことですか? 車の一種です 「ステップワゴン」は「スパーダ」ということですね もじゃもじゃの髭とはどういうことですか? 汚い髭です 「髭が生えた男」は「もじゃもじゃの髭」ということですね 車の一種とはどういうことですか? スパーダです 「スパーダ」は「車の一種」ということですね 汚い髭とはどういうことですか? ホームレスのようです 「もじゃもじゃの髭」は「汚い髭」ということですね スパーダとはどういうことですか? 犯人の乗ったいた車です 「車の一種」は「スパーダ」ということですね 「車の一種」は「スパーダ」ということですね ホームレスのようとはどういうことですか? 汚い服装です 「汚い髭」は「ホームレスのよう」ということですね 犯人の乗ったいた車とはどういうことですか? ワゴン車です 「スパーダ」は「犯人の乗ったいた車」ということですね 汚い服装とはどういうことですか? 公園で暮らしていそうな服装です 「ホームレスのよう」は「汚い服装」ということですね ワゴン車とはどういうことですか? ステップワゴンです 「犯人の乗ったいた車」は「ワゴン車」ということですね 公園で暮らしていそうな服装とはどういうことですか? e 考察 正しく表示されているゆえにプログラムは正しい ● 三段論法 作成したプログラム #!/usr/koeki/bin/ruby $KCODE="e" sandan=Hash.new zentei="家電製品" zentei_naiyou="いつか使えなくなる" sandan[zentei]=zentei_naiyou zentei_2 ="パソコン" zentei_naiyou2=zentei sandan[zentei_2]=zentei_naiyou2 zentei="家電製品" if sandan.value?(zentei)== true printf("%sは%s\n",zentei,sandan[zentei]) printf("%sは%s\n",zentei_2,sandan[zentei_2]) printf("ゆえに%sは%s\n",zentei_2,sandan[zentei]) end 元としたプログラム hash_socrates.rb を参考にして作成した 実行結果 pan{c109058}% ./hash_exe3.rb [~/Ruby] 家電製品はいつか使えなくなる パソコンは家電製品 ゆえにパソコンはいつか使えなくなる 考察 プログラムが正しく表示されている、ゆえに正しい 参考文献 http://www.h3.dion.ne.jp/~t_yamaz/aviation/avtn013.htm 日本の航空一覧 ruby life eachメソット http://www.rubylife.jp/ini/for/index5.html 2010講義ノート 西村まどか 基礎プログラミングII第3回 人工無能 http://roy.e.koeki-u.ac.jp/~madoka/2010/r2/03/03_10_theme_05_chatterbot.html