C基础案例 学生管理系统

目录

【1】实现功能

【2】代码展示


【1】实现功能

1)系统运行,打开如下界面。列出系统帮助菜单(即命令菜单),提示输入命令。

2)开始时还没录入成绩,所以输入命令 L 无法列出成绩。应提示“成绩表为空!请先使用命令 T 录入学生成绩。”

同理,当输入其他的成绩处理命令时也作相应的处理。

3)输入命令 T ,调用 Type子函数录入成绩。

界面提示输入学生人数

输入 3 回车提示输入3 名学生的 3 门课成绩,列出成绩单的表头“学号   语文   数学   英语 ”,提示学号:1 

 输入 1 号学生的3门课成绩,用空格间隔,回车结束。提示学号: 2 

 输入 2 号学生的3门课成绩,用空格间隔,回车结束。提示学号: 3 

 输入 3 号学生的3门课成绩,用空格间隔,回车结束。Type子函数调用结束,返回。提示输入命令

 4)输入命令 L ,调用 List 子函数输出成绩表。List 子函数调用结束,返回。提示输入命令

5)输入命令 A ,调用Ave 子函数计算平均分,提示“平均分已计算,请通过命令 L 查看。”   Ave子函数调用结束,返回。提示输入命令。

输入命令 L ,调用 List 子函数输出成绩表。List 子函数调用结束,返回。提示输入命令。

6)输入命令 P ,调用 Sort 子函数将各学生记录按平均分由高到低排序,提示“排序已完成,请通过命令 L 查看。”  Sort子函数调用结束,返回。提示输入命令。

输入命令 L ,调用 List 子函数输出成绩表。List 子函数调用结束,返回。提示输入命令。

 7)输入,命令 S ,调用Search 子函数查询学生成绩,提示“请输入要查询的学生学号:”

输入 2  回车找到 2 号学生的成绩并输出。Search 子函数调用结束,返回。提示输入命令。

8)输入命令 C 回车 执行清屏函数语句 system("clear");

执行 命令 C 之前 

执行命令 C 之后,清除屏幕上的所有内容。提示输入命令。

 

9)输入命令 H 回车 调用 Help 子函数显示帮助菜单。Help 子函数调用结束,返回。提示输入命令。

10)输入命令 Q 回车  则退出系统。

注意:

1)输出数组元素时,要将学号单独处理,输出为整数(即保留0位小数)。同理,在计算成绩时也要将第1列的学号撇开,只计算第2列之后的。成绩保留1位小数。

2)学生人数n贯穿始终,通过n的值判断当前命令的子函数是否能够调用执行。例如:当n=0时,说明还没有录入成绩。而一旦输入命令T,也即调用Type子函数录入了成绩,则n的值就不再是0。当n=0时,就可以进行其他的成绩操作,但不能再执行录用成绩的操作。所以当用户输入的命令无法执行时,应当给出提示。

【2】代码展示

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h> //调用 system(”clear“)所需要的头文件
#define N 100

typedef struct student // 定义学生结构体数据类型
{
    int id;
    float Ch;
    float mh;
    float Eng;
    float ave;
} Stu;

/*成绩录入*/
void Type(int *n, Stu *p)
{
    while (1)                       // 此循环用于判断输入学生人数是否大于 0
    {                               // 若大于 0 则正常录入学生成绩
        printf("请输入学生人数:");    // 若小于等于0 则输出error跳出
        scanf("%d", n);
        getchar();

        if (*n > 0)
        {
            printf("\n请输入%d名学生的成绩:\n\n", *n);
            printf("学号 语文 数学 英语\n");
            for (int i = 0; i < *n; i++) // 该次循环用于录入学生成绩
            {
                printf("%d    ", i + 1); // 提示语句
                p->id = i + 1;           // 给学号赋值
                scanf("%f %f %f", &(p->Ch), &(p->mh), &(p->Eng));
                getchar();
                p++;
            }
            printf("成绩录入完成\n\n");
            break;   //当成绩录入完成后跳出 while 循环
        }
        else
        {
            printf("error\n\n");
        }
    }
}

/*列出成绩表*/
void List(int n, Stu *p)
{
    printf("学生成绩如下:\n\n");
    printf("学号 语文 数学 英语 平均分\n");
    for (int i = 0; i < n; i++) // 该层循环用于输出学生成绩表
    {
        printf("%d    %.1f  %.1f  %.1f  %.1f\n", p->id, p->Ch, p->mh, p->Eng, p->ave);
        p++;
    }
    printf("\n");
}

