UVA12412 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)

本文介绍了一个学生成绩管理系统的实现方法,通过C语言编程完成学生信息的添加、删除、查询等功能。系统可以处理学生的学号、班级、姓名及四门课程的成绩,并提供排名和统计功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个问题,使得人们仿佛又回到了字符界面的时代。

问题链接UVA12412 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)

题意简述:学生成绩有关数据的增删统计等(具体内容参见原问题)。

问题分析:使用一个结构类型数组存储数据,对其中数据进行操作。字符时代的软件似乎就是这样,只是少了用文件来存储最终的结果。

程序说明(略)。

AC的C语言程序如下:

/* UVA12412 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang) */

#include <stdio.h>
#include <string.h>
#include <memory.h>

#define MAXN 100
#define MAXLEN1 10
#define MAXLEN2 20

#define EPS 1e-5

struct student {
    char sid[MAXLEN1+1];
    int cid;
    char name[MAXLEN2+1];
    int score[5];
    int removed;
} all[MAXN+1];
int scount;

void output_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 dflag, i;

    for(;;) {
        printf("Please enter the SID, CID, name and four scores. Enter 0 to finish.\n");
        struct student in;
        scanf("%s", in.sid);
        if(strcmp(in.sid, "0") == 0)
            break;
        scanf("%d", &in.cid);
        scanf("%s", in.name);
        scanf("%d", &in.score[1]);
        scanf("%d", &in.score[2]);
        scanf("%d", &in.score[3]);
        scanf("%d", &in.score[4]);

        dflag = 0;
        for(i=0; i<scount; i++)
            if(!all[i].removed && strcmp(in.sid, all[i].sid)==0) {
                printf("Duplicated SID.\n");
                dflag = 1;
                continue;
            }
        if(!dflag) {
            in.score[0] = in.score[1] + in.score[2] + in.score[3] + in.score[4];
            in.removed = 0;
            all[scount++] = in;
        }
    }
}

int rank(int x)
{
    int t = all[x].score[0];
    int high=0, i;
    for(i=0; i<scount; i++)
        if(!all[i].removed && all[i].score[0] > t)
            high++;
    return high + 1;
}

void queryremove(int flag)
{
    char s[MAXLEN1+1];
    int i;

    for(;;) {
        printf("Please enter SID or name. Enter 0 to finish.\n");
        scanf("%s", s);
        if(strcmp(s, "0") == 0)
            break;
        int rcount = 0;
        for(i=0; i<scount; i++) {
            if(!all[i].removed && (strcmp(s, all[i].sid) == 0 || strcmp(s, all[i].name) == 0)) {
                if(flag){
                    printf("%d %s %d %s %d %d %d %d %d %.2f\n", rank(i), all[i].sid, all[i].cid, all[i].name,
                           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 = 1;
                    rcount++;
                }
            }
        }
        if(!flag)
            printf("%d student(s) removed.\n", rcount);
    }
}

void output_score(int id, int type)
{
    int sum=0, count1=0, count2=0, i;
    for(i=0; i<scount; i++) {
        if(!all[i].removed && (id == 0 || all[i].cid == id)) {
            sum += all[i].score[type];
            if(all[i].score[type] >= 60)
                count1++;
            else
                count2++;
        }
    }
    printf("Average Score: %.2f\n", count1+count2 == 0 ? 0 : sum*1.0/(count1+count2)+EPS);
    printf("Number of passed students: %d\n", count1);
    printf("Number of failed students: %d\n", count2);
    printf("\n");
}

void statistics()
{
    int id, i, j;

    printf("Please enter class ID, 0 for the whole statistics.\n");
    scanf("%d", &id);
    printf("Chinese\n");
    output_score(id, 1);
    printf("Mathematics\n");
    output_score(id, 2);
    printf("English\n");
    output_score(id, 3);
    printf("Programming\n");
    output_score(id, 4);
    printf("Overall:\n");
    int okcount[5];
    memset(okcount, 0, sizeof(okcount));
    for(i=0; i<scount; i++) {
        if(!all[i].removed && (id == 0 || all[i].cid == id)) {
            int ok = 0;
            for(j=1; j<=4; j++)
                if(all[i].score[j] >= 60)
                    ok++;
            okcount[ok]++;
        }
    }
    printf("Number of students who passed all subjects: %d\n", okcount[4]);
    printf("Number of students who passed 3 or more subjects: %d\n", okcount[3]+okcount[4]);
    printf("Number of students who passed 2 or more subjects: %d\n", okcount[2]+okcount[3]+okcount[4]);
    printf("Number of students who passed 1 or more subjects: %d\n", okcount[1]+okcount[2]+okcount[3]+okcount[4]);
    printf("Number of students who failed all subjects: %d\n", okcount[0]);
    printf("\n");
}

int main(void)
{
    int choice;

    scount = 0;
    for(;;) {
        output_menu();

        scanf("%d", &choice);
        if(choice == 1)
            add();
        else if(choice == 2)
            queryremove(0);
        else if(choice == 3)
            queryremove(1);
        else if(choice == 4)
            printf("Showing the ranklist hurts students' self-esteem. Don't do that.\n");
        else if(choice == 5)
            statistics();
        else if(choice == 0)
            break;
    }

    return 0;
}


转载于:https://www.cnblogs.com/tigerisland/p/7564305.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值