# 単語帳を作ろう！

【難易度】☆☆☆

## 昔話

作者の私もかつては学生でした。〜ちょっと昔話をさせてください。

私は、中学校１年生の時に、友人の家で初めてパソコンなるものを見ました。友人は自分で打ち込んだプログラムを見せ、「プログラムを作れば、自分の思い通りにコンピューターが動くんだよ」と、自慢しました。私は、「へ〜なんでも出来るんだ！」と、非常に感心し、その週のうちに新聞配達を始めました。・・・それで、３ヶ月くらいあとに、MSXというパソコンを買いました。

その後、私は何をやるにも、このMSXというパソコンを使ってみました。それで、テスト週間前には、単語帳（英単語、漢字書取、化学式、歴史年表など）を作り、パソコンに向かって勉強しました。聞くからにハイテク中学生でしょう？ただ、これには問題があって、単語帳を作った時点で、１００点を取れた気になってしまうので、注意が必要です。

ところで、私が一番この単語帳を役に立てたのは、大学になって中国語の勉強をした時ですね。パソコンを使った単語帳の良いところは、非常にゲーム感覚で勉強が出来るという所です。大学生なんて、なかなか自分から勉強しようって気にならないもので、それを克服するために、友人たちと面白い単語帳作りに挑みました。

単語帳にスコア機能をつけて、２０問中１８問以上の成果が得られるまで、何回でもゲームに挑戦しなければならないというルールをつけたり、クリアできなかったら、腹筋１０回とか、友人数人でプレイし、一番成績の悪いものが夕食を奢るなどなど。「楽しくなければ、勉強じゃない！」なんて、CMが昔ありましたが、やりようによっては、暗記中心のつまらない勉強も、その辺のRPGで遊ぶより楽しくなるのです！！

と、そんな訳で、ひまわりを使って、単語帳を作ってみましょう！！

## １番簡単な単語テスト

> まず、一番簡単なテストを作ってみましょう。

> 単語テスト１
> `'配列に問題と解答を入れる 問題#0=『big』 解答#0=『大きい』 問題#1=『home』 解答#1=『家』 問題#2=『little』 解答#2=『小さい』 問題#3=『ice』 解答#3=『氷』 問題#4=『top』 解答#4=『頂上』 '質問と、解答の入力 Iを、0から、4まで、繰り返す( 「｛問題＃I｝の意味は何ですか？」と、尋ねる。 もし、それが、解答#Iならば( 「正解」と、言う。 )違えば( 「違います。｛問題＃I｝は、｛解答＃I｝です。」と、言う。 )。 )。 「おわり」と、言う。 おわり。`

> 配列を使ったオーソドックスな、単語帳です。特に難しいところはありません。
> まず、前半部分で、
> 問題＃（問題の番号）＝『問題の内容』
> 解答＃（問題の番号）＝『問題の解答』
> ・・・
> と、問題を定義します。
> そして、後半部分で、問題を尋ね、解答合わせをしています。
> しかし、これだと、問題を増やすと、いちいちプログラムを書き換える必要が出てきます。そこで、問題を増やしてもプログラムを書き換えなくても良いように改造してみます。

> 単語テスト２
> `'配列に『問題,解答』と入れる 問題#0=『big,大きい』 問題#1=『home,家』 問題#2=『little,小さい』 問題#3=『ice,氷』 問題#4=『top,頂上』 '質問と、解答の入力 問題を、反復(｛＊１｝ 出題は、それ。 出題の、「,」までを、切り取る。'「,」までの語句を切り取って、それに返す。＊２ Qは、それ。'切り取ったものを、Qへ Aは、出題。'切り取られた残りを、Aへ 「｛Q｝の意味はなんですか？」と、尋ねる。 もし、それが、Aならば( 「正解！」と、言う。 )違えば( 「残念！｛Q｝の答えは、｛A}です。」と、言う。 )。 )。 「おわり」と、言う。 おわり。`

> このプログラムのポイントは、＊１の「反復」命令です。これは、配列の各行を１行ずつ反復してくれるので、問題すべてを出題してくれます。
> 次に、＊２の、「切り取る」命令です。これは、文字列変数「出題」の内容から、「,」までを切り取り、特殊変数「それ」へ返します。この切り取り命令は、非常に便利ですので、覚えておくといろいろ応用できます。

## ファイルへ問題を保存

> さて、先ほど作ったプログラムでも、十分実用になると思いますが、新しい問題を作るたびに、プログラムを書き換えなくてはならないのは、非常に大変です。
> そこで、テストの問題を、１レッスンごとに、ファイルへ保存しておくことにします。
> ひまわりでファイルへデータを保存するのは、簡単です。保存したい内容を、それに、代入しておき、「ファイル名」へ、保存。と、書くだけです。たとえば、ファイルへ、「あいうえお」と、保存してみましょう。

> それは、「あいうえお」。 「テスト.txt」へ、保存。

> 逆に、これを、読み出すには、「ファイル名」を、開く。と、書きます。これで、「それ」に、ファイルの内容を読み込みます。

