C语言课程设计-学生学籍管理系统
课题要求:
开发一个简单的学生学籍管理系统 ,实现以下功能:
【基本功能】
- 实现学院、专业和班级信息的维护管理。
- 实现学生信息的维护管理。
- 实现学生学籍信息的维护管理。
- 实现学生学籍信息的查询管理。
【扩展功能】
可以按照自己对学生学籍管理系统的需求理解进行扩展。比如:(1)权限处理 (2)模糊查询(3)综合查询(4)统计功能等。总之,可以根据自己的需求分析进行功能扩展。
1 需求分析
随着互联网的发展和广泛应用,越来越多的学校采用网上学生学籍管理系统对学生学籍信息进行更好的管理。教学管理员在新学期开始前对学生学籍进行录入,管理员使用账号密码登录该系统,登录成功之后显示系统使用帮助,以便管理员更好的对该系统进行操作,随后进入主菜单。在主菜单中可选择对学生学籍进行增添,增添学生信息时要有输入样例,方便管理员正确输入学生相关信息。若添加学生学籍信息错误,可以对学生学籍进行修改或者删除,修改学生学籍信息时要能对学生各项信息进行修改。删除学生学籍时,如果输入不存在的学号信息,要进行反馈;删除成功该学生学籍将不存在于该系统。要能够对已输入的学籍信息进行查询操作,查询学生信息应该有多种查询方式,输出查询到的目标所有信息。以及要能够对学生信息进行统计,统计应该要有多种方式,如按学院统计,按专业统计等等。操作过程中要随时可以查看已经输入好的信息,以便随时改动。所有操作完成后将输入的信息存入文件,然后退出该系统;在下次登录该系统后可以对文件进行读取,然后对已输入的数据进行管理。
2 概要设计
定义一个结构体类型,包括每个学生的学号、姓名、年龄、性别、学院、专业班级、电话等信息。所有数据定义为字符串类型,建立链表,定义该结构体类型的指针,用于指向各结点。分别建立具有增添,删除,查询,修改,显示,统计,保存与读取文件的子函数,完成相应功能,对程序实现模块化。通过主函数对各个子函数进行调用。
2.1增添模块
通过设计一个模块,当需要加入新的学生信息的时候来实现学生信息的增添。在输入时提供正确的输入案列,以便更好的输入学生学籍相关信息。
2.2删除模块
通过设计一个模块,当输入一个学生的学号时,对其进行搜索查找,查找成功后将其从学生学籍信息中删去。此后,该学生信息将不会出现在学生学籍信息中。
2.3查询模块
通过设计一个模块,这个模块可以按学生的学号、学院、专业、班级来查询学生的所有信息,以便查询者阅读。
2.4修改模块
通过设计一个模块,当需要对学生信息进行修改时,可以通过该模块进行修改。修改模块具有多级子菜单,使用方便,灵活。
2.5显示模块
通过设计一个模块,来实现学生信息的显示。以便浏览学生的信息。
2.6统计模块
通过设计一个模块,对学生信息进行统计,可对学院学生人数,专业学生人数,班级学生人数分别进行统计,方便快捷。
3 运行环境
硬件环境:PC机内存8GB,硬盘512GB,处理器Intel® Core™ i5-8265U。
软件环境:操作系统为Windows 10家庭版操作系统。
4 开发工具和编程语言
开发工具:Dev-C++5.11,Visual Studio Code。
编程语言:C语言。
5 详细设计与实现
5.1主函数
定义一个变量n来记录学生信息输入量,赋初值为0。定义一个整形变量a,赋初值为1,通过修改a的值,来控制循环的执行,以及子函数的调用。输入账号密码进入系统,如果输入错误会提示再次输入。账号密码成功则进入帮助界面,按任意键进入菜单界面,输入序号进行函数调用操作,所有操作完成后可进行选择退出该系统。主函数功能结构图如图5.1.1所示:
主函数流程图如图5.1.2所示:
5.2增添学籍函数(void Add(void))
为结构体指针p1(已定义的结构体指针)申请内存,判断是否为第一个学生学籍数据。若为第一个数据,将头指针指向p1,继续输入学生学籍信息;若不是第一个数据,把新创建的结点p1和链表的尾结点连接起来,然后继续输入学生学籍信息。输入完成后,p2(已定义的结构体指针)指向p1,p2的尾结点指向NULL,学生信息输入量n加1。增添学籍函数如5.2.1所示:
5.3查询学籍函数(void Seek(void))
定义标志变量flag,赋值为0。通过判断学生信息输入量n判断系统是否存在数据,如果不存在数据提示错误返回主菜单;存在数据则输入序号确定查找方式。如序号输入错误,系统会进行提示随后返回菜单;输入正确会进行查找并输出所有符合条件的学生学籍信息,查找成功,flag赋值为1;查找失败,flag仍为0,并进行相应提示。查询学籍函数如图5.3.1所示:
关键代码如下:
do
{
if(strcmp(a,p->StudentId)==0)
{
printf("\n信息已被找到:\n学号\t\t姓名\t\t年龄\t性别\t学院\t\t专业\t\t班级\t\t电话\n");
printf("%-16s%-16s%-8s%-8s%-16s%-16s%-16s%-16s\n",p->StudentId,p->StudentName,p->StudentAge,p->StudentSex,p->StudentCollege,p->StudentMajor,p->StudentClass,p->StudentTelephoneNumber);
flag=1;
}
p=p->next;
}while(p!=NULL);
5.4删除学籍函数(void Delete(void))
定义标志变量flag,赋值为0。通过判断学生信息输入量n判断系统是否存在数据,如果不存在数据提示错误返回主菜单,存在则输入待删除学号,在链表中寻找相应结点,若查找成功则删去,flag赋值为1,n减1;若没有找到则flag仍为0。对flag的值进行判断,输出相应提示并返回主菜单。删除学籍函数如图5.4.1所示:
关键代码如下:
do
{
if(strcmp(p->StudentId,a)==0)
{
q1=p;
q2->next=p->next;
free(q1);
flag=1;
break;
}
q2=p;
p=p->next;
}while(p!=NULL);
5.5修改学籍函数(void Modify(void))
定义标志变量flag,赋值为0。通过判断学生信息输入量n判断系统是否存在数据,如果不存在数据提示错误返回主菜单,存在则输入待修改学号。用指针检验链表中待修改学生是否存在,若不存在,flag仍为0,提示错误并退出;若存在,flag 赋值为1,输入修改的目标对对应结点修改,提示成功并退出。修改学籍函数流程图如5.5.1所示:
5.6统计学籍函数(void Statistics(void))
定义整形变量d,赋值为0,用来表示统计得到的结果。输入统计方式序号,输入错误进行提示返回主菜单;输入正确,则输入要统计的名称。对链表进行遍历,如果符合条件则d自增(d++)。统计完成后输出统计得到的结果,并返回主菜单。统计学籍函数流程图如5.6.1所示
关键代码如下:
printf("请输入要统计的名称:");
scanf("%s",a);
p=head;//指针指向开头
do{
if(strcmp(a,p->StudentCollege)==0) {
d++;
}
p=p->next;
}while(p!=NULL);
5.7显示学籍函数(void Browse(void))
通过判断学生信息输入量n判断系统是否存在数据,如果不存在数据提示错误返回主菜单,存在则用指针检验是否有记录。移动指针,依次输出学生学籍信息,输出完毕,返回主菜单。
6 运行结果
6.1增添学生学籍信息
进入系统,选择增加学生信息,输入如表6.1的数据。
程序运行结果如图6.1.1,图6.1.2所示:
6.2查找学生学籍信息
增加学生信息后,选择查找学生信息,选择查找方式,可输出查找目标。
程序运行结果如图6.2.1所示:
6.3统计学生学籍信息
增加学生信息后,选择统计学生信息,选择统计方式,将输出统计得到的人数。
程序运行结果如图6.3.1所示:
6.4修改学生学籍信息
增加学生信息后,选择修改学生信息,输入学号选择修改目标,再输入想对该目标修改的值。
程序运行结果如图6.4.1,图6.4.2所示:
6.5删除学生学籍信息
增加学生信息后,选择删除学生信息,输入待删除学生信息学号,即可将学生信息删除。
程序运行结果如图6.5.1,6.5.2所示:
6.6保存学生学籍信息
当前操作完成后,选择保存学生信息对录入的信息及进行的操作保存。将信息写入文件,并生成“studentdate.txt”文件。
程序运行结果如图6.6.1,图6.6.2所示:
6.7读取学生学籍信息
当再次进入该系统时,选择读取学生信息可对已经保存的信息进行读取。
程序运行结果如图6.7.1,图6.7.2所示:
7 调试分析及心得
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决问题,锻炼实践能力的重要环节,是对我们能力的具体训练和考察过程。回顾起此次课程设计,还是有不少收获,从理论到实践,在整整半个月的日子里,学到了很多很多的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
首先要提到的就是在此次课程设计中遇到的问题。在一开始接触课程设计时,对自己要做什么,怎么做,不甚了了。好在老师对此次课程设计进行了讲解,确定了任务,于是我开始慢慢摸索。上学期C语言老师由于时间原因,没有对链表,文件管理进行特别详细的讲解。于是,我通过阅读课本,网上搜索,先“恶补”了一番相关知识。然后按照老师建议,先不要着急写代码,要进行需求分析和完善的构思。最终,我有了初步的设想并开始着手,但是在写代码的过程中也是存在着一些问题。
例如一开始由于对头文件包含相关知识存在一定误区,导致出现如图7.1所示找不到相关文件的错误,通过查询资料,询问他人,最终我发现问题是我将源文件和头文件存放于不同文件夹,将头文件和源文件放在同一文件夹或者引用时加入头文件的绝对路径,这样就可以避免出现图7.1的错误。
因为是第一次做课程设计,难免会遇到各种各样的问题,但是我在设计的过程中发现了自己的不足之处,发现自己对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说指针,链表…通过这次课程设计,我把前面所学过的知识又重新温故了一遍,有了不同的感悟,收获颇丰。同时写代码过程中不免有等号写成赋值号,使用中文输入法输入标点符号,漏打括号等各种各样的小问题,这也提醒了我,写代码是一项严谨而细致的工作,“千里之提,溃于蚁穴”,上千行代码中只要有一个错误都会导致编译无法通过,程序无法正常运行。所以在日后的学习过程中,应当更加细致,谨慎小心。
由于时间,知识水平等原因,该学生学籍管理系统并没有完全到达我心理的预期,个人认为还有很多可以改进的地方,比如说UI界面,相关功能等等。但是我有很认真的对待这次课设,从代码的书写,到计划书的修改。经常会因为一处bug然后修改到半夜,虽然很晚,但是解决掉问题后程序能够正常运行还是让我十分开心。随着知识水平和能力的提高,我日后还会对该系统进行修改,推出出2.0,3.0等版本。对计科专业的学子来说,学习是一个永不停止的过程,随着时代的变迁和科技的发展,会不断推出新的编程语言,计算机技术。因此我们都应该树立终身学习的理念,来提高我们自己!There is no end to learning!
参考文献
[1]甘勇,李晔,卢冰.C语言程序设计(第二版)[M].北京: 中国铁道出版社,2015.
[2]谭浩强.C程序设计(第五版)[M].北京:清华大学出版社,2017.
[3]Stephen Prata .C Primer Plus(第六版)中文版[M]. 姜佑译.北京:人民邮电出版社,2016.
[4]Kenneth A.Reek .C和指针[M]. 徐波译.北京:人民邮电出版社,2008.
[5]Peter Van Der Linden .C专家编程[M]. 徐波译.北京:人民邮电出版社,2008.
[6]肖昆明.浅析基于c语言的文件处理[J].电脑与信息技术,2013.