实现一个学生信息管理系统,完成要求功能,并按要求输出.具体内容可以看[UVA12412](UVA12412 A Typical Homework (a.k.a 师兄帮帮忙) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))
输入 #1
1 0011223344 1 John 79 98 91 100 0022334455 1 Tom 59 72 60 81 0011223344 2 Alice 100 100 100 100 2423475629 2 John 60 80 30 99 0 3 0022334455 John 0 5 1 2 0011223344 0 5 0 4 0
输出 #1
Welcome to Student Performance Management System (SPMS). 1 - Add 2 - Remove 3 - Query 4 - Show ranking 5 - Show Statistics 0 - Exit Please enter the SID, CID, name and four scores. Enter 0 to finish. Please enter the SID, CID, name and four scores. Enter 0 to finish. Please enter the SID, CID, name and four scores. Enter 0 to finish. Duplicated SID. Please enter the SID, CID, name and four scores. Enter 0 to finish. Please enter the SID, CID, name and four scores. Enter 0 to finish. Welcome to Student Performance Management System (SPMS). 1 - Add 2 - Remove 3 - Query 4 - Show ranking 5 - Show Statistics 0 - Exit Please enter SID or name. Enter 0 to finish. 2 0022334455 1 Tom 59 72 60 81 272 68.00 Please enter SID or name. Enter 0 to finish. 1 0011223344 1 John 79 98 91 100 368 92.00 3 2423475629 2 John 60 80 30 99 269 67.25 Please enter SID or name. Enter 0 to finish. Welcome to Student Performance Management System (SPMS). 1 - Add 2 - Remove 3 - Query 4 - Show ranking 5 - Show Statistics 0 - Exit Please enter class ID, 0 for the whole statistics. Chinese Average Score: 69.00 Number of passed students: 1 Number of failed students: 1 Mathematics Average Score: 85.00 Number of passed students: 2 Number of failed students: 0 English Average Score: 75.50 Number of passed students: 2 Number of failed students: 0 Programming Average Score: 90.50 Number of passed students: 2 Number of failed students: 0 Overall: Number of students who passed all subjects: 1 Number of students who passed 3 or more subjects: 2 Number of students who passed 2 or more subjects: 2 Number of students who passed 1 or more subjects: 2 Number of students who failed all subjects: 0 Welcome to Student Performance Management System (SPMS). 1 - Add 2 - Remove 3 - Query 4 - Show ranking 5 - Show Statistics 0 - Exit Please enter SID or name. Enter 0 to finish. 1 student(s) removed. Please enter SID or name. Enter 0 to finish. Welcome to Student Performance Management System (SPMS). 1 - Add 2 - Remove 3 - Query 4 - Show ranking 5 - Show Statistics 0 - Exit Please enter class ID, 0 for the whole statistics. Chinese Average Score: 59.50 Number of passed students: 1 Number of failed students: 1 Mathematics Average Score: 76.00 Number of passed students: 2 Number of failed students: 0 English Average Score: 45.00 Number of passed students: 1 Number of failed students: 1 Programming Average Score: 90.00 Number of passed students: 2 Number of failed students: 0 Overall: Number of students who passed all subjects: 0 Number of students who passed 3 or more subjects: 2 Number of students who passed 2 or more subjects: 2 Number of students who passed 1 or more subjects: 2 Number of students who failed all subjects: 0 Welcome to Student Performance Management System (SPMS). 1 - Add 2 - Remove 3 - Query 4 - Show ranking 5 - Show Statistics 0 - Exit Showing the ranklist hurts students’ self-esteem. Don’t do that. Welcome to Student Performance Management System (SPMS). 1 - Add 2 - Remove 3 - Query 4 - Show ranking 5 - Show Statistics 0 - Exit
这道题和平时的编程大作业没有太大区别,没有什么思维难度,但格式要求非常严格,稍不注意就WA,建议使用自顶向下的方法来实现.参考紫书答案和洛谷题解.
#include <stdio.h> #include <string.h> #define maxn 1005 #define maxl 1005 #define EPS 1e-5 // 定义结构体 struct stu { char SID[maxn]; char name[maxn]; int CID; int Ch, Ma, En, Pr, All; // 无视这两个,写的时候没有用到 double Ave; int rank; }; stu st[maxl]; int n = 0; int removed[maxl] = {0}; // 查重 int check(char* t) { for (int i = 0; i < n; i++) { if (!removed[i]) { if (strcmp(t, st[i].SID) == 0) { return 0; } } } return 1; } // 增加功能 void add() { while (1) { printf("Please enter the SID, CID, name and four scores. Enter 0 to finish.\n"); scanf("%s", st[n].SID); if (strcmp(st[n].SID,"0" ) == 0) { return; } scanf("%d%s%d%d%d%d", &st[n].CID, st[n].name, &st[n].Ch, &st[n].Ma, &st[n].En, &st[n].Pr); if (check(st[n].SID) == 0) { printf("Duplicated SID.\n"); continue; } else { st[n].All = st[n].Ch + st[n].En + st[n].Ma + st[n].Pr; n++; } } } // 排名就是,有多少人比当前学生高分,这个学生的排名即人数加1 int rank(int s) { int sum = 1; for (int i = 0; i < n; i++) { if (removed[i] == 1) { continue; } if (st[i].All > s) { sum++; } } return sum; } // 查询,删除都要先查到学生,可以整合成一个函数 void RQ(int flag) { while (1) { printf("Please enter SID or name. Enter 0 to finish.\n"); char temp[maxn]; int r = 0; scanf("%s", temp); if (strcmp(temp, "0") == 0) { return; } for (int i = 0; i < n; i++) { if (removed[i] == 1) { continue; } if (strcmp(temp, st[i].SID) == 0 || strcmp(temp, st[i].name) == 0) { if (flag == 0) { // 注意浮点数输出加一个EPS,缓解精度误差带来的问题 printf("%d %s %d %s %d %d %d %d %d %.2f\n", rank(st[i].All), st[i].SID, st[i].CID, st[i].name, st[i].Ch, st[i].Ma, st[i].En, st[i].Pr, st[i].All, st[i].All / 4.0 + EPS); } else { removed[i] = 1; r++; } } } if (flag) { printf("%d student(s) removed.\n", r); } } } void ST() { printf("Please enter class ID, 0 for the whole statistics.\n"); int cid; int chnum = 0, manum = 0, ennum = 0, prnum = 0; int pass0 = 0, pass1 = 0, pass2 = 0, pass3 = 0, pass4 = 0; int num = 0, passnum = 0; int all = 0; double cntot = 0, matot = 0, entot = 0, prtot = 0; scanf("%d", &cid); if (cid == 0) { for (int i = 0; i < n; i++) { if (removed[i] == 1) { continue; } all++; passnum = 0; cntot = cntot + st[i].Ch; matot = matot + st[i].Ma; entot = entot + st[i].En; prtot = prtot + st[i].Pr; if (st[i].Ch >= 60) { passnum++; chnum++; } if (st[i].En >= 60) { passnum++; ennum++; } if (st[i].Ma >= 60) { passnum++; manum++; } if (st[i].Pr >= 60) { passnum++; prnum++; } if (passnum == 0) pass0++; if (passnum >= 1) pass1++; if (passnum >= 2) pass2++; if (passnum >= 3) pass3++; if (passnum >= 4) pass4++; } printf("Chinese\n" "Average Score: %.2f\n" "Number of passed students: %d\n" "Number of failed students: %d\n\n" "Mathematics\n" "Average Score: %.2f\n" "Number of passed students: %d\n" "Number of failed students: %d\n\n" "English\n" "Average Score: %.2f\n" "Number of passed students: %d\n" "Number of failed students: %d\n\n" "Programming\n" "Average Score: %.2f\n" "Number of passed students: %d\n" "Number of failed students: %d\n\n" "Overall:\n" "Number of students who passed all subjects: %d\n" "Number of students who passed 3 or more subjects: %d\n" "Number of students who passed 2 or more subjects: %d\n" "Number of students who passed 1 or more subjects: %d\n" "Number of students who failed all subjects: %d\n\n", cntot / (double)all + EPS, chnum, all - chnum, matot / (double)all + EPS, manum, all - manum, entot / (double)all + EPS, ennum, all - ennum, prtot / (double)all + EPS, prnum, all - prnum, pass4, pass3, pass2, pass1, pass0 ); } else { for (int i = 0; i < n; i++) { if (removed[i] == 1 || st[i].CID != cid) { continue; } all++; passnum = 0; cntot = cntot + st[i].Ch; matot = matot + st[i].Ma; entot = entot + st[i].En; prtot = prtot + st[i].Pr; if (st[i].Ch >= 60) { passnum++; chnum++; } if (st[i].En >= 60) { passnum++; ennum++; } if (st[i].Ma >= 60) { passnum++; manum++; } if (st[i].Pr >= 60) { passnum++; prnum++; } if (passnum == 0) pass0++; if (passnum >= 1) pass1++; if (passnum >= 2) pass2++; if (passnum >= 3) pass3++; if (passnum >= 4) pass4++; } printf("Chinese\n" "Average Score: %.2f\n" "Number of passed students: %d\n" "Number of failed students: %d\n\n" "Mathematics\n" "Average Score: %.2f\n" "Number of passed students: %d\n" "Number of failed students: %d\n\n" "English\n" "Average Score: %.2f\n" "Number of passed students: %d\n" "Number of failed students: %d\n\n" "Programming\n" "Average Score: %.2f\n" "Number of passed students: %d\n" "Number of failed students: %d\n\n" "Overall:\n" "Number of students who passed all subjects: %d\n" "Number of students who passed 3 or more subjects: %d\n" "Number of students who passed 2 or more subjects: %d\n" "Number of students who passed 1 or more subjects: %d\n" "Number of students who failed all subjects: %d\n\n", cntot / (double)all + EPS, chnum, all - chnum, matot / (double)all + EPS, manum, all - manum, entot / (double)all + EPS, ennum, all - ennum, prtot / (double)all + EPS, prnum, all - prnum, pass4, pass3, pass2, pass1, pass0 ); } } int main() { while (1) { int choice; // 注意输出格式!!! printf("Welcome to Student Performance Management System (SPMS).\n"); printf("\n"); printf("1 - Add\n"); printf("2 - Remove\n"); printf("3 - Query\n"); printf("4 - Show ranking\n"); printf("5 - Show Statistics\n"); printf("0 - Exit\n"); printf("\n"); scanf("%d", &choice); switch (choice) { case 0: return 0; case 1: add(); break; case 2: RQ(1); break; case 3: RQ(0); break; case 4: printf("Showing the ranklist hurts students' self-esteem. Don't do that.\n"); break; case 5: ST(); break; } } return 0; }