第 7 回 正規表現と Ruby 言語でのプログラミング レポート課題 氏名:齋藤允貴 学籍番号:C111069A 語学クラス:英語 2 コース:地域共創コース 1、筆記問題 A、進数変換 今回の進数変換は2通りある。 aは2進数を16進数に変換するもの bは10進数を16進数に変換するもの a、0b 11010110 = 0x?? まず、2進数を10進数に変換してみた。 1 * 2の7乗 = 128 1 * 2の6乗 = 64 0 * 2の5乗 = 0 1 * 2の4乗 = 16 0 * 2の3乗 = 0 1 * 2の2乗 = 4 1 * 2の1乗 = 2 0 * 2の0乗 = 0 これらを足すと、 128 + 64 + 0 + 16 + 0 + 4 + 2 + 0 = 214 となる。 この10進数で出た答えを16進数で表示したいときは、16で割り続ければ よい。 214 / 16 = 13 余り 6 13 / 16 = 0 余り 13 そして、割り切った最後の商と、余りを下から上に並べる。 このままだと、0x136 となるがそれが答えではない。 16進数に変換したいとき、10進数の数字10から15の場合はアルファベッ トに変換しなければならない。 10 = a 11 = b 12 = c 13 = d 14 = e 15 = f 今回は、13を使っているので、d を使う。 したがって、0b 11010110 = 0xd6 となる。 b、0d 1024 = 0x?? この場合は、10進数の数字を16で割り続ける。 1024 / 16 = 64 余り 0 64 / 16 = 4 余り 0 4 / 16 = 0 余り 4 そして、割り切った最後の商と、余りを下から上に並べる。 したがって、0d 1024 = 0x400 となる。 B、自分の名前のアルファベットを16進数で表示したいとき、「ASCII コード 表」を利用して、調べてみた。 名前をアルファベットで表記すると、「SAITO MASATAKA」となる。 ASCII コードで調べた結果は以下の通りである。 S = 0x53 A = 0x41 I = 0x49 T = 0x54 O = 0x4f M = 0x4d A = 0x41 S = 0x53 A = 0x41 T = 0x54 A = 0x41 K = 0x4b A = 0x41 したがって、自分の名前を16進法で表示すると、 0x53 41 49 54 4f 4d 41 53 41 54 41 4b 41 となる。 2、プログラム問題 今回僕が挑戦したのは、Bの問題である。 a、平均走行距離を計算するときには、以前、授業の中で使った、「while」 「if」を用いて作成した。 while j < taxi.length if taxi[j] == "a" pointa += km[j] * 70 pointa += 650 heikma = heikma.to_f + km[j].to_f a += 1 elsif taxi[j] == "b" pointb += km[j] *80 pointb += 710 heikmb = heikmb.to_f + km[j].to_f b += 1 elsif taxi[j] == "c" pointc += km[j] *90 pointc += 710 heikmc = heikmc.to_f + km[j].to_f c += 1 end j += 1 end b、金額と乗車時間が記載されたレシートは、今回の授業で使った、「open」 を用いて作成した。そのオープンの中に指定されたファイルを入力して、 以下の通りに作成した。 open("reciept.txt" , "w") do |mail| mail.printf("---------------\n") mail.printf("出発時刻:%s\n 金額: %s円\n", hour, price) mail.printf("獲得したマイレージ: %dマイル\n",milange) mail.printf("公益タクシー\n") mail.printf("---------------\n") end c、料金の請求額を四捨五入したいときは、以下のように作成した。 sigo = (meter + 0.5).to_i d、100円で1マイルたまるマイレージは、以下のように作成した。 milange = price/100 eの深夜営業の請求額を2割増にするやり方は、全く分からなかったので断念し た。 なお、今回は、先生のデータ例を参考に、「car.dat」としてファイルを作成 した。 こうして作成したプログラムは以下のとおりである。 #!/usr/koeki/bin/ruby #coding: euc-jp time = Array.new # 各種変数の初期設定 taxi = Array.new km = Array.new avekma = 0 avekmb = 0 avekmc = 0 a = 0 b = 0 c = 0 # ここまで i=0 open("car.dat" , "r") do |money| # car.datというファイルを読み込む。 while price = money.gets # ループ処理を実行する。 if /(\S+)\s+(\S+)\s+(\d+.\d+)/ =~ price # 設定した条件に一致した場合 time[i] = $1 # 配列にデータファイルの文字列を格納 taxi[i] = $2 km[i] = $3.to_f # 実数系のデータを格納 i += 1 end end end # ループ処理を終わらせる。 #p time, taxi, km j = 0 pointa=0 # それぞれの初期値を入力 pointb=0 pointc=0 # ここまで while j < taxi.length # taxiの格納数より超えたら、終了。 if taxi[j] == "a" # aと入力された場合、以下の処理を行う。 pointa += km[j] * 70 # 距離に応じた計算方法 pointa += 650 # 初乗り料金を加える。 heikma = heikma.to_f + km[j].to_f #aの合計走行距離を求める。 a += 1 elsif taxi[j] == "b" # b と入力された場合 pointb += km[j] *80 pointb += 710 heikmb = heikmb.to_f + km[j].to_f b += 1 elsif taxi[j] == "c" # c と入力された場合 pointc += km[j] *90 pointc += 710 heikmc = heikmc.to_f + km[j].to_f c += 1 end j += 1 end heikma = heikma/a heikmb = heikmb/b heikmc = heikmc/c printf("平均 %5.1f km \n", heikma) printf("本日、小型タクシーの売上は %d 円です。\n", pointa) # 売り上げを表示 printf("小型の平均走行距離は、%5.1f kmです。\n",heikma) # 平均を表示 printf("本日、中型タクシーの売上は %d 円です。\n", pointb) printf("中型の平均走行距離は、%5.1f kmです。\n", heikmb) printf("本日、大型タクシーの売上は %d 円です。\n", pointc) printf("大型の平均走行距離は、%5.1f kmです。\n", heikmc) STDERR.print("小型はa, 中型はb, 大型はc で次の質問に答えて下さい。\n") STDERR.print("乗車したタクシー: ") # どのタクシーに乗ったのか入力。 car = gets.chomp STDERR.print("乗車時刻: ")# いつ乗ったのか入力する。 hour = gets.chomp k = 0 while k < time.length # 入力したデータと一致した場合 if time[k] == hour # 時間と走行距離を代入する。 meter = km[k] break # 処理を終了する。 else # 違う場合 k += 1 # 条件に合うものを探す。 end end # ループの終了 sigo = (meter + 0.5).to_i # 走行距離を四捨五入する。 if car == "a" # aの場合 p price = 650 + sigo * 70 # 金額の計算 elsif car == "b" # bの場合 p price = 710 + sigo * 80 elsif car == "c" p price = 710 + sigo * 90 # cの場合 end milange = price/100 # マイレージの計算 open("reciept.txt" , "w") do |mail| # reciept.txtにデータを書きこむ。 mail.printf("---------------\n") # 書きこみ内容 mail.printf("出発時刻:%s\n 金額: %s円\n", hour, price) mail.printf("獲得したマイレージ: %dマイル\n",milange) mail.printf("公益タクシー\n") mail.printf("---------------\n") # ここまで end printf("発券終了\n") # 標準出力で発券の終了 実行結果 pan{c111069}% ./open_taxi.rb [~/Ruby] 平均 6.5 km 本日、小型タクシーの売上は 3308 円です。 小型の平均走行距離は、 6.5 kmです。 本日、中型タクシーの売上は 1852 円です。 中型の平均走行距離は、 2.7 kmです。 本日、大型タクシーの売上は 1124 円です。 大型の平均走行距離は、 4.6 kmです。 小型はa, 中型はb, 大型はc で次の質問に答えて下さい。 乗車したタクシー: a 乗車時刻: 10:10 720 発券終了 pan{c111069}% cat reciept.txt [~/Ruby] --------------- 出発時刻:10:10 金額: 720円 獲得したマイレージ: 7マイル 公益タクシー --------------- pan{c111069}% ./open_taxi.rb [~/Ruby] 平均 6.5 km 本日、小型タクシーの売上は 3308 円です。 小型の平均走行距離は、 6.5 kmです。 本日、中型タクシーの売上は 1852 円です。 中型の平均走行距離は、 2.7 kmです。 本日、大型タクシーの売上は 1124 円です。 大型の平均走行距離は、 4.6 kmです。 小型はa, 中型はb, 大型はc で次の質問に答えて下さい。 乗車したタクシー: b 乗車時刻: 12:10 950 発券終了 pan{c111069}% cat reciept.txt [~/Ruby] --------------- 出発時刻:12:10 金額: 950円 獲得したマイレージ: 9マイル 公益タクシー --------------- pan{c111069}% ./open_taxi.rb [~/Ruby] 平均 6.5 km 本日、小型タクシーの売上は 3308 円です。 小型の平均走行距離は、 6.5 kmです。 本日、中型タクシーの売上は 1852 円です。 中型の平均走行距離は、 2.7 kmです。 本日、大型タクシーの売上は 1124 円です。 大型の平均走行距離は、 4.6 kmです。 小型はa, 中型はb, 大型はc で次の質問に答えて下さい。 乗車したタクシー: c 乗車時刻: 13:20 1160 発券終了 pan{c111069}% cat reciept.txt [~/Ruby] --------------- 出発時刻:13:20 金額: 1160円 獲得したマイレージ: 11マイル 公益タクシー --------------- 考察 aの場合 pan{c111069}% bc -l [~/Ruby] 1.4 + 3.7 + 14.3 19.4 19.4 / 3 6.46666666666666666666 2.5 + 2.9 5.4 5.4 / 2 2.70000000000000000000 4.6 4.6 4.6 / 1 4.60000000000000000000 quit cの場合 pan{c111069}% bc -l [~/Ruby] 650 + 1 * 70 720 710 + 3 * 80 950 710 + 5 * 90 1160 quit dの場合 pan{c111069}% bc -l [~/Ruby] 720 / 100 7.20000000000000000000 950 / 100 9.50000000000000000000 1160 / 100 11.60000000000000000000 quit * なお、小数点以下の数字は切り捨てた。 どの計算方法も一致するので、このプログラムは成立する。 3、感想 今回は正規表現とRuby 言語でのプログラミングをやった。かなり苦戦した が、2つのプログラムとも、きちんと起動するときができたのでとても良かっ た。 また、四捨五入の計算がプログラムでも正確に打てば、きちんと起動してく れるというのには非常に驚いた。また、四捨五入を使った計算を使うときに は、しっかり覚えて操作していきたいと思った。 参考文献 http://roy/~madoka/2012/r1/07/r1_07_14_theme_11_vendingmachine.html 西村まどか 基礎プログラミングI 第7回 「券売機のしくみ」 http://roy/~madoka/2012/r1/07/r1_07_15_theme_12_distance.html 西村まどか 基礎プログラミングI 第7回 「走行距離を求めるには」 http://roy/~madoka/2012/r1/07/r1_07_16_theme_13_filewrite.html 西村まどか 基礎プログラミングI 第7回 「自動印刷を行うには」 http://roy/~madoka/2012/r1/05/r1_05_01_theme_01_asciicode.html 西村まどか 基礎プログラミングI 第5回 「ASCII コード表」 共同学習者 佐藤智久、渡辺十夢、小野貴己