📜  C |文件处理|问题4(1)

📅  最后修改于: 2023-12-03 14:59:38.621000             🧑  作者: Mango

文件处理问题4

本题要求编写一个程序,从文件中读取一段文本,统计其中各个字符出现的次数,并按照字符出现的频率从高到低输出字符及其出现次数。

思路分析
  1. 首先,我们需要从文件中读取文本内容,可以使用 fgets 函数按行读取。
  2. 然后,我们需要对读取的文本内容进行遍历,统计其中每个字符的出现次数,可以使用 for 循环和数组进行实现。
  3. 最后,我们需要按照字符出现的频率从高到低进行排序,并输出字符及其出现次数,可以使用冒泡排序算法进行排序。
代码实现
#include <stdio.h>
#include <string.h>

#define MAX_LENGTH 1000

void bubbleSort(char* ch, int* num, int len) {  // 冒泡排序函数
    for (int i = 0; i < len - 1; i++) {
        for (int j = 0; j < len - 1 - i; j++) {
            if (num[j] < num[j + 1]) {
                int temp = num[j];
                num[j] = num[j + 1];
                num[j + 1] = temp;

                char ch_temp = ch[j];
                ch[j] = ch[j + 1];
                ch[j + 1] = ch_temp;
            }
        }
    }
}

int main() {
    FILE* fp = fopen("test.txt", "r");  // 打开文件
    if (fp == NULL) {
        printf("打开文件失败!");
        return -1;
    }

    char buffer[MAX_LENGTH];
    int count[128] = {0};  // 记录每个字符出现次数的数组
    while (fgets(buffer, MAX_LENGTH, fp) != NULL) {  // 按行读取文本
        for (int i = 0; i < strlen(buffer); i++) {
            count[buffer[i]]++;  // 统计字符出现次数
        }
    }

    char ch[128];  // 记录每个字符的数组
    int num[128];  // 记录每个字符出现次数的数组
    int len = 0;
    for (int i = 0; i < 128; i++) {
        if (count[i] > 0) {  // 如果字符出现过
            ch[len] = i;
            num[len] = count[i];
            len++;
        }
    }

    bubbleSort(ch, num, len);  // 对字符按照出现次数从高到低排序

    printf("字符\t出现次数\n");
    for (int i = 0; i < len; i++) {
        printf("%c\t%d\n", ch[i], num[i]);  // 输出字符及其出现次数
    }

    fclose(fp);  // 关闭文件
    return 0;
}
运行结果样例
字符	出现次数
	   95
e	26
o	17
t	16
a	11
n	11
s	9
i	8
h	8
r	8
l	6
p	6
u	6
c	5
g	4
m	4
y	4
f	4
d	4
b	2
j	2
?	2
v	2
w	2
,	1
.	1
k	1
x	1
z	1
q	1
!	1
-	1