学生考勤系统课程设计_第1页
学生考勤系统课程设计_第2页
学生考勤系统课程设计_第3页
学生考勤系统课程设计_第4页
学生考勤系统课程设计_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、课程设计题目:1、课程设计名称:学生考勤系统。2、课程设计内容: 对学生考勤信息的统计与管理,可以分为若干个模块来实现,如:理论 课考勤、实验课考勤、班级或院系会议考勤、课外活动考勤等等。缺勤的情况可以按不同的类型(缺席、迟到、早退、请假)设置不同的权值。系统要求能对 考勤信息进行数据录入、情况的统计、信息的输出显示等等。学生也可以根据自己的理解,去考 虑更多的功能,并给予实现。能按各种条件进行组合查询和数据统计,并能按指定顺序进行格式 化输出。对数据的新增,修改及删除应注意满足相应的约束条件。二、问题的分析:在进行问题的分析前,我们应该知道该问题的任务和需求。任务和需求如下: 考勤信息记

2、录了学生的在校所有学习生活的出勤情况,它包括:缺席日期、 缺席类型。如:若是缺课,则应记录缺课日期、第几节课、课程名称、学生学号、 学生姓名、缺课类型(迟到、早退、请假及旷课) 。试设计一考勤管理系统,使之能提供以下功 能:1 、录入学生的缺勤记录;2 、修改某个学生的缺勤记录;3 、查询某个学生的缺勤情况;4 、统计某段时间内, 缺勤学生学号及缺勤次数, 按缺勤权值统计学生的负分值, 并能进行排序;5 、统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序;6 、系统以菜单方式工作。 具体要求如下:1 、 采取模块化方式进行程序设计, 要求程序的功能设计、 数据结构设计及整体结

3、构设计合理。 学生也可根据自己对题目的理解增加新的功能模块(视情况可另外加分) 。2 、 系统以菜单界面方式(至少采用文本菜单界面,如能采用图形菜单界面更好)工作,运行 界面友好,演示程序以用户和计算机的对话方式进行。3 、 程序算法说明清晰,理论分析与计算正确,运行情况良好,实验测试数据无误,容错性强 (能对错误输入进行判断控制) 。4 、 编程风格良好 (包括缩进、 空行、 适当注释、 变量名和函数名见名知意, 程序容易阅读等) 所以进行问题的分析时我们应该进行以下工作:(1)备工作:a 、仔细阅读课程设计任务书,明确实验设计的目的、实验内容、实验要求、所需知识点等。b、阅读教材及相关材料

4、,更深入的了解所需知识点,并与其它知识点能够融会贯通,加深 对各知识点的了解,使得在进行课程设计的时候能够更好的运用各知识点。当看到本设计所设计的知识点时,心里真的很害怕,因为其中有很多的知识点我都不知道, 所以在课程设计开始的第一周我基本没做出什么。后来经过翻阅资料,问题被逐一解决。(2 )设计整体框架: 由实验设计内容、目的与要求来分析该如何简略设计该实验的总体框架, ,然后一步步完善整个程序。a 、分析实验题目,确定需要用到对象,分析如何使用对象,并分配好成员函数和成员数据。b、分析实验要求的功能,按功能确定需要用到的外部函数。c、大概想想是不是需要其他的外部函数来辅助外部函数来实现实验

5、要求的功能。d、想想主函数如何实现。(3) 、完善函数:按实验设计的总体框架一步步来编写函数。对于暂时想不到的函数先跳过 或查书,一步步写完函数。( 4)、程序实现思路: 开始是设计程序的界面,了解需要实现的功能模块。对数据结构的选择写出的界面,现在需要做的事情其实就是要将所有的菜单功能进行实现。可以考虑将用户输 入每个学生的记录用一个结构体里面,即:struct Student_info std:string date;/缺课日期std:string class_num; /第几节课std:string course_name; /课程名称std:string stu_name;/学生姓名s

