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

下载本文档

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

文档简介

1、蒇一需求分析肄功能需求:莁 1 、录入学生的缺勤记录;芀 2 、修改某个学生的缺勤记录;薆 3 、查询某个学生的缺勤情况;蒄 4 、统计某段时间内,缺勤学生学号及缺勤次数,按缺勤权值统计学生的负分值,并能进行排序;膁 5 、统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序;羈 6 、系统以菜单方式工作羈数据需求袃 本系统主要涉及的数据有学生缺课信息类和有关信息排序类。 学生缺课信息包括缺课时间,学生姓名,课程名称,第几节,学生迟到次数,早退次数,请假次数,旷课次数。有关信息排序类包括对课程排序和对姓名排序。袂性能需求聿要求系统具有可靠性,速度要快肇二、系统的主要功能薆(1)、

2、录入学生的缺课记录,函数代码void input(records *r)模块中。首先提示用户按照正确的格式进行学生缺课记录的录入,这个步骤比较简单,只需要不断地将记录的每个数据项存入结构体对应的成员中。蚂 (2) 、修改某个学生的缺课记录,函数代码 void edt(records *r) 模块中。首先必须查找到你所需要修改的那位的学生全部缺课记录。这个模块不需要定义新的结构体。在修改前当然要检查记录是否为空了,不为空的话,可以设置下面这五个菜单供用户选择: 1、缺课日期 2、第几节课 3、课程名称 4、学生姓名 5、缺课类型 6、退出修改程序并返回系统主菜单。修改很简单,仅需要对该学生的某个

3、部分进行替换即可。采用switch 语句很快就解决。最后实现对所选记录的修改,完成后更新原有的学生记录。膀(3)、查询某个学生的缺课情况,函数代码void search(records *r)模块中。达到查询结果按照日期升序排序,同一天内按照所缺课程的时间升序排序的目的,膅 (4) 、统计,函数代码为 void order_c() 和 void order_s() 的类模块中。其中实现对课程排序和对学生姓名的排序。羆三、流程图莃学生考勤系统结构图:羈薇蒅肃罿蚆袄袃肁肈基类的数据成员和成员描述芄薄 record袈 String date,cname,sname;膆 int cno,type;蚃

4、void set();肀 string tostr();衿芅类名 / 函数名膂描述袀类名 / 函数名蚇 record袆基类薁 edt()螆 records芅实现学生旷课情况排序芁 del()的类膈 wt/rd()蚅实现对文件的输入和输肂 search()出蒅 input()芃录入学生的缺课记录羁 search_s ()羁描述螈修改学生信息蝿删除学生信息肀查找学生信息袇一定范围查找学生信息袇 edt ()螂修改学生信息螁 main()羈主函数羆四、数据结构设计膂 此程序运用多种条件语句, 主体采用的是动态数组、 指针。系统的设计采用了数组语句、选择语句和循环语句 , 在需要处理大量同类数据时 ,

5、 这样就使程序书写更加简洁。程序使用了布尔函数。选择语句多采用 if 多分支选择结构与 switch 语句。首先计算 switch 表达式,然后在 caes 子句中寻找值相等的常量表达式,并以此为入口符号,由此开始顺序执行。循环语句采用了 for 语句等、 do-while 语句, for 语句用于已知循环次数的循环结构,括号中的三个量分别用来表示循环变量初值、 循环终值和循环增量。 do-while 语句先循环后判断, Break 语句在 switch 语句中,保证多分支情况的正确执行,在循环语句中,强制终止本层循环。保存和读取函数是典型的函数功能,一个程序是由若干个函数组成的,保存和读取函

6、数是和其他函数互相调用的蒂再有使用有关类的设计,学生缺课信息类和有关信息排序类,如下:羀 class record/学生缺课信息类肄袅 public:膂 void set(string d,int cno,string c,string s,int type)螇 蒇芄羂袈薅date.assign(d);/日期cname.assign(c);/课程名字sname.assign(s);/学生姓名this-cno=cno;/对缺课类型的选择为 int型this-type=type;/缺课类型蚄 葿 void set(record re)袀 袇膃腿蚇肆date.assign(re.date);cnam

