这道题总体还好就是过程挺长的要考虑的东西就多起来了
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
#define MAX 105
#define EPS 1e-5
struct student{
string sid;
int cid;
string name;
int score[5];
int removed;
} students[MAX];
int counts = 0;
void print_menu();
void add();
int Rank(int);
void DQ(int);
void output(int, int);
void stat();
int main() {
/*
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
*/
while (1) {
int choice;
print_menu();
cin >> choice;
if (choice == 0)
break;
if (choice == 1)
add();
if (choice == 2)
DQ(0);
if (choice == 3)
DQ(1);
if (choice == 4)
puts("Showing the ranklist hurts students' self-esteem. Don't do that.");
if (choice == 5)
stat();
}
return 0;
}
void print_menu() {
puts("Welcome to Student Performance Management System (SPMS).\n");
puts("1 - Add");
puts("2 - Remove");
puts("3 - Query");
puts("4 - Show ranking");
puts("5 - Show Statistics");
puts("0 - Exit\n");
}
void add() {
while(1) {
puts("Please enter the SID, CID, name and four scores. Enter 0 to finish.");
student input;
cin >> input.sid;
if(input.sid == "0")
break;
cin >> input.cid;
cin >> input.name;
cin >> input.score[0];
cin >> input.score[1];
cin >> input.score[2];
cin >> input.score[3];
int flag = 0;
for(int i = 0; i < counts; i++)
if(!students[i].removed && input.sid == students[i].sid) {
puts("Duplicated SID.");
flag = 1;
continue;
}
if(!flag) {
input.score[4] = input.score[0] + input.score[1] + input.score[2] + input.score[3];
input.removed = 0;
students[counts++] = input;
}
}
}
int Rank(int x) {
int score = students[x].score[4];
int n = 1;
for(int i = 0; i < counts; i++)
if (!students[i].removed && students[i].score[4] > score)
n++;
return n;
}
void DQ(int isq) {
string s;
while (1) {
puts("Please enter SID or name. Enter 0 to finish.");
cin >> s;
if (s == "0")
break;
int r = 0;
for (int i = 0; i < counts; i++)
if (!students[i].removed) {
if (students[i].sid == s || students[i].name == s) {
if (isq) {
cout << Rank(i) << ' ' << students[i].sid << ' ' << students[i].cid << ' ' << students[i].name << ' '
<< students[i].score[0] << ' ' << students[i].score[1] << ' ' << students[i].score[2] << ' '
<< students[i].score[3] << ' ' << students[i].score[4] << ' ';
printf("%.2f\n", students[i].score[4]/4.0+EPS);
}
else {
students[i].removed = 1;
r++;
}
}
}
if (!isq)
printf("%d student(s) removed.\n", r);
}
}
void output(int id, int type) {
int sum = 0, count1 = 0, count2 = 0;
for(int i = 0; i < counts; i++) {
if(!students[i].removed && (id == 0 || students[i].cid == id)) {
sum += students[i].score[type];
if(students[i].score[type] >= 60)
count1++;
else
count2++;
}
}
printf("Average Score: %.2f\n", count1 + count2 == 0 ? 0 : sum * 1.0/ (count1+count2) + EPS);
printf("Number of passed students: %d\n", count1);
printf("Number of failed students: %d\n", count2);
putchar('\n');
}
void stat() {
int id;
puts("Please enter class ID, 0 for the whole statistics.");
cin >> id;
puts("Chinese");
output(id, 0);
puts("Mathematics");
output(id, 1);
puts("English");
output(id, 2);
puts("Programming");
output(id, 3);
puts("Overall:");
int passcount[5];
memset(passcount, 0, sizeof(passcount));
for(int i = 0; i < counts; i++) {
if(!students[i].removed && (id == 0 || students[i].cid == id)) {
int pass = 0;
for(int j = 0; j < 4; j++)
if(students[i].score[j] >= 60)
pass++;
passcount[pass]++;
}
}
printf("Number of students who passed all subjects: %d\n", passcount[4]);
printf("Number of students who passed 3 or more subjects: %d\n", passcount[3] + passcount[4]);
printf("Number of students who passed 2 or more subjects: %d\n", passcount[2] + passcount[3] + passcount[4]);
printf("Number of students who passed 1 or more subjects: %d\n", passcount[1] + passcount[2] + passcount[3] + passcount[4]);
printf("Number of students who failed all subjects: %d\n", passcount[0]);
putchar('\n');
}