語学クラス:英語XX 系列:XXXX系 学籍番号:c106XXXX 氏名:XXXXXXXX 1.過程を示しながら答えよ。 (1) 0xabc = 0b?? 16進数0xabcを2進数へ変換する。 まず、16進数0xabcを10進数へ変換する。 0xabc = 16**2 * a + 16**1 * b + c #16**0はいらない。 = 256 * a + 16 * b + c となる。そして、この時点でabcを講義で使用した表をもとに10進数へ 変換する。 = 256 * 10 + 16 * 11 + 12 変換するとこのようになる。これを計算すると… = 2560 + 176 + 12 = 2748 となる。これで、16進数から10進数への変換が出来た。 次に、変換した10進数をひたすら2で割り2進数へと変換していく。 2)2748 … 0 ーーー 2)1374 … 0 ーーー 2) 687 … 1 ーーー 2) 343 … 1 ーーー 2) 171 … 1 ーーー 2) 85 … 1 ーーー 2) 42 … 0 ーーー 2) 21 … 1 ーーー 2) 10 … 0 ーーー 2) 5 … 1 ーーー 2) 2 … 0 ーーー 1 計算していくと 101010111100 となる。 よって答えは… 0xabc = 0b101010111100 となる。 (2) 0b11010001 + 0b1 - 0b1100 = 0d?? まず計算式に出てくる数字は全て2進数なので、10進数に変換して計 算していく。 0b11010001 を10進数へ変換。 右から箱にいれる。 すると… 1101 0001 の2つになる。 この2つを、以前講義で使用した16進数の表を用いて変換していく。 変換すると… 1101 0001 ↓ ↓ 13 1 となる。よって 0b11010001は… 0b11010001 =0d13 1 となる。 他のものも同様に変換していく。 0b1は1桁しかないので… 0b1 =0d1 となる。 0b1100は4桁なので単純に変換する。 0b1100 = 0d12 となる。これを式にすると… 0d131 + 0d1 - 0d12 となり、これを計算していく。 0d131 + 0d1 - 0d12 = 0d120 となる。よって答えは… 0b11010001 + 0b1 - 0b1100 = 0d120 A.0d120 しかし、この計算の答えは正しくない。 なぜならば、0b11010001を2進数から10進数へ変換したとしても「13」 と「1」にしかならないからだ。 「131」という数字にはならない。 よって、この式は手計算で答えを出すしかないことに気が付いた。 *手計算* 2進数を10進数へ変換する。 0b11010001は2進数の各桁に2の倍数を掛けた数字なので、右から計算 していく。 0b11010001 = (2**7 * 1)+(2**6 * 1)+(2**5 * 0) +(2**4 * 1)+(2**3 * 0)+(2**2 *0) +(2**1 * 0)+(2**0 * 1) = 128 + 64 + 0 + 16 + 0 + 0 + 0 + 1 = 209 よって0b11010001の答えは… 0b11010001 = 0d209 となる。 ここまで計算すると、表を使った計算と組み合わせて計算できる。 0b1 = 0d1 0d1100 = 0d12 は変わらずに使うことが出来るので、これを利用して計算する。 0d209 + 0d1 - 0d12 = 0d198 と計算できる。 よって答えは… 0b11010001 + 0b1 - 0b1100 = 0d198 A. 0d198 となる。 <参考> http://roy/~madoka/2007/r1/04/04-12-binary2.html ー16 進数のまとめー 2. できるところまで答えよ。 A.飯森山にあるレンタルビデオ屋の売り上げ伝票をまとめたデータiimori.dat 。 その日の売り上げと客単価を計算させるプログラム。 貸し出しは 1 日 1 本あたり 100 円である。 データは自分で作成する。6 行以上のデータとする。 rental.rb (C+) <データ> iimori.dat 名前 本数 貸出日数 成瀬 大輝 10 3 飯田 良子 2 4 伊藤 武史 3 7 伊集院 武久 6 11 宇都宮 舞子 9 1 佐竹 シオリ 7 4 西城 輝彦 4 9 桜塚 麗華 6 5 白鳥 玲子 10 6 藤井 翔 5 1 後野 まつり 2 12 川井 伊代 3 3 <プログラム> rental.rb #!/usr/koeki/bin/ruby m = 0 #人数を0にする sum = 0 #合計を0にする average = 0 #平均を0にする while line = gets #lineを getsしてこい if /\S+\s+\S+\s+(\d+)\s+(\d+)/ =~ line sum += $1.to_i * $2.to_i * 100 #本数×日数×100 = 総売り上げ m += 1 #人数に1を足しなさい end #ifのend end #whileのend average = sum/m #平均 = 総売り上げ÷人数 printf("本日の総売り上げは %d 円です。\n",sum) #総売り上げ表示 printf("本日の客単価は %d 円です。\n",average) #客単価表示 <表示結果> irsv{c106164}% ./rental.rb iimori.dat [~/Ruby] 本日の総売り上げは 32600 円です。 本日の客単価は 2716 円です。 ★総売り上げ★ irsv{c106164}% bc -l [~/Ruby] (10*3*100)+(2*4*100)+(3*7*100)+(6*11*100)+(9*1*100) +(7*4*100)+(4*9*100)+(6*5*100)+(10*6*100)+(5*1*100) +(2*12*100)+(3*3*100) 32600 ★客単価★ 32600/12 2716.66666666666666666666 <確認!!手計算> 総売り上げ料の手計算をするには次の式を使用する。 本数 * 貸出日数 * 100 = その人のレンタル料金 この式で計算をしていくと… 10 * 3 * 100 = 3000 2 * 4 * 100 = 800 3 * 7 * 100 = 2100 6 * 11 * 100 = 6600 9 * 1 * 100 = 900 7 * 4 * 100 = 2800 4 * 9 * 100 = 3600 6 * 5 * 100 = 3000 10 * 6 * 100 = 6000 5 * 1 * 100 = 500 2 * 12 * 100 = 2400 3 * 3 * 100 = 900 となる。出た「その人のレンタル料」を全て足していく。 3000 + 800 + 2100 + 6600 + 900 + 2800 + 3600 + 3000 + 6000 + 500 + 2400 + 900 = 32600 と出る。 よって、表示されたものと同じで本日の総売り上げは 32600 円となる。 次は、客単価をもとめる。 客単価は次の式を使用する。 総売り上げ ÷ お客さんの総人数 = 客単価 この式で計算すると… 32600 / 12 = 2716.66666666… となる。 よって小数点以下を切り捨てて、客単価は表示されたものと同じで 2716円となる。 <考察> 表示結果と確認!!手計算の数値が一緒なのでこのプログラムは正常に機能 していると思います。 B.2つのランチメニュー(A:650円,B:550円)しかない黒森のオープンカフェ。 片方を残し、片方を新メニューに入れ替えたい。 売り上げ伝票 kuromori.dat から、 総売り上げ、客単価、どちらのランチメニューの注文が多いかが分かる プログラム cafe.rb (B+)。データは自分で作ってよい。データ数は少なくとも 6 行以 上。 <データ>kuromori.dat 注文 A A B A B B B A A B A B B B A <プログラム> #!/usr/koeki/bin/ruby mesiA = 0 #mesiAを0にする mesiB = 0 #mesiBを0にする m = 0 #mを0にする sum = 0 #合計を0にする average = 0 #平均を0にする while line = gets #lineをgetsしてこい if /(\w+)/ =~ line if $1 == "A" # $1がAならば mesiA += 1 #mesiAに1を足せ else #そうでなければ mesiB += 1 #mesiBに1を足せ end # if(2)のend m += 1 #人数に1人足せ end # if(1)のend end #whileのend sum = mesiA * 650 + mesiB * 550 #合計 = mesiA ×650 + mesiB ×550 average = sum/m #合計 ÷ 人数 で平均を出す if mesiA > mesiB #もし mesiA が mesiB より多ければ print("!!Bを新メニューに変えましょう!!\n")#表示させなさい elsif mesiA == mesiB #もし mesiAと mesiBが同じ数ならば print("☆もうちょっと調査してみましょう☆\n")#表示させなさい else #そうでなければ print("★Aを新メニューに変えましょう★\n")#表示させなさい end printf("本日の総売り上げは %d 円です。\n",sum)#売上の表示結果 printf("来店人数は %d です。\n",m)#来店数の表示結果 printf("本日の客単価は %d です。\n",average)#客単価の表示結果 <表示結果> irsv{c106164}% ./cafe.rb kuromori.dat [~/Ruby] ★Aを新メニューに変えましょう★ 本日の総売り上げは 8950 円です。 来店人数は 15 です。 本日の客単価は 596 です。 ★総売り上げ★ (7*650)+(8*550) 8950 ★客単価★ 8950/15 596.66666666666666666666 <確認!!手計算 part2> Aのランチを頼んだ人が7人、Bのランチを頼んだ人が8人いた。 計算式は… Aランチを頼んだ人数 × 650円 + Bランチを頼んだ人数 × 550円 で総売り上げがでる。 表示結果の場合… 7 × 650 + 8 × 550 = 8950 となる。 答えは、8950円!! 表示された結果と同じなので成功している。 来店人数はデータを数えると15行あるので今日は15人来たことになる。 客単価は次の式で計算する。 総売り上げ ÷ 人数 = 客単価 今回の場合の式は… 8950 ÷ 15 = 596.6666666666666… となる。 小数点以下を切り捨て、答えは… 596円 となる。 どの計算結果も結果表示されたものと同じなので成功していると思われる。 <考察> 答えと表示結果が同じなのでこのプログラムは成功していると思われる。 C.あるコピー機は、1 枚印刷するときには 10 円のコストがかかる。 ところが連続で 30 枚以上印刷すると 7 円で済む。 コピー機で誰が何枚つくったかの情報を読みこんで、 コピー機の使用にいくらかかったのか調べよ。 コピー使用データ copy.dat は 6 行以上であれば書式自由。 <データ> 所属名 社員番号 枚数 人事部 1111 14 営業3課 1001 5 庶務2課 1100 6 マーケティング部 1010 30 秘書課 1101 20 経理部 0000 50 海外事業部 0001 60 営業3課 1001 3 人事部 1111 6 秘書課 1101 11 <プログラム> #!/usr/koeki/bin/ruby sum = 0 #sumを0にする。 while line = gets #lineをgetsしてこい。 if /\S+\s+\S+\s+(\d+)/ =~ line if $1.to_i < 30 # $1の数が30より下だったら sum += $1.to_i*10 # $1を整数にしたものに10掛ける else #そうでなければ sum += $1.to_i*7 # $1を整数にしたものに7掛ける end # if(2)のend end # if(1)のend end # whileのend printf("今日のコピー機使用料金は %d 円になります。\n",sum)#結果の表示 <表示結果> irsv{c106164}% ./print.rb copy.dat [~/Ruby] 今日のコピー機使用料金は 1630 円になります。 irsv{c106164}% bc -l [~/Ruby] 始めに30以下の枚数を全て足す 14+5+6+20+3+6+11 65 足した数に30以下のコピー数の金額10円/1枚を掛ける 65*10 650 次に、30枚以上の枚数を全て足す 30+50+60 140 そして、足した数に30枚以上のコピー数の金額7円/1枚を掛ける 140*7 980 最後に、10円を掛けた金額と7円を掛けた金額を足す 650+980 1630 答えは1630円です。 表示結果と同じなのでプログラムは成功していると思います 3.感想。 今回のレポートは、プログラム作成を一番頑張りました。何度も手直しを加 えて、求めていた結果になったときはとても嬉しく思いました。 先輩にも分らないところを聞いたりと自分なりに努力できたと思います。 プログラムを3つ作るのは苦労したけれど、今は充実した気持ちです。 次のレポートも頑張りたいと思います。