第2回 基礎プログラミング II レポート課題 氏名: xxxxxxxx 学籍番号:c109xxx 語学クラス:中国語1 コース(系):環境サイエンス 1、筆記問題=================================================================== A、食べ物の名前を hash 配列 foodとしました。 Food の key と value はそれぞれの国名と、その国名から発想される食べ物に しました。 1:key「日本」に対して value は「お寿司」 2:key「イタリア」に対して value は「ピザ」 3:key「インド」に対して value は「カレー」 4:key「メキシコ」に対して value は「トルティーヤ」 5:key「イギリス」に対して value は「サンドイッチ」 これに対するHashの表し方はこのようになります。 food[“日本”] = “お寿司” food[“イタリア”] = “ピザ” food[“インド”] = “カレー” food[“メキシコ”] = “トルティーヤ” food[“イギリス”] = “サンドイッチ” 2つめの表し方はこのようになります。 {“日本”=>”お寿司”,”イタリア”=>”ピザ”,”インド”=>”カレー”,”メキシコ”=>”トルティーヤ”, ”イギリス”=>”サンドイッチ”} B、~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 0d は10進数、0x は16進数、0b は2進数を示す。 a、0d 2010 = 0x ?? まず、10進数を16進数になおすには、16で割り、出た答えを下から読み上げる。 2010 / 16 = 125 …余り 10 125 / 16 = 7 …余り 13 7 / 16 = 0 …余り 7 下から読み上げると、 7 13 10 となる。 これらを16進数表を参考に変換すると、 7 = 7 13 = d 10 = a となる。 よって、0d 2010 = 0x 7da となる。 b、0d 2010 = 0b ?? 10進数を2進数になおすには、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 下から読み上げると、11111011010 となる。 よって、0d 2010 = 0b 11111011010 となる。 確かめ算を行なうには、上記で出た2進数の数字を下から4桁ずつ区切り、10進数 に変換していく。 0111 = 0*2の3乗 + 1*2の2乗 + 1*2の1乗 + 1*2の0乗 = 0 + 4 + 2 + 1 = 7 1101 = 1*2の3乗 + 1*2の2乗 + 0*2の1乗 + 1*2の0乗 = 8 + 4 + 0 + 1 = 13 1010 = 1*2の3乗 + 0*2の2乗 + 1*2の1乗 + 0*2の0乗 = 8 + 0 + 2 + 0 = 10 これらを10進数表を参考に変換すると、 7 = 7 13 = d 10 = a よって、7daとなる。 結果、1問目と同じ答えになる。 2、プログラム問題============================================================= A、 a、考えた設定 事前に登録してある対のデータを表示させるプログラム。 b、作成したプログラム(hash_for.rb) #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コードEUCで入力する。 food = Hash.new # Hash 配列を food とする。 food["日本"] = "お寿司" food["イタリア"] = "ピザ" food["インド"] = "カレー" food["メキシコ"] = "トルティーヤ" food["イギリス"] = "サンドイッチ" for kuni in food.keys # for キー名、値 in hash配列名.keys printf("%s から発想される食べ物は %s です。\n",kuni, food[kuni]) # 行なう操作 end # for 終わり c、もとにしたプログラム プログラム hash_shop.rbを参考にしました。p文の部分を、printf…end で表示させ ました。 d、実行結果 pan{c109067}% ./hash_for.rb [~/Ruby] イギリス から発想される食べ物は サンドイッチ です。 インド から発想される食べ物は カレー です。 イタリア から発想される食べ物は ピザ です。 日本 から発想される食べ物は お寿司 です。 メキシコ から発想される食べ物は トルティーヤ です。 e、考察 事前に登録してある対のデータが、printf文の通りに表示されたので、このプロ グラムは正しいといえる。 初めはプログラムが起動せず、疑問に思っていたが、「""」が全角になっていた のが原因であるということが分かったため、半角に直し、プログラムを完成させ ることができた。 f、参考文献 最後に記載 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ B、 a、考えた設定 ユーザーが知りたい情報を選択し、そのデータを表示させるプログラム。 b、作成したプログラム(hash_choice.rb) #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コードEUCで入力する。 food = Hash.new # Hash 配列を food とする。 food["日本"] = "お寿司" food["イタリア"] = "ピザ" food["インド"] = "カレー" food["メキシコ"] = "トルティーヤ" food["イギリス"] = "サンドイッチ" print("国名を入力を入力してください。その国から発想される食べ物が表示されます。\n") print("\n") print("日本、イタリア、インド、メキシコ、イギリスの中から選んでください。\n") STDERR.print("国名を打ち込んでください。: ") # STDERR.print文 kuni = gets.chomp # kuni を読み込ませる if food.key?(kuni) == true # 文字列 key があるかを調べ、なければ false という値を返す printf("\n %s から発想される食べ物は %s です。\n",kuni, food[kuni]) else # そうでなければ print("\n データに無いです\n") end # else 終わり c、もとにしたプログラム A 問題で作成したプログラムと、「入力したデータを取り出そう」のプログラムを参考に しました。 if food.key?(kuni) == true 、else…end を付け足しました。 d、実行結果 pan{c109067}% ./hash_choice.rb [~/Ruby] 国名を入力を入力してください。その国から発想される食べ物が表示されます。 日本、イタリア、インド、メキシコ、イギリスの中から選んでください。 国名を打ち込んでください。: 日本 日本 から発想される食べ物は お寿司 です。 pan{c109067}% ./hash_choice.rb [~/Ruby] 国名を入力を入力してください。その国から発想される食べ物が表示されます。 日本、イタリア、インド、メキシコ、イギリスの中から選んでください。 国名を打ち込んでください。: インド インド から発想される食べ物は カレー です。 pan{c109067}% ./hash_choice.rb [~/Ruby] 国名を入力を入力してください。その国から発想される食べ物が表示されます。 日本、イタリア、インド、メキシコ、イギリスの中から選んでください。 国名を打ち込んでください。: イタリア イタリア から発想される食べ物は ピザ です。 pan{c109067}% ./hash_choice.rb [~/Ruby] 国名を入力を入力してください。その国から発想される食べ物が表示されます。 日本、イタリア、インド、メキシコ、イギリスの中から選んでください。 国名を打ち込んでください。: メキシコ メキシコ から発想される食べ物は トルティーヤ です。 pan{c109067}% ./hash_choice.rb [~/Ruby] 国名を入力を入力してください。その国から発想される食べ物が表示されます。 日本、イタリア、インド、メキシコ、イギリスの中から選んでください。 国名を打ち込んでください。: スイス データに無いです e、考察 作成したプログラム通りに表示され、きちんと国名を打ち込むと食べ物の名前が 表示された。また、作成したデータ以外の国名を打ち込んだところ、データに無 い、と表示されたのでこのプログラムは正しいといえる。 f、参考文献 最後に記載 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ D、 a、考えた設定 データを読み込み、プログラムを実行すると、データの一覧を表示させるプログ ラム。 b、作成したデータ(hash_read.rb)・プログラム(hash_data.dat) <データ> 日本 お寿司 イタリア ピザ インド カレー メキシコ トルティーヤ イギリス サンドイッチ <プログラム> #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コードEUCで入力する。 food = Array.new kuni = Hash.new # Hash 配列を kuni とする。 print("\n") # 空行 print("その国から発想される食べ物を表示させます。\n") # print文 print("\n") open("hash_data.dat","r") do |tabe| # hash_data.datを読みこみ、tabeという名前に置き換える。 while mono = tabe.gets # 繰り返し、tabe の中身が無くなったら終わる。 if/(\S+)\s+(\S+)/=~mono f = $1 # 1番目の S に f を読みこむ。 k = $2 # 2番目の S に k を読みこむ。 printf("%sから発想される食べ物は %sです。\n",f ,k) end # if 終わり end # while 終わり end # open 終わり c、もとにしたプログラム 前期に作成したプログラム ringo.rb を参考にしました。 主に open ファイルの部分をもとにして作成しました。 また、Hash 配列を使用しました。 d、実行結果 pan{c109067}% ./hash_read.rb [~/Ruby] その国から発想される食べ物を表示させます。 日本から発想される食べ物は お寿司です。 イタリアから発想される食べ物は ピザです。 インドから発想される食べ物は カレーです。 メキシコから発想される食べ物は トルティーヤです。 イギリスから発想される食べ物は サンドイッチです。 e、考察 A問題のプログラム実行結果と同じく表示されたので、このプログラムは正しい といえる。 このプログラムでは openファイルに読みこませるため、データを作成したが、 #国名 #食べ物 日本 お寿司 イタリア ピザ インド カレー メキシコ トルティーヤ イギリス サンドイッチ 上記のように「#」を付け、項目名を付けていたところ、プログラムを実行すると、 pan{c109067}% ./hash_read.rb [~/Ruby] その国から発想される食べ物を表示させます。 #国名から発想される食べ物は #食べ物です。 日本から発想される食べ物は お寿司です。 イタリアから発想される食べ物は ピザです。 インドから発想される食べ物は カレーです。 メキシコから発想される食べ物は トルティーヤです。 イギリスから発想される食べ物は サンドイッチです。 というように、項目名までを読みこんでしまっていることが分かった。なので、 項目名を消し、再度プログラムを実行したところ、今度はきちんとデータが表示 された。 f、参考文献 最後に記載 3、感想・学んだこと =========================================================== 実際にこの仕組みが使用されていのは、お店のレジ、ゲームのプログラム、電車 などのチケットで何処のルートに行けるか、などが挙げられると思います。 <感想> 授業ではプログラムを作ることで精一杯だったので、今回の課題がこなせるかど うかとても不安でした。しかし、何度も作業しているうちに、なんとなくですが プログラムで使用されているものの意味が少し分かるようになりました。 プログラム作成中では、"前角"を使用していてプログラムが実行しなかったりと、 ミスが多かったと思います。しかし、逆に新たな発見もできたので、その点は良 かったのではないかと感じました。 今後はこのようなミスが減るよう心掛けていきたいです。そして、もっとプログ ラムの意味が理解できるように、復習してまた頑張っていきたいです。 <学んだこと> ・プログラムで Ctrl-s … printfを探し出す。Ctrl-sで移動していく。 ・プログラムで M- > … プログラムの一番上に移動する。 ・プログラムで M- < … プログラムの一番下に移動する。 ・M- > をしたあとに、Ctrl-r 、gets … getsを探す。そして Ctrl-rで 下から上にむかってgetsを探す。 ・hash配列.key?("文字列") … key に "文字列" が存在するか調べる。 ・hash配列.values?("文字列") … value に "文字列" が存在するか調べる。 存在したら true 、しなければ false を返す。 ・hash名 = Hash(初期値)…存在しないkeyが呼び出されたときに初期値を代入する。 ・配列.each{ … 第0要素から順番に取り出して変数に代入する。 |配列の要素をしまう| …配列の要素を使用 } 4、参考文献 ================================================================== 西村 まどか 基礎プログラミング II 第2回 なになにといえばこれこれ http://roy/~madoka/2010/r2/02/ 「入力したデータを取り出そう」 http://roy/~madoka/2010/r2/02/02_03_theme_02_hash_input.html 神田 直弥 基礎プログラミングI$(C!$情報検索 http://roy/~naoya/ruby/index.html [1] 2進数と16進数 2進数の構造 http://roy/~naoya/ruby/9.html 共同学習者 久保田 瑛一郎 青木 千紗 横山 広樹