- ベストアンサー
ワードカウンタプログラムの要点と注意点
- ワードカウンタプログラムでは、prevletter変数を使用して直前の文字を追跡します。
- 2つ目のwhileループでは、改行やスペース、ピリオドなどの特定の文字を処理し、ワード数の計算を行います。
- 入力された文字列のうち、特定の条件でワード数をカウントします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
こんにちは。 > 1、なぜprevletterは必要でしょうか。 必要か必要でないかは、ご提示のプログラムが、どういう趣旨(仕様、目的など) のものであるかによると思います。 ご提示のプログラムが、 1)標準入力から「区切り文字」で区切られた「文字列」(=ワード)を入力し、 改行が入力されたら、入力された「文字列」の個数を表示する。 2)「区切り文字」として、スペース、及び、ピリオドを使用する。 3)文字列の入力時に、改行のみが入力された場合は、プログラムを終了させる。 それ以外は、1)の処理を繰り返す。 という趣旨のものであるならば、必要だと思います。 ※例えば、プログラムは強制終了(Ctrl+'C'の入力など)させるという仕様ならば、 必要ないかもしれません。 今回の場合、prevletterは改行のみが入力された場合に、プログラムを終了させる ための「判定条件」(下記部分)として使用されていると思われます。 if(prevletter == '\0') break; 試しに、prevletter の記述部分を全てコメントアウトしたバージョンを作成して、 コンパイル&実行を行い、その動作を確認してみれば解ると思います。 > 2、2つ目のwhile文でif(c == '\n')やif(c == ' ' || c == '.')では改行やスペース、 > ピリオドだけ入力されている場合しか処理していないと思うのですが、実際は > どうなっているのでしょうか このプログラムの処理内容(何を行っているのか?)が、解らないということでしょうか? ご覧になっている「本」には、どう書かれているのでしょうか? プログラム内で使用されているC言語の構文、標準関数の仕様等を理解されている のであれば、プログラムを順を追って見て行けば解ると思います。 ※プログラムに、コメント(ステップ単位とか、まとまった処理単位毎の説明)を付けて みるのも良いかもしれません。 上記で述べた趣旨のプログラムであるならば、このプログラムは「文字列」の個数 をカウントするためのものであり、「文字列」の中身まではチェックする必要はない と思われます。 従って、入力の終了判定【=改行の判定】、及び、「文字列」の区切りの判定 【=スペース、及び、ピリオドの判定】以外の入力文字の判定などの処理は、 特に必要ないと思われます。 ただし、前述の「prevletter」によるプログラム終了判定を行うために、「prevletter」 に入力された文字を格納する処理(下記部分)を行っているようです。 prevletter = c; ※改行のみが入力された場合は、prevletter には初期値の '\0' が格納されて いますので、それを見てプログラム終了としているようです。 その他に、 変数 wordnum は、 「文字列」の個数を数えるカウンタとして使用されているようです。 ・改行入力または、区切り文字が入力される度にカウントアップされる。 (ただし、下記に示す word_in = 1 だった場合のみ。) 変数 word_in は、 「文字列」の【入力中】を示すフラグとして使用されているようです。 word_in = 1 の時 → 文字列の入力中 ・区切り文字が入力されたら、word_in = 0 となる。 word_in = 0 の時 → 区切り文字の入力後 ・区切り文字以外が入力されたら、word_in = 1 となる。 となっているようです。 以上です。 的外れだった場合はすみません。
その他の回答 (1)
#1です。 連投すみません。 ご提示のプログラムの場合、文字列の入力待ち状態で、 『区切り文字のみ』入力された場合でも、 ワード数:1 として表示されてしまうため、1段目のループ先頭の while(1) { wordnum = 0; word_in = 1; : の部分は、 while(1) { wordnum = 0; word_in = 0; : とした方が良いかも知れません。 ただし、プログラムの仕様によります。 以上です。
お礼
>的外れだった場合はすみません。 いえ、大丈夫です。的中してます。 ご回答ありがとうございました。