第 7 回 ゼミ紹介 レポート課題 氏名:加藤恭平 学籍番号:c1100549 語学クラス:英語2 コース(系):政策マネジメント 1. A.最高傑作に関するレポート a.仕様書 「http://roy/~c110054/advertise2/pran.txt」 取扱説明書 「http://roy/~c110054/advertise2/00readme.txt」 b.プログラムについて a)考えた設定 入力した言葉を解説や備考付きで登録し、登録した言葉の検索や登録した言葉 をクイズ型式で出題する3つの機能を備えたプログラム(databox.rb) b)作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' # 文字コードの設定。この場合は EUC コードで漢字 library = Hash.new # 新しくHash配列library print("呉羽「今回は何をするの?」\n") STDERR.print("[1]覚え書きに入力\t[2]覚え書きから検索\t[3]覚え書きの内容把握度チェック\n") STDERR.print("呉羽「使いたい機能の番号を選択して下さいね。」:") number = gets.to_i # 選択された番号をnumberに入れる if number == 1 # [1]覚え書きに入力が選択された場合 print ("呉羽「言葉を入力して登録するわ。」\n") while true # ある条件を満たすまで繰り返し printf("呉羽「登録したい言葉の名称を入力してください。」(qを入力すると終了):") data = gets.chomp # 改行文字を消して data に入れる if data == "q" # dataにqが入力された場合 break # 繰り返しを抜ける end # ifに対するend printf("呉羽「解説、備考などを入力してね。」:") library[data] = gets.chomp # 入力した言葉を library 配列に入れる end # while に対するend STDERR.print("呉羽「入力終了よ。お疲れさま。」\n") print("\n名称\t解説や備考\n") # 名称と解説をこの下に表示する for list in library.keys # libraryのkeysをlistにする。 printf("%s\t%s \n",list,library[list]) # 結果を表示 print"-"*80 # 区切り線を表示 open("databox.dat","a+") do |kakikomi| # databox.datを開いて書き込みを行う kakikomi.printf("%s\t%s \n",list,library[list]) #この内容を書き込む end # openに対するend end # forに対するend printf("呉羽「以上を覚え書きに書き込んだわ。\n検索や確認がしたくなったらまた来てね。」\n") elsif number == 2 # [2]覚え書きから検索が選択された場合 print("呉羽「覚え書きに登録された用語を検索するわ。\n該当するものが見つからなかった場合は何も表示されないから注意して。\n") while true # ある条件を満たすまで繰り返し STDERR.printf("呉羽「検索したい名称を入力してね。」(qを入力で終了):") search = STDIN.gets.chomp # 入力された言葉を改行文字を消して searchに入れる if search == "q" # searchにqが入力された場合 break # 繰り返しを抜ける end # ifに対するend open("databox.dat","r") do |yomikomi| # databox.dat を開いて書き込みを行う while databox = yomikomi.gets if /^#{search}/e =~ databox # searchの文字列で始まるものを出す if /(\S+)\s+(\S+)/ =~ databox # 正規表現(文字列 空白 文字のとき) printf("%s\t%s\n",$1,$2) # 検索結果の表示 end # if /(\S+)\s+(\S+)/ =~ databoxに対するend end # if /^#{pattern}/e =~ dictionaryに対するend end # while dictionary = yomikomi.getsに対するend end # openに対するend end # while trueに対するend elsif number == 3 # [3]覚え書きの内容把握度チェックが選択された場合 question = 0 # 問題数を入れる変数 question。初期値は0 correct = 0 # 正解数を入れる変数 correct。初期値は0 print("呉羽「覚え書きに登録したことをどれだけ覚えているか確認するわね。」\n") sleep 1 print("呉羽「解説や備考はデータに入力した通りにお願いね。」\n") sleep 1 print("呉羽「それでは始めるわ…」\n") open("databox.dat","r") do |yomiyomi| # databox.dat開いて書き込みを行う while databox = yomiyomi.gets if/(\S+)\s+(\S+)/ =~ databox # 正規表現(文字列 空白 文字列 のとき) STDERR.printf("呉羽「%sの解説や備考は何かしら?」:",$1) content = gets.chomp # 入力された言葉を改行文字を消してcontentに入れる question += 1 # 何問解いたかをカウントする if content == $2 # 入力された言葉が配列の2列目と一致しているとき print("呉羽「流石です。よく覚えているわ。」\n") correct += 1 # 正解数に1を足す else # 一致しないとき print("呉羽「ごめんなさい、登録した内容と違うようです。」\n") end # if mean == $2 に対するend end # if/(\S+)\s+(\S+)/ =~ databoxに対するend end # whileに対するend end # openに対するend printf("呉羽「%d個中 %d個覚えていたわ。\nまた確認したくなったらいつでも来て下さいね。」\n",question,correct) # 何問中何問正解したかを表示する end # モード選択のifに対するend c)もとにしたプログラム 去年の授業用ページに掲載されている先輩が作成したdictionary.rbを参考にした。 d)実行結果 [1]覚え書きに入力を選択した場合 pan{c110054}% ./databox.rb [~/Ruby] 呉羽「今回は何をするの?」 [1]覚え書きに入力 [2]覚え書きから検索 [3]覚え書きの内容把握度チェック 呉羽「使いたい機能の番号を選択して下さいね。」:1 呉羽「言葉を入力して登録するわ。」 呉羽「登録したい言葉の名称を入力してください。」(qを入力すると終了):曹操 呉羽「解説、備考などを入力してね。」:字は孟徳 呉羽「登録したい言葉の名称を入力してください。」(qを入力すると終了):劉備 呉羽「解説、備考などを入力してね。」:字は玄徳 呉羽「登録したい言葉の名称を入力してください。」(qを入力すると終了):孫権 呉羽「解説、備考などを入力してね。」:字は仲謀 呉羽「登録したい言葉の名称を入力してください。」(qを入力すると終了):q 呉羽「入力終了よ。お疲れさま。」 名称 解説や備考 孫権 字は仲謀 --------------------------------------------------------------------------------劉備 字は玄徳 --------------------------------------------------------------------------------曹操 字は孟徳 --------------------------------------------------------------------------------呉羽「以上を覚え書きに書き込んだわ。 検索や確認がしたくなったらまた来てね。」 [2]覚え書きから検索を選択した場合 pan{c110054}% ./databox.rb [~/Ruby] 呉羽「今回は何をするの?」 [1]覚え書きに入力 [2]覚え書きから検索 [3]覚え書きの内容把握度チェック 呉羽「使いたい機能の番号を選択して下さいね。」:2 呉羽「覚え書きに登録された用語を検索するわ。 該当するものが見つからなかった場合は何も表示されないから注意して。 呉羽「検索したい名称を入力してね。」(qを入力で終了):曹操 曹操 字は孟徳 呉羽「検索したい名称を入力してね。」(qを入力で終了):劉備 劉備 字は玄徳 呉羽「検索したい名称を入力してね。」(qを入力で終了):孫権 孫権 字は仲謀 呉羽「検索したい名称を入力してね。」(qを入力で終了):馬岱 呉羽「検索したい名称を入力してね。」(qを入力で終了):q [3]覚え書きの内容把握度チェックを選択した場合 pan{c110054}% ./databox.rb [~/Ruby] 呉羽「今回は何をするの?」 [1]覚え書きに入力 [2]覚え書きから検索 [3]覚え書きの内容把握度チェック 呉羽「使いたい機能の番号を選択して下さいね。」:3 呉羽「覚え書きに登録したことをどれだけ覚えているか確認するわね。」 呉羽「解説や備考はデータに入力した通りにお願いね。」 呉羽「それでは始めるわ…」 呉羽「孫権の解説や備考は何かしら?」:字は仲謀 呉羽「流石です。よく覚えているわ。」 呉羽「劉備の解説や備考は何かしら?」:字は玄徳 呉羽「流石です。よく覚えているわ。」 呉羽「曹操の解説や備考は何かしら?」:字は子桓 呉羽「ごめんなさい、登録した内容と違うようです。」 呉羽「3個中 2個覚えていたわ。 また確認したくなったらいつでも来て下さいね。」 e)考察 [1]について 入力した言葉と解説が登録できているかデータファイルとなる databox.datを開き、確認してみる。 孫権 字は仲謀 劉備 字は玄徳 曹操 字は孟徳 のようになっており、入力した内容が正確に登録できている。 [2]について 実行結果を見ると、指示に従って登録した言葉を入力するとそれに対応して入力 した解説が検索されて表示されていることが分かる。 また登録していない言葉を入力したときは結果は表示されず、再び質問に戻るよ うになっている。 [3]について 実行結果を見ると、表示される指示に従って登録した言葉に対応した解説を入力 すると正解メッセージが表示されている。 また、登録していない解説を入力した際も不正解メッセージを表示し、正解数も 正確にカウントされていることが分かる。 以上の三つの結果から、このプログラムは正しく動作していると言える。 d.広告ページへのリンク先 「http://roy/~c110054/advertise2/」 2.感想 自由課題と言うことでなかなかアイディアが思いつかず、最終的に昨年度の先輩の アイディアを頂く形になってしまったが、正規表現やopenメソッドなど、忘れているところは前期に学習した神田先生のページを見ながら復習して理解し、自分なりの変化も加えることが出来たので最終的には自分の力とすることが出来たので良かったと思います。 ----------------------------------------------------------------------------- 参考文献 基礎プログラミングI 2011年度授業用ページ (7) 正規表現 http://roy/~naoya/ruby/7.html 著者 神田直弥 基礎プログラミングI 2011年度授業用ページ (8)ファイルの入出力 http://roy/~naoya/ruby/8.html 著者 神田直弥 2010年度講義ノート 基礎プログラミング II 第7回 ゼミ紹介 講評 http://roy/~madoka/2010/r2/07/rpt/c108203.txt 著者 西村まどか 昨年度の先輩