首页 > 其他分享 >学生管理系统(改良巨详细版,分文件版)

学生管理系统(改良巨详细版,分文件版)

时间:2024-08-14 21:27:05浏览次数:15  
标签:改良 管理系统 int ml stu num 详细 printf 输入

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

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

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

3.输入命令 T,调用Type子函数录入成绩。界面提示输入学生人数

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

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

以此类推,直到输入结束

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

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

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

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

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

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

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

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

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

9.输入命令D,执行删除函数Delete

10.输入命令M,执行Modify函数

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

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

11.构造思想:

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

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

代码展示

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct student // 定义结构体数组,用来存放学生信息
{
    int num;
    float Chinese;
    float math;
    float English;
    float average;
} stu[32];
void Help(); // 声明函数
int Type(struct student *p, int n);
void List(int n);
void Average(int n);
void paixu(int n);
void Search(int n);
int Delete(int n);
void Modify(int n);
int main(int argc, char const *argv[])
{
    Help(); // 调用帮助菜单函数
    int n = 0;
    while (1) // 重复输入命令
    {
        char ml[32];
        printf("请输入命令=");
        scanf(" %s", ml);
        if (strlen(ml) > 1)
        {
            printf("输入命令错误,请重新输入\n");
            continue;
        }
        if (ml[0] == 'C')
            system("clear"); // 输入C时,触发清屏函数
        else if (ml[0] == 'Q')
            break; // 输入Q时退出程序
        else if (ml[0] == 'T')
            n = Type(stu, n); // 输入T时调用Type函数录入信息
        else if (n == 0)      // 当学生人数为0时无法使用其它命令,需要先录入信息
            printf("成绩表为空!请先使用命令T录入学生成绩\n");
        else if (n != 0)
        {
            if (ml[0] == 'H')
                Help(); // 当输入H时调用Help函数打开帮助菜单
            else if (ml[0] == 'L')
                List(n); // 输入L时调用List函数列出学生信息
            else if (ml[0] == 'D')
                n = Delete(n); // 输入D时调用Delete函数删除学生信息
            else if (ml[0] == 'M')
                Modify(n); // 输入M时调用Modify函数修改学生信息
            else if (ml[0] == 'A')
                Average(n); // 输入A时调用Average函数计算平均分
            else if (ml[0] == 'P')
                paixu(n); // 输入P时调用paixu函数进行排序
            else if (ml[0] == 'S')
                Search(n); // 输入S时调用Search函数进行查询
        }
        getchar(); // 回收垃圾字符
    }
    return 0;
}
int Type(struct student *p, int n) // 录入信息函数
{
    int num;
    printf("请输入学生人数:");
    scanf("%d", &num);
    printf("请输入%d个学生的成绩\n", num);
    printf("学号  语文  数学  外语\n");
    for (int a = n; a < n + num; a++) // for循环遍历录入信息
    {
        printf("%d  ", a + 1);
        stu[a].num = a + 1;
        scanf("%f %f %f", &stu[a].Chinese, &stu[a].math, &stu[a].English);
    }
    n = num + n;
    return n; // 返回学生人数
}
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("*        D=删除                      *\n");
    printf("*        X=修改                      *\n");
    printf("*        C=清屏                      *\n");
    printf("*        Q=退出系统                  *\n");
    printf("**************************************\n");
    printf(" Copyright <c>  2024.08.06 By zhr\n");
}
void List(int n) // 列出学生信息函数
{
    printf("学生成绩如下:\n");
    printf("学号 语文 数学 外语  平均分\n");
    for (int a = 0; a < n; a++) // for循环遍历结构体数组
    {
        printf("%d   %.2f  %.2f %.2f   %.2f", stu[a].num, stu[a].Chinese, stu[a].math, stu[a].English, stu[a].average);
        printf("\n");
    }
}
void Average(int n) // 计算平均分函数
{
    for (int a = 0; a < n; a++)
        stu[a].average = (stu[a].Chinese + stu[a].English + stu[a].math) / 3;
    printf("平均分已计算,请使用命令L查看\n");
}
void paixu(int n) // 排序函数
{
    struct student stu1;
    if (stu[0].average == 0) // 平均分未计算时无法排序
        printf("无法排序,请先使用命令A计算平均分\n");
    else
    {
        for (int a = 0; a < n - 1; a++)
        {
            for (int b = 0; b < n - 1 - a; b++)
            {
                if (stu[b].average < stu[b + 1].average)
                {
                    stu1 = stu[b]; // 通过交换结构体数组进行排序
                    stu[b] = stu[b + 1];
                    stu[b + 1] = stu1;
                }
            }
        }
        printf("已完成排序,请使用命令L查看\n");
    }
}
void Search(int n)
{
    int num;
    printf("请输入要查询的学生的学号:");
    scanf("%d", &num);
    printf("学号 语文 数学 外语  平均分\n");
    for (int a = 0; a < n; a++)
        if (stu[a].num == num) // 通过学号打印学生信息
            printf("%d   %.2f  %.2f %.2f   %.2f\n", stu[a].num, stu[a].Chinese, stu[a].math, stu[a].English, stu[a].average);
}
int Delete(int n) // 删除函数
{
    int num;
    int i;
    printf("请输入要删除的学生的学号");
    scanf("%d", &num);
    if (num > n || num <= 0)
        printf("输入学号错误请重新输入");
    for (int a = 0; a < n; a++)
        if (stu[a].num == num)
            i = a;
    for (int m = i; m < n - 1; m++) // 将删除学号后面的数组往前补,以此类推
        stu[m] = stu[m + 1];
    return n - 1;
}
void Modify(int n) // 修改信息函数
{
    int num;
    int i;
    printf("请输入要修改的学生的学号");
    scanf("%d", &num);
    for (int a = 0; a < n; a++)
        if (stu[a].num == num)
        {
            i = a;
            break;
        }
    printf("请输入修改后的信息\n");
    printf("学号 语文 数学 外语 \n");
    printf("%d  ", stu[i].num);
    scanf("%f %f %f", &stu[i].Chinese, &stu[i].math, &stu[i].English);
}

