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に格納します。 これで分からない場合は、もう少し具体的に聞いてください。 |