这题做了两个月,是第四章最后一个AC的题,小细节比较多,仅样例的输出就一百多行,无奈借助专业的ultracompare才完成了对比,最后找到汝佳老师的源代码改了一个小细节AC了。
注意的地方有:精度的控制;人数为0时平均分的输出;增加人员的时候,同名的人如果被移除了也可以添加。
#include <bits/stdc++.h> using namespace std; const double EPS = 1e-5; const int maxn = 1024; int cnt = 0; struct stu{ string SID, name; int CID; int score[5]; bool removed; }all[maxn]; void print_menu() { cout << "Welcome to Student Performance Management System (SPMS)." << endl << endl; cout << "1 - Add" << endl; cout << "2 - Remove" << endl; cout << "3 - Query" << endl; cout << "4 - Show ranking" << endl; cout << "5 - Show Statistics" << endl; cout << "0 - Exit" << endl; cout << endl; } int Rank(const int x) { int t = all[x].score[0]; int high = 0; for(int i = 0; i < cnt; i++) if(!all[i].removed && all[i].score[0] > t) high++; return high + 1; } void add() { while(true){ loop: cout << "Please enter the SID, CID, name and four scores. Enter 0 to finish." << endl; stu in; cin >> in.SID; if(in.SID == "0") break; cin >> in.CID >> in.name >> in.score[1] >> in.score[2] >> in.score[3] >> in.score[4]; for(int i = 0; i < cnt; i++) if(!all[i].removed && in.SID == all[i].SID){ cout << "Duplicated SID." << endl; goto loop; } in.score[0] = in.score[1] + in.score[2] + in.score[3] + in.score[4]; in.removed = false; all[cnt++] = in; } } void DQ(const int isq) { while(true){ cout << "Please enter SID or name. Enter 0 to finish." << endl; string str; cin >> str; if(str == "0") break; int rem_cnt = 0; for(int i = 0; i < cnt; i++){ if(!all[i].removed && (str == all[i].SID || str == all[i].name)) { if(isq){ printf("%d %s %d %s %d %d %d %d %d %.2f ", Rank(i), all[i].SID.c_str(), all[i].CID, all[i].name.c_str(), all[i].score[1], all[i].score[2], all[i].score[3], all[i].score[4], all[i].score[0], all[i].score[0]/4.0+EPS); } else{ all[i].removed = true; rem_cnt++; } } } if(!isq) printf("%d student(s) removed. ", rem_cnt); } } void output(const int ID, const int type) { int sum = 0, cnt1 = 0, cnt2 = 0; for(int i = 0; i < cnt; i++){ if(!all[i].removed && (ID==0 || all[i].CID==ID)){ sum += all[i].score[type]; if(all[i].score[type] >= 60) cnt1++; else cnt2++; } } printf("Average Score: %.2f ", cnt1+cnt2 == 0 ? 0 : sum*1.0/(cnt1+cnt2)+EPS); printf("Number of passed students: %d ", cnt1); printf("Number of failed students: %d ", cnt2); printf(" "); } void stat() { puts("Please enter class ID, 0 for the whole statistics."); int ID; cin >> ID; cout << "Chinese" << endl; output(ID, 1); cout << "Mathematics" << endl; output(ID, 2); cout << "English" << endl; output(ID, 3); cout << "Programming" << endl; output(ID, 4); cout << "Overall:" << endl; int okcnt[5]; memset(okcnt, 0, sizeof(okcnt)); for(int i = 0; i < cnt; i++){ if(!all[i].removed && (ID==0 || all[i].CID==ID)){ int ok = 0; for(int j = 1; j <= 4; j++) if(all[i].score[j] >= 60) ok++; okcnt[ok]++; } } printf("Number of students who passed all subjects: %d ", okcnt[4]); printf("Number of students who passed 3 or more subjects: %d ", okcnt[3]+okcnt[4]); printf("Number of students who passed 2 or more subjects: %d ", okcnt[2]+okcnt[3]+okcnt[4]); printf("Number of students who passed 1 or more subjects: %d ", okcnt[1]+okcnt[2]+okcnt[3]+okcnt[4]); printf("Number of students who failed all subjects: %d ", okcnt[0]); printf(" "); } int main() { //freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); while(true){ print_menu(); int choice; cin >> choice; if(choice == 0) break; if(choice == 1) add(); if(choice == 2) DQ(0); if(choice == 3) DQ(1); if(choice == 4) cout << "Showing the ranklist hurts students' self-esteem. Don't do that." << endl; if(choice == 5) stat(); } return 0; }