学生考勤管理系统设计报告Word格式文档下载.docx
《学生考勤管理系统设计报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《学生考勤管理系统设计报告Word格式文档下载.docx(28页珍藏版)》请在冰豆网上搜索。
考勤信息包括:
缺课日期、第几节课、课程名称、学生姓名、缺课类型(迟到、早退、请假和旷课)。
1.3功能要求
(1)添加功能:
程序能够添加学生的记录和缺课记录,提供选择界面供用户选择所要添加的类别。
添加学生记录时,要求学号要唯一,如果添加了重复学号的记录时,则提示数据添加重复并取消添加。
(2)查询功能:
可根据学号、姓名等信息对已添加的学生记录进行查询,如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息。
还可以按课程名、学生姓名对缺课记录进行查询。
(3)显示功能:
可显示当前系统中所有学生的记录和缺课记录,每条记录占据一行。
(4)编辑功能:
可根据查询结果对相应的记录进行修改,修改时注意学号的唯一性。
(5)删除功能:
主要实现对已添加的学生记录进行删除。
如果当前系统中没有相应的记录,则提示“记录为空!
”并返回操作。
(6)统计功能:
能根据多种参数进行统计。
能按课程名统计出学生旷课的信息、还可以按姓名统计出任一学生的旷课情况。
需要排序。
(7)保存功能:
可将当前系统中各类记录存入文件中,存入方式任意。
(8)读取功能:
可将保存在文件中的信息读入到当前系统中,供用户进行使用。
1.4问题的解决方案
根据系统功能要求,可以将问题解决分为以下步骤:
(1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;
(2)分析系统中的各个实体及它们之间的关系;
(3)根据问题描述,设计系统的类层次;
(4)完成类层次中各个类的描述;
(5)完成类中各个成员函数的定义;
(6)完成系统的应用模块;
(7)功能调试;
(8)完成系统总结报告。
2.设计思路和方法
2.1设计思路
根据设计要求,经分析可将整个系统划分为7个功能模块。
数据管理中可以对学生的基本信息、课程的基本信息、学生缺课的查询、添加、删除和修改。
查询管理通过根据学生姓名,课程姓名时间段儿等信息,查询单个学生的缺课记录,单科课的旷课记录,单个学生的旷课记录。
功能模块图如下图所示:
2.2数据结构设计
structxueke
{charxueke_name[50];
intpeople_num;
};
这是定义了一个xueke结构体,用来存放一个学科名及其相应的旷课人数;
structstudent
{charname[50];
longtime;
intlesson_time;
charlesson_name[50];
intchidao_num;
intzaotui_num;
intqingjia_num;
intkuangke_num;
structstudent*next;
这是定义了一个student的结构体,用来存放一个学生的考勤记录,
其中有,字符数组name[50],lesson_name[50],分别存放学生名字,
缺课课程名字;
int型变量lesson_time,chidao_num,zaotui_num,qingjia_num,kuangke_num,分别来存放,缺课节次,迟到次数,早退次数,请假次数,旷课次数long型变量time,记录时间。
3.主模块设计
3.1建立学生缺课记录子模块
建立的学生人数,学生基本信息(包括缺课时间、学生姓名、课程名称、节次、迟到次数、早退次数、请假次数、旷课次数),用creat()函数,如下图:
3.2修改学生缺课记录子模块
3.3修改学生缺课记录子模块
3.4查看单科旷课记录子模块
根据学科名称和时间范围查出所有在该范围内旷课的学生以及次数,如下图:
3.5查看学生旷课记录子模块
根据要查询的学科名称及时间段查出在改时间段内该门课上旷课的人数,如下图:
3.6载入学生旷课记录子模块
可以载入实现储存在当前文件夹中txt文件中所储存的数据,如下图:
3.7储存学生旷课记录子模快
进入系统界面,进行数据的输入,信息的保存调用相应的函数打开相应的地址,查询各项信息。
如下图:
4.运行测试与结果
4.1开始菜单
4.2主菜单
4.3创建学生缺课记录库
4.4修改学生缺课记录
4.5查询学生缺课记录
4.6查看单科旷课记录
4.7查看学生旷课记录
4.8载入旷课记录
4.9储存旷课记录
5.总结
在老师同学的细心帮助下,结合网上的参考资料,这次设计总算顺利完成。
通过本次设计,让我对C++基础课程有了更加深刻的理解,在相关的能力上有了很大的提高,虽然在设计过程中遇到很大的困难,但是经过不断的修改和调试,在此过程中受益匪浅。
这次的程序设计相对于平时的训练还是有了进步的。
学生考勤管理系统要求至少要有四个类,在起初,对于定义哪四个类我是不清楚的,通过仔细的研读问题描叙终于在脑海里确定了这四个类。
既然是学生考勤管理系统,那由学生缺课信息中的日期我想到了时间类,这是一个很简单的类。
从系统的几大功能我又想到了系统的基础就是缺课学生的缺课信息,于是我又想到了一个信息类,还有两个类是根据两个统计功能想到的,在现在看来似乎有些不妥。
通过这次的课程设计我明白了学习程序设计语言必须要勤做实验,通过实验总结经验。
平时遇到的一些小问题一定要重视,越是基础的知识越要理解透彻。
比如指针与数组方面的知识,一旦没有弄清楚,在设计程序时就会吃亏。
这次的课设中,我遇到了很多的问题,有的通过思考或查看书本解决了,有的还留在脑子里,只有通过孜孜不倦的求索我们才会有进步,不懂得思考就不能真正的掌握一门知识。
这次的实验给以了我警示,让我明白我所掌握的知识还很欠缺,对于继承与派生这一章的知识,我以为自己勉强掌握了,这次实验后我发现我掌握得还不够。
基类的保护成员公有继承到派生类,类外是否可以通过对象来访问呢,原先我认为是可以的,经过这次程序设计,我知道我错了。
总之,我觉得做学问不应该马虎,对于所学一定要有深入的理解,这也是我这次课设得到的启示。
参考文献:
刘锐宇.VisualC++从入门到精通.清华大学出版社
谭浩强.C++语言程序设计.清华大学出版社
设计源程序代码:
#include<
cstdio>
//stdio.h的内容用C++头文件的形式表示
iostream>
malloc.h>
//动态内存分配
cstring>
iomanip>
//I/O流控制头文件
#defineNULL0
#defineguding10
#defineLENsizeof(structstudent)//定义了一个常数宏LEN,它的值等于结构体student的所占内存大小
usingnamespacestd;
intstudent_num;
FILE*fp1;
//定义指针类型文件
structxueke
{
charxueke_name[50];
{
charname[50];
voidchaxun(structstudent*head)
inti;
charchaxun_name[50];
cout<
<
"
请输入要查询的人名:
;
cin>
>
chaxun_name;
structstudent*p;
if(head==NULL)
cout<
联系人为空"
p=head;
for(i=0;
i<
student_num;
i++)
{
if(strcmp(chaxun_name,p->
name)==0)
缺课时间:
p->
time<
学生姓名:
name<
课程名称:
lesson_name<
节次:
lesson_time<
endl<
迟到次数:
chidao_num<
早退次数:
zaotui_num<
请假次数:
qingjia_num<
旷课次数:
kuangke_num<
endl;
}
p=p->
next;
//p的指针内容变成了p->
next
}
structstudent*xiugai(structstudent*head)
charxiugai_name[50];
charxiugai_xueke_name[50];
intk;
请输入要修改的学生姓名与学科名称【格式:
学生姓名(空格)学科名称】:
xiugai_name>
xiugai_xueke_name;
structstudent*p1,*p2;
p2=(structstudent*)malloc(LEN);
p1=head;
没有学生信息\n"
returnhead;
while((strcmp(xiugai_name,p1->
name)!
=0||strcmp(xiugai_xueke_name,p1->
lesson_name)!
=0)&
&
(p1->
next!
=NULL))
p1=p1->
if(strcmp(xiugai_name,p1->
name)==0&
strcmp(xiugai_xueke_name,p1->
lesson_name)==0)
{
===================================修改信息=================================\n"
1-修改缺课时间\n"
2-修改学生姓名\n"
3-修改课程名称\n"
4-修改第几节缺课\n"
5-修改迟到次数\n"
6-修改早退次数\n"
7-修改请假次数\n"
8-修改旷课次数\n\n"
================================================================================\n"
cin>
k;
switch(k)
{
case1:
cout<
请输入新的缺课时间:
cin>
p1->
time;
break;
case2:
请输入新的学生姓名:
name;
case3:
请输入新的课程名称:
lesson_name;
case4:
请输入新的缺课节次:
lesson_time;
case5:
请输入新的迟到次数:
chidao_num;
case6:
请输入新的早退次数:
zaotui_num;
case7:
请输入新的请假次数:
qingjia_num;
case8:
请输入新的旷课次数:
kuangke_num;
}
returnhead;
structstudent*creat()
inti,b;
structstudent*head,*p1,*p2;
请输入要建立资料的学生人数:
b;
head=p2=NULL;
p1=(structstudent*)malloc(LEN);
【输入格式:
缺课时间(空格)学生姓名(空格)课程名称(空格)第几节(空格)迟到次数(空格)早退次数(空格)请假次数(空格)旷课次数】\n"
请输入第1名学生信息:
time>
name>
lesson_name>
lesson_time>
chidao_num>
zaotui_num>
qingjia_num>
head=p1;
p2=p1;
student_num+=1;
for(i=1;
{
p1=(structstudent*)malloc(LEN);
请输入第"
i+1<
名学生信息:
p2->
next=p1;
p2=p1;
student_num+=1;
}
p2->
next=NULL;
voidprint(structstudent*head)
if(p==NULL)
while(p!
=NULL)
setw(10)<
早退次数:
p=p->
}
structstudent*tongji_lesson(structstudent*head)
structstudent*p1,*p2,*p3;
charlesson[50];
longlook_time1,look_time2;
intxunhuan_num=0;
p3=(structstudent*)malloc(LEN);
没有学生信息"
return(head);
p2=p1->
while(xunhuan_num<
student_num)
while(p2!
=NULL)
if(p2->
kuangke_num>
kuangke_num)
{
p3->
chidao_num=p2->
kuangke_num=p2->
qingjia_num=p2->
zaotui_num=p2->
lesson_time=p2->
time=p2->
strcpy(p3->
lesson_name,p2->
lesson_name);
name,p2->
name);
p2->
chidao_num=p1->
kuangke_num=p1->
qingjia_num=p1->
zaotui_num=p1->
lesson_time=p1->
time=p1->
strcpy(p2->
lesson_name,p1->
name,p1->
p1->
chidao_num=p3->
kuangke_num=p3->
qingjia_num=p3->
zaotui_num=p3->
p1->
lesson_time=p3->
time=p3->
strcpy(p1->
lesson_name,p3->
name,p3->
}
p1=p2;
p2=p2->
p1=head;
p2=p1->
xunhuan_num++;
请输入要查看的学科名称:
lesson;
请输入要查看的时间范围【输入格式:
时间(空格)时间】"
look_time1>
look_time2;
while(p1!
if(strcmp(lesson,p1->
lesson_name)==0&
look_time1<
=p1->
time&
=look_time2)
旷课次数:
structstudent*tongji_student(structstudent*head)
structxuekea[10];
intn,i,j,zhongjian;
structstudent*p1;
charzhongjian_name[50];
请输入一共的学科数:
n;
个学科名称:
a[i].xueke_name;
a[i].people_num=0;
请输入要查看的时间范围由小到大【输入格式:
=NULL&
if(a[i].xueke_name==p1->
lesson_name)
a[i].people_num+=p1->
kuangke_n