C语言编写:学生管理系统

要求:

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 ,调用Average子函数计算平均分,提示“平均分已计算。请使用命令L查看。” Average子函数调用结束,返回。提示输入命令

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

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

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

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

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

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

清除屏幕的所有内容。提示输入命令

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

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

注意:

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

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

思路:

总的来看,这个系统有几个功能组成,运行系统显示的那个页面可以看做目录,也可以跟功能之一的Help看做同一个,其他还有录入,罗列,求平均值,排序,查找,清空,终止共八个功能。每一个功能可以看做一个子函数,主函数作为一个主干,或者看做一个目录来连接这八大功能。因此,可以把这个学生管理系统看作一个主干加八大功能分支,外加运用一个结构体。下面依次编写。

分部编写:

先写出头文件+子函数函数,本人习惯子函数写在主函数后,先罗列子函数是编译格式
#include <stdio.h>
#include <stdlib.h>

void Help();    //目录也是帮助功能
void Type();    //录入成绩功能
void List();    //罗列功能;
void Average(); //求平均值功能
void Sort();    //排序
void Search();  //查找
void Exit();    //退出
void Clear();   //清空
用了两个全局变量:
int n = 0; //n为学生人数
int t = 1; //将t看做系统开关,运行默认为1,开关打开,实现退出功能时将t置零
             0,退出系统;
结构体:
struct student
{
    int id;            //id为学号
    float score[3];    //成绩,用于储存语数英三门
    float ave;         // 平均值
} stu[50];             //50为开辟了50个空间,足够用就可,开辟多少随意
主函数:起到目录功能 
int main(int argc, char const *argv[])
{
    Help();             //先调用Help()函数,运行系统时显示
    while (t)           //t为全局变量,起到开关作用
    {
        char num;
        printf("请输入命令=");
        scanf("  %c", &num);     //scanf()内加了两个空格,消除垃圾字符
        switch (num)        //判断指令
        {
        case 'T':
            if (n == 0)
                Type();          //n为0时,正常输入
            else              //n不为0时,说明成绩已录入,不能继续添加
            {
                printf("成绩已录入,无法继续添加,请重新输入命令\n");
            }
            break;
        case 'H':
            Help();
            break;

        case 'A':
            if (n == 0)          //n为0,说明没有录成绩,没法求平均值
            {
                printf("成绩为空!请先使用命令T录入学生成绩\n");
            }
            else
                Average();
            break;
        case 'L':
            if (n == 0)           //n为0,说明没有录成绩,没法罗列成绩
            {
                printf("成绩为空!请先使用命令T录入学生成绩\n");
            }
            else
                List();
            break;
        case 'P':
            if (n == 0)          //n为0,说明没有录成绩,没法排序
            {
                printf("成绩为空!请先使用命令T录入学生成绩\n");
            }
            else
                Sort();
            break;
        case 'S':
            if (n == 0)        //n为0,说明没有录成绩,没法查找
            {
                printf("成绩为空!请先使用命令T录入学生成绩\n");
            }
            else
                Search();
            break;
        case 'C':
            Clear();
            break;
        case 'Q':
            Exit();
            break;
        default:              //输入为其他指令,报错
            printf("输入错误,请重新输入:\n");
        }
    }
    return 0;
}
Help()子函数:帮助列表
void Help()
{
    printf("     **************************************************    \n");

    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("     **************************************************      \n");

    printf("       *       Copyright <C> 2024.08.12 By SMJ      *  \n");

    printf("     **************************************************      \n");
    printf("\n\n");
}
Type()录入功能:
void Type()
{
    printf("请输入学生人数:");
    scanf("%d", &n);
    printf("请输入%d名学生的三门课成绩:\n", n);
    printf("学号 语文 数学 外语\n");
    for (int i = 0; i < n; i++)
    {
        printf("%d", i + 1);
        stu[i].id = i + 1;  //统一格式,方便后面遍历输出
        scanf("%f%f%f", &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);
    }
}
List()罗列成绩功能:
void List()
{
    printf("学生成绩如下:\n");
    printf("学号 语文 数学 外语 平均分\n");
    for (int i = 0; i < n; i++)
    {
        printf("%d  %.2f  %.2f  %.2f  %.2f\n", stu[i].id, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);
    }
}
Average()求平均值功能
void Average()
{
    for (int i = 0; i < n; i++)
    {
        stu[i].ave = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2]) / 3;
    }
    printf("平均分已计算。请使用命令L查看。\n");
}
Sort()排序功能
void Sort()
{
    struct student str[50];   //用来存储第三杯水的作用
    if (stu[0].ave == 0)     //判断是否计算平均值
    {
        printf("无法排序,请先使用命令A计算平均分\n");
    }
    else
    {
        for (int i = 0; i < n - 1; i++)            //冒泡排序
        {
            for (int j = 0; j < n - 1 - i; j++)
            {
                if (stu[j].ave < stu[j + 1].ave)
                {
                    str[j] = stu[j];         //三杯水交换
                    stu[j] = stu[j + 1];
                    stu[j + 1] = str[j];
                }
            }
        }
        printf("已完成排序,请使用命令L查看\n");
    }
}
Search()查找功能
void Search()
{
    int num;
    printf("请输入要查询的学生学号:");
    scanf("%d", &num);
    if (num > n || num <= 0)        //严瑾化
    {
        printf("超出学号范围,请使用命令S重新查询\n");
    }
    else
    {
        printf("学号 语文 数学 外语 平均分\n");
        for (int i = 0; i < n; i++)
        {
            if (stu[i].id == num)
            {
                printf("%d  %.2f  %.2f  %.2f  %.2f\n", stu[i].id, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);
            }
        }
    }
}
Clear()清空功能
void Clear()
{
    system("clear");  //调用system函数清空
}
Exit()退出功能
void Exit()
{
    t = 0;    //全局变量置零,关闭循环,结束系统
    printf("Press any key to continue\n");
}

