第 6 回 正規表現と検索 レポート課題 氏名:梅津光 学籍番号:c1110246 語学クラス:英語 2 コース:政策マネジメント 1.筆記問題 A.誕生日 1992年6月8日 まず、1992 を 0d1992 を、 16進数 と 2進数 で表示してみる。 10進数 → 2進数 1992 / 2 = 996 0 996 / 2 = 498 0 498 / 2 = 249 0 ↑ 249 / 2 = 124.5 1 124 / 2 = 62 0 62 / 2 = 31 0 ↑ 31 / 2 = 15.5 1 15 / 2 = 7.5 1 7 / 2 = 3.5 1 ↑ 3 / 2 = 1.5 1 1 → 下から読んでいくと、 11111001000 となる。 よって、 0b11111001000 となる。 6 を 2進数表示にする。 6 / 2 = 3 0 3 / 2 = 1.5 1 1 0d6 = 0b110 8 を 2進数表示にする。 8 / 2 = 4 0 4 / 2 = 2 0 2 / 2 = 1 0 1 0d8 = 0b1000 次に16進数に変換する。 さっき変換した2進数を使う。 11111001000 を右から4桁毎に区切る。 111、 1100、 1000 と区切ることが出来る。これを16進数に変換する。 111 = 7 1100 = c 1000 = 8 よって、 0x7c8 となる。 0110 = 6 よって、 0x6 となる。 1000 = 8 よって、 0x8 となる。 B.1992 年 6 月 8 日 を 1992、 6、 8 とし、16進数に直す。 まず数値を足す。 1992+6+8=2006 その後、16 で割っていく。余りを出す。 2006 / 16 6 125 / 16 13 7 / 16 7 出てきた余りを2進数同様に、16進数として、下から読み上げていく。 0x7d6 となる。 次に、10進数に直すため、それぞれ、*1、 *16、 *256 を掛けていく。 (7*256)+(13*16)+(6*1) ↓ ↓ ↓ 1792 + 208 + 6 =2006 この計算の結果、2006 となり、16進数と同じの数値と同じになった。 c.プログラムを起動するときに利用者が起動方法を間違えた場合には適切なメッ セージを端末に出力する必要がある。そのような場合は単にprintfするのではな く、STDERR に対してprintfする必要がある。単にprintfすると、エラーメッセー ジさえもファイルに書かれるため、利用者の目に触れずに終わってしまうから。 2.プログラミング問題 A.山形県 村山地方 の市町村の名前、人口、面積について B.製作したプログラム 大石田町 Oishida 8300人 79 尾花沢市 Obanazawa 19000人 372 村山市 Murayama 28000人 169 東根市 Higashine 47000人 207 朝日町 Asahi 7600人 197 河北町 Kahoku 20000人 52 西川町 Nisikawa 6000人 393 大江町 Oe 9000人 154 寒河江市 Sagae 42000人 139 山辺町 Yamanobema 15000人 61 中山町 Nakayama 11833人 31 天童市 Tendo 62000人 113 山形市 Yamagata 254000人 381 上山市 Kaminoyama 33000人 241 C.山形県 村山地方 の名前、人口、面積を分類する。 D.検索パターンを考える 1、egrep "町" data_c111024.dat を実行する。 予想は、市町村の内、町が検索される。 2、egrep "山+市" data_c111024.dat を実行する。 予想は、yama(山)のあとにshi(市)がくる市町村が検索される。 3. egrep "o" data_c111024.dat を実行する。 予想は、ローマ字表記に "o" がつく市町村が検索される。 4. egrep "東|西|南|北" data_c111024.dat を実行する。 予想は、市町村名に東か西、南、北が入っている市町村が検索される。 5. egrep "1....人" data_c111024.dat を実行する。 予想は、人口10000から19999人までの市町村が検索される。 6. egrep "as?+h" data_c111024.dat を実行する。 予想は、ローマ字で "h" がつくまえに、"a" か "s" がついている市町村が 検索される。 7. egrep "[100-300].9" data_c111024.dat を実行する。 予想は、面積 100 から 300 までの市町村、なおかつ1の桁が 9 である市町村が 検索される。 E.実行した結果 1. pan{c111024}% egrep "町" data_c111024.dat [~/Ruby] 大石田町 Oishida 8300人 79 朝日町 Asahi 7600人 197 河北町 Kahoku 20000人 52 西川町 Nisikawa 6000人 393 大江町 Oe 9000人 154 山辺町 Yamanobe 15000人 61 中山町 Nakayama 12000人 31 2. pan{c111024}% egrep "山+市" data_c111024.dat [~/Ruby] 村山市 Murayama 28000人 169 上山市 Kaminoyama 33000人 241 3. pan{c111024}% egrep "o" data_c111024.dat [~/Ruby] 河北町 Kahoku 20000人 52 山辺町 Yamanobe 15000人 61 天童市 Tendo 62000人 113 上山市 Kaminoyama 33000人 241 4. pan{c111024}% egrep "東|西|南|北" data_c111024.dat [~/Ruby] 東根市 Higashine 47000人 207 河北町 Kahoku 20000人 52 西川町 Nisikawa 6000人 393 5. pan{c111024}% egrep "1....人" data_c111024.dat [~/Ruby] 尾花沢市 Obanazawa 19000人 372 山辺町 Yamanobe 15000人 61 中山町 Nakayama 12000人 31 6. pan{c111024}% egrep "as?+h" data_c111024.dat [~/Ruby] 東根市 Higashine 47000人 207 朝日町 Asahi 7600人 197 河北町 Kahoku 20000人 52 7. pan{c111024}% egrep "[100-300].9" data_c111024.dat [~/Ruby] 村山市 Murayama 28000人 169 寒河江市 Sagae 42000人 139 F.結果の考察 1.予想の通り、「町」が全て検索された。このプログラムは正しいと言える。 2.予想の通り、「山」のあとに「市」がくる市町村が検索された。このプログラ ムは正しいと言える。 3."o" のつく市町村が全て表示されると思っていたが、予想以上に少なかった。 原因は、ローマ字表記のところで、始まりを大文字の "O" と入力していたためだと思っ た。 試しに大文字で入力してみる。 pan{c111024}% egrep "O" data_c111024.dat [~/Ruby] 大石田町 Oishida 8300人 79 尾花沢市 Obanazawa 19000人 372 大江町 Oe 9000人 154 大文字で入力していた市町村だけが検索された。 このプログラムは大文字と小文字も識別するらしい。結果、このプログラムは正 しいと言える。 4.東西南北のうち、どれかひとつでも入っていれば検索されるようにした。結果、 どれかひとつでも入っている市町村が全て検索された。よってこのプログラムは 正しいと言える。 5.人口が10000人以上20000人未満までの市町村が検索されるようにした。結果、 予想していた市町村が全て検索されたのでこのプログラムは正しいと言える。 6.ローマ字入力時、"h" がくるまえに、"a" か "s" がつく市町村が検索される ようにした。結果、予想していたものが全て検索された。よってこのプログラム は正しいと言える。 7.面積が100から300までの市町村、なおかつ1の桁が "9" の市町村を検索する。 結果、予想していたものが全て検索された。よって、このプログラムは正しいと 言える。 G.利用した正規表現 今回利用した正規表現は以下のものである。 +(plus):直前の文字が出現しなければならず、その出現は何回でも良い場合 の時に使う。 |(vertical line): 「または」の意味である。 [](braket): []で括られた文字のどれかが一致するものを取り出すときに使 う。 .(period): 検討できない一文字を取り出して検索してくれる。 period の前にある文字や数字が必ず出てくる必要がある。 ?(question mark): question mark の直前の文字が0回または1回含まれるも のを検索する。 3.感想 今までなにげなく使っていた検索エンジンを自ら作ることは予想以上に難しかっ た。何を題材にするのかとても迷ってしまって、その後のプログラミングに支障 をきたしてしまった。やはり考えに煮詰まったら一旦帰宅するべきだと学んだ。 普段の生活では、パソコンなどで、動画など再生できるかどうかの対応の形式 だと思う。そのパソコンや、アップロードで、再生できない形式のファイルは再 生できないということだ。 4.参考文献 webページ 基礎プログラミング I 第 6 回 正規表現と検索 「うろ覚えの検索」 http://roy/~madoka/2012/r1/06/r1_06_03_theme_01_patternmatching.html 「何回か繰り返される文字を探したい」 http://roy/~madoka/2012/r1/06/r1_06_04_theme_02_repetation.html 「いくつかある候補を探したい場合」 http://roy/~madoka/2012/r1/06/r1_06_05_theme_03_or.html 「1 文字違い」 http://roy/~madoka/2012/r1/06/r1_06_06_theme_04_onecharacter.html 「正規表現の例」 http://roy/~madoka/2012/r1/06/r1_06_09_theme_07_regexp.html 著者:西村まどか ------------------------------------------------------------------------- ウィキペディア 「村山地方」 http://ja.wikipedia.org/wiki/%E6%9D%91%E5%B1%B1%E5%9C%B0%E6%96%B9 -------------------------------------------------------------------------