6 月 6 日のレポート 語学クラス:XXXX語選択XX 系:XXXX系 学籍番号:c106XXXX 氏名:XXXXXXXX 1.A.0xabc = 0b101010111100 16進数から2進数への変換は表を見ると、 a → 1010 b → 1010 c → 1100 となる。 B.0b11010001 + 0b1 - 0b1100 = 0d198 2進数から10進数への変換 0b11010001 = 0d209 1 × 2の7乗 = 128 1 × 2の6乗 = 64 0 × 2の5乗 = 0 1 × 2の4乗 = 16 0 × 2の3乗 = 0 0 × 2の2乗 = 0 0 × 2の1乗 = 0 1 × 2の0乗 = +) 1 --------- 209 0b1 = 0d1 1 × 2の0乗 = 1 0b1100 = 0d12 1 × 2の3乗 = 8 1 × 2の2乗 = 4 0 × 2の1乗 = 0 0 × 2の0乗 = +) 0 ---------- 12 0d209 + 0d1 - 0d12 = 198 【参考HP】 ・西村先生のホームページ 〜2進数、16進数変換(2)〜 http://roy/~madoka/2007/r1/04/04-12-binary2.html ・「Cyber Librarian」 〜2進数、16進数と10進数〜 http://www.asahi-net.or.jp/~AX2S-KMTN/ref/bdh.html 2.選択問題 : A a)作成したデータの内容 名前、貸し出し本数 b)データファイル iimori.dat 佐藤 8 鈴木 5 高橋 3 田中 11 渡辺 1 伊藤 13 山本 9 中村 2 小林 4 c)作成したプログラム rental.rb #!/usr/koeki/bin/ruby a = 0 goukei = 0 tanka = 0 open("iimori.dat","r") do |file| name = Array.new dvd = Array.new while rental = file.gets if /(\S+)\s+(\d+)/=~ rental name[a] = $1 dvd[a] = $2 goukei += $2.to_f a+= 1 end end print("名前\t貸し出し本数") b = 0 while b < a printf("\n%s 樣\t\s\s\s%2d本\n", name[b],dvd[b]) b += 1 end end uriage = goukei*100 tanka = uriage/a printf("\n本日の売り上げ合計: %d円" , uriage) printf("\n本日の客単価: %4.1f円\n", tanka) d)元にしたプログラム及びプログラムの説明 average.rbを元にした。 「データから平均を求めよう」 http://roy/~madoka/2007/r1/08/08-04-addition.html 7行目〜29行目の end まで open("iimori.dat","r") do |file| データファイルを読み込む。("ファイル名","モード")と指定している。rは読み 込み(Read)の意味。 12行目 while rental = file.gets rentalにgetsでデータを一行取りこみ、代入。 13行目 if /(\S+)\s+(\d+)/=~ rental (\S+)は氏名、\s+はスペース、(\d+)はレンタル本数を示す。 16行目 goukei += $2.to_f 小数点で求めるため to_f にした。 31行目 uriage = goukei*100 レンタルは1本100円なので、貸し出し本数の合計×100。 32行目 tanka = uriage/a 客単価を出すには、売り上げから客数を割ればよい。 e)実行結果 irsv{c106179}% ./rental.rb [~/Ruby] 名前 貸し出し本数 佐藤 樣 8本 鈴木 樣 5本 高橋 樣 3本 田中 樣 11本 渡辺 樣 1本 伊藤 樣 13本 山本 樣 9本 中村 樣 2本 小林 樣 4本 本日の売り上げ合計: 5600円 本日の客単価: 622.2円 f)考察 売り上げ合計 irsv{c106179}% bc -l [~/Ruby] (8+5+3+11+1+13+9+2+4)*100 5600 客単価 irsv{c106179}% bc -l [~/Ruby] (5600/9) 622.22222222222222222222 選択問題 : B a)作成したデータの内容 ランチメニューAかB b)データファイル kuromori.dat A B B B A B B A B B A A A c)作成したプログラム cafe.rb #!/usr/koeki/bin/ruby lA = 0 lB = 0 a = 0 tanka = 0 goukei = 0 open("kuromori.dat","r") do |file| while cafe = file.gets if /(\w+)/=~ cafe if $1 == "A" lA += 1 elsif $1 == "B" lB += 1 end a +=1 end end end print("\t** 注文数 **\n") printf("ランチ A : %d セット\nランチ B : %d セット\n",lA,lB) if lA > lB print("\nランチ A の方が注文数が多いです。\n") elsif lA == lB print("\nランチ A とランチ B は同じ注文数です。\n") else lA < lB print("\nランチ B の方が注文数が多いです。\n") end goukei = lA*650 + lB*550 tanka = goukei/a.to_f printf("\n本日の売り上げは、%d円でした。\n",goukei) printf("本日の客単価は、%4.1f円でした。\n",tanka) d)プログラムの説明 27行目 if lA > lB ランチAの注文数がランチBより多い場合。 29行目 elsif lA == lB ランチAとランチBの注文数と同じ場合。 31行目 else lA < lB ランチBの注文数がランチAより多い場合。 35行目 goukei = lA*650 + lB*550 売り上げ合計。ランチAは650円、ランチBは550円なのでそれぞれの個数と掛けて 足す。 36行目 tanka = goukei/a.to_f 客単価 = 売り上げ ÷ 客数。小数点で求めるためにto_fを使った。 e)実行結果 irsv{c106179}% ./cafe.rb [~/Ruby] ** 注文数 ** ランチ A : 6 セット ランチ B : 7 セット ランチ B の方が注文数が多いです。 本日の売り上げは、7750円でした。 本日の客単価は、596.2円でした。 f)考察 売り上げ irsv{c106179}% bc -l [~/Ruby] (6*650)+(7*550) 7750 客単価 irsv{c106179}% bc -l [~/Ruby] (7750/13) 596.15384615384615384615 選択問題 : C a)作成したデータの内容 利用時間、名前、コピーした枚数 b)データファイル copy.dat 07:25 佐藤 8 08:47 鈴木 31 09:11 高橋 3 10:58 田中 11 11:39 渡辺 1 12:03 伊藤 13 14:01 山本 9 17:54 中村 2 19:21 小林 40 c)作成したプログラム copy.rb #!/usr/koeki/bin/ruby sum = 0 cost = 0 okane = 0 goukei = 0 a = 0 b = 0 open("copy.dat","r") do |file| while copy = file.gets if /(\S+)\s+(\S+)\s+(\d+)/=~ copy sum = $3.to_i if sum < 30 cost += sum * 10 a += 1 end if sum >= 30 okane += sum * 7 b += 1 end end end end print("金額\t利用者数\s\s小計\n") printf("10円 \t%d人\t \s\s%d 円\n" ,a ,cost) printf(" 7円 \t%d人\t \s\s%d 円\n" ,b ,okane) goukei = cost + okane printf("\nコピー代の合計は、%d 円 です。\n" ,goukei) d)プログラムの説明 15行目 if sum < 30 コピーが30枚以内であった場合。 19行目 if sum >= 30 30枚以上コピーした場合。 e)実行結果 irsv{c106179}% ./copy.rb [~/Ruby] 金額 利用者数 小計 10円 7人 470 円 7円 2人 497 円 コピー代の合計は、967 円 です。 f)考察 30枚以下の場合 irsv{c106179}% bc -l [~/Ruby] (8+3+11+1+13+9+2)*10 470 30枚以上の場合 irsv{c106179}% bc -l [~/Ruby] (31+40)*7 497 コピー代の合計 irsv{c106179}% bc -l [~/Ruby] (470+497) 967 誰が何枚コピーしたかを出力したかったが、配列を使ってやってみたところ、上手く いかなかったため今回はできなかった。 何故上手くいかなかったのか、原因を考えていきたい。 3.感想 while文やif文を組み合わせて使うことで、endが多くなりかなり分かりにくくなるが、 Tabキーを使って適切な場所に揃えることで分かりやすくなった。 こういった基礎のことをしっかりやれば、小さなミスでプログラムが実行できな いということもなくなると思うので、今後も気を付けていきたいと思う。