冬奥会国家金牌数量排序 C语言实现 - 代码示例及解析
冬奥会国家金牌数量排序 C语言实现 - 代码示例及解析
本程序将实现对冬奥会各个国家金牌数量进行排序的功能。
1. 问题描述
将 2022 北京冬奥会各个国家金牌数量存储在文件 'woGolds.txt' 中,编程获取文件数据并进行金牌数量排序处理,将排序后的结果存入一个新文件 'woGolds_sort.txt' 中,并查看结果与实际结果是否相符。
2. 实验要求
- 理解并掌握该问题的实现方法;
- 代码书写格式规范,测试结果符合期望结果;
- 通过编程完成各个国家金牌数量存储文件 'woGolds.txt' 在硬盘创建;
- 通过调用函数完成以下任务:
- 各个国家金牌数量从键盘输入到内存
- 内存中的各个国家金牌数量保存到文件
- 从文件读取各个国家金牌数量到内存
- 输出排序前的各个国家的金牌数量列表
- 内存中各个国家的金牌数量排序处理
- 排序处理后的各个国家的金牌数量保存文件
- 从文件读取排序处理后各个国家的金牌数量到内存
- 输出排序后的各个国家的金牌数量列表
3. 代码实现
#include <stdio.h>
#include <stdlib.h>
#define NUM_COUNTRIES 10 // 国家数量
#define FILENAME "woGolds.txt" // 存储金牌数量的文件名
#define SORTED_FILENAME "woGolds_sort.txt" // 排序后存储金牌数量的文件名
// 从键盘输入各个国家金牌数量到内存中
void inputGoldNums(int* goldNums) {
printf("请输入%d个国家的金牌数量:\n", NUM_COUNTRIES);
for (int i = 0; i < NUM_COUNTRIES; i++) {
printf("国家%d的金牌数量:", i+1);
scanf("%d", &goldNums[i]);
}
}
// 将内存中的各个国家金牌数量保存到文件中
void saveGoldNumsToFile(int* goldNums) {
FILE* fp = fopen(FILENAME, "w");
if (fp == NULL) {
printf("无法创建文件 %s\n", FILENAME);
exit(1);
}
for (int i = 0; i < NUM_COUNTRIES; i++) {
fprintf(fp, "%d ", goldNums[i]);
}
fclose(fp);
}
// 从文件中读取各个国家金牌数量到内存中
void readGoldNumsFromFile(int* goldNums) {
FILE* fp = fopen(FILENAME, "r");
if (fp == NULL) {
printf("无法打开文件 %s\n", FILENAME);
exit(1);
}
for (int i = 0; i < NUM_COUNTRIES; i++) {
fscanf(fp, "%d", &goldNums[i]);
}
fclose(fp);
}
// 输出各个国家的金牌数量列表
void printGoldNums(int* goldNums) {
printf("各个国家的金牌数量列表:\n");
for (int i = 0; i < NUM_COUNTRIES; i++) {
printf("国家%d:%d\n", i+1, goldNums[i]);
}
}
// 比较函数,用于排序
int cmp(const void* a, const void* b) {
return *(int*)b - *(int*)a; // 降序排序
}
// 内存中各个国家的金牌数量排序处理
void sortGoldNums(int* goldNums) {
qsort(goldNums, NUM_COUNTRIES, sizeof(int), cmp);
}
// 将排序后的各个国家金牌数量保存到文件中
void saveSortedGoldNumsToFile(int* goldNums) {
FILE* fp = fopen(SORTED_FILENAME, "w");
if (fp == NULL) {
printf("无法创建文件 %s\n", SORTED_FILENAME);
exit(1);
}
for (int i = 0; i < NUM_COUNTRIES; i++) {
fprintf(fp, "%d ", goldNums[i]);
}
fclose(fp);
}
// 从文件中读取排序后的各个国家金牌数量到内存中
void readSortedGoldNumsFromFile(int* goldNums) {
FILE* fp = fopen(SORTED_FILENAME, "r");
if (fp == NULL) {
printf("无法打开文件 %s\n", SORTED_FILENAME);
exit(1);
}
for (int i = 0; i < NUM_COUNTRIES; i++) {
fscanf(fp, "%d", &goldNums[i]);
}
fclose(fp);
}
int main() {
int goldNums[NUM_COUNTRIES];
// 输入各个国家金牌数量
inputGoldNums(goldNums);
// 将各个国家金牌数量保存到文件
saveGoldNumsToFile(goldNums);
// 从文件中读取各个国家金牌数量到内存中
readGoldNumsFromFile(goldNums);
// 输出各个国家的金牌数量列表
printGoldNums(goldNums);
// 内存中各个国家的金牌数量排序处理
sortGoldNums(goldNums);
// 将排序后的各个国家金牌数量保存到文件中
saveSortedGoldNumsToFile(goldNums);
// 从文件中读取排序后的各个国家金牌数量到内存中
readSortedGoldNumsFromFile(goldNums);
// 输出排序后的各个国家的金牌数量列表
printf("排序后的各个国家的金牌数量列表:\n");
for (int i = 0; i < NUM_COUNTRIES; i++) {
printf("国家%d:%d\n", i+1, goldNums[i]);
}
return 0;
}
4. 代码解析
- 头文件包含:
#include <stdio.h>和#include <stdlib.h>分别用于标准输入输出和标准库函数。 - 宏定义: 定义了
NUM_COUNTRIES、FILENAME和SORTED_FILENAME三个宏,分别表示国家数量、存储文件名称和排序后存储文件名称。 - 函数定义:
inputGoldNums: 从键盘输入各个国家金牌数量到内存中。saveGoldNumsToFile: 将内存中的金牌数量保存到文件中。readGoldNumsFromFile: 从文件中读取金牌数量到内存中。printGoldNums: 输出各个国家的金牌数量列表。cmp: 比较函数,用于qsort排序。sortGoldNums: 使用qsort对金牌数量进行排序。saveSortedGoldNumsToFile: 将排序后的金牌数量保存到文件中。readSortedGoldNumsFromFile: 从排序后存储的文件中读取金牌数量到内存中。
- 主函数: 调用各个函数完成排序任务。
5. 代码运行
运行代码,程序会提示输入各个国家金牌数量,输入完成后,程序会将排序后的结果输出到控制台。同时,也会将排序后的结果保存到 'woGolds_sort.txt' 文件中。
6. 总结
本程序演示了使用 C语言进行文件操作、数组排序、以及函数调用来解决实际问题的示例。程序结构清晰,代码易懂,便于理解和学习。
7. 扩展
- 可以尝试将国家名称和金牌数量一起存储到文件中,并在排序后也输出国家名称。
- 可以将金牌数量的排序方式改为升序排序。
- 可以使用其他排序算法,例如冒泡排序、插入排序等,来实现金牌数量的排序。
- 可以使用结构体来存储国家名称和金牌数量,并使用结构体数组来存储所有国家的数据,提高代码的可读性和可维护性。
原文地址: https://www.cveoy.top/t/topic/n3wc 著作权归作者所有。请勿转载和采集!