UVA12412师兄帮帮忙

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define EPS 1e-5
int N;
struct student
{
    int glass;
    char s[120],name[120];
    int Chinese,Math,English,Program,Sum;
} stu[110];

int rank(int k)
{
    int i,n = 1;
    for(i=0; i<N; i++)
    {
        if(stu[i].Sum>stu[k].Sum)
            n++;
    }
    return n;
}
void print_menu()
{
    printf("Welcome to Student Performance Management System (SPMS).\n\n");
    printf("1 - Add\n");
    printf("2 - Remove\n");
    printf("3 - Query\n");
    printf("4 - Show ranking\n");
    printf("5 - Show Statistics\n");
    printf("0 - Exit\n\n");
}
void Add()
{
    int k;
    getchar();
    for(;;)
    {
        int sign = 1;;
        char str[120];
        printf("Please enter the SID, CID, name and four scores. Enter 0 to finish.\n");
        scanf("%s",str);
        if(!strcmp(str,"0"))
            break;
        strcpy(stu[N].s,str);
        scanf("%d%s%d%d%d%d",&stu[N].glass,stu[N].name,&stu[N].Chinese,&stu[N].Math,&stu[N].English,&stu[N].Program);
        stu[N].Sum = stu[N].Chinese+stu[N].Math+stu[N].English+stu[N].Program;
        for(k=0; k<N; k++)
        {
            if(!strcmp(stu[N].s,stu[k].s))
            {
                sign=0;
                break;
            }
        }
        if(sign)
            N++;
        else
            printf("Duplicated SID.\n");
    }
}
void Remove()
{
    getchar();
    for(;;)
    {
        int i,j,num = 0;
        printf("Please enter SID or name. Enter 0 to finish.\n");
        char str[120];
        scanf("%s",str);
        if(strlen(str) == 1&& str[0] == '0')
            break;
        for(i=0; i<N; i++)
        {
            if(!strcmp(str,stu[i].name)||!strcmp(str,stu[i].s))
            {
                num++;
                N--;
                for(j=i; j<N; j++)
                    memcpy(stu+j,stu+j+1,sizeof(struct student));
                i--;
            }
        }
        printf("%d student(s) removed.\n", num);
    }
}
void Query()
{
    getchar();
    int i;
    for(;;)
    {
        printf("Please enter SID or name. Enter 0 to finish.\n");
        char str[120];
        scanf("%s",str);
        if(!strcmp(str,"0"))
            break;
        for(i=0; i<N; i++)
        {
            if(!strcmp(str,stu[i].name)||!strcmp(str,stu[i].s))
            {
                printf("%d %s %d %s %d %d %d %d %d %.2f\n", rank(i), stu[i].s, stu[i].glass,
                       stu[i].name, stu[i].Chinese, stu[i].Math,
                       stu[i].English, stu[i].Program, stu[i].Sum, stu[i].Sum / 4.0 + EPS);;
            }
        }
    }
}
void Sta()
{
    printf("Please enter class ID, 0 for the whole statistics.\n");
    int id,i,ca=0,cp=0,ma=0,mp=0,ea=0,ep=0,pa=0,pp=0,ap=0,thp=0,twp=0,op=0,af=0;
    scanf("%d",&id);
    int num1=0;
    for(i=0; i<N; i++)
    {
        int num = 0;
        if(id!=0&&stu[i].glass!=id)
            continue;
        if(stu[i].Chinese>=60)
        {
            cp++;
            num++;
        }
        if(stu[i].Math>=60)
        {
            mp++;
            num++;
        }
        if(stu[i].English>=60)
        {
            ep++;
            num++;
        }
        if(stu[i].Program>=60)
        {
            pp++;
            num++;
        }
        ca+=stu[i].Chinese;
        ma+=stu[i].Math;
        ea+=stu[i].English;
        pa+=stu[i].Program;
        num1++;
        if(num==4)
            ap++;
        else if(num==3)
            thp++;
        else if(num==2)
            twp++;
        else if(num==1)
            op++;
        else
            af++;
    }
    printf("Chinese\n");
    printf("Average Score: %.2f\n",ca*1.0/num1+EPS);
    printf("Number of passed students: %d\n",cp);
    printf("Number of failed students: %d\n\n",num1-cp);
    printf("Mathematics\n");
    printf("Average Score: %.2f\n",ma*1.0/num1+EPS);
    printf("Number of passed students: %d\n",mp);
    printf("Number of failed students: %d\n\n",num1-mp);
    printf("English\n");
    printf("Average Score: %.2f\n",ea*1.0/num1+EPS);
    printf("Number of passed students: %d\n",ep);
    printf("Number of failed students: %d\n\n",num1-ep);
    printf("Programming\n");
    printf("Average Score: %.2f\n",pa*1.0/num1+EPS);
    printf("Number of passed students: %d\n",pp);
    printf("Number of failed students: %d\n\n",num1-pp);
    printf("Overall:\n");
    printf("Number of students who passed all subjects: %d\n",ap);
    printf("Number of students who passed 3 or more subjects: %d\n",ap+thp);
    printf("Number of students who passed 2 or more subjects: %d\n",ap+thp+twp);
    printf("Number of students who passed 1 or more subjects: %d\n",ap+thp+twp+op);
    printf("Number of students who failed all subjects: %d\n\n", af);
}
int main()
{
    int order;
    N = 0;
    for(;;)
    {
        print_menu();
        scanf("%d",&order);
        if(order==0)
            break;
        else if(order==1)
            Add();
        else if(order==2)
            Remove();
        else if(order==3)
            Query();
        else if(order==5)
            Sta();
        else
            printf("Showing the ranklist hurts students' self-esteem. Don't do that.\n");
    }
    return 0;
}
这道题是紫书上最后一道例题,交上以后各种wa,也是超级恶心,做了整整一天,做到人生绝望。后来从网上找了答案一点一点的比对,希望找到出错的地方,但是没有找到。不过,遇到一位好心的大神,帮忙看了代码,找到了错误,大神的博客总结很到位,总结了这道题各种可能wa的原因,超级有帮助,附上大神链接。 点击打开链接

猜你喜欢

转载自blog.csdn.net/sgsyacm/article/details/79309671
今日推荐