三、参考代码:

#include <stdio.h> #include <stdlib.h> #include <string.h>

#define MAX_COUNTRY_NUM 100 // 最多支持的国家数量 #define MAX_GOLD_NUM 100 // 每个国家最多获得的金牌数量

// 国家结构体 typedef struct { char name[20]; // 国家名称 int golds[MAX_GOLD_NUM]; // 该国家获得的金牌数量 int gold_num; // 该国家获得的金牌数量 } Country;

// 从文件中读取数据到内存 void read_data_from_file(Country *countries, int *country_num) { FILE *fp = fopen("woGolds.txt", "r"); if (fp == NULL) { printf("Failed to open file woGolds.txt\n"); exit(1); }

*country_num = 0;  // 初始化国家数量为0

while (!feof(fp)) {
    char line[100];
    fgets(line, 100, fp);
    if (strlen(line) == 0) {
        continue;
    }
    
    char *p = strtok(line, " ");
    if (p == NULL) {
        continue;
    }
    
    // 新增一个国家
    strcpy(countries[*country_num].name, p);
    countries[*country_num].gold_num = 0;
    
    // 读取该国家获得的金牌数量
    while ((p = strtok(NULL, " ")) != NULL) {
        countries[*country_num].golds[countries[*country_num].gold_num++] = atoi(p);
    }
    
    (*country_num)++;  // 国家数量加1
}

fclose(fp);

}

// 将数据从内存写入文件 void write_data_to_file(Country *countries, int country_num) { FILE *fp = fopen("woGolds_sort.txt", "w"); if (fp == NULL) { printf("Failed to open file woGolds_sort.txt\n"); exit(1); }

for (int i = 0; i < country_num; i++) {
    fprintf(fp, "%s", countries[i].name);
    for (int j = 0; j < countries[i].gold_num; j++) {
        fprintf(fp, " %d", countries[i].golds[j]);
    }
    fprintf(fp, "\n");
}

fclose(fp);

}

// 比较函数,用于qsort排序 int cmp(const void *a, const void *b) { Country *ca = (Country *)a; Country *cb = (Country *)b; int sum_a = 0, sum_b = 0; for (int i = 0; i < ca->gold_num; i++) { sum_a += ca->golds[i]; } for (int i = 0; i < cb->gold_num; i++) { sum_b += cb->golds[i]; } return sum_b - sum_a; }

int main() { Country countries[MAX_COUNTRY_NUM]; int country_num;

// 从文件读取数据到内存
read_data_from_file(countries, &country_num);

// 输出排序前的各个国家的金牌数量列表
printf("排序前\n");
for (int i = 0; i < country_num; i++) {
    printf("%s", countries[i].name);
    for (int j = 0; j < countries[i].gold_num; j++) {
        printf(" %d", countries[i].golds[j]);
    }
    printf("\n");
}

// 对国家金牌数量进行排序
qsort(countries, country_num, sizeof(Country), cmp);

// 将排序后的数据写入文件
write_data_to_file(countries, country_num);

// 从文件读取排序后的数据到内存
read_data_from_file(countries, &country_num);

// 输出排序后的各个国家的金牌数量列表
printf("排序后\n");
for (int i = 0; i < country_num; i++) {
    printf("%s", countries[i].name);
    for (int j = 0; j < countries[i].gold_num; j++) {
        printf(" %d", countries[i].golds[j]);
    }
    printf("\n");
}

return 0;
一、实验内容:编程完成冬奥会国家金牌数量排序的实现。将2022北京冬奥会各个国家金牌数量存储在文件woGoldstxt中编程获取文件数据并进行金牌数量排序处理将排序后的结果存入一个新文件woGolds_sorttxt中并查看结果与实际结果是否相符。二、实验要求:1、理解并掌握该问题的实现方法;2、代码书写格式规范测试结果符合期望结果;3、通过编程完成各个国家金牌数量存储文件woGoldstxt在硬

原文地址: http://www.cveoy.top/t/topic/faE2 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录