/*计算平均分*/
void Ave(int n, Stu *p)
{
    for (int i = 0; i < n; i++) // 该层循环用于计算学生成绩平均分
    {                           // 注意不要把id也算进去
        p->ave = (p->Ch + p->mh + p->Eng) / 3;
        p++;
    }
    printf("平均分已计算,请通过命令 L 查看\n\n");
}

/*排序*/
void Sort(int n, Stu *p)
{
    if (p->ave == 0) // 先判断此时平均分是否计算
    {                // 若平均分为 0 ,则说明平均分未计算,提示无法排序
        printf("平均分未计算,无法排序\n\n");
    }
    else
    {
        for (int i = 0; i < n - 1; i++)              
        {
            for (int j = 0; j < n - 1 - i; j++)
            {
                if (p[j].ave < p[j + 1].ave)      //冒泡排序 (反向)
                {
                    Stu t = p[j];
                    p[j] = p[j + 1];
                    p[j + 1] = t;
                }
            }
        }
        printf("排序已完成,请通过命令 L 查看\n\n");
    }
}

/*查询学生成绩*/
void Serach(int n, Stu *p)
{
    int a = 0;
    printf("请输入要查询的学生学号:");
    scanf("%d", &a);
    while (p->id != a)              //判断 p -> id 是否等于要查询的学号
    {                               //若不等于,则指针 p 加一,再次判断,直到找到要查询的学号
        p++;                        //输出此时指针所指向的结构体数组内容,即该学生信息
    }
        printf("学号 语文 数学 英语 平均分\n");
        printf("%d    %.1f  %.1f  %.1f  %.1f\n", p->id, p->Ch, p->mh, p->Eng, p->ave);
}

/*帮助*/
void Help()
{
    printf("          ******************************************\n");
    printf("           *      学生成绩管理系统--帮助菜单      *\n");
    printf("          ******************************************\n");
    printf("           *        H = 显示帮助菜单              *\n");
    printf("           *        T = 成绩录入                  *\n");
    printf("           *        A = 计算学生成绩平均分        *\n");
    printf("           *        L = 列出成绩表                *\n");
    printf("           *        P = 按照成绩从高到低排序      *\n");
    printf("           *        S = 按学号查询成绩            *\n");
    printf("           *        C = 清屏                      *\n");
    printf("           *        Q = 退出系统                  *\n");
    printf("          ******************************************\n");
    printf("           *    Copyright <C> 2024.8.2 By 欢      *\n");
    printf("          ******************************************\n");
}

int main()
{
    Help();
    char order[32];            //定义一个数组用来接受输入的命令字符串
    Stu stu[N];                //定义一个学生结构体数组
    int n = 0;                 //定义一个变量存放学生人数
    int c = strlen(order);     //定义一个变量存放输入命令字符串的长度
    while (1)                  //该层循环用来判断输入的命令字符串长度是否大于 1 
    {                          //若大于 1 则提示命令错误,重新输入
        printf("请输入命令= ");
        scanf(" %s", order);
        if (strlen(order) > 1)
        {
            printf("\n命令输入有误,请重新输入\n\n");
            continue;
        }

        printf("\n");
        switch (order[0])
        {
        case 'T':
            if (n == 0)                //若学生人数为 0 ,说明还未录入信息,则调用Type子函数
                Type(&n, stu);
            else
                printf("成绩已录入,请重新输入命令\n\n");
            break;
        case 'L':
            if (n == 0)                //若学生人数为 0 ,说明还未录入信息,输出以下提示语句
                printf("成绩表为空!请先使用命令 T 录入学生成绩。\n\n");
            else
                List(n, stu);          //学生人数不为 0 ,调用函数
            break;
        case 'A':
            if (n == 0)
                printf("成绩表为空!请先使用命令 T 录入学生成绩。\n\n");
            else
                Ave(n, stu);
            break;
        case 'P':
            if (n == 0)
                printf("成绩表为空!请先使用命令 T 录入学生成绩。\n\n");
            else
                Sort(n, stu);
            break;
        case 'S':
            if (n == 0)
                printf("成绩表为空!请先使用命令 T 录入学生成绩。\n\n");
            else
                Serach(n, stu);
            break;
        case 'C':
            system("clear");          //引用 头文件 #include <unistd.h> 下的函数
            break;
        case 'H':
            Help(n, stu);
            break;
        case 'Q':
            return 0;                  //退出系统
        default:
            printf("命令输入有误,请重新输入\n\n");
            break;
        }
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值