请帮我用c语言写一个可以接收含有一篇英文文章的文本文档,这个文档要求用户输入,然后读取文档用hash表存储里面的单词,单词不分大小写,标点符号被认为是一个单词,程序应打印输入文件中的单词总数、输入文件中不同单词的数量,以及最常出现的100个单词及其频率。这些单词按其频率按降序排列。该程序还应测量和打印处理时间。
时间: 2023-05-16 21:07:04 浏览: 105
以下是可以实现上述功能的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#define MAX_WORD_LENGTH 50
#define MAX_NUM_WORDS 1000000
#define MAX_NUM_FREQS 100
typedef struct {
char* word;
int freq;
} WordFreq;
int cmp_word_freq(const void* a, const void* b) {
const WordFreq* wf_a = (const WordFreq*) a;
const WordFreq* wf_b = (const WordFreq*) b;
return wf_b->freq - wf_a->freq;
}
int hash(char* s) {
int h = 0;
while (*s) {
h = (h * 31 + tolower(*s)) % MAX_NUM_WORDS;
s++;
}
return h;
}
void insert_word(char* word, int* num_words, WordFreq* word_freqs) {
int h = hash(word);
for (int i = 0; i < MAX_NUM_WORDS; i++) {
int j = (h + i) % MAX_NUM_WORDS;
if (word_freqs[j].word == NULL) {
word_freqs[j].word = strdup(word);
word_freqs[j].freq = 1;
(*num_words)++;
break;
} else if (strcmp(word_freqs[j].word, word) == 0) {
word_freqs[j].freq++;
break;
}
}
}
int main() {
clock_t start_time = clock();
char filename[100];
printf("请输入含有一篇英文文章的文本文档的文件名:");
scanf("%s", filename);
FILE* fp = fopen(filename, "r");
if (fp == NULL) {
printf("无法打开文件 %s\n", filename);
return 1;
}
int num_words = 0;
WordFreq word_freqs[MAX_NUM_WORDS] = {0};
char word[MAX_WORD_LENGTH];
while (fscanf(fp, "%s", word) != EOF) {
insert_word(word, &num_words, word_freqs);
}
fclose(fp);
qsort(word_freqs, num_words, sizeof(WordFreq), cmp_word_freq);
printf("单词总数:%d\n", num_words);
printf("不同单词数量:%d\n", num_words);
printf("最常出现的100个单词及其频率:\n");
for (int i = 0; i < MAX_NUM_FREQS && i < num_words; i++) {
printf("%s: %d\n", word_freqs[i].word, word_freqs[i].freq);
}
for (int i = 0; i < num_words; i++) {
free(word_freqs[i].word);
}
clock_t end_time = clock();
printf("处理时间:%f秒\n", (double) (end_time - start_time) / CLOCKS_PER_SEC);
return 0;
}
```
请注意,这个程序假设单词的长度不超过 50 个字符,最多有 100 万个单词,最多输出 100 个频率最高的单词。如果输入文件中的单词数量超过了这些限制,程序可能会出现问题。
阅读全文