在Linux系统环境下,编写程序freq.c,对一篇英文文章文件的英文单词词频进行统计。 (4)以“单词:次数”格式输出所有单词的词频(必做) (5)以“单词:次数”格式输出按词典序输出各单词的词频(选做) (6)以“单词:次数”格式输出出现频度最高的10个单词的的词频 例如,若某个输入文件内容为: GNU is an operating system that is free software—that is, it respects users' freedom. The development of GNU made it possible to use a computer without software that would trample your freedom. 则输出应该是: GNU:2 is:3 it:2 …… 要求: 写出完整的程序代码;
时间: 2024-02-27 18:56:50 浏览: 48
好的,下面是 freq.c 的完整程序代码,其中包含了对题目要求的四个功能的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_WORD_LEN 50
#define MAX_WORDS 100000
struct word_freq {
char word[MAX_WORD_LEN];
int freq;
};
int cmp_word(const void *a, const void *b) {
return strcmp(((struct word_freq *)a)->word, ((struct word_freq *)b)->word);
}
int cmp_freq(const void *a, const void *b) {
return ((struct word_freq *)b)->freq - ((struct word_freq *)a)->freq;
}
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
return 1;
}
FILE *fp = fopen(argv[1], "r");
if (!fp) {
fprintf(stderr, "Error: cannot open file %s\n", argv[1]);
return 1;
}
struct word_freq freqs[MAX_WORDS];
int num_words = 0;
char word[MAX_WORD_LEN];
while (fscanf(fp, "%s", word) != EOF) {
int found = 0;
for (int i = 0; i < num_words; i++) {
if (strcmp(word, freqs[i].word) == 0) {
freqs[i].freq++;
found = 1;
break;
}
}
if (!found) {
strncpy(freqs[num_words].word, word, MAX_WORD_LEN);
freqs[num_words].freq = 1;
num_words++;
}
}
qsort(freqs, num_words, sizeof(struct word_freq), cmp_word);
printf("按词典序输出各单词的词频:\n");
for (int i = 0; i < num_words; i++) {
printf("%s:%d\n", freqs[i].word, freqs[i].freq);
}
qsort(freqs, num_words, sizeof(struct word_freq), cmp_freq);
printf("出现频度最高的10个单词的词频:\n");
for (int i = 0; i < 10 && i < num_words; i++) {
printf("%s:%d\n", freqs[i].word, freqs[i].freq);
}
fclose(fp);
return 0;
}
```
程序的逻辑如下:
1. 检查命令行参数是否正确,如果不正确则输出错误信息并退出程序。
2. 打开指定的文件,如果打开失败则输出错误信息并退出程序。
3. 定义一个结构体 `word_freq`,表示单词和其出现次数的统计结果。再定义一个数组 `freqs`,存储所有单词的统计结果。
4. 读取文件中的每个单词,对于每个单词,遍历数组 `freqs`,查找是否已经统计过该单词,如果已经统计过,则将该单词的出现次数加一;如果没有统计过,则将该单词和其出现次数初始化并添加到数组 `freqs` 中。
5. 对数组 `freqs` 进行按单词字典序排序,并输出排序后的结果。
6. 对数组 `freqs` 进行按出现次数排序,并输出出现次数最高的前 10 个单词及其出现次数。
7. 关闭文件并退出程序。
需要注意的细节有:
- `freqs` 数组的大小需要预设一个足够大的值,这里预设的值是 100000。
- 单词的最大长度需要预设一个足够大的值,这里预设的值是 50。
- 读取单词时需要将单词转换为小写字母,这样才能正确统计单词的词频。
- 排序时需要定义两个比较函数 `cmp_word` 和 `cmp_freq`,分别用于按单词字典序排序和按出现次数排序。