data-structure-experiments/9/main.c

269 lines
9.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char *uid;
char *name;
int math, eng, cs;
} Score;
void save_to_file(Score **scores, int n, char *file_name) {
FILE *fp = fopen(file_name, "w");
fprintf(fp, "%d\n", n);
for (int i = 0; i < n; i++) {
fprintf(fp, "%s %s %d %d %d\n", scores[i]->uid, scores[i]->name,
scores[i]->math, scores[i]->eng, scores[i]->cs);
}
fclose(fp);
}
int main() {
Score *scores[105];
int n;
// 如果 score.dat 不存在,就从键盘输入
FILE *fp = fopen("score.dat", "r");
if (fp == NULL) {
printf("score.dat not found, please input:\n");
scanf("%d", &n);
fp = fopen("score.dat", "w");
fprintf(fp, "%d\n", n);
for (int i = 0; i < n; i++) {
scores[i] = (Score *)malloc(sizeof(Score));
char *uid = (char *)malloc(sizeof(char) * 105);
char *name = (char *)malloc(sizeof(char) * 105);
scanf("%s %s %d %d %d", uid, name, &scores[i]->math,
&scores[i]->eng, &scores[i]->cs);
scores[i]->uid = uid;
scores[i]->name = name;
fprintf(fp, "%s %s %d %d %d\n", scores[i]->uid, scores[i]->name,
scores[i]->math, scores[i]->eng, scores[i]->cs);
}
fclose(fp);
} else {
// 从 score.dat 读取
fscanf(fp, "%d", &n);
for (int i = 0; i < n; i++) {
scores[i] = (Score *)malloc(sizeof(Score));
char *uid = (char *)malloc(sizeof(char) * 105);
char *name = (char *)malloc(sizeof(char) * 105);
fscanf(fp, "%s %s %d %d %d", uid, name, &scores[i]->math,
&scores[i]->eng, &scores[i]->cs);
scores[i]->uid = uid;
scores[i]->name = name;
}
fclose(fp);
}
printf("Total: %d\n", n);
printf("当前数据:\n");
// 输出所有人的信息
for (int i = 0; i < n; i++) {
printf("%s %s %d %d %d\n", scores[i]->uid, scores[i]->name,
scores[i]->math, scores[i]->eng, scores[i]->cs);
}
printf("--------------------\n");
// 按照每个科目排序并输出对应的排名
printf("按照数学成绩排序:\n");
for (int i = 0; i < n; i++) {
int max = i;
for (int j = i + 1; j < n; j++) {
if (scores[j]->math > scores[max]->math) {
max = j;
}
}
Score *tmp = scores[i];
scores[i] = scores[max];
scores[max] = tmp;
printf("%s %s %d %d %d\n", scores[i]->uid, scores[i]->name,
scores[i]->math, scores[i]->eng, scores[i]->cs);
}
save_to_file(scores, n, "math.dat");
printf("--------------------\n");
printf("按照英语成绩排序:\n");
for (int i = 0; i < n; i++) {
int max = i;
for (int j = i + 1; j < n; j++) {
if (scores[j]->eng > scores[max]->eng) {
max = j;
}
}
Score *tmp = scores[i];
scores[i] = scores[max];
scores[max] = tmp;
printf("%s %s %d %d %d\n", scores[i]->uid, scores[i]->name,
scores[i]->math, scores[i]->eng, scores[i]->cs);
}
save_to_file(scores, n, "eng.dat");
printf("--------------------\n");
printf("按照计算机成绩排序:\n");
for (int i = 0; i < n; i++) {
int max = i;
for (int j = i + 1; j < n; j++) {
if (scores[j]->cs > scores[max]->cs) {
max = j;
}
}
Score *tmp = scores[i];
scores[i] = scores[max];
scores[max] = tmp;
printf("%s %s %d %d %d\n", scores[i]->uid, scores[i]->name,
scores[i]->math, scores[i]->eng, scores[i]->cs);
}
save_to_file(scores, n, "cs.dat");
printf("--------------------\n");
// 计算平均分,按平均成绩排序,写到 average.dat
printf("平均分:\n");
FILE *fp_average = fopen("average.dat", "w");
fprintf(fp_average, "%d\n", n);
double avg_scores[105];
for (int i = 0; i < n; i++) {
avg_scores[i] =
(scores[i]->math + scores[i]->eng + scores[i]->cs) / 3.0;
}
// sort
for (int i = 0; i < n; i++) {
int max = i;
for (int j = i + 1; j < n; j++) {
if (avg_scores[j] > avg_scores[max]) {
max = j;
}
}
int tmp = avg_scores[i];
avg_scores[i] = avg_scores[max];
avg_scores[max] = tmp;
Score *tmp_score = scores[i];
scores[i] = scores[max];
scores[max] = tmp_score;
}
for (int i = 0; i < n; i++) {
printf("%s %s %d %d %d %.2f\n", scores[i]->uid, scores[i]->name,
scores[i]->math, scores[i]->eng, scores[i]->cs,
avg_scores[i] * 1.0);
fprintf(fp_average, "%s %s %d %d %d %.2f\n", scores[i]->uid,
scores[i]->name, scores[i]->math, scores[i]->eng, scores[i]->cs,
avg_scores[i] * 1.0);
}
fclose(fp_average);
printf("--------------------\n");
// 求出各门课程的平均成绩、最高分、最低分、不及格人数、60-69分人数、70-79分人数、
// 80-89分人数、90分以上人数。
int math_sum = 0, eng_sum = 0, cs_sum = 0;
int math_max = 0, eng_max = 0, cs_max = 0;
int math_min = 100, eng_min = 100, cs_min = 100;
int math_fail = 0, eng_fail = 0, cs_fail = 0;
int math_60_69 = 0, eng_60_69 = 0, cs_60_69 = 0;
int math_70_79 = 0, eng_70_79 = 0, cs_70_79 = 0;
int math_80_89 = 0, eng_80_89 = 0, cs_80_89 = 0;
int math_90 = 0, eng_90 = 0, cs_90 = 0;
for (int i = 0; i < n; i++) {
math_sum += scores[i]->math;
eng_sum += scores[i]->eng;
cs_sum += scores[i]->cs;
if (scores[i]->math > math_max) {
math_max = scores[i]->math;
}
if (scores[i]->eng > eng_max) {
eng_max = scores[i]->eng;
}
if (scores[i]->cs > cs_max) {
cs_max = scores[i]->cs;
}
if (scores[i]->math < math_min) {
math_min = scores[i]->math;
}
if (scores[i]->eng < eng_min) {
eng_min = scores[i]->eng;
}
if (scores[i]->cs < cs_min) {
cs_min = scores[i]->cs;
}
if (scores[i]->math < 60) {
math_fail++;
}
if (scores[i]->eng < 60) {
eng_fail++;
}
if (scores[i]->cs < 60) {
cs_fail++;
}
if (scores[i]->math >= 60 && scores[i]->math <= 69) {
math_60_69++;
}
if (scores[i]->eng >= 60 && scores[i]->eng <= 69) {
eng_60_69++;
}
if (scores[i]->cs >= 60 && scores[i]->cs <= 69) {
cs_60_69++;
}
if (scores[i]->math >= 70 && scores[i]->math <= 79) {
math_70_79++;
}
if (scores[i]->eng >= 70 && scores[i]->eng <= 79) {
eng_70_79++;
}
if (scores[i]->cs >= 70 && scores[i]->cs <= 79) {
cs_70_79++;
}
if (scores[i]->math >= 80 && scores[i]->math <= 89) {
math_80_89++;
}
if (scores[i]->eng >= 80 && scores[i]->eng <= 89) {
eng_80_89++;
}
if (scores[i]->cs >= 80 && scores[i]->cs <= 89) {
cs_80_89++;
}
if (scores[i]->math >= 90) {
math_90++;
}
if (scores[i]->eng >= 90) {
eng_90++;
}
if (scores[i]->cs >= 90) {
cs_90++;
}
}
printf("数学:\n平均分:%.2f 最高分:%d 最低分:%d 不及格人数:%d "
"60-69分人数%d "
"70-79分人数%d 80-89分人数%d 90分以上人数%d\n",
math_sum * 1.0 / n, math_max, math_min, math_fail, math_60_69,
math_70_79, math_80_89, math_90);
printf("英语:\n平均分:%.2f 最高分:%d 最低分:%d 不及格人数:%d "
"60-69分人数%d "
"70-79分人数%d 80-89分人数%d 90分以上人数%d\n",
eng_sum * 1.0 / n, eng_max, eng_min, eng_fail, eng_60_69, eng_70_79,
eng_80_89, eng_90);
printf("计算机:\n平均分:%.2f 最高分:%d 最低分:%d 不及格人数:%d "
"60-69分人数%d "
"70-79分人数%d 80-89分人数%d 90分以上人数%d\n",
cs_sum * 1.0 / n, cs_max, cs_min, cs_fail, cs_60_69, cs_70_79,
cs_80_89, cs_90);
// 根据姓名或学号查询某人的各门成绩,重名情况也能处理。
while (1) {
printf("请输入学号或姓名:\n");
char *query = (char *)malloc(sizeof(char) * 105);
scanf("%s", query);
int found = 0;
for (int i = 0; i < n; i++) {
if (strcmp(scores[i]->uid, query) == 0 ||
strcmp(scores[i]->name, query) == 0) {
printf("%s %s %d %d %d\n", scores[i]->uid, scores[i]->name,
scores[i]->math, scores[i]->eng, scores[i]->cs);
found = 1;
}
}
if (!found) {
printf("未找到\n");
}
}
return 0;
}