第2回 基礎プログラミング II レポート課題 氏名: xxxxxxxx 学籍番号: C109xxx 語学クラス: 英語3 コース(系): 政策マネジメント 1-A ネズミの仲間についての特徴を、配列 mouse とした。 mouse の key と value はそれぞれ動物名と、その動物の特徴とした。 1:key「ハムスター」に対して、value「夜光性」 2:key「ハツカネズミ」に対して 「短命」 3:key「ハリネズミ」に対して 「トゲトゲ」 4:key「カピバラ」に対して 「大型」 5:key「ピカチュウ」に対して 「放電」 これに対応する Hash の表し方は2種類ある。1つはまとめて指定する方法、 mouse = { "ハムスター" => "夜光性", "ハツカネズミ" => "短命", "ハリネズミ" => "トゲトゲ", "カピバラ" => "大型", "ピカチュウ" => "放電" } 2つ目はひとつひとつ指定する方法、 mouse["ハムスター"] = "夜光性" mouse["ハツカネズミ"] = "短命" mouse["ハリネズミ"] = "トゲトゲ" mouse["カピバラ"] = "大型" mouse["ピカチュウ"] = "放電" である。 1-B a 10進数を16進数に変換するには、変換したい10進数を商が0になるまで 16で割っていき、生じた余りを最後の方から並べて16進数に当てはめる方法がある。 2010 / 16 = 125 余り 10 125 / 16 = 7 13 7 / 16 = 0 7 これを最後の方から並べると 7, 13, 10 16進法では7,d,a である。よって 0d2010 = 0x7da である。 b 10進数を2進数へ変換するには、aの10進数から16進数への変換と同じ要領で、 10進数を商が0になるまで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 よって 0d2010 = 0b11111011010 である。 さらにこの2進数を16進数へ変換する。 2進数を4桁ずつに区切り、2進数と16進数の対応表に当てはめる。 11111011010 は、0111, 1101, 1010 に区切られる。 0111 = 7 1101 = d 1010 = a よって、0b11111011010 = 0x7da すなわち、0d2010 = 0b11111011010 = 0x7da である。 参考文献 10進数から16進数へ変換する | 基数変換 | 基本情報技術者講座 http://www.it-license.com/cardinal_number/DecimalToHexa.html 基本情報技術者講座 著者: 不明 『生活と情報(2009)』講義レジュメ 「第2回 情報のデジタル化[1] 2進数」 著者: 神田直弥 p4 「2進数によるデータ表現」、「10進数から2進数へ」、 「2進数←→16進数の相互変換」 B Cを選択した。 しかし、入力された文字が Hash にない場合に、「登録されていません」と Hashの初期値が表示されるはずが、表示されない問題があるので未完成である。 AとBのプログラムは完成したのでCのプログラムともに添付した。 a、 授業で作成した hash_data.rb と、hash_pair.rb を組み合わせ、 ネズミの仲間の特徴を検索し、入力文字列がプログラム中の Hashにない 場合には、一時的に登録して出力することができるプログラム hash_register.rb を作成した。 また、hash_register.rb の基になっているのは、先に作成した A問題の hash_for.rb と、B問題のhash_choice.rb なのだが、 A問題の hash_for.rb は講義ノート 基礎プログラミング II 第2回 なになにといえばこれこれ 「Hash の対を表示するには」 http://roy/~madoka/2010/r2/02/02_07_theme_06_forprint.html に記載されているプログラムを参考に、 B問題の hash_choice.rb は授業で作成した hash_choice.rb を参考に作成した。 b #!/usr/koeki/bin/ruby $KCODE = 'e' #日本語コードを使うことを命令 mouse = Hash.new("登録されていません。\n") # mouse の初期値を指定 mouse = { "ハムスター" => "夜光性", "ハツカネズミ" => "短命", "ハリネズミ" => "トゲトゲ", "カピバラ" => "大型", "ピカチュウ" => "放電" } # Hash の中身 STDERR.print("ネズミの仲間の特徴を見ることができます。\nねずみの仲間の名前を入力してください(Ctrl-D で終了)。\n") # 入力を促す文 while true # 条件(Ctrl-D)が満たされるまで実行しつづける。 name = gets #入力された文字列を name にしまう。ここでchompするとエラー if name == nil # Ctrl-D が入力されたら break # while true から抜ける(終了) else name = name.chomp # 改行文字は切り捨てる。 end # 上の if のend if mouse.key?(name) == false # 入力されたのがCtrl-Dでなく、name にしまわれている文字列でもなかった場合 printf("%s は %s\n", name, mouse[name]) # 入力された文字列と初期値(登録されてない)を代入 print("登録するので、特徴を入力してください。\n") new = gets.chomp # 入力された特徴を新しい変数 new にしまう printf("%s の特徴は \t%s です。\n",name, new) #代入して表示 print("以上のように登録しました。\n") else # 入力された文字が上2つの条件に当てはまらない、 # すなわち表にある動物だった場合 printf("\n%s の特徴は \t%s です。\n", name, mouse[name]) #表の通りに出力 end # while true のend end # if のend c 基にした hash_data.rb と、hash_pair.rb と大きく違うのは、 key?メソッドの途中に new = gets.chomp で入力文字列を新しい変数に しまうように付け加えた点である。 hash_pair.rb は、プログラム中に Hash を書かずに、 完全に入力されたものだけ Hash にしまって出力するプログラムなのに対し、 hash_data.rb にはプログラム中に Hash が何組か書かれていて、 それぞれ変数も指定されていた。 2つのプログラムを組み合わせると変数がkey?メソッドの途中で 矛盾してしまうために、新しい変数を用意し、整理立てる必要があると思い 付け加えた。その他の変更点は変数名とprint文などの細々とした部分である。 d pan{c109046}% ./hash_register.rb [~/Ruby] ネズミの仲間の特徴を見ることができます。 ねずみの仲間の名前を入力してください(Ctrl-D で終了)。 ミッキーマウス ミッキーマウス は 登録するので、特徴を入力してください。 声が高い ミッキーマウス の特徴は 声が高い です。 以上のように登録しました。 # プログラム中に書いていなかったHashが出力された。 しかし「登録されていない」という初期値が表示されない。 pan{c109046}% ./hash_register.rb [~/Ruby] ネズミの仲間の特徴を見ることができます。 ねずみの仲間の名前を入力してください(Ctrl-D で終了)。 ピカチュウ ピカチュウ の特徴は 放電 です。 ハムスター ハムスター の特徴は 夜光性 です。 ハツカネズミ ハツカネズミ の特徴は 短命 です。 ハリネズミ ハリネズミ の特徴は トゲトゲ です。 カピバラ カピバラ の特徴は 大型 です。 pan{c109046}% # プログラムに書いた5つのHashはすべて出力された。 e Hashの初期値が出力されない問題だが、 mouse = { "ハムスター" => "夜光性" } の直後に配置すると出力された。 だが、ハムスターなどのプログラムに書かれているHashも 「登録されていません」の初期値が出てしまう問題があったので断念した。 また、癖で最初に while true name = gets.chomp としたのだが、ctrl-dで終了しようとするとエラーが出てしまった。 ctrl-d と入力する際にはエンターを押さないために エラーが出たということに気がついた。 これから、プログラム中でキーバインド入力を求める場合には 気をつけようと 思った。 3 Windows Media player などのメディアプレーヤーで、 曲名、アーティスト名、アルバム名、ジャンル名、発表年などが、一曲ずつに 登録されているのは Hash でひとくくりにしているのではないかと思う。 また、新たにCDを取り込むとと曲情報が追加されるが、 一曲だけ取り込んでも各項目がきちんと登録されていて独立性がある点が 配列のようにそれぞれが無関係で、while文の中で+1などして、 順番で整理するのではなく、1セットで記憶されていると感じる。 今回は新しく学んだ概念、Hash だが、まだわからない点もたくさんあるので、 プログラムを作成するなど、どんどん実践で理解を深めていきたい。 参考文献 基礎プログラミング II 第2回 なになにといえばこれこれ 「あるかないか」 http://roy/~madoka/2010/r2/02/02_04_theme_03_existornot.html 基礎プログラミング II 第2回 なになにといえばこれこれ 「対にないものが呼び出されたとき」 http://roy/~madoka/2010/r2/02/02_05_theme_04_initialize.html 基礎プログラミング II 第2回 なになにといえばこれこれ 「Hash の対を表示するには」 http://roy/~madoka/2010/r2/02/02_07_theme_06_forprint.html 以上すべて著者は西村まどか 共同学習者: 笹原千珠子