C语言 统计数字的出现频率,并将出现频率最高的前100个数字按照降序排列后写入到文件中

完整的C语言代码,用于从名为spn.txt的文本文件中读取数字,统计在16到500范围内数字的出现频率,并将出现频率最高的前100个数字按照降序排列后写入到spnexport.txt文件中。我们需要编写一个C程序来读取文件、解析数字、统计次数、排序并写入结果。

环境:Linux Ubuntu,gcc编译器

cpp 复制代码
#include <stdio.h>  

#include <stdlib.h>  

#include <string.h>  

  

#define MAX_NUMBERS 500 - 16 + 1  

#define TOP_COUNT 100  

#define INPUT_FILE "spn.txt"  

#define OUTPUT_FILE "spnexport.txt"  

  

typedef struct {  

    int number;  

    int count;  

} NumberCount;  

  

// 比较函数,用于qsort降序排序  

int compare(const void *a, const void *b) {  

    NumberCount *numA = (NumberCount *)a;  

    NumberCount *numB = (NumberCount *)b;  

    return numB->count - numA->count; // 降序  

}  

  

int main() {  

    FILE *inputFile = fopen(INPUT_FILE, "r");  

    if (!inputFile) {  

        perror("Error opening input file");  

        return 1;  

    }  

  

    FILE *outputFile = fopen(OUTPUT_FILE, "w");  

    if (!outputFile) {  

        perror("Error opening output file");  

        fclose(inputFile);  

        return 1;  

    }  

  

    NumberCount counts[MAX_NUMBERS] = {0};  

    char line[1024];  

    int number;  

  

    // 读取文件并统计数字频率  

    while (fgets(line, sizeof(line), inputFile)) {  

        char *token = strtok(line, " \n\t\r\f\v");  

        while (token != NULL) {  

            number = atoi(token);  

            if (number >= 16 && number <= 500) {  

                counts[number - 16].number = number;  

                counts[number - 16].count++;  

            }  

            token = strtok(NULL, " \n\t\r\f\v");  

        }  

    }  

    fclose(inputFile);  

  

    // 找出出现频率最高的前TOP_COUNT个数字  

    NumberCount topCounts[TOP_COUNT];  

    int topIndex = 0;  

    for (int i = 0; i < MAX_NUMBERS; ++i) {  

        if (counts[i].count > 0) {  

            if (topIndex < TOP_COUNT) {  

                topCounts[topIndex++] = counts[i];  

            } else {  

                // 如果当前数字的频率大于topCounts中最小频率的数字,则替换之  

                int minIndex = 0;  

                for (int j = 1; j < topIndex; ++j) {  

                    if (topCounts[j].count < topCounts[minIndex].count) {  

                        minIndex = j;  

                    }  

                }  

                if (counts[i].count > topCounts[minIndex].count) {  

                    topCounts[minIndex] = counts[i];  

                }  

            }  

        }  

    }  

  

    // 对topCounts数组进行降序排序  

    qsort(topCounts, topIndex, sizeof(NumberCount), compare);  

  

    // 将结果写入输出文件  

    for (int i = 0; i < topIndex; ++i) {  

        fprintf(outputFile, "%d %d\n", topCounts[i].number, topCounts[i].count);  

    }  

  

    fclose(outputFile);  

    printf("Top %d numbers exported to %s\n", topIndex, OUTPUT_FILE);  

    return 0;  

}

运行结果

cpp 复制代码
100 236
20 187
25 152
22 150
110 110
190 109
105 105
92 101
102 95
183 94
16 92
175 90
174 77
108 76
158 76
91 75
18 74
17 67
19 65
94 59
168 55
51 51
111 50
173 47
106 47
98 46
171 45
97 44
172 43
157 42
109 42
52 40
21 38
101 37
70 31
24 30
23 26
29 26
50 25
189 22
60 19
485 18
166 18
107 18
232 16
30 15
81 15
96 15
61 14
191 13
176 12
28 11
31 11
441 11
103 11
48 10
69 10
99 10
112 10
27 9
42 9
46 9
47 9
170 9
86 9
32 8
34 8
177 8
167 8
120 8
132 8
95 8
39 7
44 7
62 7
156 7
450 6
37 6
40 6
53 6
54 6
159 6
26 5
33 5
59 5
127 5
76 5
79 5
84 5
442 5
45 4
49 4
55 4
57 4
68 4
83 4
85 4
444 4
89 4
161 4
相关推荐
地平线开发者2 小时前
ReID/OSNet 算法模型量化转换实践
算法·自动驾驶
地平线开发者2 小时前
开发者说|EmbodiedGen:为具身智能打造可交互3D世界生成引擎
算法·自动驾驶
星星火柴9363 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
艾莉丝努力练剑4 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
闪电麦坤955 小时前
数据结构:迭代方法(Iteration)实现树的遍历
数据结构·二叉树·
C++、Java和Python的菜鸟6 小时前
第六章 统计初步
算法·机器学习·概率论
Cx330❀6 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
散1126 小时前
01数据结构-Prim算法
数据结构·算法·图论
起个昵称吧6 小时前
线程相关编程、线程间通信、互斥锁
linux·算法
..过云雨7 小时前
01.【数据结构-C语言】数据结构概念&算法效率(时间复杂度和空间复杂度)
c语言·数据结构·笔记·学习