第6回 基礎プログラミング I レポート課題 氏名:XXXXXXXX 学籍番号:c109XXX 語学クラス:英語1 コース:社会福祉 1 筆記問題 以下の問題は自分の誕生日を2進数に変換後、その2進数を16進数に変換するもの とする。 A 以下の2進数に変換する際の表記について説明する。(第5回レポート再掲) 例 2 / 7 / 3---1 7を2で割ったら3あまり1である。「----- 数字」は余りを示す。 私の誕生日は1991年3月18日である。ちなみに「1991」は「19」と「91」に分け て考えることにする。 0d19 2 /19 2 /9---1↑ 2 /4---1↑ 2 /2---0↑ 1---0↑ →→→ 余りを矢印の方向に読む。よって0b10011となる。 0b10011を16進数に変換すると 10011 0001 /0011----(1) 1 / 3-----(2) 説明 (1)後から4けたごとに分けるが、前の桁は1桁になってしまうため0を付けて4桁 にする。 (2) 4桁ごとに分けた数字を変換表(のちに示す)を用いて変換する。 よって0x13となる。 0d91 2 /91 2 /45---1↑ 2 /22---1↑ 2 /11---0↑ 2 /5----1↑ 2 /2----1↑ 1----0↑ →→→→ 余りを矢印の方向に読む。よって0b1011011となる。 0b1011001を16進数に変換すると 1011001 0101 /1011----(1) 5 / b-----(2) 説明 (1)後から4けたごとに分けるが、前の桁は3桁になってしまうため0を付けて4桁 にする。 (2) 4桁ごとに分けた数字を変換表(のちに示す)を用いて変換する。 0d3を2進数に変換する 2/3 1---1 →→→ よって0b11となる 0b11を16進数に変換する。 後に表記する変換表を用いて0x3となる 2 /18 2 /9----0↑ 2 /4----1↑ 2 /2----0↑ 1----0↑ →→→→ 余りを矢印の方向に読む。よって0b10010となる。 0b10010を16進数に変換する。 0001 /0010----(1) 1 / 2-----(2) 説明 (1)後から4けたごとに分けるが、前の桁は1桁になってしまうため0を付けて4桁 にする。 (2) 4桁ごとに分けた数字を変換表(のちに示す)を用いて変換する よって0x12となる。 10進数 16進数対応表 10進 16進 2進 0 0 0 1 1 1 2 2 10 3 3 11 4 4 100 5 5 101 6 6 110 7 7 111 8 8 1000 9 9 1001 10 a 1010 11 b 1011 12 c 1100 13 d 1101 14 e 1110 15 f 1111 16 10 10000 17 11 10001 18 12 10010 19 13 10011 20 14 10100 21 15 10101 22 16 10110 23 17 10111 24 18 11000 25 19 11001 26 1a 11010 解答を表にまとめる 年月日 2進数表示 16進数表示 0d19 0b10011 0x13 0d91 0b1011011 0x5b 0d3 0b11 0x3 0d18 0b10010 0x12 B ASCIIコード表を用いる(前回レポートより再掲) 0 1 2 3 4 5 6 7 8 9 a b c d e f 0 nul soh stx eox eot enq ack bel bs ht lf vt ff cr so si 1 dle dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us 2 ! " # $ % & ' ( ) * + , - . / 3 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 4 @ A B C D E F G H I J K L M N O 5 P Q R S T U V W X Y Z [ 円 ] ^ _ 6 ` a b c d e f g h i j k l m n o 7 p q r s t u v w x y z { | } ~ del 使い方(前回レポートより、16進数から文字を探す手順から、文字から16進数の 数字を求める手順に変更した。) 0 1 2 3 4 5 6 7 8 9 a b c d e f 0 nul soh stx eox eot enq ack bel bs ht lf vt ff cr so si 1 dle dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us イ ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← ↑ ↑ ↑ ↑ ↑ ↑ ↑ ロ 例 ASCIIコード表でemを調べる。 イ 「em」が存在する場所から横軸に見てそこにある数字を調べる。(←で表記) ロ「em」が存在する場所から縦軸に見てそこにある数字を調べる。 (↑で表記) ハ 手順イとロでさがした数字をイ、ロの順番で並べる。 よって0x19となる。 以下、自分の名前を16進数に変換した結果をこの要領で求め、まとめたものを表とする。 文字 16進数表示 K 0x4b u 0x75 b 0x62 o 0x6f t 0x74 a 0x61 E 0x45 i 0x69 i 0x69 c 0x63 h 0x68 i 0x69 r 0x72 o 0x6f プログラム問題 a 2010年5月の山形空港発着の定期便検索プログラムを作成する。 train.datをもととして、内容を変更した。 b 作成したデータファイル JAL 2231 50 08:05 09:20 大阪到着 Osakaarrive JAL 2233 50 11:15 12:30 大阪到着 Ohsakaarrive JAL 2237 50 08:05 18:05 大阪到着 Ohsakaarrive JAL 2232 50 09:50 11:10 大阪 Ohsaka JAL 2236 50 17:00 18:20 大阪 Ohsaka JAL 2238 50 18:35 19:55 大阪 Ohsaka JAL 2843 50 15:20 16:30 札幌到着 Sapporoarrive JAL 2844 50 13:15 14:20 札幌 sapporo JAL 4323 50 11:35 12:35 名古屋到着 Nagoyaarrive JAL 4326 50 13:00 14:05 名古屋 Nagoya JAL 1259 150 13:15 14:15 東京到着 Tokyoarrive JAL 1258 150 15:00 16:00 東京 Tokyo #最初の配列は航空会社の略称を示す #2つめの配列は便名を示す #3つめの配列は座席数を示す #4つ目の配列は出発時刻を示す #最初の配列は到着時刻を示す #最初の配列は出発地(到着便の場合は何処から到着するか)を示す 例 庄内到着=庄内空港から到着する #最初の配列は出発地(到着便の場合は何処から到着するか)の英語表記を示す 例 shonaiarrive=庄内空港から到着する ちなみに今回は、メールに直接「#」を記載した。 c 目的 2010年5月の山形空港発着の航空定期便を検索し、旅行のプランを立てたい。 d使用する検索パターンの予想 1 egrep "^J" data06.rb Jという文字が最初の要素に入力されているものを検索させたい。 2パソコンの操作になれていないA君が、1の検索のように「JAL」と入力したかっ たのだが、誤ってegrep "^AL" data06.rbと入力してしまった。正しく表示され ないことが予想されるがどうだろうか。 3 同じくパソコンの操作になれていないC君が、1の検索のように「JAL」と入力したかっ たのだが、誤ってegrep "^JA" data06.rbと入力してしまった。今度は正しく表 示されることが予想されるがどうだろうか 4 Dさんは自分の英語力に自身がないひとである。D君は「大阪」を「oosaka」な のか、「ohsaka」なのか判らなかった。従って、egrepo[oh]sakaと入力させた。 これなら正しく検索できると仮定するが、どうだろうか。 5 Eさんはアメリカ人である。道でであった人に「大阪」という文字が読めなかっ たため、読んで、発音してもらったが「おおか」と聴こえたらしく、良く判らな い、この場合egrep "oho.kaと入力すれば検索できいると仮定できるかどうだろ うか。 6 Fさんは山形と東京の往復と、大阪と山形の往復を調べ、チケット代によって、 (今回のデータには、値段は記入していないが)旅行プランを立てたかった。この ときegrep tokyo|ohsaka data06.dat と入力させれば良いと仮定するがどうだろ うか。 7 Gさんは山形空港のグランドスタッフ(空港で受付などをする人)である。Gさんの 本日の仕事は昼休憩が終わったら、13時から14時までの、あと1時間であるため、 この1時間の発着スケジュールについて、調べることとした。 この場合egrep" (13)" data06.datとすれば良いと仮定されるがどうだろうか。 8 Fさんはマーシャラー、つまり着陸後の飛行機を正しく駐機場に誘導するための仕事をし ている。山形空港でマーシャラーの仕事を遂行するために、到着便のみを検索し たいが、「到着する」という意味の「arrive」という英単語に「r」が何回出て くるか判らなかった。 この場合egrep "(a+r)" data06.datと入力させれば到着便のみを表示させること ができると仮定できるが、どうだろうか。 9 新人グランドスタッフのGさんは、本日山形空港赴任初日である。しかし、Gさん は上司から「aあなたははゆとり教育世代なのだから、自分で検索プログラムの使い方 について、勉強しなさい!」といわれ何も教えてくれなかった。 Gさんは仕方なく、手探りで検索し始めたが、「1259」便の「12 9」は判ったが、 真ん中の1つの数字が判らなかった。この場合、egrep "(12[0-9]9)" data06.dat とすれば良いと仮定されるがどうだろうか。 10 使っていない機能である$について調べた。 e 実行結果 1 pan{c109058}% egrep -i "^J" data06.dat [~/Ruby] JAL 2231 50 08:05 09:20 大阪到着 Osakaarrive JAL 2233 50 11:15 12:30 大阪到着 Ohsakaarrive JAL 2237 50 08:05 18:05 大阪到着 Ohsakaarrive JAL 2232 50 09:50 11:10 大阪 Ohsaka JAL 2236 50 17:00 18:20 大阪 Ohsaka JAL 2238 50 18:35 19:55 大阪 Ohsaka JAL 2843 50 15:20 16:30 札幌到着 Sapporoarrive JAL 2844 50 13:15 14:20 札幌 sapporo JAL 4323 50 11:35 12:35 名古屋到着 Nagoyaarrive JAL 4326 50 13:00 14:05 名古屋 Nagoya JAL 1259 150 13:15 14:15 東京到着 Tokyoarrive JAL 1258 150 15:00 16:00 東京 Tokyo よって1の予想は結果と合致した 2 pan{c109058}% egrep -i "^AL" data06.dat [~/Ruby] pan{c109058}% [~/Ruby] よって2の予想と結果は合致した。 3 pan{c109058}% egrep -i "^JA" data06.dat [~/Ruby] JAL 2231 50 08:05 09:20 大阪到着 Osakaarrive JAL 2233 50 11:15 12:30 大阪到着 Ohsakaarrive JAL 2237 50 08:05 18:05 大阪到着 Ohsakaarrive JAL 2232 50 09:50 11:10 大阪 Ohsaka JAL 2236 50 17:00 18:20 大阪 Ohsaka JAL 2238 50 18:35 19:55 大阪 Ohsaka JAL 2843 50 15:20 16:30 札幌到着 Sapporoarrive JAL 2844 50 13:15 14:20 札幌 sapporo JAL 4323 50 11:35 12:35 名古屋到着 Nagoyaarrive JAL 4326 50 13:00 14:05 名古屋 Nagoya JAL 1259 150 13:15 14:15 東京到着 Tokyoarrive JAL 1258 150 15:00 16:00 東京 Tokyo 4 pan{c109058}% egrep -i "o[oh]saka" data06.dat [~/Ruby] JAL 2233 50 11:15 12:30 大阪到着 Ohsakaarrive JAL 2237 50 08:05 18:05 大阪到着 Ohsakaarrive JAL 2232 50 09:50 11:10 大阪 Ohsaka JAL 2236 50 17:00 18:20 大阪 Ohsaka JAL 2238 50 18:35 19:55 大阪 Ohsaka よって予想と結果は合致した。 5 pan{c109058}% egrep -i "Ohsa.a" data06.dat [~/Ruby] JAL 2233 50 11:15 12:30 大阪到着 Ohsakaarrive JAL 2237 50 08:05 18:05 大阪到着 Ohsakaarrive JAL 2232 50 09:50 11:10 大阪 Ohsaka JAL 2236 50 17:00 18:20 大阪 Ohsaka JAL 2238 50 18:35 19:55 大阪 Ohsaka 6 pan{c109058}% egrep -i "Tokyo|Ohsaka" data06.dat [~/Ruby] JAL 2233 50 11:15 12:30 大阪到着 Ohsakaarrive JAL 2237 50 08:05 18:05 大阪到着 Ohsakaarrive JAL 2232 50 09:50 11:10 大阪 Ohsaka JAL 2236 50 17:00 18:20 大阪 Ohsaka JAL 2238 50 18:35 19:55 大阪 Ohsaka JAL 1259 150 13:15 14:15 東京到着 Tokyoarrive JAL 1258 150 15:00 16:00 東京 Tokyo よって予想と結果は一致した 7 pan{c109058}% egrep "(13)" data06.dat [~/Ruby] JAL 2844 50 13:15 14:20 札幌 sapporo JAL 4326 50 13:00 14:05 名古屋 Nagoya JAL 1259 150 13:15 14:15 東京到着 Tokyoarrive よってこの結果は一致している。 しかし、私自身もどうしてこんな発想をしたのか理解できないのだが、この結果 を実行する前に下記のような実行もしている。 pan{c109058}% egrep "(1),(7)" data06.dat [~/Ruby] pan{c109058}% egrep "(1),(7)" data06.dat [~/Ruby] もちろん実行できないが、推測される理由として、 http://roy.e.koeki-u.ac.jp/~madoka/2010/r1/06/06_06_theme_04_onecharacter.html に表記されている、一文字ずつ探すという言葉の意味の取違いとされる。 8 pan{c109058}% egrep "(a+r)" data06.dat [~/Ruby] JAL 2231 50 08:05 09:20 大阪到着 Osakaarrive JAL 2233 50 11:15 12:30 大阪到着 Ohsakaarrive JAL 2237 50 08:05 18:05 大阪到着 Ohsakaarrive JAL 2843 50 15:20 16:30 札幌到着 Sapporoarrive JAL 4323 50 11:35 12:35 名古屋到着 Nagoyaarrive JAL 1259 150 13:15 14:15 東京到着 Tokyoarrive よって結果と予想が合致した。 9 pan{c109058}% egrep "(12[0-9]9)" data06.dat [~/Ruby] JAL 1259 150 13:15 14:15 東京到着 Tokyoarrive よって予想と結果は一致した。 10 pan{c109058}% egrep "e$" data06.dat [~/Ruby] JAL 2231 50 08:05 09:20 大阪到着 Osakaarrive JAL 2233 50 11:15 12:30 大阪到着 Ohsakaarrive JAL 2237 50 08:05 18:05 大阪到着 Ohsakaarrive JAL 2843 50 15:20 16:30 札幌到着 Sapporoarrive JAL 4323 50 11:35 12:35 名古屋到着 Nagoyaarrive JAL 1259 150 13:15 14:15 東京到着 Tokyoarrive このことから、これは最後のデータの最後の文字を検索したことが判る。 f考察 このプログラミングを作成しながら、思い浮かんだのは、座席数がリアルタイム に(予約したら)減って行くというシステムはどうやるのだろうかということであ る。 具体的には予約座席数をSTDERR.printでいくつ予約するかを聞き、そこで手に入 れた数字をgetsでとりこみ。その数を引くということを考えたが、問題はその数 字をどうやってdataに反映させるのかが判らない。dataに反映できないのかも知 れないとも思う。 g 今回使ったmeta charactarをまとめる。 説明 . .の前と後に存在する文字列を検索する = 例 10.回→100回、101回など + 「+」の直前の文字は、何回出現してもいいし、どれが出てき てもいいのだが、+の後の文字は絶対に出現しなければならない。 ^ 先頭の文字列(列の差愛書の文字列)を検索 $ 最後の文字列の最後の文字を検索 | A|B =AとBを含む [ ] [ay]=aまたはyに該当する 例 p[ou]p =popまたはpup [0-9] 0〜9間での一文字に該当する -i 大文字でも小文字でも検索させる TokyoでもtOkyoでも検索する ( ) ( )内の文字と一緒 h 感想 今回は、検索するだけだった。よって、単調な作業で大変だったが。その単調な 時間を楽しむために、事例で(ソーシャルワーク風に生活感を持たせながら)楽し い時間をすごした。 なかなか頭の中で整理しにくいので、演習問題で、更に技 術を高められるように努力したい 日常で存在する正規表現(検索プログラム)は電話帳(iタウンページ)があるだろ う。業種で「病院」だけを探し出したり、電話番号で「03ー〜」等、索引もでき i参考文献 西村 まどか 2010講義ノート 基礎プログラミング I 第6回 うる覚えの検索 http://roy.e.koeki-u.ac.jp/~madoka/2010/r1/06/06_03_theme_01_patternmatching.html 西村 まどか 2010講義ノート 基礎プログラミング I 第6回 何回か繰り返され ている文字を検索したい http://roy.e.koeki-u.ac.jp/~madoka/2010/r1/06/06_04_theme_02_repetation.html 西村 まどか 2010講義ノート 基礎プログラミング I 第6回 いくつかある候補 を探したい場合 ttp://roy.e.koeki-u.ac.jp/~madoka/2010/r1/06/06_05_theme_03_or.html 西村 まどか 2010講義ノート 基礎プログラミング I 第6回 1文字違い http://roy.e.koeki-u.ac.jp/~madoka/2010/r1/06/06_06_theme_04_onecharacter.htm 山形空港ビル株式会社 フライト情報 http://www.yamagata-airport.co.jp/flight/flight_top.html 協力してくれた先輩: 大沼 拓海 先輩/五代儀 公大 先輩/工藤 智也 先輩 共同学習者: 横山広樹/青木 千紗/大島 藍