第2回 基礎プログラミング II レポート課題 氏名: xxxxxxxx 学籍番号:c109xxx 語学クラス:中国語 コース(系):政策マネ 1. A. 海外で活躍するサッカー選手を hash 配列 の sensyu とした。 sensyu の key と value は選手の名前とその所属チームにした。 1:key「川島永嗣」に対してvalueは 「リールセ」 2:key「長友佑都」 に対してvalueは 「チェゼーナ」 3:key「松井大輔」 に対してvalueは 「グルノーブル」 4:key「本田圭祐」に対してvalueは 「CSKAモスクワ」 5:key「森本貴幸」に対してvalueは 「カターニャ」 sensyu["川島永嗣"]="リールセ" sensyu["長友佑都"]="チェゼーナ" sensyu["松井大輔"]="グルノーブル" sensyu["本田圭祐"]="CSKAモスクワ" sensyu["森本貴幸"]="カターニャ" {"川島永嗣"=>"リールセ","長友佑都"=>"チェゼーナ","松井大輔"=>"グルノーブ ル","本田圭祐"=>"CSKAモスクワ","森本貴幸"=>"カターニャ"} B a. 0d 2010 = 0x ?? 0dは10進数で0xは16進数です。10進数を16進数にするには、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 = 0x7da となる。 b.0d 2010 = 0b ?? 0dは10進数、0bは2進数である。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 となります。0x2010 = 0b11111011010 0b11111011010を16進数に変換する。2進数を16進数にするには 2進数を下から4桁ずつに区切って、その数字ごとに10進数に変換する。 0111/1101/1010 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 以上の計算から0x7daとなる。これは1問目と同じ答えになることから正しいと言 える。 2. A. ◯考えた設定 あらかじめプログラムに登録してある対のデータを全て表示するhash_for.rb 。 ・作成したプログラム本体「 hash_for.rb 」 #!/usr/koeki/bin/ruby $KCODE = 'e' sensyu = Hash.new # Hash 配列を sensyu とする sensyu["川島永嗣"] = "リールセ" sensyu["長友佑都"] = "チェゼーナ" sensyu["松井大輔"] = "グルノーブル" sensyu["本田圭祐"] = "CSKAモスクワ" sensyu["森本貴幸"] = "カターニャ" for kaigai,soccer in sensyu # for キー名,値 in ハッシュ配列 printf("%s の所属チームは「%s」です。\n", kaigai, soccer) # 行う操作 end # forのend ◯実行結果 pan{c109029}% ./hash_for.rb [~/Ruby] 松井大輔 の所属チームは「グルノーブル」です。 森本貴幸 の所属チームは「カターニャ」です。 長友佑都 の所属チームは「チェゼーナ」です。 川島永嗣 の所属チームは「リールセ」です。 本田圭祐 の所属チームは「CSKAモスクワ」です。 pan{c109029}% [~/Ruby] ◯考察 ・プログラム sensyu["川島永嗣"] = "リールセ" sensyu["長友佑都"] = "チェゼーナ" sensyu["松井大輔"] = "グルノーブル" sensyu["本田圭祐"] = "CSKAモスクワ" sensyu["森本貴幸"] = "カターニャ" ・実行結果 松井大輔 の所属チームは「グルノーブル」です。 森本貴幸 の所属チームは「カターニャ」です。 長友佑都 の所属チームは「チェゼーナ」です。 川島永嗣 の所属チームは「リールセ」です。 本田圭祐 の所属チームは「CSKAモスクワ」です。 プログラムで作成した Hash の対と実行結果の対が同じであるため正しくプログ ラムを作成できているといえる。 B. ◯考えた設定 hash_for.rb に加えてユーザが選択した情報だけを表示するプログラム。 選手名を入力してもらうと、選手名と所属チームが表示されるプログラム。 ・作成したプログラム「 hash_choice.rb 」 #!/usr/koeki/bin/ruby $KCODE = 'e' sensyu = Hash.new("ありません。\n") #Hash 配列を sensyu とする sensyu["かわしまえいじ"] = "リールセ" sensyu["ながともゆうと"] = "チェゼーナ" sensyu["まついだいすけ"] = "グルノーブル" sensyu["ほんだけいすけ"] = "CSKAモスクワ" sensyu["もりもとたかゆき"] = "カターニャ" print("海外のチームに所属している日本人選手名を入力すると、その選手の所属チームが表示されます。ひらがなで正しく入力して下さい。\n") STDERR.print("選手名は?: ") kaigai = gets.chomp if sensyu.key?(kaigai) == true # 文字列 key があるかどうか調べる printf("%s の所属チームは「%s」です。\n", kaigai, sensyu[kaigai]) else printf("データにありません\n") # 存在しなければ false という値を返したときに表示される。 end ◯変更点 漢字変換した場合、一度に正確に変換できない場合下のようにしっかりと表示で きなかったことと、入力する際に漢字が分からない場合があると考えたため漢字 をひらがなにした。 pan{c109029}% ./hash_choice.rb [~/Ruby] 海外のチームに所属している日本人選手名を入力すると、その選手の所属チームが表示されます。漢字で正しく入力して下さい。 選手名は?: 川島永嗣 川島永嗣い呂△蠅泙擦鵝 ◯実行結果 ・プログラムにデータある場合 pan{c109029}% ./hash_choice.rb [~/Ruby] 海外のチームに所属している日本人選手名を入力すると、その選手の所属チームが表示されます。ひらがなで正しく入力して下さい。 選手名は?: かわしまえいじ かわしまえいじ の所属チームは「リールセ」です。 pan{c109029}% ./hash_choice.rb [~/Ruby] 海外のチームに所属している日本人選手名を入力すると、その選手の所属チームが表示されます。ひらがなで正しく入力して下さい。 選手名は?: ながともゆうと ながともゆうと の所属チームは「チェゼーナ」です。 pan{c109029}% ./hash_choice.rb [~/Ruby] 海外のチームに所属している日本人選手名を入力すると、その選手の所属チームが表示されます。ひらがなで正しく入力して下さい。 選手名は?: まついだいすけ まついだいすけ の所属チームは「グルノーブル」です。 pan{c109029}% ./hash_choice.rb [~/Ruby] 海外のチームに所属している日本人選手名を入力すると、その選手の所属チームが表示されます。ひらがなで正しく入力して下さい。 選手名は?: ほんだけいすけ ほんだけいすけ の所属チームは「CSKAモスクワ」です。 pan{c109029}% ./hash_choice.rb [~/Ruby] 海外のチームに所属している日本人選手名を入力すると、その選手の所属チームが表示されます。ひらがなで正しく入力して下さい。 選手名は?: もりもとたかゆき もりもとたかゆき の所属チームは「カターニャ」です。 ・プログラムにない場合 pan{c109029}% ./hash_choice.rb [~/Ruby] 海外のチームに所属している日本人選手名を入力すると、その選手の所属チームが表示されます。ひらがなで正しく入力して下さい。 選手名は?: えんどうゆうき データにありません pan{c109029}% ./hash_choice.rb [~/Ruby] 海外のチームに所属している日本人選手名を入力すると、その選手の所属チームが表示されます。ひらがなで正しく入力して下さい。 選手名は?: きないゆう データにありません ◯考察 プログラムに存在するデータを入力すると選手名と対になっている所属チームが 表示された。データにない文字を入力すると「データにありません」と表示され る。このことから設定通りにプログラムを作成できたといえる。 D. ◯考えた設定 データファイル読み込み、知りたい情報だけを結果表示する。 ◯作成したプログラム「 hash_read.rb 」 #!/usr/koeki/bin/ruby $KCODE ='e' sensyu = Hash.new("データにありません。\n") # Hash 配列を sensyu とする。 print("海外で活躍する日本人サッカー選手名を入力してください。所属チームを表示します。\n") open("hash_data.dat","r") do |z| while hash_data = z.gets if /(\S+)\s+(\S+)/ =~ hash_data sensyu[$1] = $2 end end end STDERR.print("選手名は:\n") # STDERR.print("入力を促す文章") kaigai = gets.chomp if sensyu.key?(kaigai) == true # 文字列 key があるかどうか調べる printf("%s の所属チームは「%s」です。\n",kaigai,sensyu[kaigai]) else printf("%sは%s\n",kaigai,sensyu[kaigai]) # 存在しなければ false という値を返す end ◯変更点 bの「hash_choice.rb」をもとに open--end でデータファイルを読み込むように した。その際に hash_data.dat を読みこませるようにした。 ●実行結果 ・データにある場合 pan{c109029}% ./hash_read.rb [~/Ruby] 海外で活躍する日本人サッカー選手名を入力してください。所属チームを表示します。 選手名は: かわしまえいじ かわしまえいじ の所属チームは「リールセ」です。 pan{c109029}% ./hash_read.rb [~/Ruby] 海外で活躍する日本人サッカー選手名を入力してください。所属チームを表示します。 選手名は: ながともゆうと ながともゆうと の所属チームは「チェゼーナ」です。 pan{c109029}% ./hash_read.rb [~/Ruby] 海外で活躍する日本人サッカー選手名を入力してください。所属チームを表示します。 選手名は: まついだいすけ まついだいすけ の所属チームは「グルノーブル」です。 pan{c109029}% ./hash_read.rb [~/Ruby] 海外で活躍する日本人サッカー選手名を入力してください。所属チームを表示します。 選手名は: ほんだけいすけ ほんだけいすけ の所属チームは「CSKAモスクワ」です。 pan{c109029}% ./hash_read.rb [~/Ruby] 海外で活躍する日本人サッカー選手名を入力してください。所属チームを表示します。 選手名は: もりもとたかゆき もりもとたかゆき の所属チームは「カターニャ」です。 pan{c109029}% [~/Rub ・データに無い場合 pan{c109029}% ./hash_read.rb [~/Ruby] 海外で活躍する日本人サッカー選手名を入力してください。所属チームを表示します。 選手名は: かわぐちよしかつ かわぐちよしかつはデータにありません。 pan{c109029}% [~/Ruby] ◯考察 選手名を入力すると選手名と対になっている所属チーム名が表示された。登録していないもの入力すると「データにありません」と表示される。このことから設定通りにプログラムを作成できたといえる。 E. ◯考えた設定 k-term で プログラム hash_write.rb を出力させ、そこで入力した情報を、 hash_data.dat に登録させるようにした。 ・作成したプログラム ●データ 「hash_data.dat」 かわしまえいじ リールセ ながともゆうと チェゼーナ まついだいすけ グルノーブル ほんだけいすけ CSKAモスクワ もりもとたかゆき カターニャ ●プログラム (hash_write.rb) #!/usr/koeki/bin/ruby $KCODE = 'e' sensyu = Hash.new # Hash 配列を sensyu とする while true STDERR.print("選手名は: \n") kaigai = gets if kaigai == nil # からっぽの という意味 break else gaikoku = kaigai.chomp STDERR.print("所属チームは: \n") nippon = gets.chomp sensyu[kaigai] = nippon end end open("hash_data_2.dat", "w")do |z| # 自動的に hash_data.dat を読み込ませる for soccer in sensyu z.printf("%s \t %s \n",soccer,sensyu[soccer]) end end ◯変更点 読み込みモード "r"から、追加書き込みモード "w" に変更した。 また、「hash_data_2.dat」を作成し、そっちの方に書きこめるようにした。 ◯実行結果 pan{c109029}% ./hash_write.rb [~/Ruby] 選手名は: うちだあつと 所属チームは: シャルケ pan{c109029}% ./hash_write.rb [~/Ruby] 選手名は: うちだあつと 所属チームは: シャルケ 選手名は: はせべまこと 所属チームは: ヴォルフスブルグ ◯考察 データに登録されていない新たな情報を、登録することができている。 ◯感想 問題を全部こなしたかったが、C問題がうまく実行できず諦めてしまったので次 回はどこが間違っているか考察して最後までやりたいと思う。 ◯参考文献 礎プログラミング II 第2回 なになにといえばこれこれ 「対にないものが呼び 出されたとき」 http://roy/~madoka/2010/r2/02/02_05_theme_04_initialize.html 基礎プログラミング II 第2回 なになにといえばこれこれ 「対の情報を使って並び換え」 http://roy/~madoka/2010/r2/02/02_08_theme_07_each.html 基礎プログラミング II 第2回 なになにといえばこれこれ 「Hash の対を表示す るには」 http://roy/~madoka/2010/r2/02/02_07_theme_06_forprint.html ◯共同学習者 木内くん、横山くん ・プログラムなどを添付します。