第7回 正規表現とRuby言語でのプログラミング レポート課題 氏名:村上茉奈美 学籍番号:C1111352 語学クラス:英語3 コース:社会福祉 1.筆記問題 A. a. 0b11010110 (2進数) を 0x (16進数) に変換する。 1. 2進数の数を右側から4桁ずつ区切る。 1101 0110 2. 4桁ずつ区切ったものを16進数に当てはめる。 1101 = d 0110 = 6 16進数に当てはめたものを並べると、 d6 になる。 答えは、 0xd6 。 b. 0d1024 (10進数) を 0x (16進数) に変換する。 1. もとの数を 16 で割り続け、商が 0 になるまで計算する。 1024/16 = 64 余り 0 64/16 = 4 余り 0 4/16 = 0 余り 4 2. 計算が合っているか bc -l で確かめる。 pan{c111135}% bc -l [~/Ruby] 1024/16 64.00000000000000000000 64/16 4.00000000000000000000 4/16 .25000000000000000000 quit 計算が合っていることが確認できた。 ( 4/16 の結果に整数が出ていないことから、商は 0 だと分かる。) 余りを下から上に読むと、 400 になる。 答えは、 0x400 。 B. 自分の名前をアルファベットにすると murakami manami ( MURAKAMI MANAMI ) だ。 それを16進数表示にするために、ASCIIコード表を用いる。 a. murakami manami の場合 (小文字) m = 0x6d u = 0x75 r = 0x72 a = 0x61 k = 0x6b a = 0x61 m = 0x6d i = 0x69 m = 0x6d a = 0x61 n = 0x6e a = 0x61 m = 0x6d i = 0x69 これを並べると、 0x6d, 0x75, 0x72, 0x61, 0x6b, 0x61, 0x6d, 0x69 ( murakami ) 0x6d, 0x61, 0x6e, 0x61, 0x6d, 0x69 ( manami) になる。 b. MURAKAMI MANAMI の場合 (大文字) M = 0x4d U = 0x55 R = 0x52 A = 0x41 K = 0x4b A = 0x41 M = 0x4d I = 0x49 M = 0x4d A = 0x41 N = 0x4e A = 0x41 M = 0x4d I = 0x49 これを並べると、 0x4d, 0x55, 0x52, 0x41, 0x4b, 0x41, 0x4d, 0x49 ( MURAKAMI ) 0x4d, 0x41, 0x4e, 0x41, 0x4d, 0x49 ( MANAMI ) になる。 筆記問題( A,B )の参考文献 1. Rubyプログラミング基礎講座 広瀬雄二著 第8講 「計算機の内部表現」 8ー1 「2進数と16進数」 p101~106 2. 基礎プログラミング 第5回 (配列の構造) 「ASCIIコード表」 西村まどか http://roy/~madoka/2012/r1/05/r1_05_01_theme_01_asciicode.html 2.プログラミング問題 A. 前回のレポートに添付したデータ data_c111135.dat を用いる。 (前回のデータでは数値を扱う部分がなかったので、つけ足した。 (入力した数値は「先頭の漢字の画数」を表す。)) 四字熟語 暗中模索 あんちゅうもさく antyumosaku 13 四字熟語 一期一会 いちごいちえ itigoitie 1 四字熟語 温厚篤実 おんこうとくじつ onkoutokujitu 12 四字熟語 外柔内剛 がいじゅうないごう gaijyunaigo 5 四字熟語 快刀乱麻 かいとうらんま kaitoranma 7 三字熟語 数奇屋 すきや sukiya 13 三字熟語 好事家 こうずか kozuka 5 四字熟語 興味津津 きょうみしんしん kyomisinsin 16 四字熟語 三位一体 さんみいったい sanmiittai 3 四字熟語 質実剛健 しつじつごうけん situjitugoken 13 四字熟語 心願成就 しんがんじょうじゅ singanjyojyu 4 三字熟語 居丈高 いたけだか itakedaka 8 四字熟語 前代未聞 ぜんだいみもん zendaimimon 9 四字熟語 内憂外患 ないゆうがいかん naiyugaikan 4 四字熟語 粒粒辛苦 りゅうりゅうしんく ryuryusinku 9 三字熟語 金字塔 きんじとう kinjito 8 四字熟語 公明正大 こうめいせいだい komeiseidai 4 四字熟語 傍若無人 ぼうじゃくぶじん bojyakubujin 12 四字熟語 因果応報 いんがおうほう ingaoho 6 三字熟語 五月雨 さみだれ samidare 4 四字熟語 言語道断 ごんごどうだん gongododan 7 四字熟語 独断専行 どくだんせんこう dokudansenko 9 四字熟語 八方美人 はっぽうびじん happobijin 2 四字熟語 千載一遇 せんざいいちぐう senzaiitigu 3 四字熟語 七転八倒 しちてんばっとう sititenbatto 2 三字熟語 真骨頂 しんこっちょう sinkottyo 10 四字熟語 無病息災 むびょうそくさい mubyosokusai 12 a. 必要な部分だけを取り出す 1. 作成したプログラム regexp_kanji.rb #!/usr/koeki/bin/ruby #coding: euc-jp STDERR.print("検索パターン: ") pat = STDIN.gets.chomp # STDIN 標準入力 req = Regexp.new(pat, true)#正規表現したい文字列にオプションをつける # true は「大文字小文字を区別しない」という意味 while kakusuu = gets if req =~ kakusuu #print kakusuu if /(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/ =~ kakusuu # (\S+) は「空白以外の文字列が1個以上並んでいるものを探す」 # \s+ は「空白文字が1個以上並んでいるものを探す」 printf("%d画\n", $5) # $5 に入っているものを反映させる end end end 2. もとにしたプログラムからの変更点 regexp_stdin.rb をもとにした。 入力したものを結果に反映させるところまでは同じだが、「何番目の 項目を表示するか」を限定する文を追加した。 ( if /(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/ =~ kakusuu と printf("%d画\n",$5) ) 3. KTerm で実行 pan{c111135}% ./regexp_kanji.rb data_c111135.dat [~/Ruby] 検索パターン: 1 13画 1画 12画 13画 16画 13画 12画 10画 12画 4. 結果の考察 1 を含んでいる項目(先頭に 1 がきているもの、及び 1 画のもの) が全て表示された。 (上記に書いてあるデータと照らし合わせて、結果が一致しているこ とが分かる。) 5. 参考文献 基礎プログラミング 第7回 (正規表現とRuby言語でのプログラミング) 西村まどか 以下、そのページ内から 「キーボードから検索文字を入力したい」 http://roy/~madoka/2012/r1/07/r1_07_05_theme_03_regexp_stdin.html 「空白を利用してデータを取りだすには」 http://roy/~madoka/2012/r1/07/r1_07_08_theme_06_tab.html 「駅名だけを切り出そう」 http://roy/~madoka/2012/r1/07/r1_07_09_theme_07_parenthesis.html b. 範囲を指定したものを検索する 1. 作成したプログラム regexp_kanji.rb #!/usr/koeki/bin/ruby #coding: euc-jp STDERR.print("検索パターン: ") pat = STDIN.gets.chomp # STDIN 標準入力 req = Regexp.new(pat, true)#正規表現したい文字列にオプションをつける # true は「大文字小文字を区別しない」という意味 while kakusuu = gets if req =~ kakusuu #print kakusuu if /(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/ =~ kakusuu # (\S+) は「空白以外の文字列が1個以上並んでいるものを探す」 # \s+ は「空白文字が1個以上並んでいるものを探す」 printf("%d画\n", $5) # $5 に入っているものを反映させる end end end 2. もとにしたプログラムからの変更点 regexp_stdin.rb をもとにした。 a と構造は変わらない。 3. KTerm で実行 pan{c111135}% ./regexp_kanji.rb data_c111135.dat [~/Ruby] 検索パターン: [0~9] 9画 9画 9画 10画 4. 結果の考察 本来は、0から9 の範囲内で検索したかった。 今回は 0 と 9 を含んでいるものが表示されてしまったので 原因を考えていきたい。 5. 参考文献 基礎プログラミング 第7回 (正規表現とRuby言語でのプログラミング) 「駅名だけを切り出そう」 http://roy/~madoka/2012/r1/07/r1_07_09_theme_07_parenthesis.html 西村まどか c. 平均値を出す 1. 作成したプログラム ary_kanji.rb #!/usr/koeki/bin/ruby #coding: euc-jp jyukugo = Array.new #四字熟語か三字熟語か kanji = Array.new #その熟語 yomi = Array.new #ひらがなの読み alfa = Array.new #アルファベット表記での読み kakusuu = Array.new #先頭の漢字の画数 n = 0 #熟語をしまう変数 sum = 0 #合計の値 while yomikomi = gets if /(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\d+)/ =~ yomikomi jyukugo[n] = $1 kanji[n] = $2 yomi[n] = $3 alfa[n] = $4 kakusuu[n] = $5.to_i sum += kakusuu[n] #画数全てを sum に代入する n += 1 # n は 1 ずつ増える end #if文の終わり end #while文の終わり average =sum.to_f/n printf("画数の合計は %d なので、それを全体の要素数で割ると、 %5.1f になります\n", sum, average) 2. もとにしたプログラムからの変更点 ary_stdin.rb をもとにした。 私が作ったデータは5つの項目があったので、空白文字以外を表 す (\d+) を追加した。 また、合計と平均を求める行も追加し、printf 文でその結果を 表示させるようにした。 3. KTerm で実行 pan{c111135}% ./ary_kanji.rb data_c111135.dat [~/Ruby] 画数の合計は 201 なので、それを全体の要素数で割ると、 7.4 になります 4. 結果の考察(確かめ算をする) pan{c111135}% bc -l [~/Ruby] 13+1+12+5+7+13+5+16+3+13+4+8+9+4+9+8+4+12+6+4+7+9+2+3+2+10+12 201 201/27 7.44444444444444444444 quit まず、それぞれの数字を全て足し算した。 それで、プログラム内の「合計」が一致していることが分かっ た。 その「合計」を個数で割って平均を求めた。 プログラム内では小数第1位まで以下は切り捨てとしている。 よって、平均を求めるプログラムが合っていることが分かった。 5. 参考文献 基礎プログラミング 第5回 (配列の構造) 「データとプログラムの分離」 http://roy/~madoka/2012/r1/05/r1_05_11_theme_09_arystdin.html 西村まどか Rubyプログラミング基礎講座 広瀬雄二著 第6講 「配列」 6ー2 「成績処理の例」 p80~83 d. 最小値を求め、必要な部分のみを表示する。 1. 作成したプログラム ary_kanji.rb (上の c の問題のプログラムに最小値を求める文を加えた。) #!/usr/koeki/bin/ruby #coding: euc-jp jyukugo = Array.new #四字熟語か三字熟語か kanji = Array.new #その熟語 yomi = Array.new #ひらがなの読み alfa = Array.new #アルファベット表記での読み kakusuu = Array.new #先頭の漢字の画数 n = 0 #熟語をしまう変数 sum = 0 #合計の値 while yomikomi = gets if /(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\d+)/ =~ yomikomi jyukugo[n] = $1 kanji[n] = $2 yomi[n] = $3 alfa[n] = $4 kakusuu[n] = $5.to_i sum += kakusuu[n] #画数全てを sum に代入する n += 1 # n は1つずつ増える end # if文の終わり end #while文の終わり average =sum.to_f/n # 平均は 合計/項目数 printf("画数の合計は %d なので、それを全体の要素数で割ると、 %5.1f になります\n", sum, average) low = kakusuu[0] #仮の最も少ない画数 nlow = 0 #最も少ない画数を持つ要素番号 i = 0 #最も少ない画数を調べる要素番号 while i < kakusuu.length-1 # i が 1 を下回るまで続ける if kakusuu[i] < low low = kakusuu[i] nlow = i end i += 1 end printf("最も少ない画数は %dです\n", kakusuu[nlow]) 2. もとにしたプログラムからの変更点 ary_lowest.rb をもとにした。 そのプログラムの price の部分を、自分のデータに対応する ように kakusuu に変更した。 3. KTerm で実行 pan{c111135}% ./ary_kanji.rb data_c111135.dat [~/Ruby] 画数の合計は 201 なので、それを全体の要素数で割ると、 7.4 になります 最も少ない画数は 1です 4. 結果の考察 データを見ると、「一期一会」の 1 画が最も少ない画数だと 分かる。 本来は、熟語の漢字と画数を表示させたかったのだが、最小 値の画数と対応する項目を表示させる文章をどこに入力すれ ば正しく実行されるのかが分からず、諦めてしまった。 結果、最小値のみを求めるものになってしまったので、 今後、どのようにしたら実行されるのかを考えたい。 5. 参考文献 基礎プログラミング 第5回 (配列の構造) 以下、そのページ内から 「最低運賃を表示するには」 http://roy/~madoka/2012/r1/05/r1_05_16_appendix_04_summary.html 「最低運賃のプランを表示するには」 http://roy/~madoka/2012/r1/05/r1_05_17_appendix_05_plan.html いずれも、西村まどか C. 感想 今回はスムーズに結果が得られて良かった。 今回の講義では「必要な部分だけを取り出す」ことを学んだので、そこを重 点的に頑張った。 平均を求めるプログラムを作る際、本来は regexp_kanji.rb のプログラム 内に入れれば一度に複数の実行結果が得られると考えたのだが、そのプログ ラムは検索パターンをキーボードから入力して反映させるものだったため、 前回までの講義で作ったプログラムを参考にして別のプログラムを作成した。 すると、エラーが出ることなく正しく実行できたので良かった。 課題が残るものも多いが、今後改善して行きたい。