第7回 正規表現とRuby言語でのプログラミング レポート課題 氏名:高橋凌太 学籍番号:C1111004 クラス:英語1 コース:地域共創 変更点 ・最後の参考文献にミスがあったため修正 ・問題Bを行う ・共同学習者名の追加 ・添付ファイルの追加 以上を変更し再提出します。 1. A. a.0b11010110 = 0x?? 0b11010110を4桁づつ区切る。 0b11010110→1101、0110 それぞれを2進数から16進数に変換する 0b1101→0xd 0x0110→0x6 よって 0b11010110 = 0xd6 となる。 A.0b11010110 = 0xd6 b.0d1024 = 0x?? 10進数を16進数に変換するため、 0d1024を16で割り結果を求める。 1024/16 = 64 余り 0 64/16 = 4 0 4/16 = 0 4 求められた結果を下から羅列し答えとする。 A.0d1024 = 0x400 B.私の名前をアルファベットで表現すると Ryota Takahashi となる。これをASCIIコード表に基づき16進数に変換する。 R = 0x52 y = 0x79 o = 0x6f t = 0x74 a = 0x61 T = 0x54 a = 0x61 k = 0x6b a = 0x61 h = 0x68 a = 0x61 s = 0x73 h = 0x68 i = 0x69 よって、0x52796f746154616b616861736869 となる。 A.0x52796f746154616b616861736869 参考文献 基礎プログラミングI 第9回 16進数・ASCIIコード 神田直弥 http://roy/~naoya/ruby/9.html 基礎プログラミングI 第5回 (配列の構造) 「ASCII コード表」 西村まどか http://roy/~madoka/2012/r1/05/r1_05_01_theme_01_asciicode.html 2. A. a.作成したプログラム egrep.rb 基にしたプログラム 基礎プログラミング 第7回 正規表現とRuby言語でのプログラミグ ・「候補駅を選べるようにするには」 regexp_select.rb #講義ノート ・「選択する部分をつくるには」 同上 #講義ノート 以上全て、西村まどか著 ・基礎プログラミング 第3回 レポート課題 自作プログラム while_mashroom.rb 読み込ませるプログラム data_c111100.dat #基礎プログラミングI 第6回 レポート課題 作成データ 岩手 花巻市 1890 花巻 Hanamaki 岩手 花巻市 1932 花巻空港 Hanamakikuukou 岩手 花巻市 1893 石鳥谷 Ishidoriya 岩手 紫波町 1890 日詰 Hizume 岩手 紫波町 1998 紫波中央 Shiwatyuou 岩手 紫波町 1949 古館 Furudate 岩手 矢巾町 1898 矢幅 Yahaba 岩手 盛岡市 1950 岩手飯岡 Iwateiioka 岩手 盛岡市 1915 仙北町 Senbokutyou 岩手 盛岡市 1890 盛岡 Morioka b.説明 #!/usr/koeki/bin/ruby #coding: euc-jp name = Array.new #駅名表示の準備 STDERR.print("検索パターン:") #Kterm上の表示 pattern = STDIN.gets.chomp #検索パターンを文字として取り出す request = Regexp.new(pattern, true,)#日本語として正規表現 open("data_c111100.dat","r") do |candidate| #データを事前に読み込ませる i = 0 while data_c111100 = candidate.gets #data_c111100.datを読み込ませる間 if request =~data_c111100 #もしdata_c111100.datを読ませたら # print data_c111100 if /(\S+)+\s+(\S+)+\s+(\S+)+\s+(\S+)+\s+(\S+)+(\S+)/=~data_c111100 #文字列 → 行間 → 文字列... データ分表示 name[i] = $4 #取り出す行目 (自分の場合、4行目だったので$4) printf("%d \t %s駅\n", i+1, name[i]) #候補の駅名の表示 i += 1 #駅名は1つづつ増えていく end end end end STDERR.print("駅番号を選んで下さい\n") #Kterm上の候補選択の表示 j = gets.chomp.to_i #選択を文字として取り出す printf("%s駅を選択しました\n", name[j-1]) #選択完了の表示 years =0 #年数の初期値 total = 0 #年数の合計の初期値 n = 0 #選択する数の総量の初期値 while true #whileの間 STDERR.print("創業年数:") #Kterm上の表示 years = gets.chomp #年数を文字として取り出す if years =="q" #もし、"q"を押されたら break #"創業年数"の表示を終了し計算に移行せよ end years = years.to_i #年数は整数で表示 total += years #年数を合計させる n += 1 #"創業年数"の表示は1つづつ増えていく end printf("創業年数の平均 %6.1f年", total.to_i / n) #Kterm上の平均の表示及び、平均の計算式 c.変更点 細かい変更点として name[i] = $1 → name[i] = $4 #自分のデータ上で駅名が4行目にあったので 基にしたプログラム while_mashroom.rbより printf("%D Kg\n", total) の削除 #今回のプログラムは合計の表示を必要としないめ d.実行結果 ・駅名での検索 pan{c111100}% ./egrep.rb [~/Ruby] 検索パターン:hanamaki 1 花巻駅 2 花巻空港駅 駅番号を選んで下さい 1 花巻駅を選択しました 創業年数:1890 創業年数:1893 創業年数:1998 創業年数:q 創業年数の平均 1927.0年% ・創業年での検索 pan{c111100}% ./egrep.rb [~/Ruby] 検索パターン:1890 1 花巻駅 2 日詰駅 3 盛岡駅 駅番号を選んで下さい 1 花巻駅を選択しました 創業年数:1890 創業年数:1893 創業年数:1998 創業年数:q 創業年数の平均 1927.0年% ・市町村名での検索 検索パターン:盛岡 1 岩手飯岡駅 2 仙北町駅 3 盛岡駅 駅番号を選んで下さい 3 盛岡駅を選択しました 創業年数:1890 創業年数:1893 創業年数:1998 創業年数:q 創業年数の平均 1927.0年% ・県名での検索 pan{c111100}% ./egrep.rb [~/Ruby] 検索パターン:岩手 1 花巻駅 2 花巻空港駅 3 石鳥谷駅 4 日詰駅 5 紫波中央駅 6 古館駅 7 矢幅駅 8 岩手飯岡駅 9 仙北町駅 10 盛岡駅 駅番号を選んで下さい 1 花巻駅を選択しました 創業年数:1890 創業年数:1893 創業年数:1998 創業年数:q 創業年数の平均 1927.0年% e.考察 駅名、創業年、市町村名、県名それぞれに対応した検索結果が表示されたので 検索機能は正しく作動したと言える。次に年数の平均の確かめ算を行う。 pan{c111100}% bc -l [~/Ruby] 1890+1893+1998 5781 5781/3 1927.00000000000000000000 よって、プログラムの計算は正しかったと言える。 B. a.作成したプログラム opem_taxi.rb 基にしたプログラム 2010年度 先輩レポート http://roy/~madoka/2010/r1/07/rpt/c109014.txt b説明 #!/usr/koeki/bin/ruby #coding: euc-jp time = Array.new #時間を読み込ませる type = Array.new #タイプを読み込ませる distance = Array.new #距離を読み込ませる hour = Array.new a = 0 #車種 b = 0 c = 0 totalmoney = 0 #売上の合計金額の初期値 totaldistance = 0 #距離の合計の初期値 distanceavg = 0 #距離の平均の初期値 i = 0 open("taxi.dat", "r") do |seek| #"taxi.dat"を読み込ませる while taxi =seek.gets #taxi.datを読み込ませている間 if /(\S+)+\s+(\S+)+\s+(\d+. \d+)/ =~ taxi #文字列 → 行間 → 文字列...の表示 time[i] = $1 #データ1行目の時間 type[i] = $2 #データ2行目の車種 distance[i] = $3.to_f #データ3行目の距離 if type[i] =="a" #もし車種 a を選択したら p = 650 * distance[i] #料金。初乗り650円 p += distance[i] * 70 #1kmごとに70円追加 elsif type[i] =="b" #もし車種 b を選択したら p = 710 * distance[i] #料金。初乗り710円 p += distance[i] * 80 #1kmごとに80円追加 else #それ以外だったら p = 710 * distance[i] #料金。車種 c は初乗り710円 p += distance[i] * 90 #1kmごとに90円追加 end total += p #料金の合計 i += 1 #表示は1つづつ増えていく print("車種 走行距離[Km]\n") #Kterm上の表示 while n < type.length #typeの数分繰り返す printf("%-10s\t%f\n", type[n], distance[n]) #Kterm上の表示 n += 1 #表示は1つづつ増えていく end avg =distance[i] / 6 #平均を求める printf("今日の総売り上げ %d円\n", total) #売上の総額を求める公式,,及び,Kterm上の表示 printf("平均走行距離は %6.1f円\n", distanceavg) #平均を求める公式,,及び,Kterm上の表示 end c.変更点 ・if type[i] =="a" p = 650 * distance[i] p += distance[i] * 70 elsif type[i] =="b" p = 710 * distance[i] p += distance[i] * 80 else p = 710 * distance[i] p += distance[i] * 90 end を追加。 d.実行結果 pan{c111100}% ./open_taxi.rb [~/Ruby] ./open_taxi.rb:51: syntax error, unexpected $end, expecting keyword_end e.考察 実行した結果、エラーメッセージが表示された。 syntax・・・「統語論、文章構成法、シンタックス」 unexpected・・・「思いがけない、不意の、意外の」 という意味のようである。 expecting keyword 「予想されるキーワード」で end とある。endをいれてみた。 pan{TAKAHASHI Ryota}% ./open_taxi.rb [~/Ruby] ./open_taxi.rb:53: syntax error, unexpected $end, expecting keyword_end が、結果は変わらなかった。 3.感想 講義や講義ノートを基に正しく作動するプログラムを作成することができた。 様々な検索パターンに対応できるため、広い分野に応用されるのは納得だ。反省 点は、問題にあった最大値を出すことができなかったこと。最大値を出す原理の 理解が不十分だったと言える。講義ノート等を見てもう一度復習したい。 問題B.はやってみたものの、結果がともなわず、悔しかった。結果が出なかった のもそうだが、何故エラーが出るのかすら分からなかったのが1番悔しい。 また、問題2のA.の解答方法が先生の求めている方法と異なるような気がする。 参考文献 基礎プログラミングI 第7回 正規表現とRuby言語でのプログラミング 「候補駅を選べるようにするには」 http://roy/~madoka/2012/r1/07/r1_07_12_theme_09_candidate.html 基礎プログラミングI 第7回 正規表現とRuby言語でのプログラミング 「選択する部分を作るには」 http://roy/~madoka/2012/r1/07/r1_07_13_theme_10_selection.html 基礎プログラミングI 第7回 正規表現とRuby言語でのプログラミング 「券売機のしくみ」 http://roy/~madoka/2012/r1/07/r1_07_14_theme_11_vendingmachine.html 基礎プログラミングI 第7回 正規表現とRuby言語でのプログラミング 「走行距離を求めるには」 http://roy/~madoka/2012/r1/07/r1_07_15_theme_12_distance.html 基礎プログラミングI 第7回 正規表現とRuby言語でのプログラミング 「自動印刷を行うには」 http://roy/~madoka/2012/r1/07/r1_07_16_theme_13_filewrite.html 以上全て、西村まどか著 基礎プログラミングI 第3回 キーボードから入力して計算させるには 自作プログラム while_mashroom 基礎プログラミングI 2010年度 先輩レポート http://roy/~madoka/2010/r1/07/rpt/c109014.txt 共同学習者 加藤拓磨 稲村洋樹 添付ファイル ・egrep.rb ・data_c111100.dat ・open_taxi.rb