学生考勤管理系统设计报告_考勤管理系统设计报告
学生考勤管理系统设计报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“考勤管理系统设计报告”。
C/C++程序设计专题实验
报告
题目:学生考勤管理系统设计
班级:电子信息科学与技术131 姓名: 邬
帅
斌
目录
目录......................................................................1 摘要........................................................................2 1.设计要求和目的.........................................................................................错误!未定义书签。
1.1设计目的................................................................3 1.2问题描述................................................................3 1.3功能要求................................................................3 1.4问题的解决方案..........................................................3 2 设计思路和方法...........................................................................................................................4 3 主模块设计....................................................................................................................................5 4.运行测试及结果.........................................................................................................................13 5.总结...........................................................................................................................................16 参考文献.........................................................................................................................................16 源代码..............................................................................................................................................17
摘要
随着信息技术在管理上越来越深入的应用,管理信息系统的实施在技术上已经逐步成熟。管理信息系统是一个不断发展的学科,任何单位要生存要发展,要提高效率地把内部活动有机地组织起来,就必须建立与自身特点相适应的信息管理系统。
由于学校的学生管理系统缺乏开发,而学生人数不断增加,学生信息的不断更新,所以,学生考勤管理系统的建立就显得非常重要了。
本设计是基于Visual basic C++ 6.0开发环境,至上而下,层次化地设计学生考勤管理,综合考虑学生考勤管理所涉及的多方面问题,结合学校和教师的情况,有步骤,条理清晰的设计,操作简单,很方便的实现了学校和老师对学生考勤的管理。
关键词:学生考勤管理 C++ 信息录入 查询
1.设计要求和目的1.1设计目的(1)进一步锻炼学生对C++课程基础知识和实践技能的掌握和运用;
(2)要求学生基本掌握面向对象程序设计的基本思路和方法;
(3)要求学生能够利用所学的基础知识和技能,解决简单的面向对象设计问题。
1.2问题描述
学生信息包括:学号、姓名、性别、年龄、班级等信息。
考勤信息包括:缺课日期、第几节课、课程名称、学生姓名、缺课类型(迟到、早退、请假和旷课)。
1.3功能要求
(1)添加功能:程序能够添加学生的记录和缺课记录,提供选择界面供用户选择所要添加的类别。添加学生记录时,要求学号要唯一,如果添加了重复学号的记录时,则提示数据添加重复并取消添加。
(2)查询功能:可根据学号、姓名等信息对已添加的学生记录进行查询,如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息。还可以按课程名、学生姓名对缺课记录进行查询。
(3)显示功能:可显示当前系统中所有学生的记录和缺课记录,每条记录占据一行。
(4)编辑功能:可根据查询结果对相应的记录进行修改,修改时注意学号的唯一性。
(5)删除功能:主要实现对已添加的学生记录进行删除。如果当前系统中没有相应的记录,则提示“记录为空!”并返回操作。
(6)统计功能:能根据多种参数进行统计。能按课程名统计出学生旷课的信息、还可以按姓名统计出任一学生的旷课情况。需要排序。
(7)保存功能:可将当前系统中各类记录存入文件中,存入方式任意。(8)读取功能:可将保存在文件中的信息读入到当前系统中,供用户进行使用。
1.4问题的解决方案
根据系统功能要求,可以将问题解决分为以下步骤:
(1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;(2)分析系统中的各个实体及它们之间的关系;(3)根据问题描述,设计系统的类层次;(4)完成类层次中各个类的描述;(5)完成类中各个成员函数的定义;
(6)完成系统的应用模块;(7)功能调试;
(8)完成系统总结报告。(7)功能调试;
(8)完成系统总结报告。
2.设计思路和方法
2.1设计思路
根据设计要求,经分析可将整个系统划分为7个功能模块。数据管理中可以对学生的基本信息、课程的基本信息、学生缺课的查询、添加、删除和修改。查询管理通过根据学生姓名,课程姓名 时间段儿等信息,查询单个学生的缺课记录,单科课的旷课记录,单个学生的旷课记录。功能模块图如下图所示:
学生考勤管理程序建立学生缺课记录修改学生缺课记录查询学生缺课记录查看单科旷课记录查看学生旷课记录载入学生旷课记录储存学生旷课记录
2.2数据结构设计
struct xueke {char xueke_name[50];int people_num;};这是定义了一个xueke结构体,用来存放一个学科名及其相应的旷课人数;
struct student { char name[50];long time;int leon_time;char leon_name[50];int chidao_num;
int zaotui_num;int qingjia_num;int kuangke_num;struct student *next;};这是定义了一个student的结构体,用来存放一个学生的考勤记录,其中有,字符数组name[50],leon_name[50],分别存放学生名字,缺课课程名字;int型变量leon_time,chidao_num,zaotui_num,qingjia_num, kuangke_num,分别来存放,缺课节次,迟到次数,早退次数,请假次数,旷课次数 long型变量time,记录时间。
3.主模块设计
3.1建立学生缺课记录子模块
建立的学生人数,学生基本信息(包括缺课时间、学生姓名、课程名称、节次、迟到次数、早退次数、请假次数、旷课次数),用creat()函数,如下图:
开始int i,b;struct student *head,*p1,*p2;printf(“请输入要建立资料的学生人数:”);scanf(“%d”,&b);head=p2=NULL;p1=(struct student *)malloc(LEN);输入第一个学生成绩head=p1;p2=p1;i=0;student_num++;inext=p1;p2=p1;student_num++;i++p2->next=NULL结束
3.2修改学生缺课记录子模块
开始char xiugai_name[50];char xiugai_xueke_name[50];int k;printf(“请输入要修改的学生姓名与学科名称:”);scanf(“%s%s”,xiugai_name,xiugai_xueke_name);struct student *p1,*p2;p2=(struct student *)malloc(LEN);p1=head;p1=p1->next;strcmp(xiugai_name,p1->name)!=0&&(p1->next!=NULL)&&strcmp(xiugai_xueke_name,p1->leon_name)!strcmp(xiugai_name,p1->name)==0&&strcmp(xiugai_xueke_name,p1->leon_name)==0显示修改菜单选择修改项目并完成修改结束
3.3修改学生缺课记录子模块
开始int i=0;char chaxun_name[50];struct student *p;p=head;printf(“请输入要查询的人名:”);scanf(“%s”,chaxun_name);iname)==0输出p所指向的结构体数据结束
3.4查看单科旷课记录子模块
根据学科名称和时间范围查出所有在该范围内旷课的学生以及次数,如下图:
开始struct student *p1,*p2,*p3;char leon[50];long look_time1,look_time2;int xunhuan_num=0;p3=(struct student *)malloc(LEN);p1=head;p2=p1->nextxunhuan_numkuangke_num>p1->kuangke_numYp1=head;p2=p1->next;xunhuan_num++;p1=p2;p2=p2->next;交换p1与p2指向数据printf(“请输入要查看的学科名称:”);scanf(“%s”,leon);printf(“请输入要查看的时间范围”);scanf(“%ld%ld”,&look_time1,&look_time2);p1=head;p1!=NULLp1=p1->next;strcmp(leon,p1->leon_name)==0&&look_time1time&&p1->time
3.5查看学生旷课记录子模块
根据要查询的学科名称及时间段查出在改时间段内该门课上旷课的人数,如下图:
开始int n,i,j,zhongjian;struct student *p1;char zhongjian_name[50];long look_time1,look_time2;printf(“请输入第%d个学科名称:”,i+1);scanf(“%s”,a[i].xueke_name);a[i].people_num=0;printf(“请输入要查看的时间范围由小到大”);scanf(“%ld%ld”,&look_time1,&look_time2);p1=head;i=0;Yitime && p1->timenext;N(strcmp(a[i].xueke_name,p1->leon_name)==0Ya[i].people_num+=p1->kuangke_num;Yj
3.6载入学生旷课记录子模块
可以载入实现储存在当前文件夹中txt文件中所储存的数据,如下图:
开始struct student *p1=NULL,*p2=NULL,*head=NULL;struct student student_ziliao[100];int i=0,n=0;打开文件!feof(fp1)将文件里的数据存入结构体数组通过结构体数组建立链表结束
3.7储存学生旷课记录子模快
进入系统界面,进行数据的输入,信息的保存调用相应的函数打开相应的地址,查询各项信息。如下图:
开始struct student *p1;p1=head;打开文件xueshengziliao.txtp1!=NULLN将数据写入文件p1=p1->next;结束
Y
4.运行测试与结果
4.1开始菜单
4.2主菜单
4.3创建学生缺课记录库
4.4修改学生缺课记录
4.5查询学生缺课记录
4.6查看单科旷课记录
4.7查看学生旷课记录
4.8载入旷课记录
4.9储存旷课记录
5.总结
在老师同学的细心帮助下,结合网上的参考资料,这次设计总算顺利完成。通过本次设计,让我对C++基础课程有了更加深刻的理解,在相关的能力上有了很大的提高,虽然在设计过程中遇到很大的困难,但是经过不断的修改和调试,在此过程中受益匪浅。
这次的程序设计相对于平时的训练还是有了进步的。学生考勤管理系统要求至少要有四个类,在起初,对于定义哪四个类我是不清楚的,通过仔细的研读问题描叙终于在脑海里确定了这四个类。既然是学生考勤管理系统,那由学生缺课信息中的日期我想到了时间类,这是一个很简单的类。从系统的几大功能我又想到了系统的基础就是缺课学生的缺课信息,于是我又想到了一个信息类,还有两个类是根据两个统计功能想到的,在现在看来似乎有些不妥。通过这次的课程设计我明白了学习程序设计语言必须要勤做实验,通过实验总结经验。
平时遇到的一些小问题一定要重视,越是基础的知识越要理解透彻。比如指针与数组方面的知识,一旦没有弄清楚,在设计程序时就会吃亏。这次的课设中,我遇到了很多的问题,有的通过思考或查看书本解决了,有的还留在脑子里,只有通过孜孜不倦的求索我们才会有进步,不懂得思考就不能真正的掌握一门知识。这次的实验给以了我警示,让我明白我所掌握的知识还很欠缺,对于继承与派生这一章的知识,我以为自己勉强掌握了,这次实验后我发现我掌握得还不够。基类的保护成员公有继承到派生类,类外是否可以通过对象来访问呢,原先我认为是可以的,经过这次程序设计,我知道我错了。总之,我觉得做学问不应该马虎,对于所学一定要有深入的理解,这也是我这次课设得到的启示。
参考文献:
刘锐宇.Visual C++从入门到精通.清华大学出版社 谭浩强.C++语言程序设计.清华大学出版社
设计源程序代码:
#include
//stdio.h的内容用C++头文件的形式表示 #include
#include
//动态内存分配 #include
#include
//I/O流控制头文件 #define NULL 0 #define guding 10 #define LEN sizeof(struct student)
//定义了一个常数宏LEN,它的值等于结构体student的所占内存大小 using namespace std;int student_num;FILE *fp1;
//定义指针类型文件 struct xueke {
char xueke_name[50];int people_num;};
struct student {
char name[50];long time;int leon_time;char leon_name[50];int chidao_num;int zaotui_num;int qingjia_num;int kuangke_num;struct student *next;};void chaxun(struct student *head){
int i;char chaxun_name[50];cout
cin>>chaxun_name;struct student *p;
if(head==NULL)
cout
if(strcmp(chaxun_name,p->name)==0){
couttimenameleon_nameleon_timechidao_num
早退次数:“zaotui_numqingjia_numkuangke_num
p=p->next;
//p的指针内容变成了p->next
}
} struct student *xiugai(struct student *head){
char xiugai_name[50];char xiugai_xueke_name[50];int k;cout>xiugai_name>>xiugai_xueke_name;struct student *p1,*p2;
p2=(struct student *)malloc(LEN);p1=head;if(head==NULL){
cout
return head;} while((strcmp(xiugai_name,p1->name)!=0||strcmp(xiugai_xueke_name,p1->leon_name)!=0)&&(p1->next!=NULL))
p1=p1->next;
if(strcmp(xiugai_name,p1->name)==0&&strcmp(xiugai_xueke_name,p1->leon_name)==0){
cout
cout
cout
cout
cout
cout
cout
cout
cout
cout
cin>>k;
switch(k)
{
case 1:
cout
cin>>p1->time;
break;
case 2:
cout
cin>>p1->name;
break;
case 3:
cout
cin>>p1->leon_name;
break;
case 4:
cout
cin>>p1->leon_time;
break;
case 5:
cout
cin>>p1->chidao_num;
break;
case 6:
cout
cin>>p1->zaotui_num;
break;
case 7:
cout
cin>>p1->qingjia_num;
break;
case 8:
cout
cin>>p1->kuangke_num;
break;
} } return head;
} struct student *creat(){ int i,b;
struct student *head,*p1,*p2;
cout
cin>>b;
head=p2=NULL;
p1=(struct student *)malloc(LEN);
cout
cout
cin>>p1->time>>p1->name>>p1->leon_name>>p1->leon_time>>p1->chidao_num>>p1->zaotui_num>>p1->qingjia_num>>p1->kuangke_num;
head=p1;
p2=p1;
student_num+=1;
for(i=1;i
{
p1=(struct student*)malloc(LEN);
cout
cin>>p1->time>>p1->name>>p1->leon_name>>p1->leon_time>>p1->chidao_num>>p1->zaotui_num>>p1->qingjia_num>>p1->kuangke_num;
p2->next=p1;
p2=p1;
student_num+=1;
}
p2->next=NULL;
return head;} void print(struct student *head){
struct student *p;p=head;if(p==NULL)
cout
{
couttimenameleon_nameleon_timechidao_numzaotui_numqingjia_numkuangke_num
p=p->next;} } struct student *tongji_leon(struct student *head){
struct student *p1,*p2,*p3;char leon[50];long look_time1,look_time2;int xunhuan_num=0;p3=(struct student *)malloc(LEN);if(head==NULL){
cout
return(head);} p1=head;p2=p1->next;while(xunhuan_num
while(p2!=NULL)
{
if(p2->kuangke_num>p1->kuangke_num)
{
p3->chidao_num=p2->chidao_num;
p3->kuangke_num=p2->kuangke_num;
p3->qingjia_num=p2->qingjia_num;
p3->zaotui_num=p2->zaotui_num;
p3->leon_time=p2->leon_time;
p3->time=p2->time;
strcpy(p3->leon_name,p2->leon_name);
strcpy(p3->name,p2->name);
p2->chidao_num=p1->chidao_num;
p2->kuangke_num=p1->kuangke_num;
p2->qingjia_num=p1->qingjia_num;
p2->zaotui_num=p1->zaotui_num;
p2->leon_time=p1->leon_time;
p2->time=p1->time;
strcpy(p2->leon_name,p1->leon_name);
strcpy(p2->name,p1->name);
p1->chidao_num=p3->chidao_num;
p1->kuangke_num=p3->kuangke_num;
p1->qingjia_num=p3->qingjia_num;
p1->zaotui_num=p3->zaotui_num;
p1->leon_time=p3->leon_time;
p1->time=p3->time;
strcpy(p1->leon_name,p3->leon_name);
strcpy(p1->name,p3->name);
}
p1=p2;
p2=p2->next;
}
p1=head;
p2=p1->next;
xunhuan_num++;} cout>leon;cout>look_time1>>look_time2;p1=head;
while(p1!=NULL){
if(strcmp(leon,p1->leon_name)==0&&look_time1time&&p1->time
coutnamekuangke_num
p1=p1->next;} return head;} struct student *tongji_student(struct student *head){
struct xueke a[10];int n,i,j,zhongjian;struct student *p1;char zhongjian_name[50];long look_time1,look_time2;if(head==NULL){
cout
} cout>n;for(i=0;i
cout>a[i].xueke_name;a[i].people_num=0;
}
cout>look_time1>>look_time2;p1=head;for(i=0;i
while(p1!=NULL&&look_time1time&&p1->time
{
if(a[i].xueke_name==p1->leon_name)
a[i].people_num+=p1->kuangke_num;
p1=p1->next;}
p1=head;
}
for(j=0;j
for(i=0;i
{
if(a[i].people_num
{
zhongjian=a[i+1].people_num;
a[i+1].people_num=a[i].people_num;
a[i].people_num=zhongjian;
strcpy(zhongjian_name,a[i+1].xueke_name);
strcpy(a[i+1].xueke_name,a[i].xueke_name);
strcpy(a[i].xueke_name,zhongjian_name);}
else if(a[i].people_num==a[i+1].people_num&&strcmp(a[i].xueke_name,a[i+1].xueke_name)>0)
{
zhongjian=a[i+1].people_num;
a[i+1].people_num=a[i].people_num;
a[i].people_num=zhongjian;
strcpy(zhongjian_name,a[i+1].xueke_name);
strcpy(a[i+1].xueke_name,a[i].xueke_name);
strcpy(a[i].xueke_name,zhongjian_name);}
} for(i=0;i
struct student student_ziliao[100];int i=0,n=0;if((fp1=fopen(”xueshengziliao.txt“,”rb+“))==NULL){ printf(”cannot open filen“);
return(head);}
while(!feof(fp1)){if(fread(&student_ziliao[i],LEN,1,fp1)!=1)
{if(feof(fp1))
{fclose(fp1);
break;}
printf(”file read errorn“);}
i++;} n=i;student_num=n;p1=p2=(struct student *)malloc(LEN);head=p1;for(i=0;ichidao_num=student_ziliao[i].chidao_num;
p1->kuangke_num=student_ziliao[i].kuangke_num;
strcpy(p1->leon_name,student_ziliao[i].leon_name);
p1->leon_time=student_ziliao[i].leon_time;
strcpy(p1->name,student_ziliao[i].name);
p1->qingjia_num=student_ziliao[i].qingjia_num;
p1->time=student_ziliao[i].time;
p1->zaotui_num=student_ziliao[i].zaotui_num;
p2->next=p1;
p2=p1;
p1=(struct student*)malloc(LEN);} p2->next=NULL;return(head);} void chucun(struct student *head){ struct student *p1;p1=head;fp1=fopen(”xueshengziliao.txt“,”wb+“);while(p1!=NULL){fwrite(p1,LEN,1,fp1);
p1=p1->next;} fclose(fp1);cout
储存成功n”;} void main(){
struct student *head;int a,b,c;zhuye: cout
欢迎使用学生考勤管理系统
************************n“;
cout
1_进入管理nnn”;
cout
2_查看系统相关信息nnn“;cout
cin>>a;
if(a==1)
{
do
{
cout
cout
1_建立学生缺课记录n”;
cout
2_修改学生缺课记录n“;
cout
3_查询学生缺课记录n”;
cout
4_查看单科旷课记录n“;
cout
5_查看学生旷课记录n”;
cout
6_载入学生旷课记录n“;
cout
7_储存学生旷课记录n”;
cout
8_退出考勤管理程序n";cout
cin>>b;
switch(b)
{
case 1:
head=creat();
print(head);
break;
case 2:
head=xiugai(head);
print(head);
break;
case 3:
chaxun(head);
break;
case 4:
head=tongji_leon(head);
break;
case 5:
head=tongji_student(head);
break;
case 6:
head=zairu();print(head);
break;
case 7:
chucun(head);
break;}
}while(b!=8);
}
else
{cout
cout
cin>>c;
if(c==1)
goto zhuye;
}
}
欢迎使用本返
回
主
页
系统请
按