第7回 基礎プログラミング I レポート課題 氏名: XXXXXXXX 学籍番号:c109XXX 語学クラス:英語1 コース:社会福祉 1 筆記問題 次の2問を解答する際に、以下の変換表を用いる(第1回レポートより再掲) 10進 16進 2進 0 0 0 1 1 1 2 2 10 3 3 11 4 4 100 5 5 101 6 6 110 7 7 111 8 8 1000 9 9 1001 10 a 1010 11 b 1011 12 c 1100 13 d 1101 14 e 1110 15 f 1111 A 0b11110110を16進数に変換する 11110110 1111 /0110----(1) f / 6-----(2) 説明 (1) 2進数の数字を後から4けたごとに分ける (2) 先に示した変換表を用いて、16進数に変換する よって0xf6となる B 10進数を2進数に変換後、16進数に変換することとする。 0d256という10進数を「2」進数変換するので、「2」で割るが、以下の表記につ いて説明する。(第5回レポートより再掲) ーーーーーーーーーーーーーーーーーーーーーーーーーーー 例 2 / 7 / 3---1 7を2で割ったら3あまり1である。「----- 数字」は余りを示す。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーー 2/256 2 /128---0 ↑ 2/ 64----0 ↑ 2 /32----0 ↑ 2 /16----0 ↑ 2 /8-----0 ↑ 2 /4-----0 ↑ 2 /2-----0 ↑ /1-----0 ↑ →→→→ 矢印の方向へ、余りを読んでいく よって、0b10000000となる 16進数に変換する 100000000 1 /0000 /0000---(1) 1 / 0 / 0----(2) 説明 (1) 変換したい2進数を後から4けたごとに分ける (2) 分けた2進数の数字から変換表を用いて16進数に変換する よって0x100となる。 2 プログラム問題 a 考えた設定 山形商店は、Aパック、Bパック、Cパックそれぞれの乾電池を売り上げた。ある 日の取引の内容を転記し、売上帳を作成した。open_battery.rb bもとにしたプログラム 基本的には、write_tocket.rbを参考に、変数を変更し、更にlengthは用いてい ない。さらに簿記を行なう際に使用される、締切線も再現した。さらに、取引日 も入力できるようにした。 c 作成したプログラム battery.dat A 2 B 3 C 8 A 5 B 10 A 3 C 12 A 2 B 3 B 21 open_battery.rb #!/usr/koeki/bin/ruby #インタプリタ宣言文 type =Array.new #後でデータをとって来て、それはtypeとする kosuu = Array.new #ータをとって来て、それはkosuuとする n = 0 #一つ一つの配列に番号があり、それは0番目から始める totala =0 #合計を求める上での仮の袋(仮の変数) aprice = 400 #Aセットは1つ400円である bprice = 300 #Bセットは1つ300円である cprice = 50 #Cセット(バラ売り)は1つ300円である total = 0 #合計を求める際に使用 kyakutanka = 0 #客単価を求める最に使用 STDERR.print("本日の「月」を入力してください") #月を入力させる month = gets.to_i #それをmonthに入れ、その数字は10進数と見なし、整数とする STDERR.print("本日の「日にち」を入力してください") #日にちを入力させる day = gets.to_i #それをdayに入れ、その数字は10進数と見なし、整数とする open("battery.dat","r") do |den| #「外部データ」とはbattery.datというように設定し、そこからどんどんデータをとって来る(読み込み)。そのデータは「den」とする a = 0 #aとは取引Noのことである printf("売上帳\t%d月\t%d日\n",month,day) #このプログラム(書類)は何かを表示させる print("----------------------------------------------\n") #レイアウト線を表示 while battery = den.gets #そのdenをbatteryに入れる if /(\S+)\s+(\d+)/ =~ battery #そのdenの配列が文字→空白→文字だったら type[n] = $1 #外部データの1つ目の要素をtypeとする kosuu[n] =$2.to_i #外部データの2つ目の要素をkosuuをとする if type[n] =="A" #もしtypeという配列に"A"という文字がみつかったら(Aセットだったら) totala = aprice * kosuu[n] #Aの単価とその個数を掛け合わせて、それをtotalaという仮の変数(仮の袋)に入れる printf("取引No.%-10d\t%-10s\t%d\n",a+=1,type[n],kosuu[n]) #個別の取引内容表示 total += totala.to_f #totalaに入っていた数字をtotalに入れ、それを小数とする(客単価=平均を求めるため) elsif type[n] =="B" #もしtypeにBという文字が見つかったら(Bセットだったら) totala = bprice * kosuu[n] #Bの単価とその個数を掛け合わせて、それをtotalaという仮の変数(仮の袋)に入れる printf("取引No.%-10d\t%-10s\t%d\n",a+=1,type[n],kosuu[n]) #個別の取引内容表示 total += totala.to_f #totalaに入っていた数字をtotalに入れ それを小数とする(客単価=平均を求めるため) else type[n] =="C" #もしCという文字が見つかったら(Cセットだったら) totala =cprice * kosuu[n] #Cの単価とその個数を掛け合わせて、それをtotalaという仮の変数(仮の袋)に入れる printf("取引No.%-10d\t%-10s\t%d\n",a+=1,type[n],kosuu[n]) #個別の取引内容表示 total += totala.to_f #totalaに入っていた数字をtotalに入れ、それを小数とする(客単価=平均を求めるため) end #ifのおわり n += 1 #nを1つ足すことによって次の配列に移る end #ifのおわり end #whileのおわり end #openのおわり print("----------------------------------------------\n") #レイアウト線 printf("総売上高\t %d円\n",total) #結果表示 kyakutanka= total/n #客単価を求める printf("客単価\t%2.1f円\n",kyakutanka) #結果表示 print("----------------------------------------------\n----------------------------------------------\n") #レイアウト線(簿記でいう帳簿の締切線) d 実行結果 pan{c109058}% ./open_battery.rb [~/Ruby] 本日の「月」を入力してください12 本日の「日にち」を入力してください5 売上帳 12月 5日 ---------------------------------------------- 取引No.1 A 2 取引No.2 B 3 取引No.3 C 8 取引No.4 A 5 取引No.5 B 10 取引No.6 A 3 取引No.7 C 12 取引No.8 A 2 取引No.9 B 3 取引No.10 B 21 ---------------------------------------------- 総売上高 16900円 客単価 1690.0円 ---------------------------------------------- ---------------------------------------------- e考察 pan{c109058}% bc -l [~/Ruby] 400*2 800 300*3 900 50*8 400 10*300 3000 400*5 2000 3*400 1200 50*12 600 400*2 800 300*3 900 300*21 6300 800+900+400+3000+2000+1200+600+800+900+6300 16900 16900/10 1690.00000000000000000000 quit よってこのプログラムの正確性が示された このプログラムを応用して、マイナスなどを数値の後につければ返品にも対要で きるのではないかと思う。 B問題 a考えた設定 山形商店は期間限定で値引を実施した。その時のプログラム(売上帳)open_six.rbを 作成した。 b元にしたプログラム open_battery.rbを元にした。変更点は主にBの個数の配列を別の変数にコピーし てそこから2つずつ引くことによって「2個買うと」というのを実行させた。 c 作成したプログラム #!/usr/koeki/bin/ruby #インタプリタ宣言文 type =Array.new #後でデータをとって来て、それはtypeとする kosuu = Array.new #データをとって来て、それはkosuuとする n = 0 #一つ一つの配列に番号があり、それは0番目から始める totala =0 #合計を求める上での仮の袋(仮の変数) aprice = 400 #Aセットは1つ400円である bprice = 300-20 #Bセットは1つ300から20円引いた値段である cprice = 50 #Cセット(バラ売り)は1つ300円である total = 0 #合計を求める際に使用 kyakutanka = 0 #客単価を求める最に使用 setkosuu = 0 #2個セット割り引きで使用 waribikiprice = 0 #2個セット割り引きの60円を貯めていくのに使用 STDERR.print("本日の「月」を入力してください") #月を入力させる month = gets.to_i #それをmonthに入れ、その数字は10進数と見なし、整数とする STDERR.print("本日の「日にち」を入力してください") #日にちを入力させる day = gets.to_i #それをdayに入れ、その数字は10進数と見なし、整数とする open("battery.dat","r") do |den| #「外部データ」とはbattery.datというように設定し、そこからどんどんデータをとって来る(読み込み)。そのデータは「den」とする a = 0 #aとは取引Noのことである printf("売上帳\t%d月\t%d日\n",month,day) #このプログラム(書類)は何かを表示させる print("----------------------------------------------\n") #レイアウト線を表示 while battery = den.gets #そのdenをbatteryに入れる if /(\S+)\s+(\d+)/ =~ battery #そのdenの配列が文字→空白→文字だったら type[n] = $1 #外部データの1つ目の要素をtypeとする kosuu[n] =$2.to_i #外部データの2つ目の要素をkosuuをとする if type[n] =="A" #もしtypeという配列に"A"という文字がみつかったら(Aセットだったら) totala = aprice * kosuu[n] #Aの単価とその個数を掛け合わせて、それをtotalaという仮の変数(仮の袋)に入れる printf("取引No.%-10d\t%-10s\t%d\n売上額 %d円\n",a+=1,type[n],kosuu[n],totala) #個別の取引内容表示 total += totala.to_f #totalaに入っていた数字をtotalに入れ、それを小数とする(客単価=平均を求めるため) totala = 0 elsif type[n] =="B" #もしtypeにBという文字が見つかったら(Bセットだったら) setkosuu= kosuu[n] if setkosuu > 1 #もし個数が1以上だったら while setkosuu >1 #setkosuuが1以上のときまで繰り返し setkosuu -= 2 #setkosuuを2個引く(2個で割り引きという意味) waribikiprice += 60 #waribikipriceに60を足す end #whileの終了 else #または(1より小さかったら) break #繰り返しをやめる end #ifの終了 totala = bprice * kosuu[n] -waribikiprice #Bの単価とその個数を掛け合わせて2個セット割り引きの60円を貯めた金額も引いて売上額を引く printf("取引No.%-10d\t%-10s\t%d\n2個セットで割り引き %d円\n売上額 %d円\n",a+=1,type[n],kosuu[n],waribikiprice,totala) #個別の取引内容表示 waribikiprice = 0 total += totala.to_f #totalaに入っていた数字をtotalに入れ それを小数とする(客単価=平均を求めるため) totala = 0 else type[n] =="C" #もしCという文字が見つかったら(Cセットだったら) totala =cprice * kosuu[n] #Cの単価とその個数を掛け合わせて、それをtotalaという仮の変数(仮の袋)に入れる printf("取引No.%-10d\t%-10s\t%d\n売上額 %d円\n",a+=1,type[n],kosuu[n],totala) #個別の取引内容表示 total += totala.to_f #totalaに入っていた数字をtotalに入れ、それを小数とする(客単価=平均を求めるため) totala = 0 end #ifのおわり n += 1 #nを1つ足すことによって次の配列に移る end #ifのおわり end #whileのおわり end #openのおわり print("----------------------------------------------\n") #レイアウト線 printf("総売上高\t %d円\n",total) #結果表示 kyakutanka= total/n #客単価を求める printf("客単価\t%2.1f円\n",kyakutanka) #結果表示 print("----------------------------------------------\n----------------------------------------------\n") #レイアウト線(簿記でいう帳簿の締切線) c実行結果 pan{c109058}% ./open_six.rb [~/Ruby] 本日の「月」を入力してください1 本日の「日にち」を入力してください21 売上帳 1月 21日 ---------------------------------------------- 取引No.1 A 2 売上額 800円 取引No.2 B 3 2個セットで割り引き 60円 売上額 780円 取引No.3 C 8 売上額 400円 取引No.4 A 5 売上額 2000円 取引No.5 B 10 2個セットで割り引き 300円 売上額 2500円 取引No.6 A 3 売上額 1200円 取引No.7 C 12 売上額 600円 取引No.8 A 2 売上額 800円 取引No.9 B 3 2個セットで割り引き 60円 売上額 780円 取引No.10 B 21 2個セットで割り引き 600円 売上額 5280円 ---------------------------------------------- 総売上高 15140円 客単価 1514.0円 ---------------------------------------------- ---------------------------------------------- d考察 bcーlにより試算する pan{c109058}% bc -l [~/Ruby] 400*2 800 280*3-60 780 50*8 400 400*5 2000 280*10-300 2500 3*400 1200 12*50 600 2*400 800 280*3-60 780 280*21-10 5870 280*21-600 5280 800+780+400+2000+2500+1200+600+800+780+5280 15140 15140/10 1514.00000000000000000000 quit よって個のプログラムの正確性が示される 考察として、#の説明の内容を簡単に図式化したいと思う もしBが1以上だったら(2個セット割り引きなので、1では割り引きできないから) ↓ 1以上になるまで繰り返す(2個セット割り引きなので、1では割り引きできないか ら) ↓ さきにBの個数の内容をコピーした変数を2個ずつ減らす(2個セット割り引きなの で、ー2で1回割り引き) ↓ 60を変数にいれてためる(60円ずつ割り引き) ↓ そこで1回につき貯めた、60円を売上高から引く ↓ それを繰り返す 「変数」=0は実行結果に1取引ずつ金額を表示させたいために、使わなくなった 数字を1回0に戻すものである。 e 感想 今回はレイアウトを中心に力を入れた。実際の現場でも施用可能となるように、 日付を入力させるようにし、それが表示させるようにした。もっと余力があれば カレンダーのデータを組み込んで「何曜日」と表示されるようなプログラムを作 りたい。 ちなみにCの問題にもとりかかったが文字化けが途中からひどくなり、完成する ことが出来なかった。 今回は、もちろん完成も大事だが、本物志向の作品を作ることで理解もすすむと改 めて実感したので、次回以降も「本物志向」で「解説は出来るだけくわしく」 「楽しく」頑張って行きたいと思っている。 f 参考文献 西村まどか 2010講義ノート 第7回 券売機のしくみ http://roy/~madoka/2010/r1/07/07_13_theme_11_vendingmachine.html 西村まどか 2010講義ノート 第7回 データを読み込むようにするには http://roy/~madoka/2010/r1/07/07_09_theme_08_fileread.html 協力してくれた先輩: 工藤 智也 先輩 共同学習者: 横山広樹/青木 千紗/大島 藍