6 月 6 日のレポートについて 氏名 : XXXXXXXX 学籍番号 : c106XXXX 語学選択 : XXXX語XX 1. A.0xabc = 0b?? 始めに 10進数に直す。 10 * 16 の2乗 = 2560 11 * 16 の1乗 = 176 12 * 16 の0乗 = 12 求めた数値をすべて足す。 2560 + 176 + 12 = 2748 求めた10進数を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 1 / 2 = 0......1 余りを下から順に並べる。答えは 0b101010111100 となる。 B.0b11010001 + 0b1 - 0b1100 = 0d?? 0bということで 2進数とわかる。それぞれを 10進数に変換しながら計算して いく。 0b11010001 を10進数に直す計算式は以下のようになる。 1 * 2 の7乗 = 128 1 * 2 の6乗 = 64 0 * 2 の5乗 = 0 1 * 2 の4乗 = 0 0 * 2 の3乗 = 0 0 * 2 の2乗 = 0 0 * 2 の1乗 = 0 1 * 2 の0乗 = 1 すべての答えを足すと 209 となる。 0b1 を10進数に直す。 1 * 2 の0乗 = 1 0b1100 を10進数に直す。 1 * 2 の3乗 = 6 1 * 2 の2乗 = 4 0 * 2 の1乗 = 0 0 * 2 の0乗 = 0 答えを足すと 10 になる。 ここで上記の問題に戻る。 209 + 1 - 10 = 200 答えは 0d200 である。 参考文献:http://www.asahi-net.or.jp/~AX2S-KMTN/ref/bdh.html 2. A. ●作成したプログラム● #!/usr/koeki/bin/ruby n = 0 # 客数 n の初期化 hon = 0 # 合計 hon の初期化 while iimori = gets ☆1 if /(\S+)\s+(\S+)\s+(\S+)\s+(\d+)/ =~ iimori ☆2 hon += $4.to_i ☆3 n += 1 end end printf("売り上げ %d 円\n",hon*100) ☆4 average = hon*100/n ☆5 printf("今日の客単価は %4.0f 円でした。\n",average) ☆6 ●プログラムの説明● ☆1→→ iimori.dat からデータを取り出す。 ☆2→→ \S が文字列。\s が空白文字。\d が数値。 ☆3→→ to_i でプログラムに数値とわからせる。 ☆4→→ hon に値段をかけさせる。 ☆5→→ 平均を出させるため、hon*100 を人数で割らせる。 ☆6→→ 平均の結果を出す文字列。 ●作成したデータ● お得意樣 伊藤啓太 itoukeita 3 お得意樣 遠藤和希 endokazuki 4 お得意樣 丹波哲也 niwatetuya 4 お得意樣 中嶋英明 nakazimahideaki 10 お得意樣 篠宮紘司 sinomiyakouzi 7 新規樣 岩井卓人 iwaitakuto 5 新規樣 西園寺郁 saionzikaoru 8 新規樣 七条臣 sitizyoomi 9 新規樣 滝俊介 takisyunsuke 15 新規樣 成瀬由貴彦 naruseyukihiko 14 新規樣 海野東馬 uminotouma 20 ●結果● irsv{c106052}% ./rental.rb iimori.dat [~/Ruby] 売り上げ 9900 円 今日の客単価は 900 円でした。 ●考察● 始め、数値のところも %s としてしまって上手く出てくれなかったが、数値の 場合は %d だったことを思い出して実行した結果上手くいった。 B. ●作成したプログラム● #!/usr/koeki/bin/ruby n = 0 # 客数 n の初期化 lanch = 0 # 合計 lanch の初期化 a = 0 # Aランチの変数 b = 0 # Bランチの変数 c = 0 # Aランチの注文が通る変数 d = 0 # Bランチの注文が通る変数 while kuromori = gets ☆1 if /(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/ =~ kuromori lanch += $4.to_i n += 1 end if "A" == $4 ☆2 a += 650 ☆3 c += 1 ☆4 end if "B" == $4 ☆5 b += 550 ☆6 d += 1 ☆7 end end printf("Aランチの注文数 %d セットです。\n",c) ☆8 printf("Bランチの注文数 %d セットです。\n",d) ☆9 lanch +=a ☆10 lanch +=b printf("本日の売り上げ %d 円でした。\n",lanch) ☆11 average =lanch/n ☆12 printf("本日の客単価は %4.0f 円でした。\n",average) ☆13 ●プログラムの説明● ☆1→→ kuromori.dat からデータを出す ☆2→→ もし $4 が A だったら ☆3→→ 650を足す ☆4→→ もし $4 が B だったら ☆5→→ 550を足す ☆6→→ B が一回通るたびに 1 を足す ☆7→→ c の合計 ☆8→→ d の合計 ☆9→→ この2行で a の合計と b の合計を一緒にする ☆10→→ この2行で a の合計と b の合計を一緒にする ☆11→→ 総売り上げが出る ☆12→→ ランチの平均を計算させる ☆13→→ 客単価を表示させる ●作成したデータ● お得意樣 伊藤啓太 itoukeita A お得意樣 遠藤和希 endokazuki B お得意樣 丹波哲也 niwatetuya B お得意樣 中嶋英明 nakazimahideaki B お得意樣 篠宮紘司 sinomiyakouzi A 新規樣 岩井卓人 iwaitakuto A 新規樣 西園寺郁 saionzikaoru A 新規樣 七条臣 sitizyoomi B 新規樣 滝俊介 takisyunsuke A 新規樣 成瀬由貴彦 naruseyukihiko B 新規樣 海野東馬 uminotouma B ●結果● irsv{c106052}% ./cafe.rb kuromori.dat [~/Ruby] Aランチの注文数 5 セットです。 Bランチの注文数 6 セットです。 本日の売り上げ 6550 円でした。 本日の客単価は 595 円でした。 ●考察● if文を使って「もし A なら 650 円を足していき、もし B なら 550 円を足す」 というプログラムにすれば実行できるのではないかと考えた。実行してみると 上手く結果が出たのでよかった。 C. ●作成したデータ● #!/usr/koeki/bin/ruby kyaku = 0 # 客数 n の初期化 syorui = 0 # 合計 syorui の初期化 ryokin = 0 while copy = gets ☆1 if /(\S+)\s+(\S+)\s+(\S+)\s+(\d+)/ =~ copy syorui = $4.to_i ☆2 printf("書類 %d 枚 \t",syorui) ☆3 # kyaku *= 1 if 29 >= syorui ☆4 syorui *= 10 ☆5 printf("料金 (10円) %d 円 \n",syorui) ☆6 ryokin += syorui ☆7 printf("ryokin = %d 円 \n",ryokin) ☆8 # end # printf("料金 () %d 円 \n",syorui) elsif 30 <= syorui ☆9 syorui *= 7 ☆10 printf("料金 (7円) %d 円 \n",syorui) ☆11 ryokin += syorui ☆12 printf("ryokin = %d 円 \n",ryokin) ☆13 end # end end end #syorui +=zyu #syorui +=nana printf("合計で %d 円 \n",ryokin) ☆14 ●プログラムの説明● ☆1→→ copy.dat からデータを出す。 ☆2→→ to_i で数値だと解らせる。 ☆3→→ 書類の枚数を出す。 ☆4→→ もし syorui が 29 枚より少なかったら ☆5→→ syorui に 料金の 10 をかける。 ☆6→→ 29枚より少ない分の料金を表示させる。 ☆7→→ 29枚より少ない分の syorui の料金を ryokin にいれていく。 ☆8→→ ここまでの料金を表示させる。 ☆9→→ そうではなく、もし syorui が30 枚より多かったら ☆10→→ syorui に 料金の 7 をかける。 ☆11→→ 30枚より多い分の料金を表示させる。 ☆12→→ 30枚より多い分の syorui の料金を ryokin にいれていく。 ☆13→→ ここまでの料金を表示させる。 ☆14→→ 2つの ryokin を合計して結果を出させる。 ●作成したデータ● 会議資料 伊藤啓太 itoukeita 35 会議資料 遠藤和希 endokazuki 28 営業用チラシ 丹波哲也 niwatetuya 25 会議資料 中嶋英明 nakazimahideaki 10 営業用チラシ 篠宮紘司 sinomiyakouzi 60 決算表 岩井卓人 iwaitakuto 20 決算表 西園寺郁 saionzikaoru 23 決算表 七条臣 sitizyoomi 45 営業用チラシ 滝俊介 takisyunsuke 38 営業用チラシ 成瀬由貴彦 naruseyukihiko 58 会議資料 海野東馬 uminotouma 100 ●結果● irsv{c106052}% ./copy.rb copy.dat [~/Ruby] 書類 35 枚 料金 (7円) 245 円 ryokin = 245 円 書類 28 枚 料金 (10円) 280 円 ryokin = 525 円 書類 25 枚 料金 (10円) 250 円 ryokin = 775 円 書類 10 枚 料金 (10円) 100 円 ryokin = 875 円 書類 60 枚 料金 (7円) 420 円 ryokin = 1295 円 書類 20 枚 料金 (10円) 200 円 ryokin = 1495 円 書類 23 枚 料金 (10円) 230 円 ryokin = 1725 円 書類 45 枚 料金 (7円) 315 円 ryokin = 2040 円 書類 38 枚 料金 (7円) 266 円 ryokin = 2306 円 書類 58 枚 料金 (7円) 406 円 ryokin = 2712 円 書類 100 枚 料金 (7円) 700 円 ryokin = 3412 円 合計で 3412 円 ●考察● to_i で、プログラムに数値であることを教えなければならない。数値なのにこ れがないと、プログラムは文字列と思ってしまい実行してはくれない。 わからないところには "printf"を使う。 syorui = $4.to_i と始めに定義することにより、その後そのまま使うことが出 来る。 if と end の位置には気を付ける。揃えるとわかりやすい。 答えがあっているか調べる。 irsv{c106052}% bc -l [~/Ruby] 245 + 280 + 250 + 100 + 420 + 200 + 230 + 315 + 266 + 406 + 700 3412 よってプログラムに間違いがないことがわかる。 D. ●作成したプログラム● #!/usr/koeki/bin/ruby STDERR.print "出発駅 : " ☆1 hazime = STDIN.gets.chomp ☆2 STDERR.print "到着駅 : " ☆3 owari = STDIN.gets.chomp ☆4 while hanekoshi = gets ☆5 if /(\S+)\s+(\d+)/ =~ hanekoshi ☆6 if $1 == hazime ☆7 hkm = $2.to_i ☆8 end if $1 == owari ☆9 okm = $2.to_i ☆10 end end end printf("大人か子供か入力して下さい。\n") ☆11 hito = gets.chomp if hito == "大人" ☆12 if hkm < okm ☆13 kyori = okm - hkm ☆14 ryokin = kyori * 20 + 100 ☆15 elsif okm < hkm ☆16 kyori = hkm - okm ☆17 ryokin = kyori * 20 + 100 ☆18 end elsif hito == "子供" ☆19 if hkm < okm ☆20 kyori = okm - hkm ☆21 ryokin = (kyori * 20 + 100)/2 ☆22 elsif okm < hkm ☆23 kyori = hkm - okm ☆24 ryokin = (kyori * 20 + 100)/2 ☆25 end end print("-" * 50) ☆26 print("\n") print("|") print(" " * 48) print("|\n") print("|") print(" " * 46) print("<\n") print("|") printf("%10s - %10s %s 料金 %d 円 |\n",hazime,owari,hito,ryokin)☆27 print("|") print(" " * 48) print("|\n") print("|") print(" " * 48) print("|\n") print("-" * 50) print("\n") ●プログラムの説明● ☆1 →→ 出発駅を入力させる。 ☆2 →→ 出発駅の変数を hazime とする。 ☆3 →→ 到達駅を入力させる。 ☆4 →→ 到達駅の変数を owari とする。 ☆5 →→ hanekosi.dat からデータを出す。 ☆6 →→ (\S+)は文字列。\s+ は空白文字。(\d+)は数値を表す。 ☆7 →→ もし hazime に駅名が入力されたら ☆8 →→ hkm は $2 の数値を表す。 ☆9 →→ もし owari に駅名が入力されたら ☆10 →→ okm は $2 の数値を表す。 ☆11 →→ 大人か子供か入力させる。 ☆12 →→ 「大人」と入力された場合... ☆13 →→ もし到達駅の距離が出発駅の距離より大きかったら ☆14 →→ 到達駅までの距離から出発駅の距離をひく ☆15 →→ 出た距離に 20円 をかけて、初乗り運賃の 100円 を足す。 ☆16 →→ そうじゃなく出発駅の距離が到達駅の距離より大きかったら ☆17 →→ 出発駅までの距離から到達駅の距離をひく ☆18 →→ 出た距離に 20円 をかけて、初乗り運賃の 100円 を足す。 ☆19 →→ 「子供」と入力されたばい場合... ☆20 →→ もし到達駅の距離が出発駅の距離より大きかったら ☆21 →→ 到達駅までの距離から出発駅の距離をひく ☆22 →→ 出た距離に 20円 をかけて、初乗り運賃の 100円 を足す。子供料金 は半額なので全体を 2 で割る。 ☆23 →→ そうじゃなく出発駅の距離が到達駅の距離より大きかったら ☆24 →→ 出発駅までの距離から到達駅の距離をひく ☆25 →→ 出た距離に 20円 をかけて、初乗り運賃の 100円 を足す。子供料金 は半額なので全体を 2 で割る。 ☆26 →→ 線を組み合わせて切符のように仕上げた。 ☆27 →→ 結果を表示させる。 ●結果● irsv{c106052}% ./hanekoshi.rb hanekoshi.dat [~/Ruby] 出発駅 : にしふくろ 到着駅 : すなこし 大人か子供か入力して下さい。 子供 -------------------------------------------------- | | | < |にしふくろ - すなこし 子供 料金 140 円 | | | | | -------------------------------------------------- irsv{c106052}% ./hanekoshi.rb hanekoshi.dat [~/Ruby] 出発駅 : づるおが 到着駅 : さけでん 大人か子供か入力して下さい。 大人 -------------------------------------------------- | | | < | づるおが - さけでん 大人 料金 640 円 | | | | | -------------------------------------------------- ●考察● if や elsif を使って 場合分けをする。変数を分かりやすいようにしてをく と良い。 %s は文字列専用で、%d は数値専用。 ●感想● 今回は本当に難しかったです。いろんなところでこだわってしまいました。教 えてくれた TA の先輩、晴香先輩、まどか先生に感謝してます。最後の切符は 障害者用のくぼみもつけてみました。大人料金や子供料金も選択出来るように 出来て良かったのですが、open-end が上手くいかなくて悔しかったです。 次は今回の反省が克復できるよう、もっと頑張りたいと思います!!