C言語関係掲示板

過去ログ

No.1131 英文で書かれたテキストを読み込み、その中にある単語の数を求める

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

英単語の頻度
投稿者---あき(2004/06/28 14:06:55)


英文で書かれたテキストを読み込み、その中にある単語の数を求めるプログラムなんですが、私なりに頑張って作りました。ですが、これではプログラム中に無い単語はカウントされないです。どうしても分からなく質問させていただきました。

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

//構造体の宣言
struct Kazu
{
char Name[10];
int Cnt;

};

void main()
{

struct Kazu Tango[4];//構造体を6個作る
FILE *fp;
int Number;
char English[10];

if( (fp = fopen("C:\\english.txt", "r")) == NULL )
{

printf("ファイルが開けません\n");

}


//構造体の初期化
strcpy(Tango[0].Name,"I");
strcpy(Tango[1].Name,"am");
strcpy(Tango[2].Name,"a");
strcpy(Tango[3].Name,"girl");

for( Number=0; Number<4; Number++ )
{
Tango[Number].Cnt = 0;
}

//データの比較と出現回数のカウント
while( fscanf( fp, "%s", &English ) == 1 )
{

for( Number=0; Number<4; Number++)
{

if ( strcmp(Tango[Number].Name, English) == 0 )
{

Tango[Number].Cnt++;//出現回数のカウント
break;

}

}

}


//画面への出力
for ( Number=0; Number<4; Number++ )
{

printf( "%s %d\n",Tango[Number].Name, Tango[Number].Cnt );

}

}



No.2182

Re:英単語の頻度
投稿者---REE(2004/06/28 14:36:07)


>英文で書かれたテキストを読み込み、その中にある単語の数を求めるプログラムなんですが、私なりに頑張って作りました。ですが、これではプログラム中に無い単語はカウントされないです。どうしても分からなく質問させていただきました。

単語のリストを予め作るのではなく、空にしておいて、
新しい単語が出てきたら、リストに追加するようにするとよいでしょう。



No.2183

Re:英単語の頻度
投稿者---あき(2004/06/28 18:57:13)


>単語のリストを予め作るのではなく、空にしておいて、
>新しい単語が出てきたら、リストに追加するようにするとよいでしょう。

新しい単語をリストに格納するには、どうすれば良いのでしょうか。
とりあえず分からないのであらかじめリストを作ったのですが、
それから進まない状態です。
基本的な質問だとは思いますが、お願いいたします。




No.2184

Re:英単語の頻度
投稿者---かずま(2004/06/28 19:21:24)


> 基本的な質問だとは思いますが、お願いいたします。

質問の基本は、【掲示板ご利用上の注意】に従うことです。

 ※ソースの添付は「HTML変換ツール」で字下げ!

この意味がわかりませんか?
----------------------------------------------------------------------
英字以外を読み飛ばし、英字列の単語を読み込める間、以下を繰り返す。
単語表を順番に見て、
単語があるかどうか調べる。
あれば、
度数を増やす。
なければ、
登録単語数を増やすが、単語表がいっぱいなら異常終了。
単語表に単語を登録する。
登録に失敗したら、記憶域不足で異常終了。
度数を 1 にする。

単語表を順番に見て、
内容を表示する。

----------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TABLESIZE  1000

typedef struct { char *word; int count; } Word; 

int main(void)
{
Word table[TABLESIZE];
int size = 0, i;  char word[256];  FILE *fp = stdin;

while (fscanf(fp, "%*[^a-zA-Z]"), fscanf(fp, "%[a-zA-Z]", word) == 1) {
for (i = 0; i < size; i++)
if (strcmp(table[i].word, word) == 0) break;
if (i < size)
table[i].count++;
else {
if (size++ == TABLESIZE) puts("too many words"), exit(1);
table[i].word = strdup(word);
if (table[i].word == NULL) puts("out of memory"), exit(1);
table[i].count = 1;
}
}
for (i = 0; i < size; i++)
printf("%4d %s\n",table[i].count, table[i].word);
return 0;
}

----------------------------------------------------------------------
    英字以外を読み飛ばし、英字列の単語を読み込める間、以下を繰り返す。
        単語表を順番に見て、
            単語があるかどうか調べる。
        あれば、
            度数を増やす。
        なければ、
            登録単語数を増やすが、単語表がいっぱいなら異常終了。
            単語表に単語を登録する。
            登録に失敗したら、記憶域不足で異常終了。
            度数を 1 にする。

    単語表を順番に見て、
        内容を表示する。

----------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TABLESIZE  1000

typedef struct { char *word; int count; } Word; 

int main(void)
{
    Word table[TABLESIZE];
    int size = 0, i;  char word[256];  FILE *fp = stdin;

    while (fscanf(fp, "%*[^a-zA-Z]"), fscanf(fp, "%[a-zA-Z]", word) == 1) {
        for (i = 0; i < size; i++)
            if (strcmp(table[i].word, word) == 0) break;
        if (i < size)
            table[i].count++;
        else {
            if (size++ == TABLESIZE) puts("too many words"), exit(1);
            table[i].word = strdup(word);
            if (table[i].word == NULL) puts("out of memory"), exit(1);
            table[i].count = 1;
        }
    }
    for (i = 0; i < size; i++)
        printf("%4d %s\n",table[i].count, table[i].word);
    return 0;
}



No.2200

Re:英単語の頻度
投稿者---あき(2004/06/30 11:30:02)


while (fscanf(fp, "%*[^a-zA-Z]"), fscanf(fp, "%[a-zA-Z]", word) == 1)
の*[^a-zA-Z]"), にある^とはどんな意味を持つのでしょうか?
調べてみたのですが分からなかったのでお教え願いたいです。


No.2201

Re:英単語の頻度
投稿者---REE(2004/06/30 13:29:02)


>while (fscanf(fp, "%*[^a-zA-Z]"), fscanf(fp, "%[a-zA-Z]", word) == 1)
>の*[^a-zA-Z]"), にある^とはどんな意味を持つのでしょうか?
>調べてみたのですが分からなかったのでお教え願いたいです。

以下のページを参考にどうぞ

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_crt_scanf_type_field_characters.asp


No.2244

Re:英単語の頻度
投稿者---あき(2004/07/07 09:14:33)


while (fscanf(fp, "%*[^a-zA-Z]"), fscanf(fp, "%[a-zA-Z]", word) == 1)
この部分は具体的に何をする箇所なんでしょうか?調べてみたんですが、よく分からないのでお教え願いたいです。よろしくお願いします。


No.2245

Re:英単語の頻度
投稿者---REE(2004/07/07 10:09:06)


>while (fscanf(fp, "%*[^a-zA-Z]"), fscanf(fp, "%[a-zA-Z]", word) == 1)
>この部分は具体的に何をする箇所なんでしょうか?調べてみたんですが、よく分からないのでお教え願いたいです。よろしくお願いします。

fscanf(fp, "%*[^a-zA-Z]"),
これは、英字以外を読み飛ばします。

fscanf(fp, "%[a-zA-Z]", word)
これは英単語をwordに格納します。

これで分からない場合は、もう少し具体的に聞いてください。