课程设计报告课程名称面向对象程序设计课题名称学生考勤管理系统专业计算机科学与技术班级1181班学号202113030128姓名蔡彪指导教师李珍辉谭小兰2021年12月15日湖南工程学院课程设计任务书课程名称面向对象程序设计课题学生考勤管理系统专业班级计算机1181班学生姓名蔡彪学号202113030128指导老师李珍辉谭小兰审批任务书下达日期2021年12月15日任务完成日期2021年01月05日一、设计内容与设计要求1.课程设计目的:面向对象程序设计课程设计是集中实践性环节之一,是学习完《面向对象程序设计》课程后进行的一次全面的综合练习。
要求学生达到熟练掌握C++语言的基本知识和技能;基本掌握面向对象程序设计的思想和方法;能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题,从而提高动手编程解决实际问题的能力。2.课题题目学生考勤管理系统3.设计要求:(1)根据自己对应的课题完成以下主要工作:①完成系统需求分析:包括系统设计目的与意义;系统功能需求(系统流程图);输入输出的要求。②完成系统总体设计:包括系统功能分析;系统功能模块划分与设计(系统功能模块图)。③完成系统详细设计:包括数据库需求分析;数据库概念结构设计(E-R图);数据库逻辑结构设计;类层次图;界面设计与各功能模块实现。④系统调试:调试出现的主要问题,编译语法错误及修改,重点是运行逻辑问题修改和调整。⑤使用说明书及编程体会:说明如何使用你编写的程序,详细列出每一步的操作步骤。⑥关键源程序(带注释)(2)按规定格式完成课程设计报告,将其打印稿(A4纸)上交给老师存档。(3)不得抄袭他人程序、课程设计报告,每个人应体现自己的个性设计。
二、进度安排第17周星期二8:00——12:00星期三8:00——12:00星期四8:00——12:00星期五8:00——12:00星期六8:00——12:00第18周星期五8:00——12:00三、参考书籍1.《C++程序设计课程设计》刘振安编著TP312C5632.《C++Builder和Delphi课程设计与系统开发案例》伍俊良清华大学出版社7-302-06072-X3.VisualC++课程设计案例精编严华峰中国水利水电出版社7-5084-2007-120044.VisualC++课程设计与系统开发案例伍俊良清华大学出版社7-302-05968-320025.VisualC++语言课程设计:案例精选与编程指导陈清华朱红东南大学出版社7-81089-275-420036.VisualC++课程设计案例精编中国水利水电出版社7-5084-1004-120027.数据结构课程设计案例精编:用C/C++描述李建学李光元吴春芳清华大学出版社7-302-14536-92007(编程平台不限,vc++,c++Builder等等。)
课题:学生考勤管理系统(一)、课程设计题目:学生考勤管理系统(二)、目的与要求:1、目的:(1)要求学生达到熟练掌握C++语言的基本知识和技能;(2)基本掌握面向对象程序设计的基本思路和方法;(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。2、基本要求:(1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计;(2)要求在设计的过程中,建立清晰的类层次;(3)在系统中至少要定义四个类,每个类中要有各自的属性和方法;(4)在系统的设计中,至少要用到面向对象的一种机制。3、创新要求:在基本要求达到后,可进行创新设计,如根据查找结果进行修改的功能。4、写出设计说明书(三)、设计方法和基本原理:1、问题描述(功能要求):考勤信息记录了学生的缺课情况,它包括:缺课日期、第几节课(连续多节课用begin-end的形式表示)、课程名称(课程名称中不会出现空格)、学生姓名、缺课类型(迟到、早退、请假及旷课)。试设计考勤管理系统,使之能提供以下功能:1).录入学生的缺课记录:从键盘输入数据(提示:为避免重复从键盘输入数据,测试时可将数据存储在文件中,利用输入重定向功能读入),输入格式为:缺课日期第几节课课程名称学生姓名缺课类型每行一条纪录。例如:2021-04-293-4C++程序设计实验张三迟到2021-04-283-4C++程序设计李四旷课2).修改某个学生的缺课记录:可以对缺课纪录的任意部分进行修改,然后显示一下修改后的纪录。3).查询某个学生的缺课情况:查询结果按照日期升序排序,同一天内按照所缺课程的时间升序排序。4).统计某段时间内(以天为单位),旷课学生姓名及旷课节数,查询结果先按旷课节数降序排序,旷课节数相同的学生按姓名升序排序;5).统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序,旷课人次相同的课程按课程名称升序排序;
6).系统以菜单方式工作。(所谓菜单指用户可以自由选择所要执行的功能)2、问题的解决方案:根据系统功能要求,可以将问题解决分为以下步骤:(1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;(2)分析系统中的各个实体及它们之间的关系包括属性和行为;(3)根据问题描述,设计系统的类层次;(4)完成类层次中各个类的描述(包括属性和方法);(5)完成类中各个成员函数的定义;(6)完成系统的应用模块;(7)功能调试;(8)完成系统总结报告以及系统使用说明书目录1.系统需求分析12.总体设计23.详细设计44.系统调试.65.结果分析96.总结10附录1.系统需求分析考勤信息记录了学生的缺课情况,它包括:缺课日期、第几节课(连续用begin-end的形式表示)、课程名称(课程名称中不会出现空格)、学生姓名、缺课类型(迟到、早退、请假及旷课)。试设计考勤管理系统,使之能提供以下功能:(1).录入学生的缺课记录:从键盘输入数据(提示:为避免重复从键盘输入数据,测试时可将数据存储在文件中,利用输入重定向功能读入),输入格式为:缺课日期第几节课课程名称学生姓名缺课类型
每行一条纪录。例如:2021-04-292-4中国近现代文学史李云龙迟到2021-04-282-4大学生社交礼仪马志鹏旷课(2).修改某个学生的缺课记录:可以对缺课纪录的任意部分进行修改,然后显示一下修改后的纪录。(3).查询某个学生的缺课情况:查询结果按照日期升序排序,同一天内按照所缺课程的时间升序排序。(4).统计某段时间内(以天为单位),旷课学生姓名及旷课节数,查询结果先按旷课节数降序排序,旷课节数相同的学生按姓名升序排序;(5).统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序,旷课人次相同的课程按课程名称升序排序;(6).系统以菜单方式工作。(所谓菜单指用户可以自由选择所要执行的功能。学生可以通过以上功能录入信息、修改信息、查询信息、整理统计出所要了解的信息,除了要实现上述的基本功能之外,本系统还应该在细节上下工夫,使用户使用方便,在使用的过程中保持一个愉快的心情。学生考勤管理系统有广大的用户群,这其中有老师、有教务处主任、有公司管理人员,也可以供给一般用户使用。总之该系统可以满足用户需求,实现对其管理的人员的考勤工作。
2.总体设计学生考勤管理系统包含五个大的功能,分别是:录入学生缺课信息、修改学生缺课信息、查询某个学生的缺课情况、统计某段时间内(以天为单位),旷课学生姓名及旷课节数和统计某段时间内,有学生旷课的课程及旷课人次。学生的缺课信息主要包含缺课日期,第几节课、课程名称,学生姓名,缺课类型。在录入学生缺课信息时根据系统提示逐一输入。每输入完一条信息,系统会提示是否继续输入,用户可以选择继续或返回主菜单。在修改学生缺课信息时,用户首先输入要修改的学生姓名,系统会检索如果系统中有该学生的相关信息则系统首先会提示用户修改该学生的那一部分信息,用户可自行选择。如果系统中没有该学生的相关信息,则系统会给相关提示,用户可以选择继续输入要修改的学生姓名或选择退出返回主菜单。在查询学生缺课信息时,用户先输入要查询的学生姓名,系统检索判断是否存在该学生的信息然后做出相应的提示。总之,用户可以方便的在系统提示下进行使用。学生考勤管理系统中功能模块图:菜单统计某段时间内,有学生旷课的课程及旷课人次统计某段时间内旷课学生姓名及旷课节数查询某学生的缺课信息修改某学生的缺课信息录入学生的缺课信息按时间升序显示有学生旷课的课程及旷课人次按时间升序显示旷课学生姓名及旷课节数查询某学生的缺课日期、缺课节次、缺课课程名称、缺课类型修改某学生的缺课日期、缺课节次、缺课课程名称、缺课类型录入缺课学生的姓名、缺课日期、缺课节次、缺课课程3.详细设计(1)类的设计此系统设计了两个类,一个是record类,一个是records类。Record类完成对学生基本信息的声明与获取,包括学生姓名、缺课日期、缺课课程名称、缺课课程类型、缺课节次。Record类的设计classrecord{
public:voidset(stringd,intcno,stringc,strings,inttype){date.assign(d);//缺课日期cname.assign(c);//缺课课程名称sname.assign(s);//学生姓名this->cno=cno;//缺课节次this->type=type;//缺课类型}voidset(recordre){date.assign(re.date);//获取缺课日期cname.assign(reame);//获取缺课课程名称sname.assign(re.sname);//获取学生姓名this->cno=reo;//获取缺课节次this->type=re.type;//获取缺课类型}stringdate,cname,sname;//定义日期,课程名称,学生姓名intcno,type;//定义缺课节次,缺课类型};(2)学生考勤系统的显示模块voidpri(records*r)//函数{if(r->n==0){cout<<"记录为空!"<
n;i++){cout<r[i]);}}(3)学生考勤系统的查询模块voidpri(records*r)//函数{if(r->n==0){cout<<"记录为空!"<n;i++)
{cout<r[i]);}}(4)学生考勤系统的修改模块voidedt(records*r)//函数{if(r->n==0){cout<<"记录为空!"<>tmp;t1.assign(tmp);for(inti=0;in;i++)if(r->r[i].sname==t1){flag=7;break;}if(!flag){cout<<"查无此学生!"<r[i].date;t2=r->r[i]o;t3=r->r[i]ame;t4=r->r[i].sname;t5=r->r[i].type;cout<<"请输入要修改的项目:n(1.缺课日期2.缺课节次3.缺课名称4.学生姓名5.缺课类型6.全部)"<>flag;switch(flag){case1:gotoe1;case2:gotoe2;
case3:gotoe3;case4:gotoe4;case5:gotoe5;case6:gotoe1;default:gotoe0;}e1:cout<<"请输入缺课日期:(例如100216)"<>t1;if(flag!=6)gotoe6;e2:cout<<"请输入缺第几节课:"<>t2;if(flag!=6)gotoe6;e3:cout<<"请输入缺课名称:"<>t3;if(flag!=6)gotoe6;e4:cout<<"请输入缺课学生姓名:"<>t4;if(flag!=6)gotoe6;e5:cout<<"请输入缺课类型:(1.迟到2.早退3.请假4.旷课)"<>t5;e6:r->r[i].set(t1,t2,t3,t4,t5);charyn;cout<<"保存修改?(y/n)"<>yn;if(yn=="y")wt(r);elsereturn;}(5)学生考勤系统的删除模块voiddel(records*r)//函数{if(r->n==0){cout<<"记录为空!"<>flag;
if(flag>r->n-1&&flag<-1){cout<<"不存在所要删除的记录!"<n=0;else{for(inti=flag;in-1;i++)r->r[i].set(r->r[i+1]);r->n--;}charyn;cout<<"保存修改?(y/n)"<>yn;if(yn=="y")wt(r);elsereturn;}(6)学生考勤系统的录入模块voidinput(records*r)//录入{stringt1,t3,t4;intt2,t5,flag=0;charyn;cout<<"请输入学生缺课记录:"<>t1;if(!(timechk(t1)))gotom1;m2:cout<<"请输入缺第几节课:"<>t2;if(t2<1||t2>10){cout<<"节次录入有误!请重新录入:"<>t3;cout<<"请输入缺课学生姓名:"<>t4;m3:cout<<"请输入缺课类型:(1.迟到2.早退3.请假4.旷课)"<>t5;if(t5<1||t5>4){cout<<"类型输入有误!请重新录入:"<n;i++)if(r->r[i].date==t1&&r->r[i]o==t2&&r->r[i]ame==t3&&r->r[i].sname==t4&&r->r[i].type==t5){cout<<"该条记录已存在,是否添加为新记录?(y/n)"<>yn;if(yn=="y")break;elseif(yn=="n")goton2;elsegoton1;}r->r[r->n++].set(t1,t2,t3,t4,t5);n2:cout<<"是否继续输入?(y/n)"<>yn;if(yn=="y")gotom1;elseif(yn=="n"){cout<<"保存修改?(y/n)"<>yn;if(yn=="y")wt(r);elsereturn;}elsegoton3;}(7)学生考勤系统的统计模块voidsearch_s(records*r)//统计{if(r->n==0){cout<<"记录为空!"<>tmp;ld.assign(tmp.substr(0,6));hd.assign(tmp.substr(7,6));if(!timechk(ld)||!timechk(hd))gotog1;for(inti=0;in;i++)if(r->r[i].datepare(ld)>=0&&r->r[i].datepare(hd)<=0&&r->r[i].type==4)r1->r[r1->n++].set(r->r[i]);cout<<"请选择统计方式:(1.学生旷课情况降序显示2.课程旷课情况降序显示)"<>i;switch(i){case1:cout<<"n在"<order_s();break;case2:cout<<"n在"<order_c();break;default:gotog2;}}
4.程序调试(1)程序开始运行的界面(2)程序显示功能的界面(3)程序录入功能的界面(4)程序查询功能的界面(5)程序修改功能的界面(6)程序删除功能的界面5.结果分析这次的课设,我写的程序也没有什么独到之处,我觉得唯一可以从我的程序可以看出的是数组用得比较多,反正是没啥特色,不仅如此,还写得功能不全,实在是惭愧。现在在这里也只能说说它的不足之处了。类层次不够清晰,纵观整个程序可以发现四个类之间的关系不甚恰当,我有这个感觉,但我不知如何改进。函数参数设定不够完美,整个程序中对指针的运用比较少。对于指针的巧妙运用把握得不够。还有就是容易missing;或者是},这都是些应该改掉的毛病。除此以外,我对于怎样用文件保存数据还没深入了解,但我将数据保存到文件后又因文件打不开而无法访问文件中的数据,对于动态链表,我不是很清晰,也就是说无法做到熟稔运用。在调试过程中我发现在主函数中把字符数组名name赋值给字符指针p即p=name;然后用cout<
#include#includeusingnamespacestd;//时间类classtime{public:time(inty=0,intm=0,intd=0){year=y;month=m;day=d;}~time(){}protected:intyear,month,day;};//信息类classxinxi:publictime{public:xinxi(){tiaoshu++;}~xinxi(){tiaoshu--;}voidsetname(char*n){strcpy(name,n);}voidsettime(inty,intm,intd){year=y;month=m;day=d;}voidsetqklx(char*qk){strcpy(queke,qk);}voidsetjieci(char*jc){strcpy(jieci,jc);}voidsetkechen(char*kc){strcpy(kechen,kc);}char*getname(){char*n;n=name;returnn;}char*getqklx(){char*qk=queke;returnqk;}char*getjieci(){char*jc;jc=jieci;returnjc;}char*getkechen(){char*gk;gk=kechen;returngk;}int*gettime();private:charname[20];//姓名charjieci[3],kechen[10],queke[10];inttm[3];staticinttiaoshu;};intxinxi::tiaoshu=0;int*xinxi::gettime(){int*t;t=tm;tm[0]=year;tm[1]=month;tm[2]=day;returnt;}//缺课课程类classqkechen:publicxinxi{public:
qkechen(){kcshu++;}~qkechen(){kcshu--;}intgetrc(xinxist1[],intn,intj);charqkn[20];//公有数据成员private:intrenci;staticintkcshu;//静态数据成员};intqkechen::kcshu=0;intqkechen::getrc(xinxist1[],intn,intj){renci=0;renci++;for(inti=0;i