zoukankan      html  css  js  c++  java
  • UVa 12412

    这题做了两个月,是第四章最后一个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;
    }


  • 相关阅读:
    6次作业
    5次作业
    4次作业
    3次作业
    first 作业
    pycharm快捷键
    python基础知识记录
    Jenkins+sonar+tomcat+SVN集成搭建
    成为1个技术大牛的入门到进阶之路(学习路线图)
    记一次收到QQ邮箱钓鱼邮件经历
  • 原文地址:https://www.cnblogs.com/kunsoft/p/5312719.html
Copyright © 2011-2022 走看看