語学クラス:XXXX語XX 系: XXXX系 学籍番号:c106XXXX 氏名:XXXXXXXX 1. 過程を示しながら答えよ。 A. 0xabc = 0b?? = 0b(1010 1011 1100) = 0b101010111100 証明 irsv{c106182}% ruby -e "printf(\"%x\n\" , 0b101010111100)" [~] abc B. 0b11010001 + 0b1 - 0b1100 = 0d?? 0b11010001 = 0d( 128 + 64 + 16 + 1 ) = 0d209 0b1 = 0d1 0b1100 = 0d( 8 + 4 ) = 0d12 0d( 209 + 1 - 12 )=198 証明 irsv{c106182}% ruby -e "printf(\"%d\n\" , 0b11010001+0b1-0b1100)" [~] 198 参考 http://ja.wikipedia.org/wiki/%E5%8D%81%E5%85%AD%E9%80%B2%E6%95%B0 2. できるところまで答えよ。考察では bc -l を使って確認する。 必ず計算して調べること。自作のデータもプログラムも忘れずに添付する。 A. 飯森山にあるレンタルビデオ屋の売り上げ伝票をまとめたデータ iimori.dat について、その日の売り上げと客単価を計算させるプログラム。 貸し出しは 1 日 1 本あたり 100 円である。データは自分で作成する。 6 行以上のデータとする。 rental.rb (C+) #rental.rb# #!/usr/koeki/bin/ruby open("iimori.dat","r") do |iimori| while rental = iimori.gets if /(\S+)\s+(\d+)\s+(\d+)/ =~ rental printf("%s 売上は %s円 客単価は%4.1f円\n",$1,$2,$2.to_i/$3.to_i) end end end #rental.rb# データの並びは 日付 売上 客数 #iimori.dat# 0601 13400 69 0602 8200 44 0603 9400 52 0604 12100 61 0605 5500 29 0606 8800 45 #iimori.dat# 。 参考/元にしたプログラム 特になし。 実行結果 irsv{c106182}% ./rental.rb [~/Ruby] 0601 売上は 13400円 客単価は194.0円 0602 売上は 8200円 客単価は186.0円 0603 売上は 9400円 客単価は180.0円 0604 売上は 12100円 客単価は198.0円 0605 売上は 5500円 客単価は189.0円 0606 売上は 8800円 客単価は195.0円 証明 irsv{c106182}% bc -l [~/Ruby] 13400/69 194.20289855072463768115 8200/44 186.36363636363636363636 9400/52 180.76923076923076923076 12100/61 198.36065573770491803278 5500/29 189.65517241379310344827 8800/45 195.55555555555555555555 考察 最初、切り出したデータ $* を整数に変換せずに計算していたので、 計算が出来ずに苦労した。 B. 2 つのランチメニュー (A: 650 円, B: 550 円) しかない黒森のオープンカフェ。 片方を残し、片方を新メニューに入れ替えたい。売り上げ伝票 kuromori.dat から、 総売り上げ、客単価、どちらのランチメニューの注文が多いかが分かる プログラム cafe.rb (B+)。データは自分で作ってよい。データ数は少なくとも 6 行以上。 データの並びは 日付 Aランチの注文数 Bランチの注文数 来客数 #kuromori.dat# 0601 10 9 20 0602 11 11 22 0603 7 9 18 0604 10 11 17 0605 12 12 25 0606 8 10 15 #kuromori.dat# #cafe.rb# #!/usr/koeki/bin/ruby a = 0 b = 0 i = 0 open("kuromori.dat","r") do |kuromori| while denpyo = kuromori.gets if /(\S+)\s+(\d+)\s+(\d+)\s+(\d+)/ =~ denpyo a += $2.to_i b += $3.to_i i += $4.to_i end end end printf("Aランチは %d の注文があり、 %d の売り上げでした\n",a,aa=a*650) printf("Bランチは %d の注文があり、 %d の売り上げでした\n",b,bb=b*550) printf("来客数は %d 人で、売上げは %d 円でした\n",i,c=aa+bb) printf("客単価は %4.1f 円です\n",c/i) if a>b print("Aランチを残しBランチを入れ替えます\n") else print("Bランチを残しAランチを入れ替えます\n") end #cafe.rb# 参考/元にしたプログラム 特になし 実行結果 irsv{c106182}% ./cafe.rb [~/Ruby] Aランチは 58 の注文があり、 37700 の売り上げでした Bランチは 62 の注文があり、 34100 の売り上げでした 来客数は 117 人で、売上げは 71800 円でした 客単価は 613.0 円です Bランチを残しAランチを入れ替えます 証明 irsv{c106182}% bc -l [~/Ruby] (10+11+7+10+12+8)*650 37700 (9+11+9+11+12+10)*550 34100 37700+34100 71800 71800/(20+22+18+17+25+15) 613.67521367521367521367 考察 rental.rbのprintf文をループの外に移動した後IF文を挿入しただけなので簡単だった。 C. あるコピー機は、1 枚印刷するときには 10 円のコストがかかる。 ところが連続で 30 枚以上印刷すると 7 円で済む。 コピー機で誰が何枚つくったかの情報を読みこんで、 コピー機の使用にいくらかかったのか調べよ。 コピー使用データ copy.dat は 6 行以上であれば書式自由。 データの並びは 時刻 名前 枚数 #copy.dat# 08:35 Aizawa 4 08:48 Kato 5 09:01 Sato 23 10:23 Tanaka 10 11:30 Nakazima 52 15:39 Hayasaka 3 16:20 Maeda 8 #copy.dat# #copy.rb# #!/usr/koeki/bin/ruby open("copy.dat","r") do |copy| while list = copy.gets if /(\S+)\s+(\S+)\s+(\d+)/ =~ list printf("時刻 %s に %s\t は %s\t 枚を",$1,$2,$3) if 9 < $3.to_i printf(" %d\t円でコピーした\n",$3.to_i*7) else printf(" %d\t円でコピーした\n",$3.to_i*10) end end end end #copy.rb# 参考/元にしたプログラム 無し 実行結果 irsv{c106182}% ./copy.rb [~/Ruby] 時刻 08:35 に Aizawa は 4 枚を 40 円でコピーした 時刻 08:48 に Kato は 5 枚を 50 円でコピーした 時刻 09:01 に Sato は 23 枚を 161 円でコピーした 時刻 10:23 に Tanaka は 10 枚を 70 円でコピーした 時刻 11:30 に Nakazima は 52 枚を 364 円でコピーした 時刻 15:39 に Hayasaka は 3 枚を 30 円でコピーした 時刻 16:20 に Maeda は 8 枚を 80 円でコピーした 証明 irsv{c106182}% bc -l [~/Ruby] 4*10 40 5*10 50 23*7 161 10*7 70 52*7 364 3*10 30 8*10 80 考察 整数への変換とIF文の使い方を間違えなければ簡単なプログラムだった。 D 時間が無いのでDを飛ばした。 駅名をユーザーに求めて入力された駅名から検索し、 駅名と距離を返す関数を書けば綺麗なプログラムになると思った。 関数宣言 変数宣言 出発駅を求める関数 目的駅を求める関数 距離が大きい方から距離がすくない方を引く 100+距離*20で大人料金 3. 感想。一番頑張ったことを中心に、前向きな感想にすること。 今回の課題は前回までに習った事が中心だったのであまり資料を見ずに作ること が出来た。 時間が取れず、中途半端な形で終わらせてしまったので次からは余裕を持って課 題にのぞみたい。