アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語のプログラミングについて質問させていただきます。
『一行の入力に対し,入力された英文の文字数,単語数,文字の使用頻度を数える』という問題なんですが、一応プログラムを組むことはできました。
しかし、今のプログラムのままでは単語間にを連続して入力しても単語数が増加してしまいます。
そこで、単語間の空白が2文字以上でも安定して単語数を正しく数えることができるようにするためにはどのように変更すればいいのか教えてください。
よろしくお願いします。

#include <stdio.h>

int main(void){
char line[100]; /* キーボード入力用汎用変数 */
int i; /* 繰り返し用カウンタ */
char temporary; /* テンポラリ */
int moji_acount[128]; /* 文字カウンタ */
int moji_count = 0; /* 文字数 */
int tango_count = 0; /* 単語数 */


/* 文字カウンタの初期化 */
for(i=32;i<128;i++){
moji_acount[i] = 0;
}

/* 文字列の入力 */
printf("文字列:");
fgets(line, sizeof(line), stdin);

/* 繰り返し用カウンタの初期化 */
i = 0;
/* 文字数を数える作業 */
while(line[i] != '\n'&& line[i] != '\0'){
moji_count++;
i++;
}

/* 文字数の表示 */
printf("文字数:%d\n", moji_count);

/* 文字をテンポラリに保存 + 文字カウンタを数える作業 */
for(i=0;i<moji_count;i++){
temporary = line[i];
moji_acount[(int)temporary]++;
}

/* 入力された文字と回数を表示 */
for(i=32;i<128;i++){
if(moji_acount[i] != 0){ /* 文字カウンタがゼロでないときに繰り返し */
printf("'%c': %2d個\n", (char)i, moji_acount[i]);
}
}

/* 繰り返し用カウンタの初期化 */
i = 0;

/* 単語数を数える作業 */
while(line[i] != '\n' && line[i] != '\0'){
if(line[i] == ' '){ /* もしline[i]がスペースのとき */
tango_count++;
}
i++;
}
printf("単語数:%d個\n", tango_count + 1);

return 0;
}

A 回答 (2件)

カンマやピリオド、記号はどうなのよ、区切りじゃないの?


単語なしのときも1個と表示されちゃいますよね。
不完全ですよね。
これだと、50点ではないでしょうか。

単語の定義を決めてからプログラミングするといいんじゃないかな。

あと、通常は単語の先頭で数えると思うのだが、終了で数えていますよね。
    • good
    • 1

>単語間の空白が2文字以上でも安定して単語数を正しく数えることができる


>ようにするためにはどのように変更すればいいのか教えてください。

単純に空白が連続していたら、カウントアップを止めれば良いだけではないのですか?
line[i] = ' ' && line[i-1] != ' '
ではだめなの?

「空白」としてはタブ文字もあるので、これも考慮すると良いでしょう。

蛇足ですが、最後の単語数も tango_count に加算した方がいいと思います。
tango_count+1 をプリントしていますが、結局変数 tango_count に「単語数」が格納できておらず、コーディングとしては良くないと思います。
    • good
    • 0
この回答へのお礼

解答ありがとうございました。
おかげで無事問題解決できました。

そんな簡単なことに気付きませんでした。
もっと勉強しようと思います。

また、わからないところがあったら教えてください。

お礼日時:2007/11/01 03:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!