6、td:string non_attendance_type; /缺课类型;最后所有的学生记录都保存到一个 vector 里面,然后根据需要再将里面需要查找的元素进 行查找,相应的排序可能就是将他们尽可能压进关联式容器map,有的部分就压入 set里面,这些都是根据模块的功能来选定的。对功能的实现1、录入学生的缺课记录首先提示用户按照正确的格式进行学生缺课记录的录入,这个步骤比较简单,只需要不断地 将记录的每个数据项存入结构体对应的成员中。2、修改某个学生的缺课记录首先必须查找到你所需要修改的那位的学生全部缺课记录。这个模块不需要定义新的结构 体。在修改前当然要检查记录是否为空了,不为空的话,可

7、以设置下面这五个菜单供用户选择:1 、缺课日期 2、第几节课 3、课程名称4、学生姓名 5、缺课类型 6、退出修改程序并返回系统主菜单修改很简单,仅需要对该学生的某个部分进行替换即可。采用 switch 语句很快就解决。 J 最后实现对所选记录的修改,完成后更新原有的学生记录。3、查询某个学生的缺课情况查询某个学生的缺课情况 , 这个模块是在以下这个函数中实现的:find_student_absent(vector& students, string& name)其中name为用户本人输入的学生姓名,这样可以很快在vector里面找到该学生的所有的记 录。为了达到查询结果按照日期升序排序,同一

8、天内按照所缺课程的时间升序排序的目的,那就 需要选择一个数据结构 need 来保存查找得到的该学生的所有缺课记录,即:mapstring, mapstring, vector need这个数据结构看起来有点复杂,其实非常好用。第一个索引值string 类型保存学生的缺课的日期,第二个 map的键值则为该学生当天在第几节课缺课,而vector用来保存该学生其余信息,那么得到的 need 保存的记录已经满足了查询结果按照日期升序排序,同一天内按照所缺课 程的时间升序排序的要求,只需要按格式输出这些记录即可。4、统计旷课学生姓名及旷课节数和有学生旷课的课程及旷课人次这两个模块之所以放在一起讨论,是由

9、于它们其实功能都是大同小异的。可以考虑用泛型编 程来解决。不过我在源程序中并没有这么做,而是写成两个函数模块。这个两个模块根据课程名称来找出所有与“旷课”这个字符串有关的记录先暂存到一个 vector 。考虑到 vector 远远不能满足客户的要求,那么可以考虑新建一个数据结构来保存这些 记录,同时满足要求,即:mapint, set need; /将统计出来的结果保存属于这段时间的学生旷课记录其中set保存的是旷课学生姓名(有学生旷课的课程),map的键值为学生旷课节数(旷课人 次)。最后会发现一个小问题,输出的结果并不是用户需要的结果先按旷课节数(旷课人次)降序 排序,旷课节数相同的学生按

10、姓名(有学生旷课的课程)升序排序, 解决的办法很简单,只需要再输出的时候定义一个迭代器即可解决,即:mapint, set :const_reverse_iterator mapset_it = need.rbegin();该功能得以解决。5、退出系统三、算法的设计:根据任务要求,我定义了 5 个子函数和一个结构体,分别将五个字函数分为五个模块。 第一个模块:输入学生的缺课记录。在该模块中,调用 s.clear() 来清空 s 的记录,用 in.clear();/ 将 记 录 的 错 误 状 态 恢 复 正 确 , 以 继 续 读 取 记 录 , 用 bool is_empty(vector&

11、 s)/ 判断输入学生的记录是否为空,为空则返回真,用 bool compare(Student_info& x,Student_info& y)/ 按照时间排序 , 若日期相等则看课程时间,然后 再根据 bool time(const Student_info& stud,int y1,int m1,int d1,int y2,int m2,int d2)/ 筛选符合输入时间段的数据。第二个模块:修改某个学生的缺课情况。首先清空MAP容器,根据ix2=s_ name.fi nd( name); /符合名字要求的数据,用 for(ix2=s_name.begin();ix2!=s_name.e

12、nd();ix2+)/将改写后的数据放入 vector 容器中。第三个模块: 查找某学生的缺课情况。 用 bool compare2(Search_struct& x,Search_struct& y)/ 按照次数排序 , 次数相等的则按照名字排序。第四个模块:查找某段时间内旷课学生姓名及旷课节数。 第五个模块:查找某段时间内旷课的课程及旷课人次。四、上机调试过程: 本次课程设计总体上感觉比之前做过的实验综合性比较强。在这里我主要总结一下我设计这个学生考勤管理系统的心得和在编译程序的过程中遇到的问题以及解决的办法。为了使得程序的编写更加有条理,阅读更加明了,在写每个模块的时候都将自己的思路写在