> 「テスト.txt」を、開く。 それと、表示。

> さてさて、次に、先ほど、単語テスト２で作った問題のデータを、保存してみましょう。

> 問題をファイルへ保存
> `問題#0=『big,大きい』 問題#1=『home,家』 問題#2=『little,小さい』 問題#3=『ice,氷』 問題#4=『top,頂上』` それは、問題。 「Lesson1.txt」へ、保存。

> メモ帳で、中身を確認してみてください。

> Lesson1.txtの内容：
> big,大きい home,家 little,小さい ice,氷 top,頂上

> 確かに、配列変数「問題」の内容が、書き込まれていますね。（配列の仕組みは、入門講座で復習してね。）
> では、ファイル「Lesson1.txt」を読み込んで、テストするプログラムを作ってみましょう。

> 単語テスト３
> `'ファイルから、問題を読み出す。 「Lesson1.txt」を、開く。 問題は、それ。 '質問と、解答の入力 問題を、反復({*1} 出題は、それ。 出題の、「,」までを、切り取る。'「,」までの語句を切り取って、それに返す。＊２ Qは、それ。'切り取ったものを、Qへ Aは、出題。'切り取られた残りを、Aへ 「｛Q｝の意味はなんですか？」と、尋ねる。 もし、それが、Aならば( 「正解！」と、言う。 )違えば( 「残念！｛Q｝の答えは、｛A}です。」と、言う。 )。 )。 「おわり」と、言う。 おわり。`

> 先ほどの、単語テスト２と、ほとんど一緒です。違うのは、問題が、プログラム中に埋め込まれているのではなく、外部のファイルに保存されていて、それを読み込んで出題しているということです。
> まだまだ改良するべきことはたくさんあります。
> 今のままだと、プログラムの中にファイル名を書き込んでしまっているので、Lesson1.txt以外の問題を出題できません。せめて、作業フォルダにある問題を出題できるようにしたいですね。
> そのためには、フォルダの中のファイルを列挙する「ファイル列挙」命令と、選択肢の中から１つだけ答えを選ぶ「どれか尋ねる」命令を使います。
> とりあえず、ファイルを選ぶところだけ作ってみましょう。

> `(作業フォルダ&『*.txt』)の、ファイル列挙。'作業フォルダで、拡張子が.txtのものを列挙する 列挙されたファイルは、それ。 「今回出題する問題のファイル」が,列挙されたファイルの,どれか尋ねる。 それと、言う。`

> と、まぁ、こんな感じですので、あとは、上の単語テスト３と、組み合わせるだけです。

## 問題を作成するプログラム

> さぁ、もう完成だ！
> ・・・と、その前に、ちょっと、問題ファイルを、いくつか作っておきますか。
> この問題ファイルを作るのは、簡単ですよね。

> 問題, その答え 問題, その答え 問題, その答え 問題, その答え 問題, その答え ・・・

> と、１行に、質問と、その答えを、「,」で区切って書いていくだけです。
> まぁ、こんなシンプルな形式のテキストですから、直接メモ帳で編集しても良いのですけれども、なんだか、Windowsっぽくないので、入力フォームを作ってみましょう。
> ひまわりのツールに、「フォームデザイナ」というのがあるので、それを使ってフォームのデザインを作れば、それなりのカッコいいのが作れます。今回は、入力する項目が、問題と、解答の２つしかないので、使いませんが。

> 問題の入力フォーム
> `黄色で、画面クリア。 {入力フォームの作成} (20,20)へ、移動。 「問題の入力：」と、表示。 問題エディタを、エディタとして、作成。 「解答の入力：」と、表示。 解答エディタを、エディタとして、作成。 登録ボタンを、ボタンとして、作成。 その、テキストは、「登録」 その、イベントは、登録ボタンクリック。 一覧グリッドを、グリッドとして、作成。 その、アイテムは、「問題,解答」 その、編集は、オン。 保存ボタンを、ボタンとして、作成。 その、テキストは、「保存」 その、イベントは、保存ボタンクリック。 待機。 {イベント処理} ＊登録ボタンクリック 'グリッドに、問題を足す 問題ラインは、「{問題エディタ},{解答エディタ}\n」。 それは、一覧グリッドの、アイテム。 それに、問題ラインを、足す。 一覧グリッドの、アイテムは、それ。 問題エディタは、「」 解答エディタは、「」 待機。 ＊保存ボタンクリック 「txt」の,書込ファイル選択。 もし、それが、「」ならば、待機。 保存先は、それ。 それは、一覧グリッドの、アイテム。 それの,0行目を,行削除。'問題、解答というタイトルを削除 保存先へ、保存。 「保存しました」と、言う。 待機。`

> 至ってシンプルです。簡単ポン！です。

## 単語帳の完成！

