学生管理系统

227 阅读6分钟

学生管理系统

要求实现输入学生成绩、查看学生成绩、求解每个学生的平均分、排序、查询学生成绩、清屏、帮助菜单、退出系统。 编译时需要把你所有的文件都编译链接起来 我的源p文件有main.c、help.c、cmds.c、Type.c、List.c Average.c、Search.c、System1.c和wenjian.h(头文件) 在这里插入图片描述 编译之后形成./a.out

一、各功能展示:

1)系统运行,打开如下界面。列出系统帮助菜单(即命令菜单),提示输入命令。 在这里插入图片描述

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

同理,当输入其他的成绩处理命令时也作相应的处理。 在这里插入图片描述

3)输入命令 T,调用Type子函数录入成绩。 在这里插入图片描述 界面提示输入学生人数 输入2
在这里插入图片描述 提示输入2名学生的3门课成绩,列出成绩单的表头“学号 语文 数学 英语”, 输入1号学生的3门课成绩,用空格间隔,回车结束。提示学号:2 在这里插入图片描述

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

在这里插入图片描述

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时,就可以进行其他的成绩操作,但不能再执行录用成绩的操作。所以当用户输入的命令无法执行时,应当给出提示。

二、代码详解

1)wenjian.h自定义头文件

在这里插入图片描述 第一步:再头文件里,我们需要加上防止重复编译的代码

再头文件一开始处加上一下两句: #ifndef 头文件ming #define 头文件名 再在文件尾部加上 #endif 这样在嵌套调用时就可以防止出现重复编译的过程

第二步:加上我们这个系统用到的头文件 #include "stdio.h" #include "string.h" #include "assert.h" 第三步:1、定义一个结构体,该结构体成员包括学号(id)、语文成绩(chinese)、数学(math)、外语(flanguage)、平均成绩(avg)。 typedef struct student { int id; float chinese; float math; float flanguage; float avg; }stu;

2、并通过typedef将结构体重命名为stu。 3、定义一个变量存储学生个数 int stun;

2)main.c文件

第一步:把我们的自己编写的头文件添加进去 在这里插入图片描述 第二步:把需要用到的外部函数help,cmds函数通过extern引用过来。 是系统在开启后,先调用help函数,显示帮助菜单。然后调用cmds命令接收终端输入的命令。

3)cmds.c文件

在这里插入图片描述 第一步:也是把用到的外部函数引进来

extern void help(); //帮助菜单函数 extern void Type(stu *p); //填写学生信息函数 extern void List(stu *q); //打印学生信息函数 extern void Average(stu *r); //求每个学生平均分的函数 extern void Sort(stu *k); //排序函数 extern void Search(stu *l); //查询函数 extern void clear1(); //清屏函数

第二步:cmds函数的编写 1、第一个就是定义个变量接受命令,并判断是否有符合的命令,如果有就去执行该命令下对应的函数。 2、头开始我们先判断是否有学生,如果没有,并且输入的命令,与学生的个数有关。这个时候我们就提示用户当前还没有学生,不能进行求平均分、排序、查看等操作。

3、注意帮助菜单命令、写命令、推出命令与是否已有学生信息无关,所以我们需要把它们单独从switch中拿出来。 4、当有学生信息的时候我们就可以去执行switch中的相关命令。 5、由于我们要求循环接受命令,所以以上内容,我们可以写进一个死循环。 6、在进入死循环之前,我们要注意把学生的个数置零,防止出现随机值。当执行完写入命令后,学生个数会发生改变。

4)Type.c写入函数

写入学生信息

第一步:先用scanf输入你要录入多少个学生。 第二步:循环录入结构体中包含的各种信息,注意学生学号要单独录入。

5)List.c

打印学生信息 在这里插入图片描述

将写入的学生信息同过for循环打印出来即可。

6)Average.c

求每个学生成绩的平均值 在这里插入图片描述

用循环遍历,把学生各个科目的成绩加起来除以3赋值给平均值这个成员变量即可。

7)Sort.c

排序函数,将学生按平均分由高到低排序 在这里插入图片描述

8)Search.c

根据学生学号查询某个学生的详细信息 在这里插入图片描述 用循环遍历,找到学生学号与我们输入的学生学号相同的学生,并把该学生的详细信息给打印出来。

9)system1.c

使用清屏函数将我们的屏幕清空 在这里插入图片描述

10)help.c

帮助菜单函数,调用这个函数会把我们这个系统所有的相关信息列出来,方便用户查询。 在这里插入图片描述

11)Q退出命令

按下这个命令后会执行return 语句退出该系统的运行过程