学生考勤管理系统课程设计报告1.docx
- 文档编号:22793130
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:34
- 大小:261.41KB
学生考勤管理系统课程设计报告1.docx
《学生考勤管理系统课程设计报告1.docx》由会员分享,可在线阅读,更多相关《学生考勤管理系统课程设计报告1.docx(34页珍藏版)》请在冰豆网上搜索。
学生考勤管理系统课程设计报告1
.需求分析
功能需求:
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
基类
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,inteno,stnngc,strings,inttype)
{
日期
课程名字
学生姓名
对缺课类型的选择为int型
缺课类型
date.assign(d);//
cname.assign(c);//sname.assign(s);//this->cno=cno;//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;i { flag=0; for(j=0;j if(r[i].sname==s[j]) { c[j]++;flag=1;break; }if(! flag){ s[k]=r[i].sname;c[k++]=1; } }for(i=1;ivk;i++) for(j=i;j>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; } } coutvv"旷课学生姓名\t旷课次数"< coutvvs[i]vv"\t\t"vvc[i]vvendl; } voidorder_c()//课程排序 { inti,j; string*s=newstring[n]; int*c=newint[n];s[0].assign(r[0].cname);c[0]=1; intk=1,flag; for(i=1;i { flag=0;for(j=0;j c[j]++;flag=1;break; }if(! flag){ s[k]=r[i].cname;c[k++]=1; } } for(i=1;i for(j=i;j>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; } } coutvv"课程名\t旷课人次"< coutvvs[i]vv"\t"vvc[i]vvendl; } record*r; intn; }; 把所有的学生记录都保存到一个文件里面,然后根据需要再将里面需要查找的元素进行 查找,相应的排序可能就是将他们尽可能压进关联式容器map有的部分就压入set里面, 这些都是根据模块的功能来选定的。 可以这么说,选择好合理的数据结构查找与排序就可以一劳永逸了。 这点在后面部分会有详细的说明。 还有就是对各功能子函数的编写应用。 五、类设计 系统中主要涉及了两个类: 一个是classrecord//关于学生考勤基本信息类 另一个是classrecords//实现学生旷课情况排序的类 六、主要算法设计 关键算法: 旷课情况的排序: classrecords//实现学生旷课情况排序的类 { public: records()//构造函数 { r=newrecord[100]; n=0; 旷课记录的修改: coutvv"请输入要修改缺课记录的学生姓名: "vvfiush; stringt1,t3,t4; chartmp[30]; intt2,t5,flag=0; cin>>tmp; tl.assign(tmp); for(i=0;ivr->n;i++) if(r->r[i].sname==t1) { flag=7; break; } if(! flag) { coutvv"查无此学生! "< return; } t1=r->r[i].date; t2=r->r[i].cno; t3=r->r[i].cname; t4=r->r[i].sname; t5=r->r[i].type; 旷课项目的修改! coutvv"请输入要修改的项目: \n(1.缺课日期2.缺课节次3.缺课名称4.学生姓名5.缺课类型6.全部)"vvflush; e0: cin>>flag; switch(flag) { case1: gotoe1; case2: gotoe2; case3: gotoe3; case4: gotoe4; case5: gotoe5; case6: gotoe1; default: gotoe0; } 用到的知识点有: 函数的作用域、函数的调用、数组赋值、函数循环、以及类的定义,另外还用到了for函数、getch函数、switch函数、case函数、default函数等等。 七、主要代码 第一部分: 学生考勤管理系统 #include"stdiib.h" #inelude"hanshushixian.h" #include"record.h" #inelude #include #include #ineludevfstream>usingnamespacestd;#include"record.h" intmain() { c1: //主菜单实现 system("cls"); { coutvv" *************************************************************"< ★欢迎访问学生考勤管理系统^ coutvv" ***"vvendl; coutvv" *mmm*mmmn*******************"VVend]; ***系统主菜单: 1.显示所有学生的缺课记录 cout<<" ***"< cout<<" ***"< cout<<" ***"< cout<<" ***"< cout<<" ***"< cout<<" ***"< cout<<" ***"< coutvv" 2.录入学生的缺课信息记录 3.查询某个学生的缺课情况 4.修改某个学生的缺课记录 5.删除某个学生的缺课记录 6.统计某段时间内旷课情况 7.退出系统 *************************************************************"< coutvv"O(n_n)0请选择你所需要的操作0(n_n)o: "《flush;intchose; c2: cin>>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; } 你的选择: "vvfiush; coutvv"是否返回主菜单? (y/n)charyn; c3: cin>>yn; if(yn二二'y')gotoc1; elseif(yn=='n')exit(O); elsegotoc3; return0; 第二部分: record.h(类的设计部分) #include #include usingnamespacestd; #ifndefrecord_class #definerecord_class classrecord//关于学生考勤基本信息类 { public: voidset(stringd,inteno,stnngc,strings,inttype){ date.assign(d);cname.assign(c);sname.assign(s);this->cno=cno;this->type=type; } voidset(record&re) { 可以避免不必要的内存分配,可以提高效率 date.assign(re.date);//assigncname.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#definerecordsclass 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;i { flag=0; for(j=0;j c[j]++;flag=1;break; }if(! flag){ s[k]=r[i].sname;c[k++]=1; } }for(i=1;i 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; } } coutvv"旷课学生姓名\t旷课次数"< coutvvs[i]vv"\t\t"vvc[i]vvendl; } voidorder_c()//课程排序 {" inti,j; string*s=newstring[n]; int*c=newint[n];s[0].assign(r[0].cname);c[0]=1; intk=1,flag; for(i=1;i { flag=0; for(j=0;j if(r[i].cname==s[j]) { c[j]++;flag=1;break; }if(! flag){ s[k]=r[i].cname;c[k++]=1; } }for(i=1;i 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; } } coutvv"课程名\t旷课人次"< coutvvs[i]vv"\t"vvc[i]vvendl; } record*r; intn; }; #endifrecords_class 第三部分: hanshushixian.h(功能子函数的实现部分) #include"record.h" #include #include #include #include"stdlib.h" #include voidwt(records*r)//实现对文件的输出 { ofstreamoutf("data.txt"); for(inti=0;i outf< "vvendl; } voidrd(records*r)//实现对文件的输入 { ifstreaminf("data.txt"); if(inf.eof()) { coutvv"记录为空! "< } stringt1,t3,t4; chartmp[30]; intt2,t5; r->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&&yearv99&&month>0&&monthv13&&day>0&&day<32)){ coutvv"日期录入有误! 请重新录入: "wendl; returnfalse; } elsereturntrue; } 录入学生的缺课记录 voidinput(records*r)// { stringt1,t3,t4; intt2,t5,flag=0; charyn; coutvv"录入一条学生缺课记录: "vvendl;//endl表示终止一行并刷新缓冲区 m1: coutvv"请输入缺课日期: (例如110627)"vvflush;//flush表示刷新缓冲区 cin>>t1; if(! (timechk(t1)))gotom1; m2: coutvv"请输入缺第几节课: "vvfiush; cin>>t2; if(t2v1||t2>10) { coutvv"节次录入有误! 请重新录入: "vvendl; gotom2; } coutvv"请输入缺课名称: "vvfiush; cin>>t3; coutvv"请输入缺课学生姓名: "vvfiush; cin>>t4; m3: coutvv"请输入缺课类型: (1.迟到2.早退3.请假4.旷课)"vvflush;cin>>t5; if(t5v1||t5>4) { coutvv"类型输入有误! 请重新录入: "vvendl; gotom3; } for(inti=0;ivr->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) coutvv"该条记录已存在,是否添加为新记录? (y/n)"vvfiush; n1: n2: coutvv"是否继续输入? (y/n)"< n3: cin>>yn; if(yn二二'y')gotom1; elseif(yn=='n') { coutvv"保存修改? (y/n)"vvflush;cin>>yn; if(yn二二'y')wt(r); elsereturn; } elsegoton3; voidprione(recordr) { coutvvr.datevv"\t\t"ovv"\t"vvr.cnamevv"\t\t"vvr.snamevv"\t\t"vvflush; switch(r.type) 迟至U"vvendl;break;早退"vvendl;break;请假"vvendl;break;旷课"vvendl;break; { case1: coutvv" case2: coutvv" case3: coutvv" case4: coutvv"default: ; } } 修改学生信息 voidp"(records*r)//{ if(r->n==O) { coutvv"记录为空! "< } 节次\t课程名称\t学生姓名\t缺课类型"< cout<<"\n序号\t缺课日期for(inti=0;i { cout<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 考勤 管理 系统 课程设计 报告