第7回 基礎プログラミング I レポート課題 XXXXXXXX C109XXX 英語 1 環境 1,A 0b は 2 進数であることを表し、0d は 10 進数であることを表す。そして 0x は 16 進数であることを表している。 0b 11110110 = 0x ?? 2 進数 10 進数 16 進数 0000 0 0 0001 1 1 0010 2 2 0011 3 3 0100 4 4 0101 5 5 0110 6 6 0111 7 7 1000 8 8 1001 9 9 1010 10 A 1011 11 B 1100 12 C 1101 13 D 1110 14 E 1111 15 F 2 進数から 16 進数に直すには、右から 4 つに分けていく。その後 4 つに分け た中で 10 進数に戻す。10 進数に戻したら上の表を見ながら 16 進数に直す。 問題では 11110110 となっているのだめ右から 4 つに分けると 1111 0110 とな る。そして、4 つの中で 10 進数に直すと 15 6 となる。戻した後 表を見なが ら 15 と 6 に当たるところを探し 16 進数に直す。すると 15 は F になり 6 は 6 になるので答えは F6 となる。 0b 11110110 = 0x F6 1,B 0d 256 = 0x ?? 10 進数から 16 進数に直すには 10 進数の数字を 16 で割って余りを 16 進数 に直す方法と、10 進数から 2 進数に直した後 右から 4 つに分けて 16 進数に 直す方法の 2 つがある。私はいつも 10 進数から 2 進数に直した後 16 進数に 直す方法を使っているので、この方法で直したいと思う。 まず最初に 256 を 2 進数に直す。直す方法は 256 を 2 で割っていき余りが 1 になるまで割っていく。 2)256 2)128 0 2) 64 0 2) 32 0 2) 16 0 2) 8 0 2) 4 0 2) 2 0 2) 1 0 2) 0 1 すると 100000000 になる。これを右から 4 つに分けると 1 0000 0000 になる。 そして、10 進数に直すと 1 0 0 になる。これを上の表を見ながら 1 と 0 に当 たるところを探し 16 進数に直す。すると 1 は 1 になり 0 は 0 になるので答 えは 100 となる。 0d 256 = 0x 100 2,A 設定 その日の売り上げと客単価を計算させるプログラム プログラム本体 # タイプ # (パック)数売上げ A 2 B 1 B 2 C 1 A 2 A 2 C 2 B 1 B 1 C 1 C 2 #!/usr/koeki/bin/ruby taipu = Array.new # taipu という配列を作る。 uriage = Array.new # uriage という配列を作る。 sum = 0 i = 0 open("battery.dat" , "r") do |f| # battery というファイルを開き # f という名前にする while buy = f.gets if /(\S+)\s+(\d+)/ =~ buy # 文字列、空白、数値にマッチ # するものを読み込む taipu[i] = $1 # taipu[i]の中にいれる uriage[i] = $2.to_f # uriage[i]の中にいれる if taipu[i] == "A" # もしtaipu[i]がAだったら次の 処理をする a = 400 * uriage[i] elsif taipu[i] == "B" # もしtaipu[i]がBだったら次の # 処理をする a = 300 * uriage[i] else a = 50 * uriage[i] end # if に対する end sum += a i += 1 end # if に対する end end # while に対する end end # open に対する end k = 0 print("売上げ数\n") while k < taipu.length # whileのtaipu.lengthでtaipu[k] # の個数を返す printf("%-10s\t%d\n",taipu[k], uriage[k]) k += 1 end tanka = sum / 11 printf("客単価は %2.1f 円です。\n",tanka) printf("その日の売上げは %d 円です。\n",sum) 実行結果 pan{c109149}% ./open_battery.rb [~/Ruby] 売上げ数 A 2 B 1 B 2 C 1 A 2 A 2 C 2 B 1 B 1 C 1 C 2 客単価は 381.8 円です。 その日の売上げは 4200 円です。 考察 pan{c109149}% bc -l [~/Ruby] 400 * 2 800 300 * 1 300 300 * 2 600 50 * 1 50 400 * 2 800 400 * 2 800 50 * 2 100 300 * 1 300 300 * 1 300 50 * 1 50 50 * 2 100 800 + 300 + 600 + 50 + 800 + 800 + 100 + 300 + 300 + 50 + 100 4200 4200 / 11 381.81818181818181818181 quit 実行結果と確かめ算により、売り上げ値は正しく実行されたと言える。 客単価は 381.81818181818181818181 と計算され小数第2位を四捨五入すると 381.8 となるため、あっている。 2,B 設定 6 個入りだけを 20 円引きして、2 パック買うと 60 円引きにする。このときの 売り上げの変化を調査するプログラム プログラム本体 # タイプ # (パック)数売上げ A 2 B 1 B 2 C 1 A 2 A 2 C 2 B 1 B 1 C 1 C 2 #!/usr/koeki/bin/ruby taipu = Array.new # taipu という配列を作る uriage = Array.new # uriage という配列を作る sum = 0 i = 0 open("battery.dat" , "r") do |f| # battery というファイルを開き # f という名前にする while buy = f.gets if /(\S+)\s+(\d+)/ =~ buy # 文字列、空白、数値にマッチ # するものを読み込む taipu[i] = $1 # taiou[i]の中にいれる uriage[i] = $2.to_f # uriage[i]の中にいれる if taipu[i] == "A" # もしtaipu[i]がAだったら次の # 処理をする a = 400 * uriage[i] elsif taipu[i] == "B" # もしtaiou[i]がBだったら次の # 処理をする a = 300 * uriage[i] else a = 50 * uriage[i] end # if に対する end sum += a i += 1 end # if に対する end end # while に対する end end # open に対する end k = 0 print("売上げ数\n") while k < taipu.length # whileのtaipu.lengthでtaipu[k] # の個数を返す printf("%-10s\t%d\n",taipu[k], uriage[k]) k += 1 end tanka = sum / 11 printf("客単価は %2.1f 円です。\n",tanka) printf("その日の売上げは %d 円です。\n",sum) taip = Array.new # taip という配列を作る uriagesuu = Array.new # uriagesuu という配列を作る sum_a = 0 p = 0 open("battery.dat" , "r") do |d| # battery というファイルを開き # d という名前にする while bay = d.gets if /(\S+)\s+(\d+)/ =~ bay # 文字列、空白、数値にマッチ # するもの読み込む taip[p] = $1 # taip[p]の中にいれる uriagesuu[p] = $2.to_f # uriagesuu[p]の中にいれる if taip[p] == "A" # もしtaip[p]がAだったら # 次の処理をする a = 400 * uriagesuu[p] elsif taip[p] == "B" # もしtaip[p]がBだったら # 次の処理をする if uriagesuu[p] <= 1 # もしuriagesuu[p]が1以下だったら # 次の処理をする a = 280 * uriagesuu[p] elsif uriagesuu[p] >= 2 # もしuriagesuu[p]が2以上だったら # 次の処理をする a = 240 * uriagesuu[p] end # if に対する end else # それ以外だったら次の処理をする a = 50 * uriagesuu[p] end # if に対する end sum_a += a p += 1 end # if に対する end end # while に対する end end # open に対する end tanka_a = sum_a / 11 printf("客単価は %2.1f 円です。\n",tanka_a) printf("その日の売上げは %d 円です。\n",sum_a) 実行結果 pan{c109149}% ./open_six.rb [~/Ruby] 売上げ数 A 2 B 1 B 2 C 1 A 2 A 2 C 2 B 1 B 1 C 1 C 2 客単価は 381.8 円です。 その日の売上げは 4200 円です。 客単価は 365.5 円です。 その日の売上げは 4020 円です。 考察 pan{c109149}% bc -l [~/Ruby] 400 * 2 800 280 * 1 280 240 * 2 480 50 * 1 50 400 * 2 800 400 * 2 800 50 * 2 100 280 * 1 280 280 * 1 280 50 * 1 50 50 * 2 100 800 + 280 + 480 + 50 + 800 + 800 + 100 + 280 + 280 + 50 + 100 4020 4020 / 11 365.45454545454545454545 quit 実行結果と確かめ算により、売り上げ値は正しく計算されたと言える。 客単価は 365.45454545454545454545 と計算され小数第2位を四捨五入すると 365.5 となるため、あっている。 2,C 設定 8 個入りの乾電池を、400 円で買うことができて、 PB 商品の 8 個入りも取 り扱うことになり、320 円で買うことができる。正規製品は電子カードで買う と、ポイントが 10 円あたり 2 ポイントつく。どちらが人気商品なのか分析 し、売上げとポイントも調べるプログラム。 プログラム本体 # 正規 # PB # 種類 0 2 カード 2 0 カード 1 1 現金 2 2 現金 0 2 カード 1 0 現金 3 1 カード #!/usr/koeki/bin/ruby seiki = Array.new # seiki という配列を作る syouhinn = Array.new # syouhinn という配列を作る syubetu = Array.new # syubetu という配列を作る total = 0 pointo = 0 seiki_a = 0 syohinn_a = 0 i = 0 open("open_compare.dat" , "r") do |f| # open_compare.dat というファイ # ルを開き f という名前にする while buy = f.gets if /(\d+)\s+(\d+)\s+(\S+)/ =~ buy # 数値、空白、数値、空白、文字列 # にマッチするものを読み込む seiki[i] = $1.to_i # seiki[i]の中にいれる syouhinn[i] = $2.to_i # hyouhinn[i]の中にいれる syubetu[i] = $3 # syubetu[i]の中にいれる if syubetu[i] == "カード" # もしsyubetu[i]がカードだったら # 次の処理をする pointo_a = 400 * seiki[i] / 10 else # それ以外の場合次の処理をする pointo_a += 0 end # if に対する end total_a = 400 * seiki[i] + 320 * syouhinn[i] seiki_a += seiki[i] syohinn_a += syouhinn[i] i += 1 total += total_a pointo += pointo_a end # if に対する end end # while に対する end end # open に対する end k = 0 print("正規 PB商品 種別\n") while k < seiki.length # whileのseiki.lengthでseiki[k] # の個数を返す printf("%d \t %d \t %s\n",seiki[k] ,syouhinn[k] ,syubetu[k]) k += 1 end printf("売り上げは %d 円です。\n",total) printf("電子マネーのポイントは %d ポイントです。\n",pointo) if seiki_a > syohinn_a # もしsyohinn_aよりseiki_aの方 # が大きかったら次の処理をする print("正規製品のほうが人気がある。\n") else # それ以外だったら次の処理をする print("PB商品のほうが人気がある。\n") end # if に対する end 実行結果 pan{c109149}% ./open_compare.rb [~/Ruby] 正規 PB商品 種別 0 2 カード 2 0 カード 1 1 現金 2 2 現金 0 2 カード 1 0 現金 3 1 カード 売り上げは 6160 円です。 電子マネーのポイントは 360 ポイントです。 正規製品のほうが人気がある。 考察 pan{c109149}% bc -l [~/Ruby] 400 * 0 + 320 * 2 640 400 * 2 + 320 * 0 800 400 * 1 + 320 * 1 720 400 * 2 + 320 * 2 1440 400 * 0 + 320 * 2 640 400 * 1 + 320 * 0 400 400 * 3 + 320 * 1 1520 640 + 800 + 720 + 1440 + 640 + 400 + 1520 6160 quit pan{c109149}% bc -l [~/Ruby] 400 * 0 / 10 0 400 * 2 / 10 80.00000000000000000000 400 * 1 / 10 40.00000000000000000000 400 * 2 / 10 80.00000000000000000000 400 * 0 / 10 0 400 * 1 / 10 40.00000000000000000000 400 * 3 / 10 120.00000000000000000000 0 + 80 + 40 + 80 + 0 + 40 + 120 360 quit 実行結果と確かめ算により売り上げとポイントは正しく計算されたと言える。 よってこのプログラムは正確に起動したと言える。 感想 今回一番頑張ったことは、2のBのプログラム問題です。もしというところがどん な条件にしたらいいか、分からなかったので一番頑張った。 参考文献 基礎プログラミング I 第7回「正規表現とRuby言語でのプログラム」券売機のし くみ 西村 まどか先生 http://roy/~madoka/2010/r1/07/07_13_theme_11_vendingmachine.html 基礎プログラミング I 第7回「正規表現とRuby言語でのプログラム」走行距離を 求めるには 西村 まどか先生 http://roy/~madoka/2010/r1/07/07_14_theme_12_distance.html 共同学習者 青木 千紗 大島 藍 久保田 瑛一郎 添付