分文件

1.  头文件:.h结尾的文件

头文件、宏定义、typedef、结构体、共用体和枚举的定义、函数的声明和外部引用extern。

全局变量一般不会定义在头文件中

2.  源文件:.c结尾的文件

包含main函数的.c文件: main函数

包含子函数的.c: 子函数

main.c文件

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"add.h"
int main(int argc, char const *argv[])
{
    Help(); // 调用帮助菜单函数
    int n = 0;
    while (1) // 重复输入命令
    {
        char ml[32];
        printf("请输入命令=");
        scanf(" %s", ml);
        if (strlen(ml) > 1)
        {
            printf("输入命令错误,请重新输入\n");
            continue;
        }
        if (ml[0] == 'C')
            system("clear"); // 输入C时,触发清屏函数
        else if (ml[0] == 'Q')
            break; // 输入Q时退出程序
        else if (ml[0] == 'T')
            n = Type(stu, n); // 输入T时调用Type函数录入信息
        else if (n == 0)      // 当学生人数为0时无法使用其它命令,需要先录入信息
            printf("成绩表为空!请先使用命令T录入学生成绩\n");
        else if (n != 0)
        {
            if (ml[0] == 'H')
                Help(); // 当输入H时调用Help函数打开帮助菜单
            else if (ml[0] == 'L')
                List(n); // 输入L时调用List函数列出学生信息
            else if (ml[0] == 'D')
                n = Delete(n); // 输入D时调用Delete函数删除学生信息
            else if (ml[0] == 'M')
                Modify(n); // 输入M时调用Modify函数修改学生信息
            else if (ml[0] == 'A')
                Average(n); // 输入A时调用Average函数计算平均分
            else if (ml[0] == 'P')
                paixu(n); // 输入P时调用paixu函数进行排序
            else if (ml[0] == 'S')
                Search(n); // 输入S时调用Search函数进行查询
        }
        getchar(); // 回收垃圾字符
    }
    return 0;
}

hanshu.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "add.h"
int Type(struct student *p, int n) // 录入信息函数
{
    int num;
    printf("请输入学生人数:");
    scanf("%d", &num);
    printf("请输入%d个学生的成绩\n", num);
    printf("学号  语文  数学  外语\n");
    for (int a = n; a < n + num; a++) // for循环遍历录入信息
    {
        printf("%d  ", a + 1);
        stu[a].num = a + 1;
        scanf("%f %f %f", &stu[a].Chinese, &stu[a].math, &stu[a].English);
    }
    n = num + n;
    return n; // 返回学生人数
}
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("*        D=删除                      *\n");
    printf("*        X=修改                      *\n");
    printf("*        C=清屏                      *\n");
    printf("*        Q=退出系统                  *\n");
    printf("**************************************\n");
    printf(" Copyright <c>  2024.08.06 By zhr\n");
}
void List(int n) // 列出学生信息函数
{
    printf("学生成绩如下:\n");
    printf("学号 语文 数学 外语  平均分\n");
    for (int a = 0; a < n; a++) // for循环遍历结构体数组
    {
        printf("%d   %.2f  %.2f %.2f   %.2f", stu[a].num, stu[a].Chinese, stu[a].math, stu[a].English, stu[a].average);
        printf("\n");
    }
}
void Average(int n) // 计算平均分函数
{
    for (int a = 0; a < n; a++)
        stu[a].average = (stu[a].Chinese + stu[a].English + stu[a].math) / 3;
    printf("平均分已计算,请使用命令L查看\n");
}
void paixu(int n) // 排序函数
{
    struct student stu1;
    if (stu[0].average == 0) // 平均分未计算时无法排序
        printf("无法排序,请先使用命令A计算平均分\n");
    else
    {
        for (int a = 0; a < n - 1; a++)
        {
            for (int b = 0; b < n - 1 - a; b++)
            {
                if (stu[b].average < stu[b + 1].average)
                {
                    stu1 = stu[b]; // 通过交换结构体数组进行排序
                    stu[b] = stu[b + 1];
                    stu[b + 1] = stu1;
                }
            }
        }
        printf("已完成排序,请使用命令L查看\n");
    }
}
void Search(int n)
{
    int num;
    printf("请输入要查询的学生的学号:");
    scanf("%d", &num);
    printf("学号 语文 数学 外语  平均分\n");
    for (int a = 0; a < n; a++)
        if (stu[a].num == num) // 通过学号打印学生信息
            printf("%d   %.2f  %.2f %.2f   %.2f\n", stu[a].num, stu[a].Chinese, stu[a].math, stu[a].English, stu[a].average);
}
int Delete(int n) // 删除函数
{
    int num;
    int i;
    printf("请输入要删除的学生的学号");
    scanf("%d", &num);
    if (num > n || num <= 0)
        printf("输入学号错误请重新输入");
    for (int a = 0; a < n; a++)
        if (stu[a].num == num)
            i = a;
    for (int m = i; m < n - 1; m++) // 将删除学号后面的数组往前补,以此类推
        stu[m] = stu[m + 1];
    return n - 1;
}
void Modify(int n) // 修改信息函数
{
    int num;
    int i;
    printf("请输入要修改的学生的学号");
    scanf("%d", &num);
    for (int a = 0; a < n; a++)
        if (stu[a].num == num)
        {
            i = a;
            break;
        }
    printf("请输入修改后的信息\n");
    printf("学号 语文 数学 外语 \n");
    printf("%d  ", stu[i].num);
    scanf("%f %f %f", &stu[i].Chinese, &stu[i].math, &stu[i].English);
}