13、 每个函数的第一行,告诉自己我这个函数将要做的是什么事情。下面实对调试过程中遇到的一些小收获:编译时发现这样的小错误:1d:my documentsvisual studio 2005projectscourse1course1main.cpp(69): errorC2360: initialization of name is skipped by case label最后得到的解决答案实:原来在 case 语句中,是不允许声明变量的。初次使用 const_reverse_iterator 的总结 :运行的时候出现“ map set iterator not incrementable”这样

14、的运行终止错误问题的结局:经过检验查出是 const_reverse_iterator原因是: mapint, set :const_reverse_iterator mapset_it = need.rbegin();for(; mapset_it != need.rend(); mapset_it-)mapset_it 的操作不能是 mapset_it- 操作 ,而应该是 mapset_it+五、测试结果及其分析:如: 1. 录入学生的缺课情况: 2008-2-3 1-2 林 C+ 旷课2008-2-4 3-4 夏 历史 早退如果再按 4:查找某段时间内旷课学生姓名及旷课节数。 会显示出如

15、下结果: 时间段, 2008-2-11-2.至 2008-2-28 ,旷课姓名:林,旷课节数:六、参考文献:1 .郑莉 等编著C+语言程序设计(第三版)北京:清华大学出版社2 .郑莉等编著C+语言程序设计(第三版)学生用书北京:清华大学出版社3 .刘振安 等编著C+程序设计课程设计机械工业出版社4 .吴乃陵 等编著C+程序设计北京:高等教育出版社5 .李春葆 等编著C+程序设计学习与上机实验指导北京:清华大学出版社七、附录 源程序:#include #include #include #include #include #include #include #include using name

16、space std;struct Student_infoint year,month,day,lesson1,lesson2;std:string course,name,type;std:istream& read(std:istream&);istream& Student_info:read(istream& in) inyearmonthdaylesson1lesson2coursenametype; return in;istream& read_record(istream& in,vector&s)/ 第 一 个 模 块 输入学生的缺课记录Student_info record

