学生管理系统
整体思路:
用单向链表实现学生管理系统,通过 malloc 动态分配内存。主要完成的是对学生成绩的录入以及对学生数据的修改,增添,删除,查看,对学生的成绩进行单科排序,对学生的整体成绩进行排序并生成成绩单。
具体步骤:
以下以 c 为例
1:通过 Creat 函数对学生的数据进行录入。
void Creat(Node *List, int people_sum); //实现对链表的创建和链接
2:通过 Check1 函数对单独的一个学生的成绩进行单独查看
void Check1(Node *List); //查看一名同学的整体成绩
3:通过 View 函数对单独的一个学科的整体成绩进行查看
void View(Node *List); //对班级里面的具体科目成绩进行查看
4:同过 Set 函数对学生成绩的标准进行设立(优秀,及格,不及格)并对不及格的成绩进行统计。
void Set(Node *List); //对各科的标准进行设立
5:通过 Check2 函数来查看不及格超过两科的学生都有谁
void Check2(Node *List); //查看挂科超过两科的同学有哪些
6:通过 Delete 函数对学生的数据进行删除
void Delete(Node *List); //对某位同学的数据进行删除
7:通过 Insert 函数来增添学生的数据
void Insert(Node *List); //将某个同学的数据进行插入
8:通过 Revise 函数对学生的数据进行修改
void Revise(Node *List); //对某个同学的数据进行修改
9:通过 Generate 函数对学生的整体成绩进行排名,并生成成绩单
void Generate(Node *List); //对学生的总体成绩进行排名并汇总成成绩单
10:退出程序
具体流程图
对文件的分离操作
main.cpp 负责主函数和基本框架
list.cpp 和 list.h 负责对链表进行操作以及函数的声明
struct.h 负责对结构体进行声明
需要注意的事项:
1.在指针变量进去函数之前要对指针变量进行判定,判定该指针是否为无效指针
2.用 malloc 分配内存之后要对分配内存是否成功进行判定,如果没有分配成功则结束程序
3.删除函数在进行时要考虑特殊情况(如果将第一个数据删除就要判断当前遍历到的数据的前一个数据是否为空)
4.在排序函数中对数据进行交换不能直接将地址进行交换(因为链表存在链接的关系)因此要对数据进行交换
5.对字符串输入要用 fgets 函数防止造成缓冲区溢出和数组越界的现象发生(当然在输入字符串没有空格的情况下也可以用 %20s 对输入的字符进行限制也可以防止缓冲区溢出)。其次是当 fgets 函数读入的数据小于 len-1 是会保留换行符,因此还需要对该函数进行设计从头遍历对末尾的换行符进行处理
代码实现(参考 c primer plus)
char *s_gets (char *st , int n)
{
char *ret_val;
int i=0;
ret_val = fgets(st , n , stdin); //防止缓冲区溢出
if (ret_val)
{
while(st[i] != '\n' && st[i] != '\0')
i++;
if(st[i] == '\n') //将结尾的换行符改成'\0'
st[i] = '\0';
else
while(getchar() != '\n')
continue;
}
return ret_val;
}
6.在读取整形变量之后还要查看后面有没有进行读取字符或者字符串的操作,如果有要刷新缓冲区或用 getchar()读取换行符,防止换行符进入下一个字符串的读入。
7.最后还要记住将该程序申请的内存进行释放
对于一些核心的代码进行一些介绍
对于一个学生管理系统来说最重要的便是对学生的成绩进行排序,这也是我完成整个学生管理系统思考最多的地方,对于排序的算法来说就有许多种,最后我选择了"选择排序",首先它是一个可以从头遍历到尾的排序,而且它传入的参数较少,因此使用起来相对容易一些。
代码实现
for(Student *p = List->head ; p ;p = p->next)
{
for(Student *q = p->next ; q ; q = q->next)
{
//这里进行数据的比较和数据的交换
}
}
其实还可以对链表进行解链操作然后完成排序的,但由于解链操作需要知道两个交换数据的前驱节点和后继节点,因此用双向链表实现更加容易一些,单向链表较为复杂交换可以直接对数据进行交换而不解链就可以了。
还有就是该学生管理系统实现了对学生成绩单进行打印,这就需要对表格的空间进行计算了。对于名字来说可以用表格的空间减去名字字符串的长度就是剩余空格的长度了,而对于学生的成绩来说,首先这是一个整形变量并且这个整形变量可能是 1 位也可以是两位甚至更多,这就需要将整行变量转化为字符型对于 c 语言来说可以调用 c 函数 sprintf(string,"%d",n)进行转化然后进行和名字一样的操作就可以了
实现之后的效果就是这样了
该学生管理系统还对输入的用户以及输入的学生的信息进行了文件处理,将数据进行了保存。其中用户以文本的形式进行保存,学生的数据以二进制文件的形式进行了保存(二进制文件可以通过 Notepad++ 对文件进行打开,虽然什么也看不懂但能够说明数据确实保存了)
还有一些对链表进行删除,添加,修改等基本操作。许多书籍以及网上的教程都进行了介绍,因此就不再进行赘述了
以下为该学生管理系统的操作成果
这是用户的注册登录界面
这是显示菜单的界面
下面这个操作完成两个任务一个是对成绩进行排序,另一个查看该学科的整体成绩
这步操作则是对个别学生的成绩进行查看
这一步其实完成了两个操作一个是对学科标准的设立,另一个是对挂科超过两科的学生进行统计
这一步进行的是删除操作,可以从图中看出 Amy 的数据被成功删除(这是一个特殊的数据因为是头节点)
总结
通过这次课设真实的体会到了企业软件开发的不易,自己也变得严谨了起来。从对代码格式的要求再到对特殊数据的判定自己也成长了不少。在这次课设中也学到了不少的东西,用 Markdown 写文档自己也算学到了很多。更重要的是对自己代码的严格要求,以企业的标准要求自己,这样才能更适应以后的工作。