add.h(头文件)

struct student // 定义结构体数组,用来存放学生信息
{
    int num;
    float Chinese;
    float math;
    float English;
    float average;
} stu[32];
void Help(); // 声明函数
int Type(struct student *p, int n);
void List(int n);
void Average(int n);
void paixu(int n);
void Search(int n);
int Delete(int n);
void Modify(int n);

makefile管理

CC=gcc
CFLAGS=-c -g -Wall
OBJS=main.o hanshu.o
main:$(OBJS)
	$(CC) $^ -o $@
%.o:%.c
	$(CC) $(CFLAGS) $^ -o $@
.PHONY:clean
clean:
	$(RM) *.o

标签:改良,管理系统,int,ml,stu,num,详细,printf,输入
From: https://blog.csdn.net/qq_64136247/article/details/141199695

相关文章

  • 网络安全自学入门:(超详细)从入门到精通学习路线&规划,学完即可就业
    在当今高度数字化的时代,网络安全已经成为了一个至关重要的领域。随着网络威胁的不断演变和增长,对于专业网络安全人才的需求也在急剧上升。对于那些对网络安全充满热情并且渴望自学成才的人来说,制定一个系统、全面且高效的学习路线和规划是迈向成功的关键第一步。本文将为您精心......
  • 学费管理系统的设计与实现(10766)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项......
  • 5个神级在线网络安全工具网站(非常详细)零基础入门到精通,收藏这一篇就够了
    1Haveibeenpwned一个可以查信息安全的网站,打开之后输入你的邮箱或者是电话,就可以查询是否有泄露的情况,红色代表已经账号密码已经被泄露,绿色代表是安全的。你还可以测试你的密码是否安全,在密码界面输入你想设置的密码,就可以看到这个密码被使用的次数,如果使用过多的话,建议大......
  • 计算机毕业设计推荐-基于JAVA的航空机票预定管理系统
    ......
  • 传感器灯光与避障系统的详细作用!
    传感器灯光视觉指示:传感器灯光为无人机提供了直观的视觉指示,帮助飞行员或地面操作人员清晰地识别无人机的飞行状态、方向和位置。通信与警示:通过特定的灯光颜色和闪烁模式,传感器灯光能够传达无人机的特定状态或警告信息,如低电量、系统故障或需要避让等。提高可见性:在复杂或......
  • 免费【2024】springboot 工资管理系统的设计与实现
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......
  • SSM基于的小区物业管理系统4c9w9 论坛 在线投诉
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容;报修信息,业主,车位信息,业主缴费,物业制度开题报告内容一、选题背景随着城市化进程的加快,小区物业管理工作日益复杂,传统的人工管理模式已难以满足......
  • 免费【2024】springboot 工厂生产设备维护管理系统的设计与实现
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......
  • SSM基于的物流管理系统98998 前后端联动
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:用户,司机,物品分类,车辆分类,车辆信息,下单信息,分配信息,站点信息,订单信息,保修信息开题报告内容一、课题名称SSM基于的物流管理系统98998设计与实......
  • JAVA毕业设计|ssm高校宿舍管理系统的设计与开发jsp包含文档代码讲解
    收藏点赞不迷路 关注作者有好处文末获取源码一、系统展示二、万字文档展示 基于ssm高校宿舍管理系统的设计与开发jsp开发语言:Java数据库:MySQL技术:Spring+SpringMVC+MyBatis+Vue工具:IDEA/Ecilpse、Navicat、Maven 编号:ssm283一、系统展示二、万字文档展示第......