Uva12412

模拟//代码还没过..不知道错哪了,放两天改//现在已正确

3.31写完的代码。
4.15更正,在网上找了正确的代码对拍,终于把错找出来了。。。

题意:就是模拟一个c语言程序设计里的 个人信息管理系统,细节给的很详细,输入输出都是要按他的规范来,之前错就是因为一个小小的输出的问题。顺便学习了一下对拍的批文件怎么写。

思路: 题意就是总体的思路,必须得有一个具体的框架,然后一个功能一个功能实现与调试。注意EPS的使用,因为浮点数运算或比较可能会出现我们并不期望的结果。

c语言程序设计

#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define maxn 1000005
const double EPS = 1e-5;

struct student
{
    char id[3][25];
    int course[4];
    double pj;
    student(){}
    student(char a[3][25],int b[4])
    {
        for(int i = 0; i < 3; i++)
        {
            for(int j = 0; j < 25; j++)
                id[i][j] = a[i][j];
        }
        for(int i = 0; i < 4 ; i++)
            course[i] = b[i];
    }
}data[maxn];

int Size = 0;

int Fin(char s[25],int a)
{
    for(int i = 0; i < Size; i++)
        if(strcmp(data[i].id[a],s) == 0)
            return i;
    return -1;
}
int pm(int id)
{
    int num = 1;
    int temp = 0;
    for(int i = 0; i < 4 ; i++)
        temp += data[id].course[i];
    int flag = 0;
    for(int i = 0; i < Size; i++)
    {
        int com = 0;
        for(int j = 0; j < 4 ; j++)
            com += data[i].course[j];
        if(com > temp) num++;
    }
    return num;
}
void init()
{
    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");
    printf("\n");
}

int add()       //增加
{

    while(1)
    {
        char id[3][25];
        int co[4];
        printf("Please enter the SID, CID, name and four scores. Enter 0 to finish.\n");
        scanf("%s",id[0]);
        if(id[0][0] == '0' && strlen(id[0]) == 1) return 0;
        scanf("%s%s",id[1],id[2]);
        for(int i = 0; i < 4 ; i++)
            scanf("%d",&co[i]);
        if(Fin(id[0],0) == -1)
            data[Size++] = student(id,co);
        else
            printf("Duplicated SID.\n");
    }
    return 1;
}
int query()     //查询
{
    while(1)
    {
        printf("Please enter SID or name. Enter 0 to finish.\n");
        char x[25];
        scanf("%s",x);
        if(x[0] == '0' && strlen(x) == 1) break;
        int ans = 0;
        if(x[0] >= 'A' && x[0] <= 'Z')
        {
            for(int id = 0; id < Size; id++)
            {
                if(strcmp(data[id].id[2],x) != 0) continue;
                int sum = 0;
                printf("%d %s %s %s ",pm(id),data[id].id[0],data[id].id[1],data[id].id[2]);
                for(int a = 0; a < 4; a ++)
                {
                    sum += data[id].course[a];
                    printf("%d ",data[id].course[a]);
                }
                printf("%d %.2f\n",sum,(double)sum/4.0+EPS);
            }

        }
        else
        {
            for(int id = 0; id < Size ;id++)
            {
                if(strcmp(data[id].id[0],x) != 0) continue;
                printf("%d %s %s %s ",pm(id),data[id].id[0],data[id].id[1],data[id].id[2]);
                int sum = 0;
                for(int a = 0; a < 4; a ++)
                {
                    sum += data[id].course[a];
                    printf("%d ",data[id].course[a]);
                }
                printf("%d %.2f\n",sum,(double)sum*1.0/4.0+EPS);
            }

        }
    }
    return 1;
}


int dq()        //删除
{
    while(1)
    {
        printf("Please enter SID or name. Enter 0 to finish.\n");
        char x[25];
        scanf("%s",x);
        if(x[0] == '0' && strlen(x) == 1) break;
        int ans = 0;

        if(x[0]>='A' && x[0] <= 'Z')
        {
            for(int id = 0; id < Size; id++)
            {
                if(strcmp(data[id].id[2],x) != 0){ continue;}
                for(int a = id; a < Size; a++)
                        data[a] = data[a+1];
                ans++; Size--;
                id= id-1;
            }
        }
        else
        {
            for(int id = 0; id < Size ;id++)
            {
                if(strcmp(data[id].id[0],x) != 0) continue;
                for(int a = id; a < Size; a++)
                    data[a] = data[a+1];
                ans++;Size --;;
            }
        }

        printf("%d student(s) removed.\n",ans);
    }

    return 1;
}
int ran()
{
    printf("Showing the ranklist hurts students' self-esteem. Don't do that.\n");
    return 0;
}
int sa[maxn][4];

int sta()       //统计
{
    printf("Please enter class ID, 0 for the whole statistics.\n");
    int pnum[4] = {0};
    int ma[4] = {0};
    int pass[5] = {0};
    int rnum = Size;
    char s[25];
    scanf("%s",s);
    if(s[0] == '0' && strlen(s) == 1)
    {

        for(int i = 0; i < Size; i++)
        {
            int num = 0;
            for(int j = 0; j < 4; j++)
            {
                ma[j] += data[i].course[j];
                if(data[i].course[j] > 59)
                {   pnum[j]++; num++; }
            }
            for(int j = num; j >= 1; j--)
                pass[j]++;
        }
    }
    else
    {
        for(int i = 0; i <Size; i++)
        {
            if(strcmp(data[i].id[1],s) != 0) {rnum --;continue;}
            int num = 0;
            for(int j = 0; j < 4 ; j++)
            {
                ma[j] += data[i].course[j];
                if(data[i].course[j] > 59)
                {
                    pnum[j]++; num++;
                }
            }
            for(int j = num; j >= 1; j--)
                pass[j]++;
        }
    }
    for(int i = 0; i < 4 ; i++)
    {
        double ans = 0;
        if(rnum == 0) ans = 0;
        else ans = (double)ma[i]/(rnum)*1.0 + EPS;
        if(i == 0) printf("Chinese\n");
        if(i == 1) printf("Mathematics\n");
        if(i == 2) printf("English\n");
        if(i == 3) printf("Programming\n");
        printf("Average Score: %.2f\n",ans);
        printf("Number of passed students: %d\n",pnum[i]);
        printf("Number of failed students: %d\n",rnum-pnum[i]);
        printf("\n");
    }
    printf("Overall:\n");
    for(int i = 4; i >= 0; i--)
    {
        printf("Number of students who ");
        if(i >= 1 && i < 4)
            printf("passed %d or more subjects: %d\n",i,pass[i]);
        else if(i == 4)
            printf("passed all subjects: %d\n",pass[i]);
        else printf("failed all subjects: %d\n",rnum - pass[1]);
    }
    printf("\n");
    return 0;

}

int main()
{
 //   freopen("D://in.txt","r",stdin);
  //  freopen("D://out.txt","w",stdout);
    while(1)
    {
        int n;
        init();
        scanf("%d",&n);
        if(n == 0) break;
        switch (n)
        {
            case 1: add();    break;
            case 2: dq();     break;
            case 3: query();  break;
            case 4: ran();    break;
            default : sta();
        }

    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值