UVA 12412 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang) (模拟)

/*
 卡代码长度。。。
 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;
}

 

 

 

 

 

posted @ 2019-06-13 21:30  fanyuheng  阅读(73)  评论(0)    收藏  举报