《学生考勤管理系统课程设计报.docx》由会员分享,可在线阅读,更多相关《学生考勤管理系统课程设计报.docx(28页珍藏版)》请在三一办公上搜索。
1、学生考勤管理系统课程设计报南昌航空大学 面向对象程序课程设计(c+) 题目:班级考勤管理系统 院系 : 软件学院 班级 : 668 学号 : 668 姓名 : 帅哥 一需求分析 功能需求: 1录入班级信息; 2. 显示班级信息; 3. 录入学生的信息和缺勤记录; 4. 修改某个学生的信息和缺勤记录; 5. 查询某个学生的信息和缺勤情况; 6. 以文件的形式读写; 7. 系统以菜单方式工作; 数据需求 本系统主要涉及的数据有班级信息和学生信息及缺课信息类。班级信息包括班级的学号,班级的人数,学生缺课信息包括学生姓名,学号,专业,课程名称,缺课节次,学生缺课类型。 二、系统的主要功能 (1). 录
2、用班级信息记录,在class clas中成员函数void set实现,按照用户提示进行操作写入类中,显示在void display中。 (2). 录入学生的信息和缺课记录,在class student中成员函数代码void input实现中。首先提示用户按照正确的格式进行学生缺课记录的录入,这个步骤比较简单,只需要不断地将记录的每个数据项存入结构体对应的成员中。 (3)、修改某个学生的缺课记录,在class student中成员函数void edt实现。首先必须查找到你所需要修改的哪位的学生全部缺课记录。可以设置下面这五个菜单供用户选择:1、学生学号2、学生姓名3、学生班级4、缺课课程5、缺课
3、类型6、退出修改程序并返回系统主菜单。修改很简单,仅需要对该学生的某个部分进行替换即可。最后实现对所选记录的修改,完成后更新原有的学生记录。 (4)、查询某个学生的缺课情况,在class student中成员函数void search实现。可以对学生的学号进行查询,并输出学生信息和考勤的信息。 (5)、学生信息的保存运用文件来保存,在class student中成员函数 void wt(int &i)和 void rd中实现。 三、类的设计 本系统设计了三个大类,一个是班级信息类,实现班级信息的录用,显示。另一个学生基本信息设置类,实现学生信息课程的录用。最后一个学生考勤操作类实现考勤信息查询
4、,显示,修改,保存等。在主函数中实现桌面菜单操作。 四、流程图 2 学生考勤系统结构图: 基类的数据成员和成员描述 Class clas 班级信息基类 int cnum,pnum; 班级数据成员 void setc; 录用班级信息 void display; 显示班级信息 继承 Class student 学生信息课程类 int snum ,cnum,type; char cname5,sname5,lname5 学生课程数据成员 void set;传递学生信息 Class records 实现学生信息和考勤情况操作的类 clas *p; student *r; 基类对象的指针 static
5、int n=0; void Input 录用学生课程考勤信息 void wt/rd/wdt 信息以文件的形式保存 void pri 显示学生课程考勤信息 void edt 修改学生考勤信息 void del 删除学生考勤信息 void search 查询学生考勤信息 最后为 main 3 五、类具体设计实现及主函数实现 此程序运用多种条件语句,主体采用的是动态对象数组、指针。系统的设计采用了数组语句、选择语句和循环语句,在需要处理大量同类数据时,这样就使程序书写更加简洁。程序。选择语句多采用if多分支选择结构与switch语句。首先计算switch表达式,然后在caes子句中寻找值相等的常量表
6、达式,并以此为入口符号,由此开始顺序执行。switch语句中,保证多分支情况的正确执行,在循环语句中,强制终止本层循环。保存和读取函数是典型的函数功能,一个程序是由若干个函数组成的,保存和读取函数是和其他函数互相调用的。 1. 编写头文件(类的声明写一个文件“ClaStu.h”) / * /头文件 ClaStu.h /* #include #include #include #include #include const int max=15; class clas /班级信息基类 public: void setc; /录用班级信息 void display; /显示班级信息 int cnu
7、m; /班级编号 int pnum; /班级人数 ; class student /学生信息课程类 public: void set(int b, char* s,char* l,char* c,int cno,int type); /传递学生信息 char cname5,sname5,lname5; /定义缺课课程名称,学生称名,学生类别名称 int snum ,cno,type; /定义学生学号,缺课节次,缺课类型 ; class records:public student ,clas /实现学生信息和考勤情况操作的类 4 public: records /构造函数 r=new stud
8、entmax; /动态建立两个基类对象数组,返回两个对象指针 p=new clasmax; void input; /录用学生课程考勤信息 void wt(int &i); / 信息以文件的形式保存 void rd; / 信息以文件的形式读出 void pri; / 显示学生课程考勤信息 void search; / 查询学生考勤信息 void del; / 删除学生考勤信息 void edt; / 修改学生考勤信息 void wdt(int &n); / 修改信息以文件的形式保存 student *r; / 声明两个对象指针 clas *p; static int n; / n为静态变量记录
9、创建对象的个数, ; int records:n=0; 2. 编写cpp文件(类的实现) 自定义的包含文件一般都放在自己指定的目录中,所以在引用他们时,采用双引号以通知c 编译器在用户指定的目录下和当前目录下寻找包含文件。 #include”ClasStu.h” void clas:setc / 录用班级信息 cout输入班级学号:cnum; cout输入班级人数:pnum; void clas:display /显示班级信息 cout班级学号:cnumendl; cout班级人数:pnumsnum=b; /学生学号 this-cno=cno; /缺课节次 this-type=type; /缺
10、课类型 void records: wt(int & i) / 信息以文件的形式保存 ofstream outf; /声明一个流对象 if(i0) / 判断是否是第一个数据,如果不是以追加文件尾的方式存储 outf.open(data.txt,ios:app); else outf.open(data.txt,ios:out);/创建一个文件并以文件的方式存储 outfsetw(6)n; / 以左边对齐6个字节方式存储 outfsetw(6)ri.snumsetw(6)osetw(6)ri.typesetw(1); outfsetw(7); outfri.sname; outfsetw(7);
11、 outfri.lname; outfsetw(7); outfn; ame; i+; void records:wdt( int &i) /修改信息以文件的形式保存 ofstream outf(data.txt); /同上面原理相同不在介绍 6 outfsetw(6)n; outfsetw(6)ri.snumsetw(6)osetw(6)ri.typesetw(1); outfsetw(7); outfri.sname; outfsetw(7); outfri.lname; outfsetw(7); ame; outf.close; void records:input /学生考勤系统的录用
12、模块 for(int i=0;i100;i+) char t15,t25,t35; /创建字符数组保存输入的学生信息和课程 int t4,t5,t6; char yn; cout录入一条学生详细考勤记录:endl; cout输入学生的学号,学生的姓名,专业,缺课课程,缺课节次和缺课类别。t4t1t2t3t5t6; records:n+; coutendl; ri.set(t4,t1,t2,t3,t5,t6); coutn; char y; cout保存? (y/n) y; if(y=y)wt(i); cout是否继续输入? (y/n) yn; if(yn=y) continue; else b
13、reak; void records:pri /学生考勤系统显示模块 if(n=0) cout -文件记录为空-endl-请先输入数据保存在进行此次操作-endl; return; 7 数 coutri.snumt; coutri.snamet; coutri.lnamet; amettt; ott; switch(ri.type) /缺课信息以整形数据保存,以字符输出 case 1:cout迟到endl;break; case 2:cout早退endl;break; case 3:cout请假endl;break; case 4:cout旷课endl;break; default:; voi
14、d records:edt /学生考勤系统修改模块 cout请输入要修改缺课记录的学生的学号: tnum; for( i=0;in;i+) if(ri.snum=tnum) cout有您要查询的学生; break; if(!flag) cout查无此学生!endl; return ; t1=ri.snum; strcpy(t2,ri.sname); 8 cout学号 t姓名 t专业 t缺课课程t,缺课节次t缺课类别。endl; for(int i=0;in;i+) /学生缺课信息数据输出,n为静态变量记录创建对象的个 strcpy(t3,ri.lname); strcpy(t4,ame); t
15、5=o; t6=ri.type; cout请输入要修改的项目:n(1.学生学号 2.学生姓名 3.学生专业 4.缺课科目 5.缺课次数 6.缺课类型km; switch(km) /控制修改的选项 case 1: cout请输入修改的学生学号: t1; break; case 2: cout请输入修改的学生姓名: t2; break; case 3: cout请输入修改的缺课课程: t3 ; break; case 4: cout请输入修改的学生专业: t4; break; case 5: cout输入修改的缺课课程次数:t5; break; case 6: cout请输入缺课类型: (1.迟到
16、 2.早退 3.请假 4.旷课) t6; break; ri.set(t1,t2,t3,t4,t5,t6); /输入学生信息到对象中去 char yn; cout保存修改? (y/n) yn; if(yn=n) wt(i); else return; void records:del/学生系统删除模块 int i; 9 cout请输入要删除的记录的学号序号: (输入-1删除全部) flag; for( i=0;in;i+) if(ri.snum=flag) cout有您要删除的学生; records: n-; char yn; cout保存修改? (y/n) yn; if(yn=n) wdt(
17、 n); break; if(!k) cout查无您要删除的学生!endl; return ; void records:search/学生统计模块 cout请输入要查询的学生学号: tnum; for(int i=0;in;i+) /查找学号 if(ri.snum=tnum) flag=0; if(!flag) cout找到您要查询的学生信息endl; cout学号 t姓名 t专业 t缺课课程t,缺课节次t缺课类别。endl; coutri.snumt; /输出查找的信息 coutri.snamet; coutri.lnamet; amettt; ott; switch(ri.type) 1
18、0 case 1:cout迟到endl;break; case 2:cout早退endl;break; case 3:cout请假endl;break; case 4:cout旷课endl;break; break; if(!flag) cout没有查到该学生的缺课记录! rd; c2: couttt学生班级考勤管理系统 V1.0.0endl / 主菜单设计有goto语句 endl 功能列表:endl 1.显示班级记录endl 2.录入学生的缺课记录w; if(w=1) /显示班级记录 t-p-setc; cout显示班级信息:p-display; cout是否返回q; if(q=1) got
19、o c2; Else /录入学生的缺课记录 c1: couttt学生考勤管理系统 V1.0.0endl /子菜单学生考勤管理设计 endl 功能列表:endl 1.显示所有学生缺课记录endl 2.录入学生的缺课记录endl 11 3.查询某个学生的缺课情况endl 4.修改某个学生的缺课记录endl 5.删除某个学生的缺课记录endl 6.退出系统endl 请选择: (1/2/3/4/5/6/7) cho; if(cho=7) exit(0); switch(cho) /控制学生考勤操作 case 1:t-pri;break; case 2:t-input;coutn;break; case
20、 3:t-search;break; case 4:t-edt;break; case 5:t-del; break; case 7:exit(0); cout返回功能列表? (y/n) yn; if(yn=y)goto c1; else if(yn=n) exit(0); 六、系统运行结果样例 当用户执行程序时首先会出现如下界面也是主菜单界面: 12 输入1时进入班级界面,并进行班级信息输入及显示: 按1返回上一级菜单,按2进入学生考勤系统如图: 按1显示记录并返回在按2录用学生信息如图: 13 录用后显示: 文件内的数据: 14 其他功能都一样不一一列举调试 七、结束语 本次课程设计主要使
21、用到了C+中的一些比较基本的算法,总体上感觉比之前做过的实验综合性比较强。在这里我主要总结一下我设计这个学生考勤管理系统的心得和在编译程序的过程中遇到的问题以及解决的办法。 为了使得程序的编写更加有条理,阅读更加明了,在写每个模块的时候都将自己的思路写在每个函数的第一行,告诉自己我这个函数将要做的是什么事情。这是一个很好的编程规范,值得继续发扬。 对于这次的程序的编写,花了不少时间,原因很可能是自己对C+的总体认知还不够,还有在上学期一个月对C+的学习知识量很有限,在编写调试的这个过程中很多新的语法知识都是在网上搜索的。 我学习编程一直有自己的一点想法:用任务来牵引,在实践中学习。也就是说,我
22、没有按照某种固定的顺序去学习编程,而是经常有一些小的程序想法或是想编一个满足特定功能的程序。这样刚开始几乎每次都是在对所编程序一无所知的基础上进行,由简单到复杂,一个问题一个问题地去解决。当然,很多时候我失败了,但在这过程中,我学到了很多。问题一个个地解决,知识一点点地积累,经验一点点地丰富,想法一点点地成熟,成功概率也一点点地提高 最后,通过完成编程,我达到了: 1、加深对本课程理论知识的理解,提高实际应用能力; 2、树立自身对理论联系实际的工作作风、严肃认真的科学态度; 3、进一步训练和提高自身的分析设计能力、理论计算能力、实验研究能力、外文阅读、查阅文献资料和文字表达等基本技能; 4、培
23、养自身独立分析、解决实际问题的能力,培养自身的创新意识和创新能力。 以上是用工程多文件编写的,不用工程多文件的如下,其实是一个意思但我怕有的同学不懂多文件,说调试错误,以下源代码只需复制粘贴编译运行就可。 #include #include #include #include #include const int max=15; 15 class clas public: void setc cout输入班级学号:cnum; cout输入班级人数:endl; void display cout班级学号:cnumendl; cout班级人数:pnumpnum; int cnum; int pnu
24、m; ; class student public: 16 void set(int b, char* s,char* l,char* c,int cno,int type) strcpy(cname,c); strcpy(sname,s);/ strcpy(lname,l); ; class records:public student ,clas public: this-snum=b; this-cno=cno;/ this-type=type; char cname5,sname5,lname5; int snum ,cno,type;/ records r=new studentma
25、x; 17 p=new clasmax; void input; void wt(int &i); void rd; void pri; void search; void del; void edt; void wdt(int &n); student *r; clas *p; static int n; ; int records:n=0; void records: wt(int & i) 18 ofstream outf; if(i0) outf.open(data.txt,ios:app); else outf.open(data.txt,ios:out); coutn; outfs
26、etw(6)n; outfsetw(6)ri.snumsetw(6)osetw(6)ri.types etw(1); outfsetw(7); outfri.sname; outfsetw(7); outfri.lname; outfsetw(7); ame; outf.close; 19 void records:wdt( int &i) ofstream outf(data.txt); outfsetw(6)n; outfsetw(6)ri.snumsetw(6)osetw(6)ri.types etw(1); outfsetw(7); outfri.sname; outfsetw(7);
27、 outfri.lname; outfsetw(7); ame; outf.close; void records:rd 20 ifstream inf; inf.open(data.txt); a infn; me; i+; void records:input /学生考勤系统的录用模块 21 for(int i=0;i100;i+) char t15,t25,t35; int t4,t5,t6; char yn; cout录入一条学生详细考勤记录:endl; cout输入学生的学号,学生的姓名,专业,缺课课程,缺课节次和缺课类别。t4t1t2t3t5t6; records:n+; cout
28、endl; ri.set(t4,t1,t2,t3,t5,t6); coutn; char y; cout保存? (y/n) y; if(y=y)wt(i); cout是否继续输入? (y/n) yn; if(yn=y) continue; else break; 22 void records:pri /学生考勤系统显示模块 if(n=0) cout -文件记录为空-endl-请先输入数据保存在进行此次操作-endl; cout学号 t姓名 t专业 t缺课课程t,缺课节次t缺课类别。endl; return; for(int i=0;in;i+) 23 coutri.snumt; coutri
29、.snamet; coutri.lnamet; amettt; ott; void records:edt /学生考勤系统修改模块 24 switch(ri.type) case 1:cout迟到endl;break; case 2:cout早退endl;break; case 3:cout请假endl;break; case 4:cout旷课endl;break; default:; cout请输入要修改缺课记录的学生的学号: tnum; for( i=0;in;i+) if(!flag) cout查无此学生!endl; return ; if(ri.snum=tnum) cout有您要查询
30、的学生; break; t1=ri.snum; strcpy(t2,ri.sname); strcpy(t3,ri.lname); strcpy(t4,ame); 25 t5=o; t6=ri.type; cout请输入要修改的项目:n(1.学生学号 2.学生姓名 3.学生专业 4.缺课科目 5.缺课次数 6.缺课类型endl; case 2: cout请输入修改的学生姓名: t2; break; cinkm; switch(km) case 1: cout请输入修改的学生学号: t1; break; case 3: cout请输入修改的缺课课程: t3 ; break; case 4: cout请输入修改的学生专业: t4; 26 break; case 5: cout输入修改的缺课课程次数:t5; break; cas