訂正点:共同学習者名を記載した。及び、作成したプログラムを添付するのを忘 れていたため、添付した。 第7回 正規表現と Ruby 言語でのプログラミング レポート課題 氏名:齋藤 香織 学籍番号:C1110654 語学クラス:中国語3 コース:政策マネジメントコース 1.筆記問題 A.a. 0b11010110 を 16進数変換する。 1 1 0 1 と 0 1 1 0 に分けて、 1 * 2^3 = 8 1 * 2^2 = 4 0 * 2^1 = 0 1 * 2^0 = 1 8 + 4 + 0 + 1 = 13 0 * 2^3 = 0 1 * 2^2 = 4 1 * 2^1 = 2 0 * 2^0 = 0 0 + 4 + 2 + 0 = 6 よって、0xd4 となる。 b.0d1024 を 16進数変換するには、1024 を 16 で割っていけば良い。 16 ) 1 0 2 4 ... 0 16 ) 6 4 ... 0 16 ) 4 よって、0x400 になる。 B.私の名前は さいとうかおり であるから Saito Kaori となる。 ASCIIコードを用いて S ... 0x53 a ... 0x61 i ... 0x69 t ... 0x74 o ... 0x6f K ... 0x4b a ... 0x61 o ... 0x6f r ... 0x72 i ... 0x69 よって 0x53 0x61 0x69 0x74 0x6f 0x4b 0x61 0x6f 0x72 0x69 となる。 2.プログラミング問題(B) i.考えた設定 タクシーの課金のしくみ、および料金表示をなるべくシンプルな設定のもと作成 した。 ii.作成したプログラム open_taxi.rb #!/usr/koeki/bin/ruby #coding:euc-jp jikoku=[] n=[] sum = 0 ave = 0 i = 0 mile = 0 STDERR.print("小型(a),中型(b),大型(c)のいずれかの売上を計算します。 \n") pattern = STDIN.gets.chomp # キーボードからの入力を読み込む。 request = Regexp.new(pattern, true, ) # 正規表現をしたい文字列にオプション付加 open("reciept.txt","r") do |seven| # recieptを開き、読み込む。 while reciept = seven.gets # ファイルへの出力変数。 if request =~ reciept # 検索パターンをキーボードで入力する。 # print if /(\S+)\s+(\S+)\s+(\d+.\d+)/ =~ reciept # 文字列及び空白文字列 printf("%d %s発 %sキロ\n",i+1,$1,$3) # 時刻と距離を表示する。 jikoku[i] = $1 # $1 の数値は人口を表す。 n[i] = $3.to_f # 小数値まで表示する。 end if pattern == "a" # もし a と入力したら goukei = 650 + n[i]*70 # 合計 ave += n[i] # 平均 mile += goukei / 100 # マイル数 elsif pattern == "b" # もし b と入力したら goukei = 710 + n[i]*80 # 合計 ave += n[i] # 平均 mile += goukei / 100 # マイル数 elsif pattern == "c" # もし c と入力したら goukei = 710 + n[i]*90 # 合計 ave += n[i] # 平均 mile += goukei / 100 # マイル数 end i += 1 # 1ずつ増加 a = goukei/10 # a は合計を 10 で割ったもの b = a.to_i * 10 # b は a の整数部分を 10倍 したもの c = goukei - b # c は合計から b を引いたもの if c >= 5 # もし c が 5 以上ならば goukei += 10-c # 合計に 10-c したものを足す。 elsif c < 5 # もし c が 5 以下ならば goukei -= c # 合計から c を引く。 end sum += goukei # sum は合計を足したもの。 printf("選択したタクシーの売上金額は %d 円です。\n",goukei) end end end ten = ave / i # ten は平均を変数で割ったもの。 printf("選択したタクシーの売上合計金額は %d 円です。\n",sum) printf("選択したタクシーの平均走行距離は %f キロです。\n",ten) printf("選択したタクシーの獲得マイルは %d です。\n",mile) iii.もとにしたプログラムからの変更点 1円以下を四捨五入の仕組みをよく考え、数式を編集したり elseif を使用して、a,b,c のパターン毎に条件を追加したりした。 iv.プログラムを実行した画面 pan{SAITO Kaori}% ./open_taxi.rb [~/Ruby] 小型(a),中型(b),大型(c)のいずれかの売上を計算します。 a # a の場合 1 10:10発 1.4キロ 選択したタクシーの売上金額は 750 円です。 2 13:30発 3.7キロ 選択したタクシーの売上金額は 910 円です。 3 15:40発 14.3キロ 選択したタクシーの売上金額は 1650 円です。 4 23:59発 5.3キロ 選択したタクシーの売上金額は 1020 円です。 5 1:20発 7.4キロ 選択したタクシーの売上金額は 1170 円です。 6 2:01発 9.7キロ 選択したタクシーの売上金額は 1330 円です。 選択したタクシーの売上合計金額は 6830 円です。 選択したタクシーの平均走行距離は 6.966667 キロです。 選択したタクシーの獲得マイルは 68 です。 pan{c111065}% ./open_taxi.rb [~/Ruby] 小型(a),中型(b),大型(c)のいずれかの売上を計算します。 b # b の場合 1 12:10発 2.5キロ 選択したタクシーの売上金額は 910 円です。 2 14:50発 2.9キロ 選択したタクシーの売上金額は 940 円です。 3 17:10発 9.0キロ 選択したタクシーの売上金額は 1430 円です。 4 22:00発 10.0キロ 選択したタクシーの売上金額は 1510 円です。 5 00:20発 4.0キロ 選択したタクシーの売上金額は 1030 円です。 選択したタクシーの売上合計金額は 5820 円です。 選択したタクシーの平均走行距離は 5.680000 キロです。 選択したタクシーの獲得マイルは 58 です。 pan{c111065}% ./open_taxi.rb [~/Ruby] 小型(a),中型(b),大型(c)のいずれかの売上を計算します。 c # c の場合 1 13:20発 4.6キロ 選択したタクシーの売上金額は 1120 円です。 2 19:30発 12.7キロ 選択したタクシーの売上金額は 1850 円です。 選択したタクシーの売上合計金額は 2970 円です。 選択したタクシーの平均走行距離は 8.650000 キロです。 選択したタクシーの獲得マイルは 29 です。 v.導き出された結果の考察 < a の場合 > pan{c111065}% bc -l [~/Ruby] 750 - 1.4 * 70 # 売上料金 - 距離 * 1kmあたりの課金 652.0 # = 初乗り料金 (以下同様) 910 - 3.7 * 70 651.0 1650 - 14.3 * 70 649.0 1020 - 5.3 * 70 649.0 1170 - 7.4 * 70 652.0 1330 - 9.7 * 70 651.0 全て1の位を四捨五入すると 650 になるため合致。 pan{c111065}% bc -l [~/Ruby] 6830 - (1330 + 1170 + 1020 + 1650 + 910 + 750 ) # 合計金額 -各時間の売上の合計 0 合計金額から各時間毎の料金を引き、0 になったので合致。 pan{c111065}% bc -l [~/Ruby] (1.4 + 3.7 + 14.3 + 5.3 + 7.4 + 9.7 ) / 6 # 走行距離の合計 - 走行回数 6.96666666666666666666 各走行距離の合計を 走行回数で割り、四捨五入すると実行結果と同じになるので合致。 pan{c111065}% bc -l [~/Ruby] 6830 / 100 # 売上合計金額 / 100 68.30000000000000000000 # 獲得マイル数 < b の場合> pan{c111065}% bc -l [~/Ruby] 910 - 2.5 * 80 710.0 940 - 2.9 * 80 708.0 1430 - 9.0 * 80 710.0 1510 - 10.0 * 80 710.0 1030 - 4.0 * 80 710.0 a の場合と同様に行い、結果が実行画面と合致。 pan{c111065}% bc -l [~/Ruby] 5820 - 1030 - 1510 - 1430 - 940 - 910 0 a の場合と同様に行い、結果が実行画面と合致。 pan{c111065}% bc -l [~/Ruby] (2.5 + 2.9 + 9.0 + 10.0 + 4.0) / 5 5.68000000000000000000 a の場合と同様に行い、結果が実行画面と合致 pan{c111065}% bc -l [~/Ruby] 5820 / 100 58.20000000000000000000 < c の場合 > pan{c111065}% bc -l [~/Ruby] 1120 - 4.6 * 90 706.0 1850 - 12.7 * 90 707.0 a , b と同様に行い、実行画面と合致。 pan{c111065}% bc -l [~/Ruby] 2970 - (1850 + 1120) 0 a , b と同様に行い、実行画面と合致。 pan{c111065}% bc -l [~/Ruby] (4.6 + 12.7) / 2 8.65000000000000000000 a , b と同様に行い、実行画面と合致。 pan{c111065}% bc -l [~/Ruby] 2970 / 100 29.70000000000000000000 a , b と同様に行い、実行画面と合致。 参考資料 神田直弥先生のHP http://roy/~naoya/ruby/8.html 西村まどか先生のHP http://roy/~madoka/2012/r1/07/lec/resume.html 感想 友人と金曜の夜11時ぐらいから始めて、3時ぐらいなったら皆帰ってしまい 私一人残って、一睡もせずやってたら外が明るくなってきて、警備員さんが来て 時計見たら朝の5時半になっていた。最初は何をしたらいいかさっぱり分からな くて、余りのできなさに友人にバカにされ、悔しくてしょうがなくて泣いてしまっ たが、こんなんで負けてるのはバカバカしいと考えたら 逆に燃えて来て頑張ることが出来た。 そのかいあってか、一人になったら何が起きたのか、 次々と自分でわからなかったところを解決していくし、オプションもできて驚いた。 私は勉強は完全無音な場所で一人でやる方が本気で集中できるのだなと 課題をやっていて気付いた。なんとか提出までこぎつけることが出来 たので、友人たちの手助けができればいいなと思った。 共同学習者名:高橋希美 藤川恒介 佐藤咲 土屋哲平