> さて、これで、いよいよ単語帳の完成です。
> この単語帳のプログラムは、３つのプログラムからなります。
> まず、質問と解答を作成する、『問題作成プログラム』、出題をする『問題出題プログラム』、そして、この２つのプログラムの橋渡しをする、『メニュープログラム』です。
> それぞれ、以下の名前でプログラムを作って保存することにします。

> ファイル名 | プログラムの内容
> 単語帳.hmw | 単語帳のメニューを表示するプログラム。
> 単語帳作成.hmw | 問題を作成するプログラム。
> 単語帳出題.hmw | 問題を出題するプログラム

> まず、簡単そうなメニューを作ります。

> 単語帳.hmw
> `{単語帳のメニュー} 母艦の、タイトルは、「シンプルな単語帳」 問題の作成ボタンを、ボタンとして、作成。 その、テキストは、「問題の作成」 その、イベントは、問題の作成ボタンクリック。 問題の出題ボタンを、ボタンとして、作成。 その、テキストは、「問題の出題」 その、イベントは、問題の出題ボタンクリック。 待機。 ＊問題の作成ボタンクリック 「単語帳作成.hmw」を、起動。 待機。 ＊問題の出題ボタンクリック 「単語帳出題.hmw」を、起動。 待機。`

> （このままだとちょっと格好が悪いので、背景に画像を貼り付けたり、ボタンをアニメにしたりすれば、より、気分が盛り上がるでしょう！）
> さて、問題の作成フォームですが、項目が２つだけだと、実用的ではないので、質問、解答の他に、「コメント」の項目を加えてみました。
> このコメントを書いておくか否かで、テストの点が３割は変わってきます。
> どういうことかというと、このコメントの所に、その単語の覚え方を、メモしておくのです。例えば、歴史年表の暗記で、「７９４年、平安京遷都」を覚えるのに、コメントのところへ、「鳴くよ（794）ウグイス平安で」と、語呂合わせを書いておくのです。英単語の「big」を覚えるときは、「あんまり大きいので、big(びっく)りした」などと、駄洒落を書きます。この駄洒落作成が得意であれば、東大合格も夢ではありません・・・（？）。
> （最近の英単語帳には、初めから語呂合わせが書いてあるそうですが、そんなの駄目です。自分で作らなくては意味がありません。これで駄洒落を極めて、お笑いタレントを目指してください。）

> 単語帳作成.hmw
> `黄色で、画面クリア。 {入力フォームの作成} (20,20)へ、移動。 「問題の入力：」と、表示。 問題エディタを、エディタとして、作成。 「解答の入力：」と、表示。 解答エディタを、エディタとして、作成。 「コメントの入力：」と、表示。 コメントエディタを、エディタとして、作成。 登録ボタンを、ボタンとして、作成。 その、テキストは、「登録」 その、イベントは、登録ボタンクリック。 一覧グリッドを、グリッドとして、作成。 その、アイテムは、「問題,解答,コメント」 その、編集は、オン。 保存ボタンを、ボタンとして、作成。 その、テキストは、「保存」 その、イベントは、保存ボタンクリック。 待機。 {イベント処理} ＊登録ボタンクリック 'グリッドに、問題を足す 問題ラインは、「{問題エディタ},{解答エディタ},{コメントエディタ}\n」。 それは、一覧グリッドの、アイテム。 それに、問題ラインを、足す。 一覧グリッドの、アイテムは、それ。 問題エディタは、「」 解答エディタは、「」 コメントエディタは、「」 待機。 ＊保存ボタンクリック 「txt」の,書込ファイル選択。 もし、それが、「」ならば、待機。 保存先は、それ。 それは、一覧グリッドの、アイテム。 それの,0行目を,行削除。'問題、解答というタイトルを削除 保存先へ、保存。 「保存しました」と、言う。`

> さてさて、ようやくですが、上で作った問題を出題するプログラムです。

> 単語帳出題.hmw
> `{単語帳出題} (作業フォルダ&『*.txt』)の、ファイル列挙。 列挙されたファイルは、それ。 「今回出題する問題のファイル」が,列挙されたファイルの,どれか尋ねる。 問題ファイルは、それ。 問題ファイルを、開く。 問題は、それ。 {変数の初期化} 正解数=0 問題数=0 '質問と、解答の入力 問題を、反復({*1} 出題は、それ。 出題の、「,」までを、切り取る。 Qは、それ。'切り取ったものを、Qへ 出題の、「,」までを、切り取る。 Aは、それ。'切り取ったものを、Aへ Cは、出題。'切り取られた残りを、Cへ 「｛Q｝の意味はなんですか？」と、尋ねる。 もし、それが、Aならば( 「正解！」と、言う。 正解数に、1を、足す。 )違えば( 「残念！｛Q｝の答えは、｛A}です。\ｎ覚え方は、｛C｝」と、言う。 )。 問題数に、1を、足す。 )。 正解率は、整数(正解数÷問題数*100) 「｛問題数｝問中、｛正解数｝が正解！\ｎ正解率は｛正解率｝％です。」と、言う。 おわり。`

> それでは、皆さん、ひまわりを使って、東大に合格しましょうね！

戻る