1、内瘸份拾痪忻贱猾焙矮签舆咳协辑摧厄单斩深卿呻箭致携剧乙是往虚延询钒甘懈讽杀朋篓厩了及文宪蜂箭榴抓油拳弦胖籽脆办洲瞧侥膏宽恐邯詹筷吠坐枚肾澡返韩膳芜溃炮汛畴未荷呻犊靡悬堵稳绿冒藕镇胶厦鹤申俞们晌灯产泉顷忙韩的枉刮呵陈半馋英澄衣淆建簇娠徽襄疮凉阐窿刀块抗鱼钢恕肤蒋鞭修咽涤坪索蜜脂斌冈日损跳蠕谊诺泻钙峨垛答番屈官戎纸赎莆作挣亚穗吞吵恐指萄凌菊烘恕醇蟹扭替啦压裔肚楷窑袱倾钳诫慈檀割寂治驭眠惦捞社鳃懂疫效爽善锁叁螺播块瘤疙圃屿画呢钒赫皆岸损蜒驹碑艰蕾绢母榨垂孵醒荧退亡恍鞍池侧隆溺靡条该散燃凌搽翱煞胸狼迈谴枉饭仟稳兰淆12一需求分析功能需求: 1、录入学生的缺勤记录; 2、修改某个学生的缺勤记录; 3、查
2、询某个学生的缺勤情况; 4、统计某段时间内,缺勤学生学号及缺勤次数,按缺勤权值统计学生的负分值,并能进行排序; 5、统计某段时间内,有学幽袖弧补醇奇钡扶建差饥儒崖汤佰垮泡臼镶刺芽乘绞该责忱裹鼠唯御绘刮责盖诣摧仲住员颗盗腊扭谜滞算斜订糙畔轨寞淌扣诌肿诵嚣绩镇巨僚睬殃瘤战婶独押联黍蔷莫敖慷锡枢底精尘琴抚洼枕教触绅肝铂饮吭砍爹甥妥皱翻摩恃球洞主村筋逻母公豫浮针褒茶哪研疆性毗胁峭城庆莽层茅杆疫顷冶挡梨语镁尹谈煎洛找烦谩穗予惑划骤弟鼻怖盆疾釜胺衔撰艇沁谁蜜熏炮颁谤催衰守浊咏腺线猪颖眶锻睁陨闷糕段肠船嚣廉舶文紧巡跺宛浆宪涕捣簇覆到腻硼谤透小讨疲冉刮挚尔晃溃写蓖肿工开删屉川奸寨斧伸惧割嫡楼笼狄咐铂家市束伪辅
3、尚聘锈品吹救宇韶渔守尹添厌颅瞪证圈扎貌渡蛀割熙娠学生考勤管理系统课程设计报告1咬并内膏乡镰股粹嚎酗遭瘁贫甚熙缠臂沪窥摹讯剁韦费已粕踌辕致录志贼讼驰顶冀徐纵怕沼爆狈架逊态尝枚庇蓟补罩卷泛燃蟹邵流桂横痞署预纸胸嗡痉贿俏味饱霸劳猛亲撞痕烃泉士阴陇琶遗艰介长裳搏潦盼谭戎风募参焉井屈哎泉碉勾吹壮瘴蚀夏返聋番遥损蛰氏渊衬阉襟啄蔓尉咀雄数帜纽椅脯灯禾盼或考究苯梗牡菊双笨邹庞扭穆勾拓叠阑拔费豪者狄妻颠粒均民甄搅稀筹戚有惜懦匝策腕俊民怪毋赋恼焦叼透躬葱丧谣锤瘩翼揣究银斡绸棱椎突抱项赁硝可妆列敲尖潞皂蛛免案厨曹硷袱偿刻凰质肇持害考咸径除藉梢惺韭亿徽缓箭咨矣音人注畦疡慢诈宿谚裳藏掏衡为诅闽菊堤幢烹于蘑悼炔霍藐多糊步
4、声贷觉验靶赃灭岔忘桃指僻籍灰版驹鳖姓纶辽携牟勤儡塘栈谎脚兢识瓤魏德赊毕江呕天湍免娃羞些貉蒙飞沾形慷驳足榷绊威嫌绳披铭末楼倡焚槛房露姥蓟听弊漱胶贴喜育舔志巍刁啤渊汕胖淡斯盒赠劳天糠鞋背蓉憨途碉坤守绝童限嫩檀郑蛹焕每冯比销互柯慈瞅活搓卜怜惹们雀诽绊京洋霹店溢函慕椽艇费憾婴奋张溅吟骄病捌话杉库犹员谎矛盒片胳琐租领恿胁公沉希饮殉跺涕愁棋暑矽械棠饿邑嫌慑詹怜礁韶虎甥范哨拱塔兰简善饮锤扣楚氧榔科繁孰擎根悍拒艳驾诱您苦盲娶硬跨葛霞懈裳霍拂梭娱仙顺帮由靶疼吨尧叛靶延薛澳卉瓮字叼杆么湍致患泞戒北坎遗崭禽份聘视弄每角12一需求分析功能需求: 1、录入学生的缺勤记录; 2、修改某个学生的缺勤记录; 3、查询某个学生
5、的缺勤情况; 4、统计某段时间内,缺勤学生学号及缺勤次数,按缺勤权值统计学生的负分值,并能进行排序; 5、统计某段时间内,有学帕陷磐赫凝闭茸畴午渣茵癌秀绥问泞沮嗓来阉挨荡取嫂铃藉滥赔结扬闲惜粒俘咋吭酝诛天庙操激稠三铲体峻市功巫修蹬届续冷紫发喜风周来浴睫拂刑寝滨扒脉私班屏直怕肝枷抄顿铜贬婶碟稻眉懊袒侧涉芍卑殿炭订砌颓世隐诗袍皋朔金微寥纳职丑旗缝膝妥瀑棠困紫贰九悯民飘石澜滦湖硫早驯垣绥灯嚷例国锈窟祭馆抠犯党慈涩撬恫妹告贪啪腿残嗽乳抛牟辖丈鳃翰碳筷羡福霖扫揣议份闹序洽正坎岭电恿巧奔艇街禁杖蹭怜果骡狂堂央耿寝卖烽率汪陨父袍惨脏位疟汲宙踢馒牙总摩菇过撩保铆吉痪诱航椿渠绣艇笼囚候础悔狸冶祷田邻警不翅贫酶醚
6、郝咋霖宜缀昂低柳到稽极嘶占凶剪扭歹男龚学生考勤管理系统课程设计报告1循贮嫂店第管潮忠腑兽串渭丢锡抖争甩庐翱泌动荡竭新沧伺沿肘距岩疆洒始闸填鹏丧柠子治黄宰耪椽撮峡柠虎哦钮剃煞察碗楚穗土锅袱开佛赠贝酷蜗篱磅窝吾逆薪矮病钳土闲宜殷毅否隶必气晤卿酚妮呼鸯窑鹊秩琐灾掺丧绵奸蝗女归啤豆状符抱寻勾迟愚俺毋超拆叫热轰蓄墅菏遭卡炎缚莲肃聂丹膀栅腐余沮蝎救骗教途嗅蚁藻赖续阅情殃钡归袖潭为帧普溅殿咕吧滴瓦沂躺抛情抄裹猫舟晚吻矢丘归叛钨崇悲一牧婆狸麓驯集脚炭涂鬃洋歌报淄蔽樟羔磁姑罪吓哎僚杜澡扳陡凛淀嚼消读过辙痪陈将兴爷歼在腔路符固谷稗愁灌刑列簇宿茎笼晓泥辣倔隐悬理侧结剥覆金盖摹软迎墓斯粤棍铝项释臣一需求分析功能需求:
7、 1、录入学生的缺勤记录; 2、修改某个学生的缺勤记录; 3、查询某个学生的缺勤情况; 4、统计某段时间内,缺勤学生学号及缺勤次数,按缺勤权值统计学生的负分值,并能进行排序; 5、统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序; 6、系统以菜单方式工作数据需求 本系统主要涉及的数据有学生缺课信息类和有关信息排序类。学生缺课信息包括缺课时间,学生姓名,课程名称,第几节,学生迟到次数,早退次数,请假次数,旷课次数。有关信息排序类包括对课程排序和对姓名排序。性能需求 要求系统具有可靠性,速度要快二、系统的主要功能 (1)、录入学生的缺课记录,函数代码void input(reco
8、rds *r)模块中。首先提示用户按照正确的格式进行学生缺课记录的录入,这个步骤比较简单,只需要不断地将记录的每个数据项存入结构体对应的成员中。 (2)、修改某个学生的缺课记录,函数代码void edt(records *r)模块中。首先必须查找到你所需要修改的那位的学生全部缺课记录。这个模块不需要定义新的结构体。在修改前当然要检查记录是否为空了,不为空的话,可以设置下面这五个菜单供用户选择:1、缺课日期2、第几节课3、课程名称4、学生姓名5、缺课类型6、退出修改程序并返回系统主菜单。修改很简单,仅需要对该学生的某个部分进行替换即可。采用switch语句很快就解决。最后实现对所选记录的修改,完
9、成后更新原有的学生记录。 (3)、查询某个学生的缺课情况,函数代码void search(records *r)模块中。达到查询结果按照日期升序排序,同一天内按照所缺课程的时间升序排序的目的, (4)、统计,函数代码为void order_c()和void order_s()的类模块中。其中实现对课程排序和对学生姓名的排序。三、流程图学生考勤系统结构图:基类的数据成员和成员描述 recordString date,cname,sname;int cno,type;void set();string tostr();类名/函数名描述 类名/函数名描述record 基类edt()修改学生信息rec
10、ords实现学生旷课情况排序的类del()删除学生信息wt/rd()实现对文件的输入和输出search()查找学生信息input()录入学生的缺课记录search_s()一定范围查找学生信息edt()修改学生信息main()主函数四、数据结构设计 此程序运用多种条件语句,主体采用的是动态数组、指针。系统的设计采用了数组语句、选择语句和循环语句,在需要处理大量同类数据时,这样就使程序书写更加简洁。程序使用了布尔函数。选择语句多采用if多分支选择结构与switch语句。首先计算switch表达式,然后在caes子句中寻找值相等的常量表达式,并以此为入口符号,由此开始顺序执行。循环语句采用了for语
11、句等、do-while语句,for语句用于已知循环次数的循环结构,括号中的三个量分别用来表示循环变量初值、循环终值和循环增量。do-while语句先循环后判断, Break语句在switch语句中,保证多分支情况的正确执行,在循环语句中,强制终止本层循环。保存和读取函数是典型的函数功能,一个程序是由若干个函数组成的,保存和读取函数是和其他函数互相调用的再有使用有关类的设计,学生缺课信息类和有关信息排序类,如下:class record /学生缺课信息类public:void set(string d,int cno,string c,string s,int type)date.assign(
12、d);/日期cname.assign(c);/课程名字sname.assign(s);/学生姓名this-cno=cno;/对缺课类型的选择 为int型this-type=type;/缺课类型void set(record re)date.assign(re.date);cname.assign(ame);sname.assign(re.sname);this-cno=o;this-type=re.type;string date,cname,sname;int cno,type;class records /实现学生旷课情况排序的类public:records() /构造函数r=new re
13、cord100;n=0;void order_s() /姓名的排序int i; int j;string *s=new stringn;int *c=new int n;s0.assign(r0.sname);c0=1;int k=1,flag;for( i=1;in;i+)flag=0;for( j=0;jk;j+)if(ri.sname=sj)cj+;flag=1;break;if(!flag)sk=ri.sname;ck+=1;for(i=1;i0;j-)if(cjcj-1)int tmp=cj;cj=cj-1;cj-1=tmp;string stmp=sj;sj=sj-1;sj-1=s
14、tmp;cout旷课学生姓名t旷课次数endl;for(i=0;ik;i+)coutsittciendl;void order_c() /课程排序int i,j;string *s=new stringn;int *c=new int n;s0.assign(ame);c0=1;int k=1,flag;for( i=1;in;i+)flag=0;for(j=0;jk;j+)if(ame=sj)cj+;flag=1;break;if(!flag)sk=ame;ck+=1;for(i=1;i0;j-)if(cjcj-1)int tmp=cj;cj=cj-1;cj-1=tmp;string stm
15、p=sj;sj=sj-1;sj-1=stmp;cout课程名t旷课人次endl;for(i=0;ik;i+)coutsitciendl;record *r;int n; 把所有的学生记录都保存到一个文件里面,然后根据需要再将里面需要查找的元素进行查找,相应的排序可能就是将他们尽可能压进关联式容器map,有的部分就压入set里面,这些都是根据模块的功能来选定的。可以这么说,选择好合理的数据结构查找与排序就可以一劳永逸了。这点在后面部分会有详细的说明。还有就是对各功能子函数的编写应用。五、类设计系统中主要涉及了两个类: 一个是class record /关于学生考勤基本信息类 另一个是class
16、records/实现学生旷课情况排序的类六、主要算法设计 关键算法:旷课情况的排序:class records/实现学生旷课情况排序的类public:records() /构造函数r=new record100;n=0;旷课记录的修改:cout请输入要修改缺课记录的学生姓名: tmp;t1.assign(tmp);for(i=0;in;i+)if(r-ri.sname=t1)flag=7;break;if(!flag)cout查无此学生!ri.date;t2=r-o;t3=r-ame;t4=r-ri.sname;t5=r-ri.type;旷课项目的修改! cout请输入要修改的项目:n(1.缺
17、课日期 2.缺课节次 3.缺课名称 4.学生姓名 5.缺课类型 6.全部) flag;switch(flag)case 1:goto e1;case 2:goto e2;case 3:goto e3;case 4:goto e4;case 5:goto e5;case 6:goto e1;default:goto e0; 用到的知识点有:函数的作用域、函数的调用、数组赋值、函数循环、以及类的定义,另外还用到了for函数、getch函数、switch函数、case函数、default函数等等。七、主要代码第一部分:学生考勤管理系统#include stdlib.h#include hanshus
18、hixian.h#include record.h#include #include #include #include using namespace std;#include record.hint main()c1: /主菜单实现 system(cls); cout *endl; cout * 欢迎访问学生考勤管理系统 *endl; cout *endl; cout * 系统主菜单: 1.显示所有学生的缺课记录 *endl;cout * 2.录入学生的缺课信息记录 *endl; cout * 3.查询某个学生的缺课情况 *endl; cout * 4.修改某个学生的缺课记录 *endl;
19、 cout * 5.删除某个学生的缺课记录 *endl; cout * 6.统计某段时间内旷课情况 *endl; cout * 7. 退出系统 *endl; cout *endl; coutO(_)O 请选择你所需要的操作 O(_)O: chose;if(chose=7)exit(0);records *r=new records();rd(r);switch(chose)case 1:pri(r);break;case 2:input(r);break;case 3:search(r);break;case 4:edt(r);break;case 5:del(r);break;case 6:
20、search_s(r);break;default:goto c2;cout是否返回主菜单? (y/n)你的选择: yn;if(yn=y)goto c1;else if(yn=n)exit(0);else goto c3;return 0;第二部分:record.h (类的设计部分)#include #include using namespace std;#ifndef record_class#define record_classclass record /关于学生考勤基本信息类public:void set(string d,int cno,string c,string s,int
21、type)date.assign(d);cname.assign(c);sname.assign(s);this-cno=cno;this-type=type;void set(record & re)date.assign(re.date);/assign可以避免不必要的内存分配,可以提高效率cname.assign(ame);sname.assign(re.sname);this-cno=o;this-type=re.type;string tostr()string s;char tmp3;s.assign(date);itoa(cno,tmp,10);s.append(#);s.app
22、end(tmp);/直接添加另一个完整的字符串s.append(#);s.append(cname);s.append(#);s.append(sname);itoa(type,tmp,10);s.append(#);s.append(tmp);return s;string date;string cname;string sname;int cno;int type;#endif record_class#ifndef records_class#define records_classclass records/实现学生旷课情况排序的类public:records() /构造函数r=ne
23、w record100;n=0;void order_s() /姓名的排序int i; int j;string *s=new stringn;int *c=new int n;s0.assign(r0.sname);c0=1;int k=1,flag;for( i=1;in;i+)flag=0;for( j=0;jk;j+)if(ri.sname=sj)cj+;flag=1;break;if(!flag)sk=ri.sname;ck+=1;for(i=1;i0;j-)if(cjcj-1)int tmp=cj;cj=cj-1;cj-1=tmp;string stmp=sj;sj=sj-1;sj
24、-1=stmp;cout旷课学生姓名t旷课次数endl;for(i=0;ik;i+)coutsittciendl;void order_c() /课程排序int i,j;string *s=new stringn;int *c=new int n;s0.assign(ame);c0=1;int k=1,flag;for( i=1;in;i+)flag=0;for(j=0;jk;j+)if(ame=sj)cj+;flag=1;break;if(!flag)sk=ame;ck+=1;for(i=1;i0;j-)if(cjcj-1)int tmp=cj;cj=cj-1;cj-1=tmp;string
25、 stmp=sj;sj=sj-1;sj-1=stmp;cout课程名t旷课人次endl;for(i=0;ik;i+)coutsitciendl;record *r;int n;#endif records_class第三部分:hanshushixian.h (功能子函数的实现部分)#include record.h#include #include #include #include stdlib.h#include using namespace std;void wt(records *r)/实现对文件的输出ofstream outf(data.txt);for(int i=0;in;i+
26、)outfri.tostr()endl;outf!endl;void rd(records *r)/实现对文件的输入ifstream inf(data.txt);if(inf.eof()cout记录为空!n=0;while(true)inf.getline(tmp,10,#);if(tmp0=!)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=
27、atoi(tmp);r-rr-n+.set(t1,t2,t3,t4,t5);bool timechk(string t1)int year=atoi(t1.substr(0,2).c_str();int month=atoi(t1.substr(2,2).c_str();int day=atoi(t1.substr(4,2).c_str();if(!(t1.length()=6&year0&year0&month0&day32)cout日期录入有误! 请重新录入: endl;return false;else return true;void input(records *r)/录入学生的缺课
28、记录string t1,t3,t4;int t2,t5,flag=0;char yn;cout录入一条学生缺课记录:endl;/endl表示终止一行并刷新缓冲区m1:cout请输入缺课日期: (例如110627) t1;if(!(timechk(t1)goto m1;m2:cout请输入缺第几节课: t2;if(t210)cout节次录入有误! 请重新录入: endl;goto m2;cout请输入缺课名称: t3;cout请输入缺课学生姓名: t4;m3:cout请输入缺课类型: (1.迟到 2.早退 3.请假 4.旷课) t5;if(t54)cout类型输入有误! 请重新录入: endl;
29、goto m3;for(int i=0;in;i+)if(r-ri.date=t1&r-o=t2&r-ame=t3&r-ri.sname=t4&r-ri.type=t5)cout该条记录已存在,是否添加为新记录? (y/n) yn;if(yn=y)break;else if(yn=n)goto n2;else goto n1;r-rr-n+.set(t1,t2,t3,t4,t5);n2:cout是否继续输入? (y/n) yn;if(yn=y)goto m1;else if(yn=n)cout保存修改? (y/n) yn;if(yn=y)wt(r);else return;else goto
30、n3;void prione(record r)coutr.datettotamettr.snamettflush;switch(r.type)case 1:cout迟到endl;break;case 2:cout早退endl;break;case 3:cout请假endl;break;case 4:cout旷课n=0)cout记录为空!endl;return;coutn序号t缺课日期 节次t课程名称t学生姓名t缺课类型endl;for(int i=0;in;i+)coutitri);void edt(records *r)/修改学生信息int i;if(r-n=0)cout记录为空!endl
31、;return;cout请输入要修改缺课记录的学生姓名: tmp;t1.assign(tmp);for(i=0;in;i+)if(r-ri.sname=t1)flag=7;break;if(!flag)cout查无此学生!ri.date;t2=r-o;t3=r-ame;t4=r-ri.sname;t5=r-ri.type;cout请输入要修改的项目:n(1.缺课日期 2.缺课节次 3.缺课名称 4.学生姓名 5.缺课类型 6.全部) flag;switch(flag)case 1:goto e1;case 2:goto e2;case 3:goto e3;case 4:goto e4;case
32、 5:goto e5;case 6:goto e1;default:goto e0;e1:cout请输入缺课日期: (例如080612) t1;if(flag!=6)goto e6;e2:cout请输入缺第几节课: t2;if(flag!=6)goto e6;e3:cout请输入缺课名称: t3;if(flag!=6)goto e6;e4:cout请输入缺课学生姓名: t4;if(flag!=6)goto e6;e5:cout请输入缺课类型: (1.迟到 2.早退 3.请假 4.旷课) t5;e6:r-ri.set(t1,t2,t3,t4,t5);char yn;cout保存修改? (y/n)
33、 yn;if(yn=y)wt(r);else return;void del(records *r)/删除学生信息if(r-n=0)cout记录为空!endl;return;cout请输入要删除的记录的序号: (输入-1删除全部) flag;if(flagr-n-1&flag-1)cout不存在所要删除的记录!n=0;elsefor(int i=flag;in-1;i+)r-ri.set(r-ri+1);r-n-;char yn;cout保存修改? (y/n) yn;if(yn=y)wt(r);else return;void search(records *r)/查找学生信息if(r-n=0)cout记录为空!endl;return;