第6回 正規表現と検索 レポート 氏名:鈴木茉衣子 学籍番号:C1110878 語学クラス:英語3 コース:地域共創 1 筆記問題 A 自分の生年月日は1992年5月28日である。 0d19 0d92 0d5 0d28をそれぞれ2進数、16進数で表示する。 まずは2進数に変換する。そのためには、10進数の値を、商が0になるまで2で割っ ていく。商を立てたときに出た余りの1または余りが出ず割り切れた場合の0が、2進数に変換した際の値となる。以下、実際に計算していく。 0d19 19/2=9...1 9/2=4...1 4/2=2...0 2/2=1...0 1/2=0...1 0d19 = 0b10011 0d92 92/2=46...0 46/2=23...0 23/2=11...1 11/2= 5...1 5/2= 2...1 2/2= 1...0 1/2= 0...1 0d92 = 0b1011100 0d5 5/2=2...1 2/2=1...0 1/2=0...1 0d5 = 0b101 0d28 28/2=14...0 14/2= 7...0 7/2= 3...1 3/2= 1...1 1/2= 0...1 0d28 = 0b11100 次に、16進数変換する。既に10進数を2進数に変換しているため、その2進数を16 進数に変換しようと思う。まずは2進数を4ケタずつに分けて考える。この時、た とえば6ケタの2進数は4ケタと2ケタに分けられるが、2ケタのほうには0を 左側に二つ足す。分けたうちの一方の4つの数字を、一の位に2の0乗、十の位に 2の1乗、百の位に2の2乗、千の位に2の3乗をかける。さらにその4つの数 字を足して、10以上15以下の数はA〜Fに変換する。それぞれ分けて変換し た数値を並べて表示すると、16進数の値になる。以下、実際に計算してみる。 0d19 = 0b10011 0b10011 0001と0011に分けて考える。 0001 = 1 0011 = 1*2**0 +1*2**1 + 0*2**2 + 0*2**3 = 1 + 2 + 0 + 0 = 3 0b10011 = 0x13 0d92 = 0b1011100 0b1011100 0101と1100に分けて考える。 0101 = 1*2**0 + 0*2**1 + 1*2**2 + 0*2**3 = 1 + 0 + 4 + 0 = 5 1100 = 0*2**0 + 0*2**1 + 1*2**2 + 1*2**3 = 0 + 0 + 4 + 8 = 12 0d12 = 0xb 0b1011100 = 0x5b 0d5 = 0b101 0101 = 1*2**0 + 0*2**1 + 1*2**2 + 0*2**3 = 1 + 0 + 4 + 0 = 5 0b101 = 0x5 0d28 = 0b11100 0b11100 0001と1100に分けて考える。 0001 = 1*2**0 + 0*2**1 + 0*2**2 + 0*2**3 = 1 + 0 + 0 + 0 = 1 1100 = 0*2**0 + 0*2**1 + 1*2**2 +1*2**3 = 0 + 0 + 4 + 8 = 12 0d12 = 0xb 0b11100 = 0x1b よって、1992.5.28は2進数法表示にすると、0b10011 0b1011100.0b5.0b11100 16進数法に表示にすると、0x13 0x5b.0x5.0x1b となる。 B. 19+92+5+28=144 0x13 + 0x5b + 0x5 + 0x1b 左の数値だけ考えると、1+5+1 = 7 になる。 右の数値は 3+b+5+b となる。まずbを10進数に変換して12とする。       3+12+5+12=32 32は16で割ると2になるので、0x20となる。 よって、右の数値の2ケタのうち左側の2はは先に計算して合った左の数値の7に加算さ れるので、左の数値は9となり、右の数値は残りの0となる。よって、和は0x90に なる。 0d144を16で割ると9になるため、0d144 = 0x90 は成り立つ。 なぜ10進数の値を16で割るかというと、16進数の一の位は0〜fまでの16個の数字 で成り立っているため、17以上の値を16進数法表示にしようとすると十の位が生 じる。よって、0x10は0d16、0x20は0d32、0x30は0d48……というように、16進数 の十の位は10進数にして16ずつ増えていく。逆に、10進数の値を16で割れば、16 進数における十の位がわかるのである。 C. STDERRというmethodを使う理由 シェルには、入力先として標準入力(キーボード)、出力先として標準出力(コン ソールやウィンドウ)、標準エラー出力の3つが用意されている。 ちなみにシェルとはユーザーの操作を受けて、与えられたosの 中核部分に伝えるソフトウェアのことである。マウスのクリックなどを解釈して、 対応した機能を実行するように伝えてくれる。 STDERRを使う理由は、標準出力と標準エラー出力を区別するためである。具体的にいうと、コマンドを実行したときに、何かエラーが生じた場合、エラー標準を普通の出力データとは、区別して出力するためである。 2 プログラム問題 30歳の平均年収を元にランキングされた企業30社のデータを作った。左から、企業名、その企業の業界、企業が設立された年(年)、30歳時の年収(万円)となっている。 以下データ本体(data_c111087.dat) キーエンス 電気機器 1974 1133 朝日放送 情報/通信 1951 988 東京海上ホールディングス 保険 2002 983 電通 サービス 1906 937 日本テレビ放送網 情報/通信 1952 860 中部日本放送 情報/通信 1950 844 キリンホーディングス 食品 1907 828 テレビ朝日 情報/通信 1957 814 ソフトバンク 情報/通信 1981 811 プレサンスコーポレーション 不動産 1997 810 PKB毎日放送 情報/通信 1951 805 三菱商事 卸売 1950 793 住友商事 卸売 1919 786 三井住友フィナンシャルグループ 銀行 2002 781 伊藤忠商事 卸売 1949 778 野村綜合研究室 情報/通信 1966 778 日本製紙グループ本社 パルプ/紙 2001 771 博報堂DYホールディングス サービス 2003 766 日清製粉グループ本社 食品 1907 751 三菱地所 不動産 1937 748 三井物産 卸売 1947 743 T&Gホールディングス 保険 2004 742 商船三井 海運 1884 741 任天堂 その他製品 1947 740 東京汽船 倉庫/運輸関連 1947 730 WOWOW 情報/通信 1984 725 グリー 情報/通信 2004 719 味の素 食品 1925 719 イオン 小売 1926 718 エムスリー サービス 2000 710 上記のデータを様々な方法で検索してみた。 以下、検索結果と考察である。 "朝日"と検索したところ、 pan{c111087}% egrep "朝日" data_c111087.dat [~/Ruby] 朝日放送 情報/通信 1951 988 テレビ朝日 情報/通信 1957 814 と出た。 次に"^朝日"と検索すると、^は先頭の文字を朝日と限定するため、 pan{c111087}% egrep "^朝日" data_c111087.dat [~/Ruby] 朝日放送 情報/通信 1951 988 となり、テレビ朝日が検索結果から外れた。 次に"朝日$"と検索してみたが、何もヒットしなかった。$は末尾の文字を朝日に 限定させるものなので、テレビ朝日が検索結果で出てくると予想したが、そうではなかった。テレビ朝日の後に情報通信と続いているため末尾の文字列と判断されなかったのではと考える。 次に、またはという意味を持つ|で検索してみた。 pan{c111087}% egrep "三井|住友|不動産" data_c111087.dat [~/Ruby] プレサンスコーポレーション 不動産 1997 810 住友商事 卸売 1919 786 三井住友フィナンシャルグループ 銀行 2002 781 三菱地所 不動産 1937 748 三井物産 卸売 1947 743 商船三井 海運 1884 741 三井、住友、不動産のうちのどれかが入っている項目がすべて検索されているた め、このプログラムは正しく作動していることがわかった。 また、?を使ってみると、三井だけでなく三菱もヒットしたため、上記の検索結 果より、三菱商事が一つ多く加わった。 ?とは、直前の文字が0または1回出現させるものである。うろ覚えの検索でもい くつかヒットするためである。 pan{c111087}% egrep "三-?|住友|不動産" data_c111087.dat [~/Ruby] プレサンスコーポレーション 不動産 1997 810 三菱商事 卸売 1950 793 住友商事 卸売 1919 786 三井住友フィナンシャルグループ 銀行 2002 781 三菱地所 不動産 1937 748 三井物産 卸売 1947 743 商船三井 海運 1884 741 感想 検索の仕組みを知ることができて面白かった。自分が予想した通りの検索結果で ないときも多かったのでなぜこのように検索されるのか考えるのが難しかった。 参考文献 webページ 基礎プログラミング第6回「正規表現と検索」 http://roy.e.koeki-u.ac.jp/~madoka/2012/r1/06/ 2011年度基礎プログラミング 第6回 講評 よかったレポート http://roy.e.koeki-u.ac.jp/~madoka/2010/r1/06/rpt/crt.html 著者 西村まどか ._._._._._._._._._._._._._._._._. 東北公益文科大学 Maiko Suzuki/鈴木茉衣子 c111087@g.koeki-u.ac.jp ._._._._._._._._._._._._._._._._.