/*
卡代码长度。。。
1.题目中描述的Showing the ranklist hurts students’ self-esteem. Don’t do that.的’是'
2.输出格式中有很多的换行
3.浮点误差,因为保留两位小数,保留之前+一个EPS,然后保留
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#define EPS 1e-6
using namespace std;
int number = 0;
typedef struct Student{
char SID[11];
int CID;
char name[20];
int scores[4];
int all;
double avg;
}Student;
Student students[115];
void showAll();
void showMain(){//显示主界面
printf("Welcome to Student Performance Management System (SPMS).\n\n1 - Add\n2 - Remove\n3 - Query\n4 - Show ranking\n5 - Show Statistics\n0 - Exit\n");
}
bool SIDCan(char SID[]){//这个SID是否已经存在
int i;
for(i=0;i<number;i++){
if(strcmp(SID,students[i].SID)==0)
return false;
}
return true;
}
void Add(){//添加操作
int CID,i;
char SID[20];
int scores[4];
char name[20];
int all;
while(true){
printf("Please enter the SID, CID, name and four scores. Enter 0 to finish.\n");
scanf("%s",SID);
if(strcmp(SID,"0")==0){
break;
}else{
scanf("%d",&CID);
scanf("%s",name);
all = 0;
for(i=0;i<4;i++){
scanf("%d",&scores[i]);
all += scores[i];
}
if(SIDCan(SID)){
Student &st = students[number];
strcpy(st.SID,SID);
st.CID = CID;
strcpy(st.name,name);
memcpy(st.scores,scores,sizeof(int)*4);
st.all = all;
st.avg = all/4.0;
number++;
}else{
printf("Duplicated SID.\n");
}
}
}
}
int Rank(int i){//求出学生成绩排名
int cnt = 0;
int j;
for(j=0;j<number;j++){
if(students[j].all>students[i].all)
cnt++;
}
return cnt+1;
}
void Remove(){//删除操作
char order[20];
int i,j;
while(true){
printf("Please enter SID or name. Enter 0 to finish.\n");
scanf("%s",order);
if(strcmp(order,"0")==0) break;
int cnt = 0;
bool isSID=false;
if(isdigit(order[0])){//判断是否是SID
isSID = true;
}
for(i=number-1;i>=0;i--){
if(isSID&&strcmp(students[i].SID,order)==0||strcmp(students[i].name,order)==0){
cnt++;
for(j=i+1;j<number;j++){
students[j-1] = students[j];
}
number--;
if(isSID) break;//SID只有一个,所以查到一次就能推出循环了
}
}
printf("%d student(s) removed.\n",cnt);
}
}
void Query(){//查询操作
char order[20];
int i,j;
while(true){
printf("Please enter SID or name. Enter 0 to finish.\n");
scanf("%s",order);
if(strcmp(order,"0")==0) break;
bool isSID = false;
if(isdigit(order[0])){//sid
isSID = true;
}
for(i=0;i<number;i++){
Student &st = students[i];
if(isSID&&strcmp(st.SID,order)==0||strcmp(st.name,order)==0){
printf("%d %s %d %s %d %d %d %d %d %.2f\n",Rank(i),st.SID,st.CID,\
st.name,st.scores[0],st.scores[1],st.scores[2],\
st.scores[3],st.all,st.avg+EPS);
if(isSID) break;
}
}
}
}
void ShowRanking(){//显示排名
printf("Showing the ranklist hurts students' self-esteem. Don't do that.\n");
}
void ShowStatistics(){//显示统计数据
int sum[4][2];
int pass[5];
printf("Please enter class ID, 0 for the whole statistics.\n");
int CID,i,j;
cin>>CID;
int sc,cnt;
for(i=0;i<4;i++) sum[i][0] = sum[i][1] = 0;
for(i=0;i<5;i++) pass[i] = 0;
int allPerson;
if(CID==0){
allPerson = number;
for(i=0;i<number;i++){
cnt = 0;
for(j=0;j<4;j++){
sc = students[i].scores[j];
sum[j][0]+=sc;
if(sc>=60) {sum[j][1]++;cnt++;}
}
if(cnt==0) pass[0]++;
else for(j=1;j<=cnt;j++) pass[j]++;
}
}else{
allPerson = 0;
for(i=0;i<number;i++){
if(students[i].CID==CID){
allPerson++;
cnt = 0;
for(j=0;j<4;j++){
sc = students[i].scores[j];
sum[j][0]+=sc;
if(sc>=60) {sum[j][1]++;cnt++;}
}
if(cnt==0) pass[0]++;
else for(j=1;j<=cnt;j++) pass[j]++;
}
}
}
if(allPerson){
double dd[4];
int rr[4];
for(i=0;i<4;i++){
dd[i] = sum[i][0]/double(allPerson)+EPS;
rr[i] = allPerson-sum[i][1];
}
printf("Chinese\nAverage Score: %.2f\nNumber of passed students: %d\nNumber of failed students: %d\n\n",dd[0],sum[0][1],rr[0]);
printf("Mathematics\nAverage Score: %.2f\nNumber of passed students: %d\nNumber of failed students: %d\n\n",dd[1],sum[1][1],rr[1]);
printf("English\nAverage Score: %.2f\nNumber of passed students: %d\nNumber of failed students: %d\n\n",dd[2],sum[2][1],rr[2]);
printf("Programming\nAverage Score: %.2f\nNumber of passed students: %d\nNumber of failed students: %d\n\n",dd[3],sum[3][1],rr[3]);
printf("Overall:\nNumber of students who passed all subjects: %d\nNumber of students who passed 3 or more subjects: %d\nNumber of students who passed 2 or more subjects: %d\nNumber of students who passed 1 or more subjects: %d\nNumber of students who failed all subjects: %d\n\n",pass[4],pass[3],pass[2],pass[1],pass[0]);
}else{
printf("Chinese\nAverage Score: 0\nNumber of passed students: %d\nNumber of failed students: %d\n\n",0,0);
printf("Mathematics\nAverage Score: 0\nNumber of passed students: %d\nNumber of failed students: %d\n\n",0,0);
printf("English\nAverage Score: 0\nNumber of passed students: %d\nNumber of failed students: %d\n\n",0,0);
printf("Programming\nAverage Score: 0\nNumber of passed students: %d\nNumber of failed students: %d\n\n",0,0);
printf("Overall:\nNumber of students who passed all subjects: %d\nNumber of students who passed 3 or more subjects: %d\nNumber of students who passed 2 or more subjects: %d\nNumber of students who passed 1 or more subjects: %d\nNumber of students who failed all subjects: %d\n\n",0,0,0,0,0);
}
}
int main()
{
int order;
while(true){
showMain();
scanf("%d",&order);
printf("\n");
if(order==0)break;
switch(order){
case 1:Add();break;
case 2:Remove();break;
case 3:Query();break;
case 4:ShowRanking();break;
case 5:ShowStatistics();break;
default:break;
}
}
return 0;
}
//提交时候把代码注释去掉,下面那个代码最后提交通过了。。。
#include <iostream>
#include <cstdio>
#include <cstring>
#define EPS 1e-6
using namespace std;
int number = 0;
typedef struct Student{
char SID[11];
int CID;
char name[20];
int scores[4];
int all;
double avg;
}Student;
Student students[115];
void showAll();
void showMain(){
printf("Welcome to Student Performance Management System (SPMS).\n\n1 - Add\n2 - Remove\n3 - Query\n4 - Show ranking\n5 - Show Statistics\n0 - Exit\n");
}
bool SIDCan(char SID[]){
int i;
for(i=0;i<number;i++){
if(strcmp(SID,students[i].SID)==0)
return false;
}
return true;
}
void Add(){
int CID,i;
char SID[20];
int scores[4];
char name[20];
int all;
while(true){
printf("Please enter the SID, CID, name and four scores. Enter 0 to finish.\n");
scanf("%s",SID);
if(strcmp(SID,"0")==0){
break;
}else{
scanf("%d",&CID);
scanf("%s",name);
all = 0;
for(i=0;i<4;i++){
scanf("%d",&scores[i]);
all += scores[i];
}
if(SIDCan(SID)){
Student &st = students[number];
strcpy(st.SID,SID);
st.CID = CID;
strcpy(st.name,name);
memcpy(st.scores,scores,sizeof(int)*4);
st.all = all;
st.avg = all/4.0;
number++;
}else{
printf("Duplicated SID.\n");
}
}
}
}
int Rank(int i){
int cnt = 0;
int j;
for(j=0;j<number;j++){
if(students[j].all>students[i].all)
cnt++;
}
return cnt+1;
}
void Remove(){
char order[20];
int i,j;
while(true){
printf("Please enter SID or name. Enter 0 to finish.\n");
scanf("%s",order);
if(strcmp(order,"0")==0) break;
int cnt = 0;
bool isSID=false;
if(isdigit(order[0])){
isSID = true;
}
for(i=number-1;i>=0;i--){
if(isSID&&strcmp(students[i].SID,order)==0||strcmp(students[i].name,order)==0){
cnt++;
for(j=i+1;j<number;j++){
students[j-1] = students[j];
}
number--;
if(isSID) break;
}
}
printf("%d student(s) removed.\n",cnt);
}
}
void Query(){
char order[20];
int i,j;
while(true){
printf("Please enter SID or name. Enter 0 to finish.\n");
scanf("%s",order);
if(strcmp(order,"0")==0) break;
bool isSID = false;
if(isdigit(order[0])){
isSID = true;
}
for(i=0;i<number;i++){
Student &st = students[i];
if(isSID&&strcmp(st.SID,order)==0||strcmp(st.name,order)==0){
printf("%d %s %d %s %d %d %d %d %d %.2f\n",Rank(i),st.SID,st.CID,\
st.name,st.scores[0],st.scores[1],st.scores[2],\
st.scores[3],st.all,st.avg+EPS);
if(isSID) break;
}
}
}
}
void ShowRanking(){
printf("Showing the ranklist hurts students' self-esteem. Don't do that.\n");
}
void ShowStatistics(){
int sum[4][2];
int pass[5];
printf("Please enter class ID, 0 for the whole statistics.\n");
int CID,i,j;
cin>>CID;
int sc,cnt;
for(i=0;i<4;i++) sum[i][0] = sum[i][1] = 0;
for(i=0;i<5;i++) pass[i] = 0;
int allPerson;
if(CID==0){
allPerson = number;
for(i=0;i<number;i++){
cnt = 0;
for(j=0;j<4;j++){
sc = students[i].scores[j];
sum[j][0]+=sc;
if(sc>=60) {sum[j][1]++;cnt++;}
}
if(cnt==0) pass[0]++;
else for(j=1;j<=cnt;j++) pass[j]++;
}
}else{
allPerson = 0;
for(i=0;i<number;i++){
if(students[i].CID==CID){
allPerson++;
cnt = 0;
for(j=0;j<4;j++){
sc = students[i].scores[j];
sum[j][0]+=sc;
if(sc>=60) {sum[j][1]++;cnt++;}
}
if(cnt==0) pass[0]++;
else for(j=1;j<=cnt;j++) pass[j]++;
}
}
}
if(allPerson){
double dd[4];
int rr[4];
for(i=0;i<4;i++){
dd[i] = sum[i][0]/double(allPerson)+EPS;
rr[i] = allPerson-sum[i][1];
}
printf("Chinese\nAverage Score: %.2f\nNumber of passed students: %d\nNumber of failed students: %d\n\n",dd[0],sum[0][1],rr[0]);
printf("Mathematics\nAverage Score: %.2f\nNumber of passed students: %d\nNumber of failed students: %d\n\n",dd[1],sum[1][1],rr[1]);
printf("English\nAverage Score: %.2f\nNumber of passed students: %d\nNumber of failed students: %d\n\n",dd[2],sum[2][1],rr[2]);
printf("Programming\nAverage Score: %.2f\nNumber of passed students: %d\nNumber of failed students: %d\n\n",dd[3],sum[3][1],rr[3]);
printf("Overall:\nNumber of students who passed all subjects: %d\nNumber of students who passed 3 or more subjects: %d\nNumber of students who passed 2 or more subjects: %d\nNumber of students who passed 1 or more subjects: %d\nNumber of students who failed all subjects: %d\n\n",pass[4],pass[3],pass[2],pass[1],pass[0]);
}else{
printf("Chinese\nAverage Score: 0\nNumber of passed students: %d\nNumber of failed students: %d\n\n",0,0);
printf("Mathematics\nAverage Score: 0\nNumber of passed students: %d\nNumber of failed students: %d\n\n",0,0);
printf("English\nAverage Score: 0\nNumber of passed students: %d\nNumber of failed students: %d\n\n",0,0);
printf("Programming\nAverage Score: 0\nNumber of passed students: %d\nNumber of failed students: %d\n\n",0,0);
printf("Overall:\nNumber of students who passed all subjects: %d\nNumber of students who passed 3 or more subjects: %d\nNumber of students who passed 2 or more subjects: %d\nNumber of students who passed 1 or more subjects: %d\nNumber of students who failed all subjects: %d\n\n",0,0,0,0,0);
}
}
int main()
{
int order;
while(true){
showMain();
scanf("%d",&order);
printf("\n");
if(order==0)break;
switch(order){
case 1:Add();break;
case 2:Remove();break;
case 3:Query();break;
case 4:ShowRanking();break;
case 5:ShowStatistics();break;
default:break;
}
}
return 0;
}