第 4 回 プログラミングの方法 レポート課題 氏名: 池田 紘平 学籍番号: c1110097 語学クラス: 英語 3 コース: 社会福祉コース 1.A 2進数を16進数にする場合、10101 を右から四桁ずつ区切る。 1 / 0101 として、それぞれ右から 2**0 、2**1、2**2、2**3 を用意する。 1 / 0 1 0 1 ↓ ↓ ↓ ↓ ↓ 2**0 2**3 2**2 2**1 2**0 この時に、2進数の 1 となっている部分のみとりだすと、 2**0 / 2**2 2**0 となるので、それを足していくと 1 / 4 + 1 1 / 5 となるので答えは 0x15 となる。 10進数にする場合は、10101 に右から 2**0、2**1、2**2、2**3、2**4 を用意する。 1 0 1 0 1 ↓ ↓ ↓ ↓ ↓ 2**4 2**3 2**2 2**1 2**0 として、2進数の1の部分だけをとりだし、足していく。 2**4 + 2**2 + 2**0 = 16 + 4 + 1 = 21 となるので、答えは 0d21 である。 1.B 野球で3アウトを取るまでの過程を表す。 アウト = 0 球数 = 1 ストライク = 0 ボール = 0 print"ストライクなら 1 、ボールなら 2 を入力してください" while true if アウト = 3 break end STDERR.printf("%d 球目の判定は? : ",t) 判定 = gets.chomp 判定 = 判定.to_i if 判定 ==1 ストライク += 1 end if 判定 == 2 ボール += 1 end if ストライク == 3 アウト += 1 ストライク = 0 printf("三振で %d アウトです\n",アウト) end if ボール == 4 ボール = 0 print"フォアボールです\n" end 球数 += 1 end print"3 アウトになりました。\n" このプログラムが実行できるかは考察で示す。 2.A < 設定 > 16進数を右から一桁ずつ入力させて、それを10進数にする。10進数だ と結果で表示させるときに、%b(2進数)を使うためである。構造的には cal_bin.rbとほぼ同じである。 < プログラム > #!/usr/koeki/bin/ruby # coding; euc-jp STDERR.print"16進数を2進数に変換します。右から1桁ずつ入力して終わったらq を押してください\n" k = 1 # 桁数(keta)のk x = 0 # 10進数にしたものを入れる箱 while true # qが入力されるまで繰り返す STDERR.printf("%d 桁目の数はいくつ? : ",k) # 一桁目から入力させる n = gets.chomp # n に入力されたものを代入する if n == "q" # もしqが入力されたら break # ループを脱出 end # if n == "q"のend if n == "a" # もしnに入力されたのがaだったら n = 10 # nに10を代入する end # if n == "a"のend if n == "b" # もしnに入力されたのがbだったら n = 11 # nに11を代入する end # if n == "b"のend if n == "c" # もしnに入力されたのがcだったら n = 12 # nに12を代入する end # if n == "c"のend if n == "d" # もしnに入力されたのがdだったら n = 13 # nに13を代入する end # if n == "d"のend if n == "e" # もしnに入力されたのがeだったら n =14 # nに14を代入する end # if n == "e"のend if n == "f" # もしnに入力されたのがfだったら n = 15 # nに15を代入する end # if n == "f"のend n = n.to_i # 入力されたものを整数に変換する x += n * 16 ** (k-1) # 16進数を10進数にするには、各桁に16の倍数を掛けたも のを足せばいいのでこの形になる k +=1 # 桁数を次の桁にする end # whileのend printf("2進数で %b です\n",x) # 10進数を、%bを使って2進数で表 示する < 説明 > まず最初に16進数の右から入力することを知らせておく。while trueで は、qが入力されるまで延々と繰り返すことになる。16進数は10〜15がa〜 fになるため、その英字が入力されたらそれぞれ対応する数値に変換す るようにした。16進数から10進数にするには、右から各桁に16の倍数を 掛ければよいので計算式はこのようになった。10進数になっていれば、 2進数で表示したいときに、%bを使えば表示できるので、%bを使った。 < 実行結果 > pan{IKEDA Kohei}% ./cal_hex.rb [~/Ruby] 16進数を2進数に変換します。右から1桁ずつ入力して終わったらqを押 してください 1 桁目の数はいくつ? : 1 2 桁目の数はいくつ? : a 3 桁目の数はいくつ? : q 2進数で 10100001 です pan{IKEDA Kohei}% ./cal_hex.rb [~/Ruby] 16進数を2進数に変換します。右から1桁ずつ入力して終わったらqを押 してください 1 桁目の数はいくつ? : a 2 桁目の数はいくつ? : b 3 桁目の数はいくつ? : q 2進数で 10111010 です < 考察 > 16進数のa1は10進数に直すと10、1になる。これを2進数に直すと 1010、0001となるので、これをくっつけると10100001となり、実行結果 と同じになる。 16進数のbaは10進数に直すと11、10になる。これを2進数に直すと 1011、1010となるのでこれをくっつけると 10111010 となり、実行結 果と同じになる。 pan{c111009}% bc -l [~/Ruby] 8+0+2+0 10 0+0+0+1 1 8+0+2+1 11 8+0+2+0 10 < 筆記問題のプログラム while_baseball.rb > #!/usr/koeki/bin/ruby # coding: euc-jp o = 0 # アウトカウント t = 1 # 球数 s = 0 # ストライクカウント b = 0 # ボールカウント print"ストライクなら 1 、ボールなら 2 を入力してください\n" # ストライクかボールか入力 while true # 3アウトになるまで繰り返す if o == 3 # もしアウトカウントが3になったら break # ループ脱出 end # if o==3のend STDERR.printf("%d 球目の判定は? : ",t) # t級目の判定を入力させる j = gets.chomp # 入力されたものをjに代入する j = j.to_i # 入力されたものを整数に変換する if j ==1 # もし入力されたものが1だったら s += 1 # ストライクカウントを1増やす end # if j==1のend if j == 2 # もし入力されたものが2だったら b += 1 # ボールカウントを1増やす end # if J==2のend if s == 3 # もしストライクカウントが3になったら o += 1 # アウトカウントを1増やして s = 0 # ストライクカウントを0に戻す printf("三振で %d アウトです\n",o) # 三振したことを表示 end # if S==4のend if b == 4 # もしボールカウントが4になったら b = 0 # ボールカウントを0に戻して print"フォアボールです\n" # フォアボールだと知らせる end # if b==4のend t += 1 # 球数を1増やす end # while trueのend print"3 アウトになりました。\n" # 3アウトになったことを表示 < 説明 > 最初にストライクなら1、ボールなら2を入力するように指示を出す。 while true の中では、3アウトになるまで延々と繰り返す。それぞれ の条件ごとに三振やフォアボール、アウトカウントを表示するように して、3アウトになったらそのことを表示するようにした。 < 実行結果 > pan{c111009}% ./while_baseball.rb [~/Ruby] ストライクなら 1 、ボールなら 2 を入力してください 1 球目の判定は? : 2 2 球目の判定は? : 2 3 球目の判定は? : 2 4 球目の判定は? : 2 フォアボールです 5 球目の判定は? : 2 6 球目の判定は? : 2 7 球目の判定は? : 2 8 球目の判定は? : 2 フォアボールです 9 球目の判定は? : 2 10 球目の判定は? : 2 11 球目の判定は? : 2 12 球目の判定は? : 2 フォアボールです 13 球目の判定は? : 1 14 球目の判定は? : 1 15 球目の判定は? : 1 三振で 1 アウトです 16 球目の判定は? : 1 17 球目の判定は? : 1 18 球目の判定は? : 1 三振で 2 アウトです 19 球目の判定は? : 1 20 球目の判定は? : 1 21 球目の判定は? : 1 三振で 3 アウトです 3 アウトになりました。 上の実行結果より、ストライクカウントが3つたまると三振、ボールカ ウントが4つたまるとフォアボール、アウトカウントが3つたまると終了 することが分かった。今回はただのカウントを数えるだけのプログラム だったので、時間があればランナーの表示や点数の表示にも取り組みた い。 < 感想 > 今回のレポート課題で一番迷った所は、16進数のa〜fをどうやって計 算させるかということだった。その解決策としてa〜fをそれぞれ対応 した値に切り替えるという事だった。その結果上手く実行することが できたので良かった。 < 参考文献 > 基礎プログラミング 1 第4回 (プログラミングの方法) 「2進数を10進 数に直すには」 西村まどか http://roy/~madoka/2012/r1/04/r1_04_19_theme_10_binary_remainder.html 「Rubyプログラミング基礎講座」 広瀬雄二 著 第8講 計算機の内部表現 8ー1 2進数と16進数(p101〜p106)