17、;s.clear();/ 调用 s.clear() 来清空 s 的记录while(record.read(in)s.push_back(record);in.clear();/ 将记录的错误状态恢复正确,以继续读取记录return in; bool is_empty(vector& s)/ 判断输入学生的记录是否为空,为空则返回真return s.empty();bool compare(Student_info& x,Student_info& y)/ 按照时间排序 , 若日期相等则看课程时 间 if(x.year=y.year&x.month=y.month&x.day=y.day) re

18、turn x.lesson1y.lesson1;else if(x.year=y.year&x.month=y.month&x.day!=y.day)return x.dayy.day;else if(x.year=y.year&x.month!=y.month)return x.monthy.month;else return x.yeary.year;bool time(const Student_info& stud,int y1,int m1,int d1,int y2,int m2,int d2)/ 筛选符合输入时间段的数据if (y1 = stud.year & stud.mont

19、h = m1 & stud.day d2)return 0;else if (y1 = stud.year & stud.month m2)return 0;else if (y1 stud.year | y2 stud.year)return 0;elsereturn 1;课情况 if(!is_empty(s)int n,m,j,k;mapstring,vector s_name;mapstring,vector :iterator ix2;vector:iterator ix,iter,itera;string name; 定义这些参数和迭代器必须在SWITHC外卜,不然它可能被忽略跳过w

20、hile(true)cout*endl;cout * 1. 请输入你要修改缺课记录的学生姓名*endl;cout*endl;cout*2.返回 上 一+k-菜*endl;cout*endl;coutn;if(n=1)s_name.clear(); 清空 MAP容器for(ix=s.begin();ix!=s.end();+ix)s_name(*ix).name.push_back(*ix);s.clear();coutname;coutendl;if(s_name.find(name)!=s_name.end()ix2=s_name.find(name); /找到符合名字要求的数据 , 并显示

21、出for(iter=(*ix2).second.begin();iter!=(*ix2).second.end();+iter)cout(*iter).year-(*iter).month-(*iter).dayt; cout(*iter).lesson1-(*iter).lesson2;coutt(*iter).courset(*iter).namet(*iter).typeendl;itera=(*ix2).second.begin();coutj;for(k=0;k!=j-1;+k) +itera;coutendl;*cout * 需 要 更 改 的 项 目 *endl;cout * *

22、endl;cout * 1 日期 2 节次 3 课程名称 4 姓名 5 缺课类型 6 返回上一级 *endl;cout * *endl;coutendl;*coutm;switch(m)case 1:cout(*itera).year(*itera).month(*itera).day;break;case 2:cout(*itera).lesson1(*itera).lesson2; break;case 3: cout(*itera).course;break; case 4: cout(*itera).name;break; case 5: cout(*itera).type;break

23、; case 6: break;default:cout 你的选择错了,请看清楚 !second.begin();iter!=ix2-second.end();iter+)s.push_back(*iter);elsecout 没有这个学生的缺课记录 endl;coutendl;break;else if(n=2)return ;elsecout 你的选择错了,请看清楚 !endl;elsecout 记录为空,没有学生的缺课记录 !endl;void Search_record(vector& s)/ 第三个模块 缺课情况 if(!is_empty(s)int i;vector:iterato

24、r iter; mapstring,vector :iterator it1; mapstring,vector s_name; mapstring, vector :iterator itera; vector:iterator it;vector 容器查找某学生的string name; while(true)cout*endl;cout *endl;cout * 1 输入你要查询的学生姓名 2 返回上一级 *endl; cout*endl;cout*endl;couti;if(i=1)s_name.clear();for(it=s.begin();it!=s.end();+it)s_na

25、me(*it).name.push_back(*it);for(itera=s_name.begin();itera!=s_name.end(); +itera)sort(itera-second.begin(),itera-second.end(),compare); coutname;coutendl;if(s_name.find(name)!=s_name.end()it1=s_name.find(name);for(iter=(*it1).second.begin();iter!=(*it1).second.end();+iter) cout(*iter).year-(*iter).m

26、onth-(*iter).dayt; cout(*iter).lesson1-(*iter).lesson2;coutt(*iter).courset(*iter).namet(*iter).typeendl; elsecout 没有这个学生 .endl;coutendl;else if(i=2)return ;elsecout 对不起,没有这个选项 !endl;elsecout 没有这个学生的缺课记录 endl;struct Search_structstring name,course;int times;/ 定义另一个结构模块, 次数相等的则按照bool compare2(Search_

27、struct& x,Search_struct& y)/ 按照次数排序 名字排序if(x.times=y.times)return y.times;查找某段时void Search_s_t(vector& std)/ 第四个模块 间内旷课学生姓名及旷课节数if(!is_empty(std)vector:iterator it;vector:iterator itera; map:iterator iter;vector vec;int y1,m1,d1,y2,m2,d2;map ret;cout 请输入你要查找的一个时间段 (y1 m1 d1 y2 m2 d2): y1m1d1y2

28、m2d2;for(it=std.begin();it!=std.end();+it) if(time(*it,y1,m1,d1,y2,m2,d2) retit-name+=(it-lesson2-it-lesson1+1);for(iter=ret.begin();iter!=ret.end();iter+)Search_struct tmp;=iter-first;tmp.times=iter-second;vec.push_back(tmp);sort(vec.begin(),vec.end(),compare2); for(itera=vec.begin();itera!

29、=vec.end();itera+) coutnamettimesendl;elsecout 对不起,没有你要查找的记录 !endl;查找某段时void Search_c_t(vector& std)/第五个模块 -间内旷课的课程及旷课人次if(!is_empty(std)vector:iterator it;vector:iterator itera; map:iterator iter; vector vec; int y1,m1,d1,y2,m2,d2; map ret;cout 请输入你想要查找的时间段 (y1 m1 d1 y2 m2 d2): y1m1d1y2m2d2;for(it=std.beg

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论