• 609.05 KB
  • 2022-05-17 13:40:54 发布

学生考勤管理系统课程设计报告1.docx

  • 44页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
蒇一.需求分析肄功能需求:莁1、录入学生的缺勤记录;芀2、修改某个学生的缺勤记录;薆3、查询某个学生的缺勤情况;蒄4、统计某段时间内,缺勤学生学号及缺勤次数,按缺勤权值统计学生的负分值,并能进行排序;膁5、统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序;羈6、系统以菜单方式工作羈数据需求袃本系统主要涉及的数据有学生缺课信息类和有关信息排序类。学生缺课信息包括缺课时间,学生姓名,课程名称,第几节,学生迟到次数,早退次数,请假次数,旷课次数。有关信息排序类包括对课程排序和对姓名排序。袂性能需求聿要求系统具有可靠性,速度要快肇二、系统的主要功能薆(1)、录入学生的缺课记录,函数代码voidinput(records*r){}模块中。首先提示用户按照正确的格式进行学生缺课记录的录入,这个步骤比较简单,只需要不断地将记录的每个数据项存入结构体对应的成员中。蚂(2)、修改某个学生的缺课记录,函数代码voidedt(records*r){}模块中。首先必须查找到你所需要修改的那位的学生全部缺课记录。这个模块不需要定义新的结构体。在修改前当然要检查记录是否为空了,不为空的话,可以设置下面这五个菜单供用户选择:1、缺课日期2、第几节课3、课程名称4、学生姓名5、缺课类型6、退出修改程序并返回系统主菜单。修改很简单,仅需要对该学生的某个部分进行替换即可。采用switch语句很快就解决。最后实现对所选记录的修改,完成后更新原有的学生记录。 膀(3)、查询某个学生的缺课情况,函数代码voidsearch(records*r){}模块中。达到查询结果按照日期升序排序,同一天内按照所缺课程的时间升序排序的目的,膅(4)、统计,函数代码为voidorder_c(){}和voidorder_s(){}的类模块中。其中实现对课程排序和对学生姓名的排序。羆三、流程图莃学生考勤系统结构图:羈薇蒅肃罿蚆袄袃肁肈基类的数据成员和成员描述芄薄record袈Stringdate,cname,sname;膆intcno,type; 蚃voidset();肀stringtostr();衿芅类名/函数名膂描述袀类名/函数名蚇record袆基类薁edt()螆records芅实现学生旷课情况排序芁del()的类膈wt/rd()蚅实现对文件的输入和输肂search()出蒅input()芃录入学生的缺课记录羁search_s()羁描述螈修改学生信息蝿删除学生信息肀查找学生信息袇一定范围查找学生信息袇edt()螂修改学生信息螁main()羈主函数羆四、数据结构设计膂此程序运用多种条件语句,主体采用的是动态数组、指针。系统的设计采用了数组语句、选择语句和循环语句,在需要处理大量同类数据时,这样就使程序书写更加简洁。程序使用了布尔函数。选择语句多采用if多分支选择结构与switch语句。首先计算switch表达式,然后在caes子句中寻找值相等的常量表达式,并以此为入口符号,由此开始顺序执行。循环语句采用了for语句等、do-while语句,for语句用于已知循环次数的循环结构,括号中的三个量分别用来表示循环变量初值、循环终值和循环增量。do-while语句先循环后判断,Break语句在switch语句中,保证多分支情况的正确执行,在循环语句中,强制终止本层循环。保存和读取函数是典型的函数功能,一个程序是由若干个函数组成的,保存和读取函数是和其他函数互相调用的蒂再有使用有关类的设计,学生缺课信息类和有关信息排序类,如下:羀classrecord//学生缺课信息类肄{袅public: 膂voidset(stringd,intcno,stringc,strings,inttype)螇{蒇芄羂袈薅date.assign(d);//日期cname.assign(c);//课程名字sname.assign(s);//学生姓名this->cno=cno;//对缺课类型的选择为int型this->type=type;//缺课类型蚄}葿voidset(recordre)袀{袇膃腿蚇肆date.assign(re.date);cname.assign(re.cname);sname.assign(re.sname);this->cno=re.cno;this->type=re.type;薂}罿stringdate,cname,sname;蝿intcno,type;膄};羂蚀classrecords//实现学生旷课情况排序的类螀{ 蒆public:莁records()//构造函数莀{薇蚅肅膁虿r=newrecord[100];n=0;}voidorder_s()//姓名的排序{羇薄袁蒆肆羃蚁蒇芄莃莂蕿薆inti;intj;string*s=newstring[n];int*c=newint[n];s[0].assign(r[0].sname);c[0]=1;intk=1,flag;for(i=1;i0;j--){if(c[j]>c[j-1]){inttmp=c[j];c[j]=c[j-1];c[j-1]=tmp;stringstmp=s[j];s[j]=s[j-1];s[j-1]=stmp;}荿} 螅蚂莀cout<<"旷课学生姓名t旷课次数"<0;j--){if(c[j]>c[j-1]){inttmp=c[j];c[j]=c[j-1];c[j-1]=tmp;stringstmp=s[j];s[j]=s[j-1];s[j-1]=stmp;}}cout<<"课程名t旷课人次"<>tmp;蚄t1.assign(tmp);葿for(i=0;in;i++)袀if(r->r[i].sname==t1)袇{膃flag=7;腿break;蚇}肆if(!flag)薂{罿蝿cout<<"查无此学生!"<r[i].date;蚀t2=r->r[i].cno;螀t3=r->r[i].cname;蒆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;蒁}膈用到的知识点有:函数的作用域、函数的调用、数组赋值、函数循环、以及类的定义,另外还用到了for函数、getch函数、switch函数、case函数、default函数等等。莆七、主要代码莅第一部分:学生考勤管理系统蒃#include"stdlib.h"薀#include"hanshushixian.h" 螆#include"record.h"肆#include芀#include蚈#include膅#include螆usingnamespacestd;莁#include"record.h"肁衿intmain()节{蒃c1://主菜单实现腿system("cls");芈{肃cout<<"*************************************************************"<>chose;if(chose==7)exit(0);records*r=newrecords();rd(r);switch(chose){case1:pri(r);break;case2:input(r);break; 肀蚀薈芆肂螈羇羆case3:search(r);break;case4:edt(r);break;case5:del(r);break;case6:search_s(r);break;default:gotoc2;}cout<<"是否返回主菜单?(y/n)——你的选择:"<>yn;if(yn=="y")gotoc1;elseif(yn=="n")exit(0);elsegotoc3;袆return0;膃}肂莇第二部分:record.h(类的设计部分)芅#include羃#include肃usingnamespacestd;螀 羈#ifndefrecord_class蚃#definerecord_class袁袈classrecord//关于学生考勤基本信息类莈{蒄public:羂voidset(stringd,intcno,stringc,strings,inttype)芀{螇膄羃荿芇date.assign(d);cname.assign(c);sname.assign(s);this->cno=cno;this->type=type;羅}螁voidset(record&re)螁{蚆蚅袂袀肅date.assign(re.date);//assign可以避免不必要的内存分配,可以提高效率cname.assign(re.cname);sname.assign(re.sname);this->cno=re.cno;this->type=re.type;莅} 袃stringtostr()羈{蝿膆蚁莀膈袆螂葿蚇莂袄袁肇肃strings;chartmp[3];s.assign(date);itoa(cno,tmp,10);s.append("#");s.append(tmp);//直接添加另一个完整的字符串s.append("#");s.append(cname);s.append("#");s.append(sname);itoa(type,tmp,10);s.append("#");s.append(tmp);returns;蚁}罿stringdate;蒆stringcname;袃stringsname;蚂intcno;肈inttype; 羆};薃螄#endifrecord_class蒀莅#ifndefrecords_class莄#definerecords_class薁蕿classrecords//实现学生旷课情况排序的类肈{肄public:薂records()//构造函数羁{蒈袅莀聿袇薅蒁膈莆莅r=newrecord[100];n=0;}voidorder_s()//姓名的排序{inti;intj;string*s=newstring[n];int*c=newint[n];s[0].assign(r[0].sname); 蒃薀螆肆芀蚈膅螆莁肁衿节蒃腿芈肃芀芈螇螃芁c[0]=1;intk=1,flag;for(i=1;i0;j--){蚀if(c[j]>c[j-1]) 膇薄莃螈薆芄膀肁羅羄膂艿虿螅芃{inttmp=c[j];c[j]=c[j-1];c[j-1]=tmp;stringstmp=s[j];s[j]=s[j-1];s[j-1]=stmp;}}cout<<"旷课学生姓名t旷课次数"<0;j--){if(c[j]>c[j-1]){inttmp=c[j];c[j]=c[j-1]; 肇膃蚁罿蒆袃蚂肈羅c[j-1]=tmp;stringstmp=s[j];s[j]=s[j-1];s[j-1]=stmp;}}cout<<"课程名t旷课人次"<薂#include蚇#include蒇#include"stdlib.h"袄#include 莀usingnamespacestd;聿袇薅voidwt(records*r)//实现对文件的输出蒁{膇ofstreamoutf("data.txt");莆for(inti=0;in;i++)肁outf<r[i].tostr()<n=0;肃while(true)芀{芇螇螃芁蚀膆薃聿螈薆芄膀inf.getline(tmp,10,"#");if(tmp[0]=="!")break;t1.assign(tmp);inf.getline(tmp,3,"#");t2=atoi(tmp);inf.getline(tmp,30,"#");t3.assign(tmp);inf.getline(tmp,30,"#");t4.assign(tmp);inf.getline(tmp,3);t5=atoi(tmp);r->r[r->n++].set(t1,t2,t3,t4,t5);袆}羅}羄膁booltimechk(stringt1)艿{蒅intyear=atoi(t1.substr(0,2).c_str());螅intmonth=atoi(t1.substr(2,2).c_str()); 罿intday=atoi(t1.substr(4,2).c_str());莇if(!(t1.length()==6&&year>0&&year<99&&month>0&&month<13&&day>0&&day<32))袄{蒅肀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].cno==t2&&r->r[i].cname==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;膃}蚁 罿voidprione(recordr)蒆{袃cout<n==0)聿{袇cout<<"记录为空!"<n;i++)肁{蒂薀cout<r[i]);虿}螅}芄薂voidedt(records*r)//修改学生信息腿{蒆inti;芅蚀if(r->n==0)薈{芆cout<<"记录为空!"<>tmp;蚇t1.assign(tmp);芅for(i=0;in;i++)薄if(r->r[i].sname==t1)肀{蒇flag=7;羂break;蚂}薀if(!flag)膈{肄螀cout<<"查无此学生!"<r[i].date;膅t2=r->r[i].cno;膃t3=r->r[i].cname;莈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<<"请输入缺课日期:(例如080612)"<>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;肇}羃虿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;螅} 膀肈voidsearch(records*r)//查找学生信息螆{薂if(r->n==0)薃{蒇蒆cout<<"记录为空!"<>str;蝿for(inti=0;in;i++)薀if(r->r[i].sname==str)羇{薂if(!flag)cout<<"n序号t缺课日期节次t课程名称t学生姓名t缺课类型"<r[i]);蚇flag=1;薄}芀if(!flag)cout<<"没有查到该学生的缺课记录!"<n==0)蚅{芁薈cout<<"记录为空!"<>tmp;ld.assign(tmp.substr(0,6));hd.assign(tmp.substr(7,6));if(!timechk(ld)||!timechk(hd))gotog1;for(i=0;in;i++)if(r->r[i].date.compare(ld)>=0&&r->r[i].date.compare(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;蒁}螁}肅八、系统运行结果样例莃当用户执行程序时首先会出现如下界面也是主菜单界面: 羀薁肆当输入序号1时会出现所有学生记录:螆蚄再选择y就会又回到主菜单界面,选n时就会退出。肈当在主菜单是选择序号2时就会出现如下界面: 膈袄按照提示进行输入,如果要继续输入则选择y,否则选n推出并会提示是否保存录入的内容。肃当在主菜单是选择序号3时会出现界面:螈 羅羃此时就要求输入查询的学生姓名,输入之后如果记录没有就会出现“没有查到该学生的缺课纪录”,如果有的话就会显示次学生的记录。蒂薈当在主菜单是选择序号4时,就会提示输入需要修改的姓名,如果此学生有会出现:肇莅袂如果没有此学生就会出现: 艿肈蒃同样在主菜单选择5时会出现:莁罿袅选择6时则会出现界面: 袆螀在统方式选1的话会出现上面的界面,选2的话界面如下:蝿羇 羄当选择7时:就会退出系统如果想再次使用就必须再次打开程序选择功能使用。蒄蒀九、结束语羈本次课程设计主要使用到了C++中的一些比较基本的算法,总体上感觉比之前做过的实验综合性比较强。在这里我主要总结一下我设计这个学生考勤管理系统的心得和在编译程序的过程中遇到的问题以及解决的办法。肂为了使得程序的编写更加有条理,阅读更加明了,在写每个模块的时候都将自己的思路写在每个函数的第一行,告诉自己(读者)我这个函数将要做的是什么事情。这是一个很好的编程规范,值得继续发扬。袃对于这次的程序的编写,花了不少时间,原因很可能是自己对C++的总体认知还不够,还有在上学期一个月对C++的学习知识量很有限,在编写调试的这个过程中很多新的语法知识都是在网上搜索的。当然错误自然是非常多的,比如bool型的,在网上看过了,感觉用的人比较多,也觉得挺好用的,在本程序中也使用了bool型的,如booltimechk();知道bool为布尔型,只有一个字节,取值false和true,是0和1的区别,不过在使用的时候老是出错。还有使用append()添加文本常用方法:直接添加另一个完整的字符串,如str1.append(str2);添加另一个字符串的某一段子串:如str1.append(str2,11,7);芀添加几个相同的字符:如str1.append(5,".");注意,个数在前字符在后.上面的代码意思为在str1后面添加5个".".螅再比如类的数据成员的初始化可以采用初始化表或函数体内赋值两种方式,这两种方式的效率不完全相同。非内部数据类型的成员对象应当采用第一种方式初始化,以获取更高的效率。内部数据类型的数据成员而言,两种初始化方式的效率几乎没有区别,但后者的程序版式似乎更清晰些。不能在类声明中初始化const数据成员,类的const常量只能在初始化 表里被初始化。蒅在设计好思路以后就是测试数据的设计,不过本次实验的测试数据比较死板,没什么好变动的。芃我学习编程一直有自己的一点想法:用任务来牵引,在实践中学习。也就是说,我没有按照某种固定的顺序去学习编程,而是经常有一些小的程序想法或是想编一个满足特定功能的程序。这样刚开始几乎每次都是在对所编程序一无所知的基础上进行,由简单到复杂,一个问题一个问题地去解决。当然,很多时候我失败了,但在这过程中,我学到了很多。问题一个个地解决,知识一点点地积累,经验一点点地丰富,想法一点点地成熟,成功概率也一点点地提高。现在编写一些简单的桌面应用程序也基本上没有问题了。羁首先声明,虽然我不是什么高手,不过通过这次编写这样的系统的学习我还是有一点心得的。学编程急不得,上来就学VC肯定碰一头灰,说VC难就难在这点上了。如果硬上,意志坚强的话也许能挺过来,但也是会缺乏后劲,不得不回过头来补习基础知识。意志不坚强的话,很有可能就此放弃了,并留下一个VC难得不得了的印象。其实,只要踏踏实实一步一步来,VC也就是很简单点事。在这里我说一下,如果你还只是一个初中生,那么你就应当仔细考虑一下了。首先,限于你的知识和思维能力,学学C语言还应该没问题,但要学VC是要下相当大的功夫的。而且,你现在学到的东西将来一定会过时,所以不如把精力放在算法的研究上,毕竟这些东西永远都不会过时。袇由于时间把握不好,这个系统是在几天空余时间写出来的,难免有点仓促,任然有许多需要改进的方向,但基本的功能已经达到了。薃最后,通过完成编程,我达到了:螂1、加深对本课程理论知识的理解,提高实际应用能力;螁2、树立自身对理论联系实际的工作作风、严肃认真的科学态度;羈3、进一步训练和提高自身的分析设计能力、理论计算能力、实验研究能力、外文阅读、查阅文献资料和文字表达等基本技能;羆4、培养自身独立分析、解决实际问题的能力,培养自身的创新意识和创新能力。膁蒁蚆 肄薁羈螇指导教师评语: 成绩:签名: