C语言读取txt文件并执行(1) 请统计输出26个字母出现的频率(大写统一转换为小写),并打印输出; (2) 请统计输出出现频率最高的200个单词, 并打印输出。
时间: 2024-05-09 22:15:04 浏览: 100
以下是一个C语言程序,可以读取一个txt文件并执行上述两个任务:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAX_WORD_LENGTH 50 // 假设单词最长为50个字符
// 定义一个结构体,用于储存单词及其出现的次数
typedef struct {
char word[MAX_WORD_LENGTH];
int count;
} WordCount;
// 比较函数,用于qsort排序
int compare(const void *a, const void *b) {
return ((WordCount*)b)->count - ((WordCount*)a)->count;
}
int main() {
FILE *fp;
char ch;
int freq[26] = {0}; // 数组用于储存26个字母的出现频率
WordCount wordList[100000]; // 假设文件中最多有10万个单词
int wordCount = 0; // 实际单词数量
char word[MAX_WORD_LENGTH] = {0}; // 用于临时储存单词
int i, j;
fp = fopen("input.txt", "r"); // 打开文件,假设文件名为input.txt
if (fp == NULL) {
printf("无法打开文件!\n");
exit(1);
}
// 统计字母出现频率
while ((ch = fgetc(fp)) != EOF) {
if (isalpha(ch)) { // 如果是字母
ch = tolower(ch); // 大写转小写
freq[ch - 'a']++; // 统计频率
} else if (ch == '\n' || ch == ' ' || ch == '\t') { // 如果是单词结束符
if (strlen(word) > 0) { // 如果当前有单词
// 查找单词是否已经在wordList中出现过
for (i = 0; i < wordCount; i++) {
if (strcmp(word, wordList[i].word) == 0) {
wordList[i].count++; // 统计次数
break;
}
}
// 如果单词没有出现过,将其添加到wordList中
if (i == wordCount) {
strcpy(wordList[i].word, word);
wordList[i].count = 1;
wordCount++;
}
memset(word, 0, sizeof(word)); // 清空临时存储单词的数组
}
} else { // 如果是单词中的字符
strncat(word, &ch, 1); // 将当前字符添加到单词中
}
}
fclose(fp); // 关闭文件
// 输出字母出现频率
printf("字母出现频率:\n");
for (i = 0; i < 26; i++) {
printf("%c: %d\n", 'a' + i, freq[i]);
}
// 输出出现频率最高的200个单词
qsort(wordList, wordCount, sizeof(WordCount), compare); // 按照单词出现次数从高到低排序
printf("出现频率最高的200个单词:\n");
for (i = 0; i < 200 && i < wordCount; i++) {
printf("%s: %d\n", wordList[i].word, wordList[i].count);
}
return 0;
}
```
上述程序首先打开名为input.txt的文件,然后逐行读取文件内容。对于每一行,程序统计其中26个字母的出现频率,并将单词分割出来。对于每个单词,程序查找它是否已经在一个结构体数组wordList中出现过。如果已经出现过,次数加1;如果没有出现过,将其添加到wordList中。最后,程序输出26个字母的出现频率,并按照单词出现次数从高到低排序,并输出出现频率最高的200个单词。
阅读全文