C言語関係掲示板

過去ログ

No.939 特定単語のカウントプログラム

[戻る] [ホームページ]
No.11941

特定単語のカウントプログラム
投稿者---ユウ(2004/01/19 18:47:06)


学校の課題で、文字列の問題なのでしょうか、
まだ習い始めたものでよく分からないので、
どなたか参考プログラムを教えていただけると
幸いです。(次のようなプログラムです。)

何文字かの文字列を入力させ、例えば

then the there these the

などと入力したら、theを含む単語数は5
またTHE"そのもの"の単語数は2というような
プログラムを作りたいのですが。

どなか教えて頂けないでしょうか。

No.11943

Re:特定単語のカウントプログラム
投稿者---senshou(2004/01/19 21:00:05)


文字列の扱いに慣れておこうと思って作ってしまいました。
学校じゃ基本的なことしかやってない(文字列の触りぐらいまでで、ポインタは全く触れていない)のに、
次の年から出る課題はやたら難しいし・・・

ということで、作ってみたのは以下です。
慣れていないので、汚いコードかもです。
どなたか
「ここはこうしたほうがいい」
「こういうことはしないほうがいい」
などなどがありましたら、教えてください。


#include <stdio.h>
#include <ctype.h>
#include <string.h>


int main(void)
{
    char str[512], *p;
    char str2[] = "the";
    char delim[] = " .,";
    int i = 0;
    int ch = 0;
    int the_counter = 0;
    int THE_counter = 0;
    
    /* 文章をすべて小文字に変換してからstr[]に格納 */
    while ((ch = getchar()) != EOF) {
        str[i++] = tolower(ch);
    }
    str[i] = '\0';
    
    /* とりあえず the の個数を数える */
    for (p = str; *(p + 2); p++) {
        if (*p == 't' && *(p + 1) == 'h' && *(p + 2) == 'e') {
            the_counter++;
        }
    }
    
    /* theそのものは文字列をトークンに分解してから数える */
    p = strtok(str, delim);
    while (p) {
        if (strcmp(p, str2) == 0) {
            THE_counter++;
        }
        p = strtok(NULL, delim);
    }
    
    printf("theを含む単語数は%d\n", the_counter);
    printf("THE\"そのもの\"の単語数は%d\n", THE_counter);
    
    return(0);
}


No.11945

Re:特定単語のカウントプログラム
投稿者---senshou(2004/01/19 21:16:38)


>文字列の扱いに慣れておこうと思って作ってしまいました。
>学校じゃ基本的なことしかやってない(文字列の触りぐらいまでで、ポインタは全く触れていない)のに、
>次の年から出る課題はやたら難しいし・・・

まあ、
「やっている」
「力が少しはついたかな?」
という実感が持てるのはいいことです。

No.11946

Re:特定単語のカウントプログラム
投稿者---コウ(2004/01/19 21:32:23)


有難うございます。大変参考になりました。

THEそのものを数えるプログラムはやはり文字列関数を使わなければ
ならないのですか?

No.11947

Re:特定単語のカウントプログラム
投稿者---senshou(2004/01/19 21:44:37)


>THEそのものを数えるプログラムはやはり文字列関数を使わなければ
>ならないのですか?

strcmp()を自作すれば可能だと思います。


No.11948

Re:特定単語のカウントプログラム
投稿者---senshou(2004/01/19 21:46:16)


>>THEそのものを数えるプログラムはやはり文字列関数を使わなければ
>>ならないのですか?
>
>strcmp()を自作すれば可能だと思います。

あと、strtok()も。



No.11949

Re:特定単語のカウントプログラム
投稿者---コウ(2004/01/19 22:04:09)


大変参考になります。

すいません、strtok()やstrcmp()などは
例えばどんなプログラムになるのですか。

また作成していただいたプログラムの文字入力
の終了の仕方が分からないので教えていただけませんか?

何度も聞いてすいません。

No.11950

Re:特定単語のカウントプログラム
投稿者---senshou(2004/01/19 22:50:26)


>大変参考になります。
>
>すいません、strtok()やstrcmp()などは
>例えばどんなプログラムになるのですか。

http://www.bohyoh.com/
こちらのサイトからダウンロードできる
「秘伝C言語問答ポインタ編第二版」の全ソースプログラムに掲載されてます。
list0446.cがstrcmp()の実現例、
list0461.cがstrtok()の実現例になっていると思います。
また、この本はポインタの勉強にいいと思うので、興味があれば本屋で見てみてください。
同じくポインタの本としては、
「C言語ポインタ完全制覇」 前橋和弥著 技術評論社
がいいと思いますが、後者のほうが内容が難しいと思います。(まだ読み終わってない)

>また作成していただいたプログラムの文字入力
>の終了の仕方が分からないので教えていただけませんか?

EOF(EndOfFile)はDOSプロンプトであればCtrl + Z

No.11954

Re:特定単語のカウントプログラム
投稿者---コウ(2004/01/19 23:20:11)


度重なる質問にお答え頂いて本当に有難うございます。

是非書籍のほうを参考にしてみたいと思います。

No.11951

Re:特定単語のカウントプログラム
投稿者---かずま(2004/01/19 22:51:00)


int main(void)
{
    int c, k = 0, n = 0, s = 0, w = 0;

    while ((c = getchar()) != EOF && c != '\n') {
        if (c >= 'A' && c <= 'Z') c += 'a' - 'A';
        if (c >= 'a' && c <= 'z') {
            w++;
            if      (s != 3 && c == 't') s = 1;
            else if (s == 1 && c == 'h') s = 2;
            else if (s == 2 && c == 'e') s = 3, k++;
            else                         s = 0;
        } else {
            if (s == 3 && w == 3) n++;
            w = s = 0;
        }
    }
    if (s == 3 && w == 3) n++;
    printf("%d %d\n", k, n);
    return 0;
}
ちょっと問題点もありますが。

No.11953

Re:特定単語のカウントプログラム
投稿者---コウ(2004/01/19 23:19:07)


すごいです。少しソースを解読するのに時間がかかりましたが、
こんな方法があったなんて…大変参考になりました。