From ab2e91de787a0c6ea74ec5f779efcb08903761aa Mon Sep 17 00:00:00 2001 From: Luthics Date: Sat, 2 Dec 2023 13:47:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=B8=80=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 5/main.c | 4 +- 6/main.c | 130 +++++++++++++---------- 6/origin.cpp | 282 ++++++++++++++++++++++++++++++++++++++++++++++++++ 9/average.dat | 8 ++ 9/cs.dat | 8 ++ 9/data.in | 0 9/eng.dat | 8 ++ 9/main.c | 269 +++++++++++++++++++++++++++++++++++++++++++++++ 9/math.dat | 8 ++ 9/score.dat | 8 ++ 10 files changed, 671 insertions(+), 54 deletions(-) create mode 100644 6/origin.cpp create mode 100644 9/average.dat create mode 100644 9/cs.dat create mode 100644 9/data.in create mode 100644 9/eng.dat create mode 100644 9/main.c create mode 100644 9/math.dat create mode 100644 9/score.dat diff --git a/5/main.c b/5/main.c index 236ae68..64e10e6 100644 --- a/5/main.c +++ b/5/main.c @@ -46,5 +46,5 @@ int main() { return 0; } -// 尚未修改到课程版本 -// Ref: P1996 约瑟夫问题 \ No newline at end of file +// Ref: P1996 约瑟夫问题 +// 已修改为实验版本 \ No newline at end of file diff --git a/6/main.c b/6/main.c index 1da0ed8..c1633f9 100644 --- a/6/main.c +++ b/6/main.c @@ -1,66 +1,91 @@ -#include - -using namespace std; +#include +#include +#include int se; // 学期总数 int sx; // 学分上限 int cl; // 课程数量 int ren[12], fe[12], re[12][105]; -struct Class { - string id; // 课程编号 - int sx; // 学分 +typedef struct { + char *id; // 课程编号 + int sx; // 学分 int xq; - int sel; // 是否已经选择 - int pren, nexn; // 先修课程数量 - int ppren; // use for topo - string pre[105]; // 先修课程 - string next[105]; // 后续课程 -} ss[105]; + int sel; // 是否已经选择 + int pren, nexn; // 先修课程数量 + int ppren; // use for topo + char *pre[105]; // 先修课程 + char *next[105]; // 后续课程 +} Class; -void pt(int detail = 0) { +Class ss[105]; + +Class *queue[105]; +int head = 0, tail = 0; + +void push(Class *c) { queue[tail++] = c; } + +Class *pop() { return queue[head++]; } + +int empty() { return head == tail; } + +Class *front() { return queue[head]; } + +void pt(int detail) { // print for (int i = 0; i < cl; i++) { - cout << ss[i].id << " " << ss[i].sx << " " << ss[i].pren << " " - << ss[i].nexn << endl; + printf("%s %d %d %d\n", ss[i].id, ss[i].sx, ss[i].pren, ss[i].nexn); if (!detail) continue; if (ss[i].pren > 0) { - cout << "pre:" << endl; + printf("pre:\n"); for (int j = 0; j < ss[i].pren; j++) { - cout << ss[i].pre[j] << " "; + printf("%s ", ss[i].pre[j]); } - cout << endl; + printf("\n"); } if (ss[i].nexn > 0) { - cout << "next:" << endl; + printf("next:\n"); for (int j = 0; j < ss[i].nexn; j++) { - cout << ss[i].next[j] << " "; + printf("%s ", ss[i].next[j]); } - cout << endl; + printf("\n"); } - cout << endl; + printf("\n"); } } // 寻找 id -int fd(string id) { +int fd(char *id) { for (int i = 0; i < cl; i++) { - if (ss[i].id == id) { + if (strcmp(ss[i].id, id) == 0) { return i; } } return -1; } +char *substr(char *str, int start, int cnt) { + char *res = (char *)malloc(sizeof(char) * (cnt + 1)); + for (int i = 0; i < cnt; i++) { + res[i] = str[start + i]; + } + res[cnt] = '\0'; + return res; +} + // 去除字符串两边空格和换行符 -string ql(string s) { - int l = 0, r = s.length() - 1; +char *ql(char *s) { + char *res = (char *)malloc(sizeof(char) * (strlen(s) + 1)); + int l = 0, r = strlen(s) - 1; while (s[l] == ' ' || s[l] == '\n') l++; while (s[r] == ' ' || s[r] == '\n') r--; - return s.substr(l, r - l + 1); + for (int i = 0; i <= r - l; i++) { + res[i] = s[l + i]; + } + return res; } // 寻找先修课程的最迟学期 @@ -93,28 +118,27 @@ int xz2(int i) { } // 拓扑排序,将排好序的id 放入sorted void topo() { - int sorted[105] = { 0 }; + int sorted[105] = {0}; int cnt = 0; - queue q; for (int i = 0; i < cl; i++) { if (ss[i].ppren == 0) { - q.push(&ss[i]); + push(&ss[i]); } } - while (!q.empty()) { - Class* tmp = q.front(); + while (!empty()) { + Class *tmp = front(); sorted[cnt] = fd(tmp->id); - q.pop(); + pop(); cnt++; for (int i = 0; i < tmp->nexn; i++) { ss[fd(tmp->next[i])].ppren--; if (ss[fd(tmp->next[i])].ppren == 0) { - q.push(&ss[fd(tmp->next[i])]); + push(&ss[fd(tmp->next[i])]); } } } if (cnt != cl) { - cout << "error" << endl; + printf("error\n"); exit(0); } Class newss[105]; @@ -172,42 +196,44 @@ void pte() { for (int i = 0; i < se; i++) { if (ren[i] == 0) continue; - cout << "学期 " << i + 1 << " 学分 " << fe[i] << " 课程数 " << ren[i] << " 课程:"; + printf("学期 %d 学分 %d 课程数 %d 课程:", i + 1, fe[i], ren[i]); for (int j = 0; j < ren[i]; j++) { - cout << ss[re[i][j]].id << " "; + printf("%s ", ss[re[i][j]].id); } - cout << endl; + printf("\n"); } } int main() { freopen("in.txt", "r", stdin); - cin >> se >> sx; + scanf("%d%d", &se, &sx); if (se <= 0 || sx <= 0 || se > 6 || sx > 10) { - cout << "error" << endl; + printf("error\n"); exit(0); } - cin >> cl; + scanf("%d", &cl); if (cl <= 0 || cl > 12) { - cout << "error" << endl; + printf("error\n"); exit(0); } for (int i = 0; i < cl; i++) { - cin >> ss[i].id; + char *id = (char *)malloc(sizeof(char) * 105); + scanf("%s", id); ss[i].id = ql(ss[i].id); } for (int i = 0; i < cl; i++) { - cin >> ss[i].sx >> ss[i].pren; + scanf("%d", &ss[i].sx); + scanf("%d", &ss[i].pren); ss[i].ppren = ss[i].pren; for (int j = 0; j < ss[i].pren; j++) { - string tmp; - cin >> tmp; + char *tmp = (char *)malloc(sizeof(char) * 105); + scanf("%s", tmp); tmp = ql(tmp); - if (tmp.size() == 0) + if (strlen(tmp) == 0) continue; int fid = fd(tmp); if (fid == -1) { - cout << "error" << endl; + printf("error\n"); exit(0); } ss[i].pre[j] = ss[fid].id; @@ -252,7 +278,7 @@ int main() { } // 判断是否全部选中 if (ttc != cl) { - cout << "error" << endl; + printf("error\n"); exit(0); } // for (int i = 0; i < cl; i++) { @@ -260,9 +286,9 @@ int main() { // } // pte(); int kind; - cin >> kind; + scanf("%d", &kind); if (kind != 1 && kind != 2) { - cout << "error" << endl; + printf("error\n"); exit(0); } // 输入分配方式,1是负担均匀,2是尽早学习 @@ -271,7 +297,7 @@ int main() { } else if (kind == 2) { // 本来就是今早分配的,无需更改 } else { - cout << "error" << endl; + printf("error\n"); exit(0); } // 输出最终结果 diff --git a/6/origin.cpp b/6/origin.cpp new file mode 100644 index 0000000..1201f2e --- /dev/null +++ b/6/origin.cpp @@ -0,0 +1,282 @@ +#include + +using namespace std; + +int se; // 学期总数 +int sx; // 学分上限 +int cl; // 课程数量 +int ren[12], fe[12], re[12][105]; + +struct Class { + string id; // 课程编号 + int sx; // 学分 + int xq; + int sel; // 是否已经选择 + int pren, nexn; // 先修课程数量 + int ppren; // use for topo + string pre[105]; // 先修课程 + string next[105]; // 后续课程 +} ss[105]; + +void pt(int detail = 0) { + // print + for (int i = 0; i < cl; i++) { + cout << ss[i].id << " " << ss[i].sx << " " << ss[i].pren << " " + << ss[i].nexn << endl; + if (!detail) + continue; + if (ss[i].pren > 0) { + cout << "pre:" << endl; + for (int j = 0; j < ss[i].pren; j++) { + cout << ss[i].pre[j] << " "; + } + cout << endl; + } + if (ss[i].nexn > 0) { + cout << "next:" << endl; + for (int j = 0; j < ss[i].nexn; j++) { + cout << ss[i].next[j] << " "; + } + cout << endl; + } + cout << endl; + } +} + +// 寻找 id +int fd(string id) { + for (int i = 0; i < cl; i++) { + if (ss[i].id == id) { + return i; + } + } + return -1; +} + +// 去除字符串两边空格和换行符 +string ql(string s) { + int l = 0, r = s.length() - 1; + while (s[l] == ' ' || s[l] == '\n') + l++; + while (s[r] == ' ' || s[r] == '\n') + r--; + return s.substr(l, r - l + 1); +} + +// 寻找先修课程的最迟学期 +int xz(int i) { + // cout << ss[i].id << " " << ss[i].pren << endl; + if (ss[i].pren == 0) + return 0; + int maxn = 0; + for (int j = 0; j < ss[i].pren; j++) { + int fid = fd(ss[i].pre[j]); + if (ss[fid].xq > maxn) { + maxn = ss[fid].xq; + } + } + return maxn + 1; +} + +// 寻找后修课程的最早学期 +int xz2(int i) { + if (ss[i].nexn == 0) + return se; + int minn = se; + for (int j = 0; j < ss[i].nexn; j++) { + int fid = fd(ss[i].next[j]); + if (ss[fid].xq < minn) { + minn = ss[fid].xq; + } + } + return minn; +} +// 拓扑排序,将排好序的id 放入sorted +void topo() { + int sorted[105] = {0}; + int cnt = 0; + queue q; + for (int i = 0; i < cl; i++) { + if (ss[i].ppren == 0) { + q.push(&ss[i]); + } + } + while (!q.empty()) { + Class *tmp = q.front(); + sorted[cnt] = fd(tmp->id); + q.pop(); + cnt++; + for (int i = 0; i < tmp->nexn; i++) { + ss[fd(tmp->next[i])].ppren--; + if (ss[fd(tmp->next[i])].ppren == 0) { + q.push(&ss[fd(tmp->next[i])]); + } + } + } + if (cnt != cl) { + cout << "error" << endl; + exit(0); + } + Class newss[105]; + // 将 ss 顺序改为 sorted 顺序 + for (int i = 0; i < cl; i++) { + newss[i] = ss[sorted[i]]; + } + for (int i = 0; i < cl; i++) { + ss[i] = newss[i]; + } +} + +void avgf() { + // 计算平均每学期学习数量 + int avg = cl / se; + // cout << avg << endl; + // 按从后向前,如果学期学习数量小于平均值,则将前面的课程往后移动 + for (int i = se - 1; i >= 1; i--) { + if (ren[i] < avg) { + for (int j = i - 1; j >= 0; j--) { + // cout << j << " " << ren[j] << endl; + if (ren[j] <= 0) + continue; + int flag = 0; + for (int ii = 0; ii < ren[j] && ren[i] < avg; ii++) { + int c = re[j][ii]; + // cout << " " << ss[c].id << " " << xz2(2)<< endl; + // cout << c << endl; + if (xz2(c) > i) { + // 把 c 课程放到 i 学期 + re[i][ren[i]++] = c; + ss[c].xq = i; + // 把 c 课程从 j 学期删除 + for (int jj = ii; jj < ren[j] - 1; jj++) { + re[j][jj] = re[j][jj + 1]; + } + ren[j]--; + flag = 1; + } + // 如果 i 学期中的课程数量大于平均值,则跳出循环 + if (ren[i] >= avg) { + break; + } + if (flag == 1) { + ii = -1; + flag = 0; + } + } + } + } + } +} + +void pte() { + for (int i = 0; i < se; i++) { + if (ren[i] == 0) + continue; + cout << "学期 " << i + 1 << " 学分 " << fe[i] << " 课程数 " << ren[i] + << " 课程:"; + for (int j = 0; j < ren[i]; j++) { + cout << ss[re[i][j]].id << " "; + } + cout << endl; + } +} + +int main() { + freopen("in.txt", "r", stdin); + cin >> se >> sx; + if (se <= 0 || sx <= 0 || se > 6 || sx > 10) { + cout << "error" << endl; + exit(0); + } + cin >> cl; + if (cl <= 0 || cl > 12) { + cout << "error" << endl; + exit(0); + } + for (int i = 0; i < cl; i++) { + cin >> ss[i].id; + ss[i].id = ql(ss[i].id); + } + for (int i = 0; i < cl; i++) { + // 学分和前置课程 + cin >> ss[i].sx >> ss[i].pren; + ss[i].ppren = ss[i].pren; + for (int j = 0; j < ss[i].pren; j++) { + string tmp; + cin >> tmp; + tmp = ql(tmp); + if (tmp.size() == 0) + continue; + int fid = fd(tmp); + if (fid == -1) { + cout << "error" << endl; + exit(0); + } + ss[i].pre[j] = ss[fid].id; + ss[fid].next[ss[fid].nexn++] = ss[i].id; + } + } + // pt(1); + topo(); + // pt(1); + for (int i = 0; i < cl; i++) { + ss[i].xq = xz(i); + } + int ttc = 0; + for (int i = 0; i < se; i++) { + for (int j = 0; j < cl; j++) { + // 判断是否已选择 + if (ss[j].sel == 1) { + continue; + } + // 判断是否学分超过上限 + if (ss[j].sx + fe[i] > sx) { + continue; + } + // 判断是否先修课程已经学习 + int flag = 0; + for (int k = 0; k < ss[j].pren; k++) { + int fid = fd(ss[j].pre[k]); + if (ss[fid].sel == 0) { + flag = 1; + break; + } + } + if (flag == 1) { + continue; + } + // 选择该课程 + ss[j].sel = 1; + fe[i] += ss[j].sx; + re[i][ren[i]++] = j; + ttc++; + } + } + // 判断是否全部选中 + if (ttc != cl) { + cout << "error" << endl; + exit(0); + } + // for (int i = 0; i < cl; i++) { + // cout << ss[i].id << " " << ss[i].xq << endl; + // } + // pte(); + int kind; + cin >> kind; + if (kind != 1 && kind != 2) { + cout << "error" << endl; + exit(0); + } + // 输入分配方式,1是负担均匀,2是尽早学习 + if (kind == 1) { + avgf(); + } else if (kind == 2) { + // 本来就是今早分配的,无需更改 + } else { + cout << "error" << endl; + exit(0); + } + // 输出最终结果 + pte(); + return 0; +} \ No newline at end of file diff --git a/9/average.dat b/9/average.dat new file mode 100644 index 0000000..bbeb526 --- /dev/null +++ b/9/average.dat @@ -0,0 +1,8 @@ +7 +004 L4 89 86 85 86.67 +002 L2 89 67 88 81.00 +001 L1 78 77 90 81.00 +005 L5 67 88 76 77.00 +007 L6 78 76 70 74.67 +003 L3 56 66 78 66.00 +006 L6 45 54 67 55.00 diff --git a/9/cs.dat b/9/cs.dat new file mode 100644 index 0000000..7df9aea --- /dev/null +++ b/9/cs.dat @@ -0,0 +1,8 @@ +7 +001 L1 78 77 90 +002 L2 89 67 88 +004 L4 89 86 85 +003 L3 56 66 78 +005 L5 67 88 76 +007 L6 78 76 70 +006 L6 45 54 67 diff --git a/9/data.in b/9/data.in new file mode 100644 index 0000000..e69de29 diff --git a/9/eng.dat b/9/eng.dat new file mode 100644 index 0000000..6d4971a --- /dev/null +++ b/9/eng.dat @@ -0,0 +1,8 @@ +7 +005 L5 67 88 76 +004 L4 89 86 85 +001 L1 78 77 90 +007 L6 78 76 70 +002 L2 89 67 88 +003 L3 56 66 78 +006 L6 45 54 67 diff --git a/9/main.c b/9/main.c new file mode 100644 index 0000000..1838009 --- /dev/null +++ b/9/main.c @@ -0,0 +1,269 @@ +#include +#include +#include + +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; +} \ No newline at end of file diff --git a/9/math.dat b/9/math.dat new file mode 100644 index 0000000..6ea003e --- /dev/null +++ b/9/math.dat @@ -0,0 +1,8 @@ +7 +002 L2 89 67 88 +004 L4 89 86 85 +001 L1 78 77 90 +007 L6 78 76 70 +005 L5 67 88 76 +003 L3 56 66 78 +006 L6 45 54 67 diff --git a/9/score.dat b/9/score.dat new file mode 100644 index 0000000..3d6d139 --- /dev/null +++ b/9/score.dat @@ -0,0 +1,8 @@ +7 +001 L1 78 77 90 +002 L2 89 67 88 +003 L3 56 66 78 +004 L4 89 86 85 +005 L5 67 88 76 +006 L6 45 54 67 +007 L6 78 76 70 \ No newline at end of file