总代码:

#include <stdio.h>
#include <stdlib.h>

void Help();
void Type();
void List();
void Average();
void Sort();
void Search();
void Exit();
void Clear();

int n = 0;
int t = 1;
struct student
{
    int id;
    float score[3];
    float ave;
} stu[50];

int main(int argc, char const *argv[])
{
    Help();
    while (t)
    {
        char num;
        printf("请输入命令=");
        scanf("  %c", &num);
        switch (num)
        {
        case 'T':
            if (n == 0)
                Type();
            else
            {
                printf("成绩已录入,无法继续添加,请重新输入命令\n");
            }
            break;
        case 'H':
            Help();
            break;

        case 'A':
            if (n == 0)
            {
                printf("成绩为空!请先使用命令T录入学生成绩\n");
            }
            else
                Average();
            break;
        case 'L':
            if (n == 0)
            {
                printf("成绩为空!请先使用命令T录入学生成绩\n");
            }
            else
                List();
            break;
        case 'P':
            if (n == 0)
            {
                printf("成绩为空!请先使用命令T录入学生成绩\n");
            }
            else
                Sort();
            break;
        case 'S':
            if (n == 0)
            {
                printf("成绩为空!请先使用命令T录入学生成绩\n");
            }
            else
                Search();
            break;
        case 'C':
            Clear();
            break;
        case 'Q':
            Exit();
            break;
        default:
            printf("输入错误,请重新输入:\n");
        }
    }
    return 0;
}
void Help()
{
    printf("     **************************************************    \n");

    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("     **************************************************      \n");

    printf("       *       Copyright <C> 2024.08.12 By SMJ      *  \n");

    printf("     **************************************************      \n");
    printf("\n\n");
}
void Type()
{
    printf("请输入学生人数:");
    scanf("%d", &n);
    printf("请输入%d名学生的三门课成绩:\n", n);
    printf("学号 语文 数学 外语\n");
    for (int i = 0; i < n; i++)
    {
        printf("%d", i + 1);
        stu[i].id = i + 1;
        scanf("%f%f%f", &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);
    }
}
void List()
{
    printf("学生成绩如下:\n");
    printf("学号 语文 数学 外语 平均分\n");
    for (int i = 0; i < n; i++)
    {
        printf("%d  %.2f  %.2f  %.2f  %.2f\n", stu[i].id, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);
    }
}

void Average()
{

    for (int i = 0; i < n; i++)
    {
        stu[i].ave = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2]) / 3;
    }
    printf("平均分已计算。请使用命令L查看。\n");
}
void Sort()
{
    struct student str[50];

    if (stu[0].ave == 0)
    {
        printf("无法排序,请先使用命令A计算平均分\n");
    }
    else
    {
        for (int i = 0; i < n - 1; i++)
        {
            for (int j = 0; j < n - 1 - i; j++)
            {
                if (stu[j].ave < stu[j + 1].ave)
                {
                    str[j] = stu[j];
                    stu[j] = stu[j + 1];
                    stu[j + 1] = str[j];
                }
            }
        }
        printf("已完成排序,请使用命令L查看\n");
    }
}
void Search()
{
    int num;
    printf("请输入要查询的学生学号:");
    scanf("%d", &num);
    if (num > n || num <= 0)
    {
        printf("超出学号范围,请使用命令S重新查询\n");
    }
    else
    {
        printf("学号 语文 数学 外语 平均分\n");
        for (int i = 0; i < n; i++)
        {
            if (stu[i].id == num)
            {
                printf("%d  %.2f  %.2f  %.2f  %.2f\n", stu[i].id, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);
            }
        }
    }
}
void Clear()
{
    system("clear");
}
void Exit()
{
    t = 0;
    printf("Press any key to continue\n");
}

视频讲解及效果展示:

【学生管理系统】 https://www.bilibili.com/video/BV1XgenexEf4/?share_source=copy_web&vd_source=989c862553a9fc170dee4fdcac7a0592

C语言编写:学生管理系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值