6月6日のレポートについて XXXX語 XXXX系 C106XXXX XXXXXXXX 1. A.0xabc = 0b?? まず16進数を10進数に変換する。 http://roy/~madoka/2007/r1/04/04-12-binary2.html の対応表を参考にする。 表を参考にすると、 a = 10 b = 11 c = 12 であるとわかる。 0xabc = a × 16の2乗 + b × 16の1乗 + c = 10 × 256 + 11 × 16 + 12 = 2560 + 176 + 12 = 2748 よって、0d2748 となる。 次にこれを2進数に変換する。 2748 ÷ 2 = 1374 余り 0 1374 ÷ 2 = 687 余り 0 687 ÷ 2 = 343 余り 1 343 ÷ 2 = 171 余り 1 171 ÷ 2 = 85 余り 1 85 ÷ 2 = 42 余り 1 42 ÷ 2 = 21 余り 0 21 ÷ 2 = 10 余り 1 10 ÷ 2 = 5 余り 0 5 ÷ 2 = 2 余り 1 2 ÷ 2 = 1 余り 0 よって、0b101010111100 となる。 B.0b11010001 + 0b1 - 0b1100 = 0d?? 2進数を10進数に変換する。 0b11010001( 0 の計算は省略) = 1 × 2の7乗 + 1 × 2の6乗 + 1 × 2の4乗 + 1 × 2の0乗 = 128 + 64 + 16 + 1 = 209 0b1 = 0d1 0b1100 = 1 × 2の3乗 + 1 × 2の2乗 = 8 + 4 = 12 209 + 1 - 12 =198 よって、0d198 となる。 2. A. 作成したデータ 借りた本数 日数 Aさん 3 2 Bさん 10 7 Cさん 5 5 Dさん 11 2 Eさん 8 8 Fさん 2 1 Gさん 9 6 Hさん 1 1 Iさん 11 8 Jさん 4 3 Kさん 7 6 作成したプログラム #!/usr/koeki/bin/ruby a = 0 # 人数 a の初期化 sum = 0 # 和 sum の初期化 average = 0 # 平均 average の初期化 while line = gets # line で1行ずつ読みこむ if /\S+\s+(\d+)\s+(\d+)/ =~ line # while - end sum += $1.to_i * $2.to_i * 100 # 借りた本数×日数 小数点切り捨て a += 1 # a に1を加える end # if - end end average = sum/a # 総和÷人数 printf("この日の総売り上げは %d 円でした。\n",sum) # プリント文 printf("この日の客単価は %d 円でした。\n",average) # プリント文 実行結果 irsv{c106175}% ./rental.rb iimori.dat [~/Ruby] この日の総売り上げは 38600 円でした。 この日の客単価は 3509 円でした。 bc -l を使って確認する。 結果画面 irsv{c106175}% bc -l (3*2*100)+(10*7*100)+(5*5*100)+(11*2*100)+(8*8*100)+(2*1*100)+(9*6*100)+(1*1*100)+(11*8*100)+(4*3*100)+(7*6*100) 38600 38600/11 3509.09090909090909090909 計算は正しかった。 参考 授業の中で作成した average.rb を下敷きにした。 B. 作成したデータ ある1日の伝票 A A B B A A A B A A B A B B 作成したプログラム #!/usr/koeki/bin/ruby a = 0 # 人数 a の初期化 sum = 0 # 和 sum の初期化 average = 0 # 平均 average の初期化 客単価 lunchA = 0 lunchB = 0 while line = gets # line で1行ずつ読みこむ if /(\S+)/ =~ line # while - end if $1 == "A" # if - end lunchA += 1 elsif $1 == "B" lunchB +=1 end a += 1 # a に1を加えていく end end sum = lunchA * 650 + lunchB * 550 # 注文のあったランチの合計 average = sum/a # 総和÷人数 if lunchA > lunchB print("この日はランチAの注文が多かったみたいです。\n") elsif lunchA == lunchB print("この日はどちらのランチも注文数が同じでした。\n") else lunchA < lunchB print("この日はランチBの注文が多かったみたいです。\n") end printf("%d 人来店しました。総売り上げは %d 円です。\n",a,sum) # プリント文 printf("1人あたりの平均は %d 円です。\n",average) # プリント文 実行結果 irsv{c106175}% ./cafe.rb kuromori.dat [~/Ruby] この日はランチAの注文が多かったみたいです。 14 人来店しました。総売り上げは 8500 円です。 1人あたりの平均は 607 円です。 確認画面 bc -l で再計算 irsv{c106175}% bc -l (650*8)+(550*6) 8500 8500/14 607.14285714285714285714 計算は正しかった。 参考 授業の中で使用した average.rb と rental.rb を下敷きにした。 3.感想 進数の計算まではあまり頭を悩ますことなく問題を解くことができたが、プログ ラムを作成するところまできたら、まず客単価の意味がわからない時点でつまず いた。とたんに訳がわからなくなってしまったがなんとか終えることができた。 \S+ \s+ \d+ の使い方がようやくわかってきた。