C言語関係掲示板

過去ログ

No.276.ファイル中の単語の最も出現頻度の高いものを表示

[戻る] [ホームページ]


No.1662

読み込みについて
投稿者---DIG(2002/06/05 03:16:32)


こんばんは、初めての投稿です。
ある英文テキストがあり、それを読み込んで英単語を出力する
問題で、プログラム中でどのようにしてそのテキストを読み込め
ばよいかわかりません。誰か教えてくれませんか?お願いします。


No.1663

Re:英文テキストを英単語に分解
投稿者---ともじ(2002/06/05 09:28:55)


おはようございます。

>ある英文テキストがあり、それを読み込んで英単語を出力する
>問題で、プログラム中でどのようにしてそのテキストを読み込め
>ばよいかわかりません。

英文テキストということは、テキストファイルですね
ファイルをfopen()でオープンして、fgets()で1行単位で読み込み、
読み込み終わったらfclose()でファイルをクローズするようになります。
詳しくは本編の第17章にありますので、ご参照ください。

また英単語を出力とのことですので、strtok()を使うと効率がよいでしょう。
#include	<stdio.h>
#include	<string.h>

int main(void)
{
	char str[] = "This is a pen.";
	char *tp = str;

	/* スペースを区切りに文字列を抽出 */	
	tp = strtok( str, " " );
	puts( tp );
	while ( tp != NULL ) {
		tp = strtok( NULL," " );
		puts( tp );
	}
	
	return( 0 );
}

出力結果
This
is
a
pen.		 

strtok()については本編ではまだまとめていませんが、掲示板過去ログの
ここのNo.876が詳しいと思いますので参考にしてみてください。


No.1664

Re:すいませんが
投稿者---DIG(2002/06/05 16:33:30)


こんにちは。ご返事ありがとうございます。ファイルの扱い方やページまで紹介してもらって助かりました。すいませんが、よろしければ、後ひとつ質問に答えていただけませんか。
 問題は、読み込んだテキストファイルの中で使われている単語の出現頻度のもっとも高いものを表示するにはどうすればよいかです。教えていただいて、調べてみたのですが分かりませんでした。お願いします。

No.1665

Re:すいませんが
投稿者---かずま(2002/06/05 18:34:52)


> 問題は、読み込んだテキストファイルの中で使われている単語の出現頻度の
> もっとも高いものを表示するにはどうすればよいかです。
> 教えていただいて、調べてみたのですが分かりませんでした。お願いします。

何を調べましたか。
この問題はどこから出てきたのですか。
人から「こんな問題できるか」と言われたのですか。
C の入門書の問題だとしたら、それ以前に説明があるはずですが、よく読みましたか。

それから、題名に「あいさつ」を書かないでください。
この掲示板の上のほうにある「掲示板ご利用上の注意」と、その中の
「技術系メーリングリストで質問するときのパターン・ランゲージ」を
よく読んでみてください。

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

#define TABLE_SIZE  3000

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

Table table[TABLE_SIZE];
int ntable = 0;

int get_word(FILE *fp, char *word, int size)
{
    int c, i = 0;

    do {
        if ((c = getc(fp)) == EOF) return 0;
    } while (!isalpha(c));
    --size;
    do {
        if (i < size) word[i++] = tolower(c);
    } while ((c = getc(fp)) != EOF && isalpha(c));
    word[i] = '\0';
    return 1;
}

int compare(const void *a, const void*b)
{
    const Table *p1 = a;
    const Table *p2 = b;
    return p2->count - p1->count;
}

int main(int argc, char **argv)
{
    FILE *fp;
    char word[256];
    int  i;
    
    if (argc != 2)
        return fprintf(stderr, "usage: %s file\n", argv[0]), 1;
    fp = fopen(argv[1], "r");
    if (fp == NULL) return fprintf(stderr, "can't open %s\n", argv[1]), 1;

    while (get_word(fp, word, sizeof word)) {
        for (i = 0; i < ntable; i++)
            if (strcmp(table[i].word, word) == 0)
                break;
        if (i == ntable) {
            if (++ntable == TABLE_SIZE)
                return fprintf(stderr, "too many words\n"), 1;
            table[i].count = 1;
            table[i].word = strdup(word);
        } else
            table[i].count++;
    }
    qsort(table, ntable, sizeof(*table), compare);
    for (i = 0; i < ntable; i++)
        printf("%4d: %s\n", table[i].count, table[i].word);
    return 0;
}