第7回 基礎プログラミング I レポート課題 氏名: XXXXXXXX 学籍番号:c109XXX 語学クラス:中国語1 コース(系):政策 1.筆記問題 0bは2進法表示、0xは16進法表示、0dは10進法表示。 A. 2進数0b11110110 を16進数(0x)に変換する。 16進数への変換の仕方は、まず、右から4桁ずつ区切って考える。 1111,0110 これを対応表を活用して変換すると、 1111 = f 0110 = 6 0xf6 となる。 したがって、0b11110110 = 0xf6 である。 B. 0d256を16進数(0x)に変換する。 まず、10進数を2進数に変換する必要がある。 10進数を2進数に変換するには、10進数の値を2で割っていく。このときに出る余 りが重要である。余りを逆から読んでいくと2進数に変換できる。 256 / 2 = 128 余り 0 128 / 2 = 64 余り 0 64 / 2 = 32 余り 0 32 / 2 = 16 余り 0 16 / 2 = 8 余り 0 8 / 2 = 4 余り 0 4 / 2 = 2 余り 0 2 / 2 = 1 余り 0 1 / 2 = 0 余り 1 上で出た計算の余りを逆から読んでいくと 100000000 なので 0d256 は 0b100000000 となる。 次に、変換した2進数を16進数に変換する。 2進数を16進数に変換するには、2進数の値を右から4桁ずつ区切って考える。 0b100000000 を 4桁ずつ区切ると 1,0000,0000 となる。 これを対応表を活用して変換すると、 1 = 1 0000 = 0 0000 = 0 0x100 となる。 したがって、 0d256 = 0x100 である。 2. A. a.設定 データを自動で読み込ませて、計算させるプログラムを作成することが目的なの で、openを用いた形にすればいいと思った。授業中に作成したwrite_ticket.rb を参考にif文を増やして、プログラムを構成しようと思う。 b.作成したプログラム #!/usr/koeki/bin/ruby t = Array.new #タイプを表す変数 u = Array.new #売上げを表す変数 sum = 0 #合計を表す i = 0 #配列の番号 open("battery.dat" , "r") do |a| #データを自動読み込みさせる while buy = a.gets #繰り返し行わせる if /(\S+)\s+(\d+)/ =~ buy #文字列、空白、数字にマッチしたらbuyの中にしまう t[i] = $1 u[i] = $2.to_f #売上げの個数を取りこみ小数に変換する if t[i] == "A" #もしも、タイプがAだったらということを表す b = 400 * u[i] #400円 * 売り上げ個数で答えを表示させるようにする elsif t[i] == "B" #もしも、タイプがBだったらということを表す b = 300 * u[i] #300円 * 売り上げ個数で答えを表示させるようにする else t[i] == "C" #もしも、タイプがCだったらということを表す b = 50 * u[i] #50円 * 売り上げ個数で答えを表示させるようにする end sum += b #合計を出す i += 1 end end end k = 0 #配列の番号 print("売上げ数\n") #売上げ数の文字を入力 while k < t.length # t の個数を返してkより大きくなったら終了 printf("%-10s\t%d\n", t[k], u[k]) #10個分の空白を空け、表示させる k += 1 end tanka = sum / 8 #合計/タイプ数で客単価を計算させる printf("客単価は %2.1f 円だよ。\n",tanka) #客単価の値を表示させる printf("その日の売上げは %d 円だよ。\n",sum) #売り上げの値を表示させる c.もとにしたプログラムからの変更点 授業で作成したwrite_ticket.rbをもととし、変更した。 変数を問題にあったものに変更。 if文を増やして、計算させる数を増やした。 print文、printf文を問題にあったものに変更。 d.実行結果 pan{c109020}% ./open_battery.rb [~/Ruby] 売上げ数 A 1 B 2 C 3 B 2 C 1 A 2 A 2 B 1 客単価は 462.5 円だよ。 その日の売上げは 3700 円だよ。 e.結果の考察 print文、printf文が正しく表示されたことから、これらの構成には誤りはない と考えられる。 また、外部ファイルを正しく読み込めていることから、open--doの使い方にも誤 りはないと考えられる。 コンピュータに、売上げと客単価を計算させたが、正しく計算されているかはわ からない。そこで、bc -l で確かめ算を行なった。 pan{c109020}% bc -l [~/Ruby] 400 * 1 400 300 * 2 600 50 * 3 150 300 * 2 600 50 * 1 50 400 * 2 800 400 * 2 800 300 * 1 300 400 + 600 + 150 + 600 + 50 + 800 + 800 + 300 3700 3700 / 8 462.50000000000000000000 以上の結果より、正しく計算されているということがわかる。 よって、このプログラムは正しく実行されたといえる。 B. a.設定 プログラム問題 Aに改良を加えればできるのではないかと考えた。 ifのところの計算を変えれば、値引きした値が表示されると考えたので、A問題 をもととしてプログラムを作成しようと思う。 b.作成したプログラム #!/usr/koeki/bin/ruby t = Array.new #タイプを表す変数 u = Array.new #売上げを表す変数 sum = 0 #合計を表す i = 0 #配列の番号 open("battery.dat" , "r") do |a| #データを自動読み込みさせる while buy = a.gets if /(\S+)\s+(\d+)/ =~ buy #文字列、空白、数字にマッチしたらbuyの中にしまう t[i] = $1 u[i] = $2.to_f #売上げの個数を取りこみ小数に変換する。 if t[i] == "A" #もしも、タイプがAだったらということを表す b = 400 * u[i] #400円 * 売り上げ個数で答えを表示させるようにする elsif t[i] == "B" #もしも、タイプがBだったらということを表す b = 300 * u[i] #300円 * 売り上げ個数で答えを表示させるようにする else t[i] == "C" #もしも、タイプがCだったらということを表す b = 50 * u[i] #50円 * 売り上げ個数で答えを表示させるようにする end sum += b #合計を出す i += 1 end end end k = 0 #配列の番号 print("売上げ数\n") #売上げ数の文字を入力 while k < t.length # t の個数を返してkより大きくなったら終了 printf("%-10s\t%d\n", t[k], u[k]) #10個分の空白を空け、表示させる k += 1 end tanka = sum / 8 #合計/タイプ数で単価を計算させる printf("客単価は %2.1f 円だよ。\n",tanka) #客単価の値を表示させる printf("その日の売上げは %d 円だよ。\n",sum) #売り上げの値を表示させる t = Array.new #タイプを表す変数 u = Array.new #売上げを表す変数 sum_a = 0 #合計を表す s = 0 #配列の番号 open("battery.dat" , "r") do |a| #データを自動読み込みさせる while buy = a.gets if /(\S+)\s+(\d+)/ =~ buy #文字列、空白、数字にマッチしたらbuyの中にしまう t[s] = $1 u[s] = $2.to_f #売上げの個数を取りこみ小数に変換する if t[s] == "A" #もしも、タイプがAだったらということを表す b = 400 * u[s] #400円 * 売り上げ個数で答えを表示させるようにする elsif t[s] == "B" #もしも、タイプがBだったらということを表す if u[s] <= 1 #もしも、売り上げ個数が 1より多かったら を表す b = 280 * u[s] #(300-20)円 * 売り上げ個数で答えを表示させるようにする else u[s] >= 2 #もしも、売り上げ個数が 2より多かったら を表す b = 240 * u[s] #(300-60)円 * 売り上げ個数で答えを表示させるようにする end else t[s] == "C" #もしも、タイプがCだったらということを表す b = 50 * u[s] #50円 * 売り上げ個数で答えを表示させるようにする end sum_a += b #合計を出す s += 1 end end end tanka = sum_a / 8 #合計/タイプ数で単価を計算させる printf("客単価は %2.1f 円だよ。\n",tanka) #客単価の値を表示させる printf("その日の売上げは %d 円だよ。\n",sum_a) #売り上げの値を表示させる c.もとにしたプログラムからの変更点 授業で作成したwrite_ticket.rbをもととし、作成したopen_six.rbに改良を加え た。 変数を問題にあったものに変更。 if文を増やして、計算させる数を増やした。 計算内容を変更。 print文、printf文を問題にあったものに変更。 d.実行結果 pan{c109020}% ./open_six.rb [~/Ruby] 売上げ数 A 1 B 2 C 3 B 2 C 1 A 2 A 2 B 1 客単価は 462.5 円だよ。 その日の売上げは 3700 円だよ。 客単価は 430.0 円だよ。 その日の売上げは 3440 円だよ。 e.結果の考察 プログラム内容量は増えたが、print文、printf文が正しく表示されたことから、 これらの構成には誤りはないと考えられる。 また、外部ファイルを正しく読み込めていることから、open--doの使い方にも誤 りはないと考えられる。 ifを用いて、計算内容をA問題から変えてコンピュータに、売上げと客単価を計 算させた。しかし、結果画面だけではコンピュータが正しく計算してくれたのか はわからない。そこで、bc -l で確かめ算を行なった。 pan{c109020}% bc -l [~/Ruby] 400 * 1 400 240 * 2 480 50 * 3 150 240 * 2 480 50 * 1 50 400 * 2 800 400 * 2 800 280 * 1 280 400 + 480 + 150 + 480 + 50 + 800 + 800 + 280 3440 3440 / 8 430.00000000000000000000 以上の結果より、正しく計算されていることがわかった。 よって、このプログラムは正しく機能しているといえる。 3.感想 B問題のifのところと、構成を頑張りました。if--endの復習にもなり、更に使 い方にも慣れてきたように思います。B問題では、変化を調査するものだったの ですが、難しかったです。A問題の結果とB問題の結果が比較できればよいので はないかと考えたので、このようなプログラムになりました。差額などを出せ ればもっとよいものになると思い、プログラム内にいろいろ工夫して、差額を 出す設定を組み込んでみたりもしましたが、どうしてもエラーになってしまい、 今回は表示することができませんでした。もっと知識と技術を増やして、諦め ずに何度もチャレンジしてみるつもりです。 私の実家は自営業で、多くの商品を扱っています。このプログラムをもととし て、実家の店の商品の売り上げなども調べてみたいと思いました。 f.参考文献 ・http://www.asahi-net.or.jp/~ax2s-kmtn/ref/bdh.html 2進数、16進数と10進数 作者:不明 ・http://roy/~madoka/2010/r1/07/07_07_theme_06_tab.html 基礎プログラミング I 第7回 「正規表現と Ruby 言語でのプログラミング」空白 を利用してデータを取りだすには(講義ノート) 西村まどか先生 ・http://roy/~madoka/2010/r1/07/07_09_theme_08_fileread.html 基礎プログラミング I 第7回 「正規表現と Ruby 言語でのプログラミング」デー タを読み込むようにするには(講義ノート) 西村まどか先生 ・http://roy/~madoka/2010/r1/07/07_13_theme_11_vendingmachine.html 基礎プログラミング I 第7回 「正規表現と Ruby 言語でのプログラミング」券 売機のしくみ(講義ノート) 西村まどか先生 共同学習者 横山 広樹