第7回 基礎プログラミング I レポート課題 氏名:酒井 春香 学籍番号:c109074A 語学クラス:英語3 コース:政策マネ 1、筆記問題 A、0b11110110 = 0x?? 0bは2進数を表し、0xは16進数を表すので、 2進数から16進数に変換するためには、 まず右から4桁ごとに区切って計算する。 1111 = 1 × 2の3乗 + 1 × 2の2乗 + 1 × 2の1乗 + 1 × 2の0乗 = 8 + 4 + 2 + 1 = 15 16進数では 15 は f となる。 0110 = 0 × 2の3乗 + 1 × 2の2乗 + 1 × 2の1乗 + 0 × 2の0乗 = 0 + 4 + 2 + 0 = 6 よって、0b11110110 = 0xf6 B、0d256 = 0x?? 0dは10進数を表しているので、 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なので、 これを16進数になおすと、 0001 = 1 0000 = 0 0000 = 0 なので、0d256 = 0x100 2、プログラム問題 a、考えた設定 乾電池の売り上げ伝票をまとめたデータについて、その日の売上の合計と客単 価を計算できるプログラム。 b、作成したプログラム #!/usr/koeki/bin/ruby type = Array.new #乾電池のタイプを選ぶ money = Array.new #お金を選ぶ j = 0 #配列の番号 total = 0 #合計 open("battery.dat","r") do |n| #battery.datを読み込ませる while line = n.gets #変数にデータを1行ずつ入れていき、 #データが無くなったら終了する if /(\S)\s+(\d+)/ =~ line #もし文字列、空白、数字だったら #以下のように作動する type[j] = $1 #タイプの数を取りこむ money[j] = $2.to_f #売上数を取りこみ小数点に変換 if type[j] == "A" #もしタイプが A に等しければ x = 400 * money[j] elsif type[j]== "B" #もしタイプが B に等しければ x = 300 * money[j] else #それ以外だったら x = 50 * money[j] end #openに対するend total += x j += 1 end #ifに対するend end #elsifに対するend end #elseに対するend k = 0 printf("売上数\n") while k < type.length #その配列に対して値の数を返し、 # kよりも大きくなったら終了 printf("%-10s\t%d\n",type[k], money[k]) k += 1 end #whileに対するend tanka_d = total / 9 printf("売り上げは %d 円です。\n",total) printf("客単価は %2.1f 円です。\n",tanka_d) 作成したデータ # タイプ # (パック)数売上げ A 1 B 5 C 2 A 3 B 2 C 6 A 4 B 8 C 10 c、もとにしたプログラムからの変更点 授業内で作成したwrite_ticket.rbをもとにした。 ・stop → type に変更。 ・dist → money に変更。 ・i → j に変更。 ・売り上げの合計を出すために total を付け足した。 ・|riku| → |n| に変更。 ・A,B,Cのタイプごとに計算できるようにif,elisif,elseで場合分けをした。 ・客単価を計算できるように tanka_d = total / 9 という計算式を付け足した。 d、プログラムを実行した結果画面 pan{c109074}% ./open_battery.rb [~/Ruby] 売上数 A 1 B 5 C 2 A 3 B 2 C 6 A 4 B 8 C 10 売り上げは 8600 円です。 客単価は 955.6 円です。 e、考察 プログラムを実行して表示された、その日の売り上げ金額と客単価に間違いがな いか確認するためにbc -lで確かめ算を行なった。 ・その日の売り上げ金額 pan{c109074}% bc -l [~/Ruby] 1*400 400 400+5*300 1900 1900+2*50 2000 2000+3*400 3200 3200+2*300 3800 3800+6*50 4100 4100+4*400 5700 5700+8*300 8100 8100+10*50 8600 quit となり、計算の結果と一致するので正しいといえる。 ・客単価 客単価は その日の売り上げ金額 / 客の人数 pan{c109074}% bc -l [~/Ruby] 8600/9 955.55555555555555555555 客単価は小数点第2位を四捨五入すると、 くりあがって955.5になることから、 この結果は正しいといえる。 よって、どちらの計算も正しいことから、 作成したプログラムは正しいといえる。 3、感想 今回一番頑張ったことは、open("battery.dat","r") doでデータを読み込ませ るようにしたことです。講義では付いていくことに一生懸命でうろ覚えの部分 があったが、レポートをやってみて理解できたことが多かった。これからも頑 張っていきたい。 <今回学んだこと> ・ -E:-- … ファイルが保存されているとき。 -E:** … ファイルが保存されていないとき。 ・ open("データ名","r")do || … プログラム本体にデータを読み込ませる。 モードは r で読み込みができる。 ・while 変数 = gets …変数にデータを1行ずつ読み込む。 ・\S … 空白文字以外の文字列が1個以上並んでいるものを探す。 ・\s … 空白文字が1個以上並んでいるものを探す。 <参考文献> 基礎プログラミング I 第7回 正規表現とRuby言語でのプログラミング 西村まどか先生 「データ取りだしプログラム」 http://roy/~madoka/2010/r1/07/07_02_theme_01_egrep.html 「空白を利用してデータを取りだすには」 http://roy/~madoka/2010/r1/07/07_07_theme_06_tab.html 「データを読み込むようにするには」 http://roy/~madoka/2010/r1/07/07_09_theme_08_fileread.html 「候補駅を選べるようにするには」 http://roy/~madoka/2010/r1/07/07_11_theme_09_candidate.html 「券売機のしくみ」 http://roy/~madoka/2010/r1/07/07_13_theme_11_vendingmachine.html <共同学習者> 佐竹 聡美 / 小松 由里