7、e.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 record100;n=0;void order_s() /姓名的排序羇薄袁蒆肆羃蚁蒇芄莃莂蕿薆int i;int j;string *s=new stringn;int *c=new int n;s0.assign(r

8、0.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=stmp;荿螅蚂莀cout 旷课学生姓名 t 旷课次数 endl;for(i=0;ik;i+)coutsittciendl;膆膇肂void order

9、_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 stmp=sj;sj=sj

10、-1;sj-1=stmp;cout 课程名 t旷课人次 endl;for(i=0;ik;i+)coutsitciendl;莇 袃 record *r;芀 int n;肀;蒅把所有的学生记录都保存到一个文件里面,然后根据需要再将里面需要查找的元素进行查找,相应的排序可能就是将他们尽可能压进关联式容器map,有的部分就压入set 里面,这些都是根据模块的功能来选定的。可以这么说,选择好合理的数据结构查找与排序就可以一劳永逸了。这点在后面部分会有详细的说明。还有就是对各功能子函数的编写应用。芃五、类设计羁系统中主要涉及了两个类:袇一个是 class record /关于学生考勤基本信息类袇另一个是

11、class 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=o;螀 t3=r-ri.c

12、name;蒆 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 5:goto e5;袇 case 6:goto e1;薅 default:goto e0;蒁 膈用到的知识点有:函数的作用域、函数的调用、数组赋值、函数循环、以及类的定义,另外还用到了

13、 for 函数、 getch 函数、 switch 函数、 case 函数、 default函数等等。莆七、主要代码莅第一部分:学生考勤管理系统蒃#include stdlib.h薀#include hanshushixian.h螆#include record.h肆#include 芀#include 蚈#include 膅#include 螆 using namespace std;莁#include record.h肁衿 int main()节蒃 c1: / 主菜单实现腿 system(cls);芈 肃 cout*endl;芀cout* 欢迎 访问学生 考勤管理 系统 *endl;芈 c

14、out*endl;螇cout* 系 统主 菜 单 :1.显 示所 有 学 生 的缺 课 记 录*endl;螃cout*2.录入 学生 的缺 课 信 息记 录*endl;芁cout*3.查询 某个 学生 的 缺 课情 况*endl;蚀cout*4. 修改 某个 学生 的 缺 课记 录*endl;膇cout*5.删除 某个 学生 的 缺 课记 录*endl;薄cout*6.统计 某段 时间 内 旷 课情 况*endl;莃cout*7. 退 出 系 统*endl;螈 cout*endl;薆芄 膀肁coutO( _)O 请选择你所需要的操作 O( _ )O: chose;if(chose=7)exit

15、(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: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;膃肂莇第二部分:

16、 record.h(类的设计部分)芅#include 羃#include 肃 using namespace std;螀羈#ifndef record_class蚃#define record_class袁袈 class record /关于学生考勤基本信息类莈蒄 public:羂 void set(string d,int cno,string c,string s,int type)芀 螇膄羃荿芇date.assign(d);cname.assign(c);sname.assign(s);this-cno=cno;this-type=type;羅 螁 void set(record & r

17、e)螁 蚆蚅袂袀肅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.append(tmp);/直接添加另一个完整的字符串s.append(#);s.append(cname);s.append(#)

18、;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_class薁蕿 class records/ 实现学生旷课情况排序的类肈肄 public:薂records() /构造函数羁 蒈袅莀聿袇薅蒁膈莆莅r=new record100;n=0;void or

19、der_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=

20、sj;sj=sj-1;sj-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+

21、=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=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

22、 莀 using namespace std;聿袇薅 void wt(records *r)/实现对文件的输出蒁膇 ofstream outf(data.txt);莆 for(int i=0;in;i+)肁 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(

23、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-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.

24、substr(4,2).c_str();莇 if(!(t1.length()=6&year0&year0&month0&day32)袄 蒅肀cout 日期录入有误 !请重新录入 : endl;return false;蚀 薇 else return true;羁肂袈 void input(records *r)/录入学生的缺课记录羇蚂string t1,t3,t4;衿 int t2,t5,flag=0;羆 char yn;莆cout 录入一条学生缺课记录 :endl;/endl表示终止一行并刷新缓冲区蒂 m1:羀cout 请输入缺课日期 : ( 例如 110627) t1;袅 if(!(tim

25、echk(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;goto m3;芆 羄 for(int i=0;in;i+)螁if(r-ri.date=t1&o=t2&ame=t3&r-

26、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 n3;膃蚁罿 void prione(reco

27、rd r)蒆袃 coutr.datett蚂 ot肈 amett羅 r.snamett薃 flush;蒀 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

28、(records *r)/修改学生信息腿蒆int i;芅蚀if(r-n=0)薈 芆 cout 记录为空 !endl;莆 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=o;膃 t3=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

温馨提示

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

评论

0/150

提交评论