第7回 基礎プログラミング I レポート課題 氏名: XXXXXXXXX 学籍番号:C109XXX 語学クラス:中国語I コース(系):地域共創コース 1、筆記問題 A.0b11110110 11110110を4桁に区切る 1111,0110と計算する 1111 =(1*2^3) + (1*2^2) + (1*2^1) + (1*2^0) = 8 + 4 + 2 + 1 = 15 0110 =(0*2^3) + (1*2^2) + (1*2^1) + (0*2^0) = 0 + 4 + 2 + 0 = 6 0b11110110 = 0x156 15を対応表で確認するとFである よって 0x156 = 0xF6 B.0d256 0d256を16進数に変換する 256 256 / 16 = 16 余り 0 16 / 16 = 1 余り 0 1 / 16 = 0 余り 1 0d256 = 0x100 10進数 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 2進数 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 16進数 0 1 2 3 4 5 6 7 8 9 A B C D E F 2、プログラム問題 << A問題 プログラム(open_battery.rb) >> データを読み込み、単価と売上げを求めるプログラムを作成した ・プログラム本体 #!/usr/koeki/bin/ruby type = Array.new # typeという配列 sales = Array.new # salesという配列 totalprice = 0 # totalpriceの初期値 i = 0 # 配列は0から始まる open("battery.dat" , "r") do |dry| # battery.datを読み込んで変数dryにする while open = dry.gets # getsでとりこんだものを変数dryに代入する if /(\S+)\s+(\d+)/ =~ open # 文字 数値の順番で読み込む type[i] = $1 # type[i]の中に(\S+)をとりこむ sales[i] = $2.to_f # sales[i]の中に(\d+)をとりこむ if type[i] == "A" # もしtype[i]がAだった場合 x = 400 * sales[i] # 計算式をxに置き換える elsif type[i] == "B" # もしtype[i]がBだった場合 x = 300 * sales[i] # 計算式をxに置き換える else # もしtype[i]がそれ以外だった場合 x = 50 * sales[i] # 計算式をxに置き換える end # 場合分けの終了 totalprice += x # 計算した値を足していく i += 1 # iに1を足していく end # if /(\S+)\s+(\d+)/ =~ openのend end # 繰り返しの終了 end # openに対するend k = 0 # 行は0から始まる print("1日の売上げ数\n") print("\nタイプ\t\t数量\n") while k < type.length # typeの中に入ってる個数を返す printf("%-10s\t%d\n", type[k], sales[k]) # 自分の作ったデータを読み込ませる k += 1 # kに1を足していく end # 繰り返しの終了 price = totalprice / 15 # 客単価を計算 printf("1日の客単価は%3.1f円\n", price) # 整数3桁、小数点第一位まで printf("1日の売上げは%d円\n", totalprice) # 整数 ・変更点 もとにしたプログラム(write_ticket.rb) 追加した箇所は以下のとおりである <追加1> if type[i] == "A" # もしtype[i]がAだった場合 x = 400 * sales[i] # 計算式をxに置き換える elsif type[i] == "B" # もしtype[i]がBだった場合 x = 300 * sales[i] # 計算式をxに置き換える else # もしtype[i]がそれ以外だった場合 x = 50 * sales[i] # 計算式をxに置き換える end # 場合分けの終了 totalprice += x # 計算した値を足していく <追加2> totalprice = 0 # totalpriceの初期値 <追加3> price = totalprice / 15 # 客単価を計算 printf("1日の客単価は%3.1f円\n", price) # 整数3桁、小数点第一位まで printf("1日の売上げは%d円\n", totalprice) # 整数 ・実行結果 pan{c109001}% ./open_battery.rb [~/Ruby] 1日の売上げ数 タイプ 数量 A 3 C 2 A 2 B 1 C 3 B 2 A 3 C 3 A 2 B 1 B 2 C 3 A 2 C 3 A 3 1日の客単価は566.7円 1日の売上げは8500円 ・考察 プログラムで客単価、売上げの計算を行なったが正しく計算されているか分から ない。そこで、bc -lで確かめ算を行なった。 pan{c109001}% bc -l [~/Ruby] (3*400) + (2*50) + (2*400) + (1*50) + (3*300) + (2*50) + (3*400) + (3*50) + (2*400) + (1*300) + (2*300) + (3*50) + (2*400) + (3*50) + (3*400) 8500 8500 / 15 566.66666666666666666666 quit 実行結果と確かめ算により、売上げ値はきちんと計算された。 客単価は566.66666666666666666666と計算され、小数点第二位を四捨五入すると 556.7となるのでプログラムの計算と一致する。よって、このプログラムは正確に機能し たといえる。 << B問題 プログラム(open_six.rb) >> データを読み込み、単価と売上げを求め、価格を変更した場合の売上げの変化を調査するプログラムを作成した ・プログラム本体 #!/usr/koeki/bin/ruby type = Array.new # typeという配列 sales = Array.new # salesという配列 totalprice = 0 # totalpriceの初期値 i = 0 # 配列は0から始まる open("battery.dat" , "r") do |dry| # battery.datを読み込んで変数dryにする while open = dry.gets # getsでとりこんだものを変数dryに代入する if /(\S+)\s+(\d+)/ =~ open # 文字 数値の順番で読み込む type[i] = $1 # type[i]の中に(\S+)をとりこむ sales[i] = $2.to_f # sales[i]の中に(\d+)をとりこむ if type[i] == "A" # もしtype[i]がAだった場合 x = 400 * sales[i] # 計算式をxに置き換える elsif type[i] == "B" # もしtype[i]がBだった場合 x = 300 * sales[i] # 計算式をxに置き換える else # もしtype[i]がそれ以外だった場合 x = 50 * sales[i] # 計算式をxに置き換える end # 場合分けの終了 totalprice += x # 計算した値を足していく i += 1 # iに1を足していく end # if /(\S+)\s+(\d+)/ =~ openのend end # 繰り返しの終了 end # openに対するend k = 0 # 行は0から始まる print("1日の売上げ数\n") print("\n\タイプt\t数量\n") while k < type.length # typeの中に入ってる個数を返す printf("%-10s\t%d\n", type[k], sales[k]) # 自分の作ったデータを読み込ませる k += 1 # kに1を足していく end # 繰り返しの終了 price = totalprice / 15 # 客単価を計算 printf("1日の客単価は%3.1f円\n", price) # 整数3桁、小数点第一位まで printf("1日の売上げは%d円\n", totalprice) # 整数 typee = Array.new # typeeという配列 saless = Array.new # salessという配列 totalpricee = 0 # totalpriceeの初期値 n = 0 # 配列は0から始まる open("battery.dat" , "r") do |dryy| # battery.datを読み込んで変数dryyにする while open = dryy.gets # getsでとりこんだものを変数dryyに代入する if /(\S+)\s+(\d+)/ =~ open # 文字 数値の順番で読み込む typee[n] = $1 # typee[n]の中に(\S+)をとりこむ saless[n] = $2.to_f # saless[n]の中に(\d+)をとりこむ if typee[n] == "A" # もしtypee[n]がAだった場合 x = 400 * saless[n] # 計算式をxに置き換える elsif typee[n] == "B" # もしtypee[n]がBだった場合 if saless[n] <= 1 # もしsalessが1以下だった場合 a = 20 # 値引の数値 elsif saless[n] >= 2 # もしsalessが2以上だった場合 a = 60 # 値引の数値 end # パックの個数の場合分けの終了 x = 300-a * saless[n] # 計算式をxに置き換える else # もしtypee[n]がそれ以外だった場合 x = 50 * saless[n] # 計算式をxに置き換える end # 場合分けの終了 totalpricee += x # 計算した値を足していく i += 1 # iに1を足していく end # if /(\S+)\s+(\d+)/ =~ openのend end # 繰り返しの終了 end # openに対するend pricee = totalpricee / 15 # 客単価を計算 print("\nBを1パック買うと20円値引、2パック以上買うと60円値引にした場合\n") printf("1日の客単価は%3.1f円\n", pricee) # 整数3桁、小数点第一位まで printf("1日の売上げは%d円\n", totalpricee) # 整数 ・変更点 もとにしたプログラム(open_battery.rb) 追加した箇所は以下のとおりである <追加1> elsif typee[n] == "B" # もしtypee[n]がBだった場合 if saless[n] <= 1 # もしsalessが1以下だった場合 a = 20 # 値引の数値 elsif saless[n] >= 2 # もしsalessが2以上だった場合 a = 60 # 値引の数値 end # パックの個数の場合分けの終了 x = 300-a * saless[n] # 計算式をxに置き換える else # もしtypee[n]がそれ以外だった場合 x = 50 * saless[n] # 計算式をxに置き換える end # 場合分けの終了 <追加2> print("\nBを1パック買うと20円値引、2パック以上買うと60円値引にした場合 \n") ・実行結果 pan{c109001}% ./open_six.rb [~/Ruby] 1日の売上げ数 タイプ 数量 A 3 C 2 A 2 B 1 C 3 B 2 A 3 C 3 A 2 B 1 B 2 C 3 A 2 C 3 A 3 1日の客単価は566.7円 1日の売上げは8500円 Bを1パック買うと20円値引、2パック以上買うと60円値引にした場合 1日の客単価は548.0円 1日の売上げは8220円 ・考察 プログラムでBを1パック買うとき20円引、2パック以上買うと60円値引にした場 合の客単価、売上げの計算を行なったが正しく計算されているか分からない。 そこで、bc -lで確かめ算を行なった。 pan{c109001}% bc -l [~/Ruby] (3*400) + (2*50) + (2*400) + (1*50) + (2*240) + (1*280) +(2*50) + (3*400) + (3*50) + (2*400) + (1*280) + (2*240) + (3*50) + (2*400) + (3*50) + (3*400) 8220 8220 / 15 548.00000000000000000000 quit 実行結果と確かめ算により、売上げ値、客単価ともにきちんと計算された。よっ て、このプログラムは正確に機能したといえる。 << C問題 プログラム(open_compare.rb) >> データを読み込み、商品の売り上げ料金・ポイント・個数の合計を求める。さ らにどちらが人気商品が分析するプログラムを作成した。 ・プログラム本体 #!/usr/koeki/bin/ruby rgoods = Array.new # rgoodsという配列 pbgoods = Array.new # pbgoodsという配列 type = Array.new # typeという配列 x = 0 # 合計の値 i = 0 # 配列の値 point = 0 # pointの値 rtotal = 0 # rtotalの値 pbtotal = 0 # pbtotalの値 open("open_compare.dat" , "r") do |dry| # open_compare.datで読み込んでdryに変換する while compare = dry.gets # getsでとりこんだものを変数dryに代入する if /(\d+)\s+(\d+)\s+(\S+)/ =~ compare # 数値 数値 文字の順番で取り込む rgoods[i] = $1.to_i # rgoods[i]の中に(\d+)をとりこむ pbgoods[i] = $2.to_i # sales[i]の中に(\d+)をとりこむ type[i] = $3 # type[i]の中に(\S+) x += rgoods[i] * 400 + pbgoods[i] * 320 # 売上の合計の計算 if type[i] == "カード" # もしtype[i]がカードだった場合 if rgoods[i] >= 1 # もしrgoodsが1以上だった場合 point += rgoods[i] * 400 / 10 # pointの合計の計算 else # もしtype[i]がそれ以外だった場合 point += 0 # pointの計算 end # pointの計算の終了 end # 場合分けの終了 rtotal += rgoods[i] # 正規品の個数の合計 pbtotal += pbgoods[i] # PB商品の個数の合計 n += 1 # nに1を足していく end # if /(\d+)\s+(\d+)\s+(\S+)/ =~ compareのend end # 繰り返しの終了 end # openに対するend k = 0 # 行は0から始まる print("購入量\n") print("\n正規品\tPB商品\t支払方法\n") while k < rgoods.length # rgoodsの中に入っている個数を返す printf("%d\t%d\t%s\n", rgoods[k], pbgoods[k], type[k]) # 自分の作ったデータを読み込ませる k += 1 # kに1を足していく end # 繰り返しの終了 printf("合計料金%d円\n", x) # 整数 printf("合計ポイント%dP\n", point) # 整数 printf("\n正規品の個数%d個\tPB商品の個数%d個\n", rtotal, pbtotal) # 整数 if rtotal > pbtotal # もしrtotalの個数がpbtotalの個数より多かった(以上)だった場合 print("正規品のほうが人気である\n") elsif rtotal < pbtotal # もしrtotalの個数がpbtotalの個数より少なかった(以下)だった場合 print("PB商品のほうが人気である\n") end # 場合分けの終了 ・変更点 もとにしたプログラム(write_ticket.rb) 追加した箇所は以下のとおりである <追加1> type = Array.new # typeという配列 x = 0 # 合計の値 i = 0 # 配列の値 point = 0 # pointの値 rtotal = 0 # rtotalの値 pbtotal = 0 # pbtotalの値 <追加2> type[i] = $3 # type[i]の中に(\S+) <追加3> x += rgoods[i] * 400 + pbgoods[i] * 320 # 売上の合計の計算 if type[i] == "カード" # もしtype[i]がカードだった場合 if rgoods[i] >= 1 # もしrgoodsが1以上だった場合 point += rgoods[i] * 400 / 10 # pointの合計の計算 else # もしtype[i]がそれ以外だった場合 point += 0 # pointの計算 end # pointの計算の終了 end # 場合分けの終了 rtotal += rgoods[i] # 正規品の個数の合計 pbtotal += pbgoods[i] # PB商品の個数の合計 <追加4> printf("合計料金%d円\n", x) # 整数 printf("合計ポイント%dP\n", point) # 整数 printf("\n正規品の個数%d個\tPB商品の個数%d個\n", rtotal, pbtotal) # 整数 <追加5> if rtotal > pbtotal # もしrtotalの個数がpbtotalの個数より多かった(以上)だった場合 print("正規品のほうが人気である\n") elsif rtotal < pbtotal # もしrtotalの個数がpbtotalの個数より少なかった(以下)だった場合 print("PB商品のほうが人気である\n") end # 場合分けの終了 ・実行結果 pan{c109001}% ./open_compare.rb [~/Ruby] 購入量 正規品 PB商品 支払方法 0 1 現金 1 0 カード 2 1 現金 1 2 現金 0 1 カード 2 0 カード 1 1 現金 2 1 カード 0 2 現金 2 1 現金 合計料金7600円 合計ポイント200P 正規品の個数11個 PB商品の個数10個 正規品のほうが人気である ・考察 プログラムで合計料金、合計ポイント、個数の計算を行なったが正しく計算され ているか分からない。そこで、bc -lで確かめ算を行なった。 pan{c109001}% bc -l [~] 0 + 1 + 2 + 1 + 0 + 2 + 1 + 2 + 0 + 2 11 11 * 400 4400 1 + 0 + 1 + 2 + 1 + 0 + 1 + 1 + 2 + 1 10 10 * 320 3200 4400 + 3200 7600 1 * 400 / 10 40.00000000000000000000 0 * 400 / 10 0 2 * 400 / 10 80.00000000000000000000 2 * 400 / 10 80.00000000000000000000 40 + 0 + 80 + 80 200 quit 実行結果と確かめ算により、合計料金、合計ポイント、個数がきちんと計算され た。よってこのプログラムは正確に機能したといえる。 3、感想 if type[i] == "カード" # もしtype[i]がカードだった場合 if rgoods[i] >= 1 # もしrgoodsが1以上だった場合 point += rgoods[i] * 400 / 10 # pointの合計の計算 else # もしtype[i]がそれ以外だった場合 point += 0 # pointの計算 end # pointの計算の終了 end # 場合分けの終了 上記のプログラムはポイントを計算した値は足されていく。また、カードのとき だけこれが実行される。このポイントが10円あたり2ポイントつくプログラムを 作るのを頑張った。 また、bc -lで計算するのは大変だったけど諦めずできた。 今回の講義でやったことを変更し、プログラムを作成することができた。授業で はわからなかったことが、課題をやっている間に理解できたので嬉しかった。課 題をじっくりすることで、わかることがでてくるので来週の課題もじっくり理解 してがんばりたい。 4、参考文献 webページ CyberLibrarian図書館員のコンピュータ基礎講座 2進数、16進数と10進数 http://www.asahi-net.or.jp/~ax2s-kmtn/ref/bdh.html 著者:上綱 秀治 ---------------------------------------------------------------------------- 基礎プログラミング I 第7回 正規表現と Ruby 言語でのプログラミング 第 7回目次 「券売機のしくみ」 http://roy.e.koeki-u.ac.jp/~madoka/2010/r1/07/07_13_theme_11_vendingmachine.html 「自動印刷を行うには」 http://roy.e.koeki-u.ac.jp/~madoka/2010/r1/07/07_15_theme_13_filewrite.html 著者:西村 まどか ----------------------------------------------------------------------------- 共同学習者:大島 藍 久保田 瑛一郎 横山 広樹 協力してくれた先輩:工藤 智也 さん 大沼 拓海 さん