第7回 基礎プログラミング II レポート課題 氏名: xxxxxxxx 学籍番号:C10xxxx 語学クラス:英語xx コース(系):社会 A.最高傑作について a.企画書 「単語帳作成ソフト」の企画書 <作成前> これまでデータファイルは読み込み用としてのみ使ってきた なので、データへの書込みを出来るプログラムを作成したいと考えた。 そこで、 ・入力された単語をデータに書き込む ・登録された単語を検索できる ものを作ろうと考えた。 <作成後> 当初、理想としては ・データ内のものを全て読込み、abc順に並び変え ・単語の意味確認テスト という機能も加えたかった。 確認テストは追加することが出来た。 だが、abc順に並べるのはどうしても出来なかった。 一旦単語を全て登録する →そこからもう一度データをファイルから全て読み出し、abc順に並び換える →並び換えたものをファイルに書き直す という方法で試してみたが、途中で混乱し出来なくなった。 もっと簡潔なやり方があると思うのでその方法を摸索したい。 <今後の課題> ・上記の理想を取り入れる。 ・確認テストの問題は、ランダム出題機能をつけたり問題数を10問くらいに設定 したりしたい。 プログラム説明 a.設定 英単語と意味を登録し、単語から意味を検索したり、覚えたか確認テストをし たりすることが出来るプログラムdictionary.rb b.作成プログラムdictionary.rb #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語を使う宣言 word = Hash.new # Hash配列 wordを使う宣言 print("単語帳作成ソフトです\n") # 説明 STDERR.print("[1]単語帳作成\t[2]登録単語検索\t[3]確認テスト\n") STDERR.print("使いたい機能の番号を選んで下さい:") number = gets.to_i # 選択された番号(1か2か3)をnumberに入れる。 if number == 1 # [1]単語帳作成 が選択されたら print("単語を登録します。\n") # 説明文。 while true # ある条件になるまで以下を続けて printf("単語を入力してください(qを入力で終了):") # 入力を促す。 tango = gets.chomp # 改行文字を切り取って tango に取り込む。 if tango == "q" # tango に q が入力されたら(while trueを抜ける条件) break # プログラムを抜ける。 end # if break 文 終了 printf("意味を入力して下さい:") # 単語を入力させたら、次は意味の入力。 word[tango] = gets.chomp # word 配列に入れる end # while true 文終了 STDERR.print("入力終了。\n") print("\n単語\t意味\n") # 単語と意味はこの下に書かれる。 for list in word.keys # wordのkeysをlistにする。 printf("%s\t%s \n", list, word[list])# 結果の表示。 print"-"*80 # 1つ前の項目との区切り線を表示 open("dictionary.dat","a+") do |kakikomi| # dictionary.datを開き、書き込みをする。 kakikomi.printf("%s\t%s \n", list, word[list]) # この内容を書き込む。 end # open〜do文終了 end # for 文終了 printf("以上を登録しました。\n") #メッセージ表示。 elsif number == 2 # [2] 登録単語検索 が選択されたら print("登録された単語を検索します。\n該当するものが見当たらなかった場合、何も表示されません\n") while true # ある条件になるまで以下を繰り返す。 STDERR.printf("検索したい単語を入力して下さい(q を入力で終了):") # 検索したい単語の入力を促す。 search = STDIN.gets.chomp # 入力されたものは改行文字を切り取ってsearchに入れる。 if search == "q" # searchに q が入力されたら(while trueを抜ける条件) break # 終了。 end # if〜break 文終了。 open("dictionary.dat","r") do |yomikomi| # dictionary.datを開き、読む。 while dictionary = yomikomi.gets if /^#{search}/e =~ dictionary # searchの文字列で始まるものが出てくるように if /(\S+)\s+(\S+)/ =~ dictionary # 文字列 空白 文字列のとき printf("%s\t%s\n",$1,$2) # 検索結果を表示する end # if /(\S+)\s+(\S+)/ =~ dictionary 文終了 end # if /^#{pattern}/e =~ dictionary 文終了 end # while dictionary = yomikomi.gets 文終了 end # open do 文終了 end # while true 文終了 elsif number == 3 # [3] 確認テスト が選択されたら question = 0 # 問題数をいれる変数 question。初期値は0 correct = 0 # 正解数をいれる変数 correct。初期値は0 print("登録した単語で、確認テストを行います。\n") sleep 1 print("データに入力した意味を答えないと、不正解となりますので悪しからず。\n") sleep 1 print("それでははじめます。\n") #ここまでの3行は説明文。 open("dictionary.dat","r") do |yomiyomi| #dictionary.datを開き読み込む。変数はyomiyomi。 while dictionary = yomiyomi.gets if/(\S+)\s+(\S+)/ =~ dictionary # 文字列 空白 文字列 のとき STDERR.printf("%sの意味は?:",$1) #問題を表示。単語の mean = gets.chomp # 入力されたものを、改行文字を切り取ってmeanに question += 1 # 何問解いたかカウント。 if mean == $2 # 入力されたものが配列の二つ目と一致していれば print("正解\n") # 正解 と表示。 correct += 1 # 正解数に1を足す。 else # そうでなければ、つまり一致しないときは print("不正解\n") #不正解の表示。 end # if mean == $2 〜文 終了 end # /(\S+)\s+(\S+)/ =~ dictionary〜文終了 end # while dictionary = yomiyomi.gets〜文 終了 end # open("dictionary.dat","r") do |yomiyomi|〜文 終了 printf("%d問中 %d問正解でした。\n",question,correct) #何問正解したか表示 end # 番号選択のif,elsif文 終了 c.変更点 特に元にしたプログラムがあるわけではない。 前期、後期を通してこれまで習ってきたことを組み合わせた。 d.実行結果 pan{c108203}% ./dictionary.rb [~/public_html/advertise2] 単語帳作成ソフトです [1]単語帳作成 [2]登録単語検索 [3]確認テスト 使いたい機能の番号を選んで下さい:1 単語を登録します。 単語を入力してください(qを入力で終了):sleep 意味を入力して下さい:眠る 単語を入力してください(qを入力で終了):watch 意味を入力して下さい:腕時計 単語を入力してください(qを入力で終了):fire 意味を入力して下さい:火 単語を入力してください(qを入力で終了):fox 意味を入力して下さい:狐 単語を入力してください(qを入力で終了):key 意味を入力して下さい:鍵 単語を入力してください(qを入力で終了):sun 意味を入力して下さい:太陽 単語を入力してください(qを入力で終了):wall 意味を入力して下さい:壁 単語を入力してください(qを入力で終了):q 入力終了。 単語 意味 sun 太陽 -------------------------------------------------------------------------------- fire 火 -------------------------------------------------------------------------------- wall 壁 -------------------------------------------------------------------------------- sleep 眠る -------------------------------------------------------------------------------- fox 狐 -------------------------------------------------------------------------------- watch 腕時計 -------------------------------------------------------------------------------- key 鍵 -------------------------------------------------------------------------------- 以上を登録しました。 pan{c108203}% ./dictionary.rb [~/public_html/advertise2] 単語帳作成ソフトです [1]単語帳作成 [2]登録単語検索 [3]確認テスト 使いたい機能の番号を選んで下さい:2 登録された単語を検索します。 該当するものが見当たらなかった場合、何も表示されません 検索したい単語を入力して下さい(q を入力で終了):wall wall 壁 検索したい単語を入力して下さい(q を入力で終了):watch watch 腕時計 検索したい単語を入力して下さい(q を入力で終了):clock 検索したい単語を入力して下さい(q を入力で終了):key key 鍵 検索したい単語を入力して下さい(q を入力で終了):q pan{c108203}% ./dictionary.rb [~/public_html/advertise2] 単語帳作成ソフトです [1]単語帳作成 [2]登録単語検索 [3]確認テスト 使いたい機能の番号を選んで下さい:3 登録した単語で、確認テストを行います。 データに入力した意味を答えないと、不正解となりますので悪しからず。 それでははじめます。 sunの意味は?:太陽 正解 fireの意味は?:火 正解 wallの意味は?:壁 正解 sleepの意味は?:眠る 正解 foxの意味は?:狐 正解 watchの意味は?:腕時計 正解 keyの意味は?:鍵 正解 7問中 7問正解でした。 e.考察 ・[1]単語帳作成 pan{c108203}% ./dictionary.rb [~/public_html/advertise2] 単語帳作成ソフトです [1]単語帳作成 [2]登録単語検索 [3]確認テスト 使いたい機能の番号を選んで下さい:1 単語を登録します。 単語を入力してください(qを入力で終了):sleep 意味を入力して下さい:眠る 単語を入力してください(qを入力で終了):watch 意味を入力して下さい:腕時計 単語を入力してください(qを入力で終了):fire 意味を入力して下さい:火 単語を入力してください(qを入力で終了):fox 意味を入力して下さい:狐 単語を入力してください(qを入力で終了):key 意味を入力して下さい:鍵 単語を入力してください(qを入力で終了):sun 意味を入力して下さい:太陽 単語を入力してください(qを入力で終了):wall 意味を入力して下さい:壁 単語を入力してください(qを入力で終了):q 入力終了。 単語 意味 sun 太陽 -------------------------------------------------------------------------------- fire 火 -------------------------------------------------------------------------------- wall 壁 -------------------------------------------------------------------------------- sleep 眠る -------------------------------------------------------------------------------- fox 狐 -------------------------------------------------------------------------------- watch 腕時計 -------------------------------------------------------------------------------- key 鍵 -------------------------------------------------------------------------------- 以上を登録しました。 ・dictionary.datを確認してみる。 sun 太陽 fire 火 wall 壁 sleep 眠る fox 狐 watch 腕時計 key 鍵 と書き込まれていることが分かった。 更に単語を追加してみる。 pan{c108203}% ./dictionary.rb [~/public_html/advertise2] 単語帳作成ソフトです [1]単語帳作成 [2]登録単語検索 [3]確認テスト 使いたい機能の番号を選んで下さい:1 単語を登録します。 単語を入力してください(qを入力で終了):Ruby 意味を入力して下さい:ルビー 単語を入力してください(qを入力で終了):program 意味を入力して下さい:プログラム 単語を入力してください(qを入力で終了):very 意味を入力して下さい:とても 単語を入力してください(qを入力で終了):difficult 意味を入力して下さい:難しい 単語を入力してください(qを入力で終了):but 意味を入力して下さい:でも 単語を入力してください(qを入力で終了):fun 意味を入力して下さい:楽しい 単語を入力してください(qを入力で終了):q 入力終了。 単語 意味 but でも -------------------------------------------------------------------------------- very とても -------------------------------------------------------------------------------- Ruby ルビー -------------------------------------------------------------------------------- program プログラム -------------------------------------------------------------------------------- fun 楽しい -------------------------------------------------------------------------------- difficult 難しい -------------------------------------------------------------------------------- 以上を登録しました。 ・データファイルをもう一度確認する。 sun 太陽 fire 火 wall 壁 sleep 眠る fox 狐 watch 腕時計 key 鍵 but でも very とても Ruby ルビー program プログラム fun 楽しい difficult 難しい きちんと追加登録されることも分かった。 ######################### ・[2]登録単語検索 pan{c108203}% ./dictionary.rb [~/public_html/advertise2] 単語帳作成ソフトです [1]単語帳作成 [2]登録単語検索 [3]確認テスト 使いたい機能の番号を選んで下さい:2 登録された単語を検索します。 該当するものが見当たらなかった場合、何も表示されません 検索したい単語を入力して下さい(q を入力で終了):Ruby Ruby ルビー 検索したい単語を入力して下さい(q を入力で終了):ruby 検索したい単語を入力して下さい(q を入力で終了):very very とても 検索したい単語を入力して下さい(q を入力で終了):sleep sleep 眠る 検索したい単語を入力して下さい(q を入力で終了):but but でも 検索したい単語を入力して下さい(q を入力で終了):difficult difficult 難しい 検索したい単語を入力して下さい(q を入力で終了):q ・検索すると、登録したものが出てくることが分かった。 登録されていない単語は、検索されても出てこない。 ここにはメッセージを入れるべきだった。 ########################## ・[3]確認テスト pan{c108203}% ./dictionary.rb [~/public_html/advertise2] 単語帳作成ソフトです [1]単語帳作成 [2]登録単語検索 [3]確認テスト 使いたい機能の番号を選んで下さい:3 登録した単語で、確認テストを行います。 データに入力した意味を答えないと、不正解となりますので悪しからず。 それでははじめます。 sunの意味は?:太陽 正解 fireの意味は?:火 正解 wallの意味は?:壁 正解 sleepの意味は?:寝る 不正解 foxの意味は?:狐 正解 watchの意味は?:腕時計 正解 keyの意味は?:鍵 正解 butの意味は?:でも 正解 veryの意味は?:とても 正解 Rubyの意味は?:ルビー 正解 programの意味は?:プログラム 正解 funの意味は?:たのしい 不正解 difficultの意味は?:難しい 正解 13問中 11問正解でした。 ・各配列の$1に入ったものの意味は という問題で、 $2と完全に同じものが入力されれば正解とした。$2と同じものを入れると正解、 そうでなければ不正解と表示されることを確認した。 また、出題された問台は全部で13問。そのうち2問間違えたので正解は11問。 問題数、正解数のカウントが出来ていることも確認できた。 なのでこのプログラムは ◯入力されたものをデータに書き込む ◯データの中を検索する ◯データの$1と$2で問題を作り、正否を判断する ことができているといえる。 d.広告ページ http://roy/~c108203/advertise2/ 2.感想 今回はじめてデータファイルに書き込むプログラムを作り、うまくできたのでよかった。 最高傑作ということで、様々な仕様を盛り込みたかった。 だが、難しく考えたためか、思いどおりにできなかったものもある。 もっと落ち着いて考えれば問題解決のヒントが見つかるかもしれないので、あと でそのできなかったところにもう一度挑戦してみようかと思う。 3.参考文献 広瀬雄二 『Rubyプログラミング基礎講座』2006 技術評論社 第7講 ファイル出入力 (p85-100) 第12講 ハッシュ (p156-169) 第13講 配列とハッシュの応用 (p85-100)