目次> 第18章> 18.6 TOPUPPREVNEXT

18.6 例題 「単語を数える」

問題
単語を数える処理を状態遷移図で表すと次のようになります。


これを、状態遷移表にすると下表になります。


ピリオドが現れたら、文の終わりとみなして、文の個数も数えるように変更し、 プログラムを作成しなさい。


解答例1

状態遷移図を下図のように変更します。


状態遷移表は下表のようになります。黄色が変更部分、水色が追加部分です。


ステップ1
まず、クラス名と必要な変数名を決めます。
クラス変数やインスタンス変数は不要で、ローカル変数のみを用います。
ステップ2
文字を1文字ずつ読み込んで、処理をするという部分を作りこみます。
1〜3行目と12〜26行目が追加部分です。


この辺で一度コンパイルをして、コンパイル・エラーのないことを確認しておきましょう。
ステップ3
18行目に状態遷移表を埋め込みます。文字ごとの分岐を記述します。
if文に条件を書き連ねてもよいのですが、 この場合、アルファベットかどうかの判定と、単語間を区切るスペースの判定は、 条件が長くなることと、今後の変更・追加が予想されることのため、 メソッドとして、外出しにすることにしました。


ステップ4
各文字ごとに、状態による分岐構造を埋め込みます。
ここは、いつも禁じ手にしている、コピー・アンド・ペーストを使いましょう。


ほぼ完成
状態遷移表を縦に読みながら、アクションと状態推移を書き込んでゆきます。 53行目は結果の表示です。 19行目はデバッグのための行で、読んだ文字をそのまま画面に表示しています。 デバッグが終わっても、削除せずにコメントにしておきましょう。

プログラム
Count.java

実行例
テストデータ
data.txt





解答例2

ピリオドを読んだ後の状態を「単語外」と整理すると次のような状態遷移図になります。


状態遷移表は下図のとおり。


プログラム
Count5.java

実行例
テストデータ
data.txt





解答例3

行の終わりには、復帰文字(CR、キャリッジ・リターン)と 改行文字(LF、ライン・フィード)が現れます。 複数行のテキストを読む場合には、これらの文字を処理する必要があります。
行の終わりは「空白が現れた」という取り扱いにすると次のような状態遷移図になります。


状態遷移表は下図のとおり。


プログラム
Count5.java に 62、63行目を追加しました。 Count6.java

実行例
テストデータ
data.txt




更新日:2007-11-19 TOPUPPREVNEXT