第7回 基礎プログラミング I レポート課題 氏名:小松由里 学籍番号:c1090673 語学クラス:中国語1 コース(系):環境サイエンス 1、筆記問題 0bは2進数、0xは16進数、0dは10進数を表している。 A、 <0b11110110 を 0x で表す> 0bは2進数なので、16進数 になおす。 2進数を16進数になおすには、11110110を右端から4桁ずつ区切り、1111と 0110にする。 そしてそれぞれ10進数になおす。 1111 = 1*2の3乗 + 1*2の2乗 + 1*2の1乗 + 1*2の0乗 = 8 + 4 + 2 + 1 = 15 0110 = 0*2の3乗 + 1*2の2乗 + 1*2の1乗 + 0*2の0乗 = 0 + 4 + 2 + 0 = 6 2進数 0b11110110 を 10進数になおすと、15 と 6 になる。 これらを16進数表に当てはめると、f と 6 になる。 よって、16進数0xの場合 0xf6 となる。 B、 <0d256 を 0x で表す> 256 / 2 = 128 …余り0 128 / 2 = 64 …余り0 64 / 2 = 32 …余り0 32 / 2 = 16 …余り0 16 / 2 = 8 …余り0 8 / 2 = 4 …余り0 4 / 2 = 2 …余り0 2 / 2 = 1 …余り0 1 / 2 = 0 …余り1 下から読み上げると、100000000 となる。 よって、10進数 0d256 を2進数になおすと、0b100000000 となる。 0b100000000 を 16進数になおす。 0bは2進数なので、まず10進数 になおす。 2進数を10進数になおすには、100000000を右端から4桁ずつ区切り、1、0000、0000 にする。 そしてそれぞれ16進数になおすと、 1 = 1 0 = 0 0 = 0 よって、0d256 を 16進数 0xの場合 0x100 となる。 2、プログラム問題 A、 a、考えた設定 ケーキの売り上げ金額・客単価を求めるプログラム b、作成したプログラム #!/usr/koeki/bin/ruby type = Array.new # ケーキの種類 price = Array.new # ケーキの値段 i = 0 # 項目数 sougoukei = 0 # 合計金額 open("battery2.dat","r") do |a| # 変数を a 。battery2.dat のファイル # を読み込むように設定する。 while syurui = a.gets # 変数 syurui に代入する。 if /(\S+)\s+(\d+)/ =~ syurui # データは2行を検索する。 type[i] = $1 # $1 はケーキの種類を表す。 price[i] = $2.to_f # $2 はケーキの値段を表す。to_f で整数化する if type[i] == "イチゴケーキ" t = 210 * price[i] elsif type[i] == "チーズケーキ" t = 200 * price[i] elsif type[i] == "シフォンケーキ" t = 230 * price[i] elsif type[i] == "チョコケーキ" t = 220 * price[i] elsif type[i] == "ミルフィーユ" t = 240 * price[i] elsif type[i] == "フルーツタルト" t = 300 * price[i] elsif type[i] == "モンブラン" t = 190 * price[i] else type[i] == "ロールケーキ" t = 250 * price[i] end sougoukei += t # sougoukei の値に t に入力された値を加算する。 i += 1 # 項目数を 1 ずつ増加させる。 end end end k = 0 printf("本日の売り上げ数\n") while k < type.length # 配列に対して、その個数を返し、kよりも大きくなった # ら終了。 printf("%-10s\t%d\n",type[k] ,price[k]) # 商品番号と、読み込んだ行を画面表 # 示させる。 k += 1 end tanka_u = sougoukei / 8 # 合計金額をケーキの種類数 8 で割る。 printf("売り上げ金額は %d 円です。\n",sougoukei) # 合計した売上金額。 printf("客単価は %2.1f 円です。\n",tanka_u) # 2桁の整数と小数点第1位まで # 表示させる。 c、もとにしたプログラムからの変更点 write_ticket.rb のプログラムもとにしました。 if /(\S+)\s+(\d+.\d+)/ を if /(\S+)\s+(\d+)/ に変更し、 tanka_u = sougoukei / 8 printf("売り上げ金額は %d 円です。\n",sougoukei) printf("客単価は %2.1円です。\n",tanka_u) を付け加えました。 d、実行結果 pan{c109067}% ./open_battery2.rb [~/Ruby] 本日の売り上げ数 イチゴケーキ 21 チーズケーキ 30 シフォンケーキ 18 チョコケーキ 20 ミルフィーユ 24 フルーツタルト 19 モンブラン 16 ロールケーキ 18 売り上げ金額は 37950 円です。 客単価は 4743.8 円です。 e、考察 pan{c109067}% bc -l [~/Ruby] 210*21 # 値段 * 個数の計算 4410 200*30 6000 230*18 4140 220*20 4400 240*24 5760 300*19 5700 190*16 3040 250*18 4500 4410+6000+4140+4400+5760+5700+3040+4500 # それぞれの値段の合計を足す 37950 37950/8 # 合計の値段 / 8 4743.75000000000000000000 quit f、参考文献 西村 まどか 基礎プログラミング I 第7回 正規表現と Ruby 言語でのプログラミング 「券売機のしくみ」 http://roy/~madoka/2010/r1/07/07_13_theme_11_vendingmachine.html 基礎プログラミング I 第4回 プログラミングの方法 「曜日を調べるプログラム」 http://roy/~madoka/2010/r1/04/04_20_theme_11_wday.html 神田 直弥 基礎プログラミングI$(C!$情報検索 16進数・ASCIIコード http://roy/~naoya/ruby/9.html 学んだこと ・Ctrl-\ …日本語表記になる。 Ctrl-\ を再度押すと元に戻る。 ・A =~ B … A は B に含まれる。 ・/ /i …大文字小文字は問わないで検索する。 ・STDIN …データの処理方法をキーボードからの入力により行う。 ・Regexp.new (変数、オプション、文字コード)… 正規表現したい文字列にオプションを付ける。 ・(/S)/1 …”/S”空白文字以外を探す。”/1”( )に当てはまるものを1回繰 り返す。=2文字同じ並びのワードを探す。 ・(A|B)/1… A A および B B が検索される。 ・ open("ファイル名","モード")…開いたファイル場所を教える変数。 ・ /d+./d+ …少数値を示す。 ・p-i …計算が合っているか確認する。 ・Ctrl-k …1行消すことができる。(改行は一緒に消えない。1行のみ消える。) 感想 今回のプログラムは、if、elsif を活用するものだったが、初めなかなかプログラム作 成に手をつけることができなかった。だが、先輩・友達に教えてもらいながらプログラ ムの土台をなんとか作成することができた。土台を作成したあとは、新たにプログラム を立ち上げ、自分の力でもう一度プログラムを作成し、内容も再度考えなおし完成させ ることができた。 また、Ctrl-k で 1 行消すことができることを先輩から教えてもらった。 今回知った Ctrl-k や、以前習った p-i など、習ったコマンドをもっと上手く活用し ていけるようになりたい。 協力してくれた先輩 松島 佳奈江 先輩 共同学習者 酒井 春香 佐竹 聡美 横山 広樹