《学生考勤管理系统(40页).doc》由会员分享,可在线阅读,更多相关《学生考勤管理系统(40页).doc(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-课程设计任务书课程设计题目:学生考勤管理系统课程设计目的:本程序设计的目的是通过对学生考勤管理系统课程的综合训练,掌握使用面向对象程序设计语言C+,熟悉面向对象开发平台VisualC+2010,通过对课程设计中类的定义和其中构造函数,成员函数的调用,帮助我们系统的掌握C+课程设计的内容。培养我们面向对向的程序设计思想和应用C+程序设计方法来分析问题,编程去解决实际问题的能力,提高调查研究、查阅技术资料以及编写技术文献的能力。问题描述:在学生考勤管理系统中,学生信息记录了学生的基本信息,它包括:学生姓名、学号、性别、年龄、班级等信息。考勤信息记录了学生的考勤情况,它包括缺课日期、第几节课、课程
2、名称、学生姓名、缺课类型(迟到、早退、请假和旷课)等。它的功能包括查询功能、显示功能、编辑功能、删除功能、统计功能、保持功能和读取功能。设计成果:学生考勤管理系统,课程设计说明书。 指导教师: 年 月 日学生考勤管理系统前 言关键词:考勤;姓名;缺课类型;课程名称;日期;学号等在本章的设计中我将对我所编写的学生考勤管理系统进行详细的介绍。首先,为何要编写学生考勤管理系统?因为只有真正的通过编写程序才能强化我们的计算机应用技能,切实提高我们的编程能力。 本学生考勤管理系统共分为四大部分,分别为1.需求分析 2.概要设计 3.详细设计 4.调试分析。通过这四个部分的设计以及其中具体内容的程序编写,
3、使得我们巩固和充实了所学的知识。在此系统中共解决了学生考勤管理系统中的8大功能即1.添加功能2查询功能3显示功能4编辑功能5删除功能6统计功能7保存功能8读取功能,并且在实现这些功能之前都进行了详细的分析。另外此程序是由VisualC+2010编写的,因此程序代码具有简洁、灵活、高效和可移植性强等特点。在四大部分中,第3部分和第4部分占据了大量篇幅,因为第3部分是对各部分功能进行了具体的实现,第4部分是对各部分功能带入数据进行具体调试,对于其中的错误还要进行分析与更改,在调试。 本系统的设计虽然时间上有点紧促,但最终在设计与编程过程中也得到了不少老师和同学指导和帮助,还是完成了系统设计。通过该
4、系统的设计,扩宽了我们的知识面,也培养了我们的创新,实践和开拓能力!目 录前 言2第1章 需求分析41.1功能需求41.2数据需求5第2章 概要设计62.1 功能模块图62.2数据技术模块7第3章 详细设计83.1 添加学生的考勤信息83.2 修改学生的考勤信息93.3 查询学生的考勤信息113.4 删除学生的考勤信息123.5 显示学生的考勤信息133.6 统计学生的考勤信息133.7 保存和读取学生的考勤信息15第4章 调试分析164.1 功能调试164.2 类与算法分析20小结23参考文献25附录26第1章 需求分析1.1功能需求1.1.1添加功能:程序能够添加学生的记录和缺课记录,提供
5、选择界面供用户选择所要添加的类别。添加学生记录时,要求学号要唯一,如果添加了重复学号的记录时,则提示数据添加重复并取消添加。1.1.2查询功能:可根据学号、姓名等信息对已添加的学生记录进行查询,如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息。还可以按课程名、学生姓名对缺课记录进行查询。1.1.3显示功能:可显示当前系统中所有学生的记录和缺课记录,每条记录占据一行。1.1.4编辑功能:可根据查询结果对相应的记录进行修改,修改时注意学号的唯一性。1.1.5删除功能:主要实现对已添加的学生记录进行删除。如果当前系统中没有相应的记录,则提示“记录为空!”并返回操作。1.1.6统计功能:
6、能根据多种参数进行统计。能按课程名统计出学生旷课的信息、还可以按姓名统计出任一学生的旷课情况。需要排序。1.1.7保存功能:可将当前系统中各类记录存入文件中,存入方式任意。1.1.8读取功能:可将保存在文件中的信息读入到当前系统中,供用户进行使用。1.2数据需求 本系统主要涉及的数据有学生基本信息和学生考勤信息。学生基本信息包括学生学号、姓名、性别、年龄、班级等信息;学生考勤信息包括学生姓名,缺课日期,课程名称,第几节课,学生缺课类型(迟到、早退、请假和旷课)。第2章 概要设计2.1 功能模块图根据分析整个系统主要划分为8个功能模块,分别执行系统需求中的功能。数据管理中实现对学生的基本信息即学
7、生学号、姓名、性别、年龄、班级等信息的管理。以及学生考勤信息即学生姓名,缺课日期,课程名称,第几节课,学生缺课类型(迟到、早退、请假和旷课)等管理实现学生缺课的查询、添加、删除和修改,以及具体考勤内容,是迟到、早退、请假还是旷课。查询管理可以通过根据学生姓名、学号、班级以及课程名称等信息进行,查询,修改管理可以任意修改考勤管理信息及基本信息中的任一项。功能模块图如图所示。学生考勤管理系统读取学生的考勤信息保存学生的考勤信息统计学生的考勤信息显示学生的考勤信息删除学生的考勤信息查询学生的考勤信息修改学生的考勤信息添加学生的考勤信息2.2数据技术模块此程序共包括4个类,分别是日期类、考勤类、缺课课
8、程类以及缺课学生类。其中考勤类为一个基类,缺课课程类和缺课学生类均继承考勤类:考勤类kaoqin缺课学生类qkxs缺课课程类qkkc此程序是使用面向对象的语言设计的,在设计过程中采用了多种条件语句,主题采用了函数的调用,类的继承以及指针。程序在设计日期类时,采用了数组语句将日期的年月日分成了三个部分,在界面设计过程中采用了switch选择语句,然后在case子句中寻找值相等的常量表达式,以此为入口,将主界面发分为7个部分,使的程序更加清晰明了。另外在整个系统设计过程中需要处理大量的同类型数据,于是采用了大量的循环语句for 和dowhile语句用于实现许多已知和未知的循环。第3章 详细设计3.
9、1 添加学生的考勤信息在功能模块图的第一部分添加学生的考勤信息是,我设计了一个添加函数tianjia,它是从“输入开始”后在根据提示逐步输入,首先是“请输入学生姓名:”输入完毕按回车键继续输入下一条“请输入课程名称:”再其次一次根据提示分别输入“请输入缺课日期:”,“请输入缺课学生年龄:”,“请输入缺课学生学号:”,“请输入缺课学生班级:”,“请输入缺课学生性别:”,“请输入缺课类型(迟到,请假,早退,旷课):”,“请输入缺课节次:”最后输入考勤信息完毕,系统会提示“是否还要继续输入:(y/n)”,以此来方便我们继续添加还是返回主界面!请输入学生姓名请输入课程名称添加学生的考勤信息请输入缺课日
10、期请输入缺课学生学号请输入缺课学生班级请输入缺课学生性别请输入缺课类型(迟到,请假,早退,旷课)请输入缺课学生年龄请输入缺课节次在这一部分的设计中使用了do-while循环,实现了添加学生考勤信息时的逐步输入。3.2修改学生的考勤信息 在功能模块图的第二部分修改学生的考勤信息时,我定义了一个修改函数xiugai,它是先根据你要修改的学生姓名查找到你要修改的学生考勤信息,然后为你提供九个选项(08),分别是: 0.修改学生姓名 1.修改日期 2.修改节次 3.修改课程名称 4.修改缺课类型 5.修改学生年龄 6.修改学生性别 7.修改学生学号 8.修改学生班级”。之后输入你所要选择的数值(0,1
11、,2,3,4,5,6,7,8)分别执行其中9个修改选项。程序代码如下: /修改函数 void xiugai(kaoqin st1,int n) int k=1,j=0,a10; int flgh; int h; while(k=1) cout请输入你要修改缺课记录的学生姓名:name; flgh=0; for(int i=0;in;i+) if(strcmp(name,st1i.getname()=0) do aj=i; cout0.修改学生姓名1.修改日期2.修改节次3.修改课程名称4.修改缺课类型5.修改学生年龄6.修改学生性别7.修改学生学号8.修改学生班级endl; cout请输入要选
12、择的数值(0,1,2,3,4,5,6,7,8)b; if(b=1) cout请输入新日期:ymd; st1i.settime(y,m,d); else if(b=0) cout请输入新姓名:name; st1i.setname(name); else if(b=5) cout请输入新年龄:age; st1i.setage(age); else if(b=6) cout请输入新性别:sex; st1i.setsex(sex); else if(b=7) cout请输入新学号:xuehao; st1i.setxuehao(xuehao); else if(b=8) cout请输入新班级:banji
13、; st1i.setbanji(banji); else if(b=2) cout请输入新节次:jieci; st1i.setjieci(jieci); else if(b=3) cout请输入新课程名称:kechen; st1i.setkechen(kechen); else if(b=4) cout请输入新缺课类型:queke; st1i.setqklx(queke); flgh=1;j+; while(b4); if(flgh=0)cout没有你要找的学生姓名,请重试要退出请按k; else cout还要继续吗?endl(1 or 0)退出请按k; for(int i=0;ij;i+)
14、h=ai; xiansi(st1h); 由程序可以看到此段代码运用了if-else语句请输入你要查询的学生姓名、学号、班级、课程名称或课程类型(任一即可)查询学生的考勤信息将你要查询的学生考勤信息显示出来选择是进行继续添加还是返回主菜单(y/n)3.3查询学生的考勤信息 在功能模块图的第三部分查询学生的考勤信息时,我定义了一个查询函数chaxun。在此部分设计中,我采用了一种比较省事的方法来查询考勤信息,它的实用性非常好,即我采用了 | |符号,它可以让我们在查询学生考勤信息时随意的输入9大信息中任一信息即可查到该学生的考勤信息。当然在实际编程过程中我只使用了5种查询方法。分别是输入你要查询的
15、学生姓名、学号、班级、课程名称或课程类型,查询时任意输入一种即可,下面为此功能的三个部分简图:(上图)。3.4删除学生的考勤信息在功能模块图的第四部删除改学生的考勤信息时,我定义了一个删除函数shanchu,先根据3.3的查询学生的考勤信息,查找出你要删除的某个学生的考勤信息,如果在查询时不存在该学生的考勤记录,界面将给出提示“你要删除的学生考勤信息不存在”,如果查询时发现记录中存有,就该对象中所有的对象成员全部赋值为0(其中int变量直接赋值为0,char类型变量全部赋值成字符0),赋值成功后界面将提示“删除该学生考勤信息成功”,其中模块图如图所示:删除学生的考勤信息请输入你要查询的学生姓名
16、、学号、班级、课程名称或课程类型(任一即可)存在不存在将所有成员全部赋值为0删除该学生考勤信息成功你要删除学生的考勤信息不存在选择是进行继续删除还是返回主菜单(y/n)3.5显示学生的考勤信息 在功能模块图的第五部显示学生的考勤信息时,我定义了一个显示函数xianshi,将所有的学生考勤记录显示出来,依靠添加时的顺序,将其9大信息依次列出。其设计的程序代码如下:/显示函数 void xiansi(kaoqin &st1) cout| 缺课日期|学生年龄学生性别学生学号学生班级 第几节课| 课程名称| 学生姓名| 缺课类型|endl; cout|*(st1.gettime()|*(st1.get
17、time()+1)*(st1.gettime()+2)|st1.getage()|st1.getsex()|st1.getxuehao()|st1.getbanji()|st1.getjieci()|st1.getkechen()|st1.getname()|st1.getqklx()|endl; 3.6统计学生的考勤信息此外在功能模块的第六部分统计学生的考勤信息共分为两部分进行统计,分别是tongji1按照“学生姓名统计出任一学生的旷课情况”和tongji2按照“按课程名称统计出任一课程学生旷课的信息”。在统计的过程中由于很有可能会有大量记录数据,使得显示出的记录不止一条。这时就要对这些数据
18、记录进行排序,本程序我采用了以时间为顺序,时间被我划分为3部分,分别是年、月、日;比较顺序是,先按照年份进行比较然后用月份进行比较最后用日进行比较!具体代码如下:void tongji1(kaoqin st1,qkxs qt1) /按姓名统计出任一学生的旷课情况 int d1=0,js=0; kaoqin min; if (g=0) cout没有你要统计的学生信息请返回菜单录入学生缺课信息endl; else if(g=1) cout姓名:st10.getname()endl; if( *(st10.getjieci()+2)!=0) js=+2; else js+; cout节数:jsend
19、l; else /信息按时间排序 int i=0; for(;i(g-1);i+) if(*(st1i.gettime()+1)*(st1i+1.gettime()+1) min=st1i; st1i=st1i+1; st1i+1=st1i; else if( *(st1i.gettime()+1)=*(st1i+1.gettime()+1)&*(st1i.gettime()+2)*(st1i+1.gettime()+2) min=st1i; st1i=st1i+1; st1i+1=st1i; else if(*(st1i.gettime()+1)=*(st1i+1.gettime()+1)&
20、*(st1i.gettime()+2)=*(st1i+1.gettime()+2) d1+; for(int j=0;j(g-d1);j+) cout*st1j.gettime()*(st1j.gettime()+1)*(st1j.gettime()+2)endl; for(i=0;ik;i+) setqstn(st1,qt1,g); cout姓名:qt1i.qstnendl; cout节数:qt1i.getjs(st1,g,i)endl; 3.7保存和读取学生的考勤信息 此为功能模块图的第七、八部分保存学生的考勤信息和读取学生的考勤信息,将考勤信息保存在“考勤txt”文本文件中。ifstre
21、am file(考勤.txt,ios:in|ios:out|ios:binary); file.seekg(0,ios:beg);第4章 调试分析4.1功能调试 图一调试并运行该程序出现主界面,如图一所示,界面出现7个选项分别是“1.添加学生的缺课记录 2.修改学生的缺课记录 3.查询学生的缺课记录 4.删除学生的缺课记录 5.按姓名统计出任一学生的旷课情况 6.按课程名称统计出学生旷课的信息 7.退出系统”以及最下面的“请选择执行的项目:”。故输入数字1添加学生的考勤记录:如图二所示,依次按照系统所给的提示逐步完成对各个部分数据的记录。由图可知,当所有考勤数据记录完毕时,界面下方会给出提示:
22、“是否还要继续输入(y/n)”,若选择y,则系统返回添加页面,再次添加另外的学生考勤记录,若选择n,则系统返回主页面即图一界面。由图二可知系统添加功能正常。图二 由图一输入2,即可进入修改界面;然后根据提示输入将要修改的图三学生姓名“刘多山”,后界面将显示0.修改学生姓名 1.修改日期 2.修改节次 3.修改课程名称 4.修改缺课类型 5.修改学生年龄 6.修改学生性别 7.修改学生学号 8.修改学生班级”,以及“请输入你所要选择的数值(0,1,2,3,4,5,6,7,8),然后根据需要输出即可!例如修改姓名选择0,输入新的姓名,输入完成后系统 图四会提示是否继续修改。由图四可以看出修改功能也
23、一切正常。由图一输入3即可进入查询界面如图五所示,可以根据学生姓名、学号、班级、课程名称和课程类型进行查询。输入班级“软件“进行查询,查询结果如图六,显然查询结果正常!图五图六选择“n“返回主界面,在选择是进入删除选项,选择以学号进行删除,输入学号“3120909090”查询出来后确认删除,页面提示“删除成功”。4.2类与算法分析4.2.1类的分析time类year:intmonth:intday:inttime()time() qkxs类jieshu:intqst;:intqkxs()qkxs()print(st1:kaoqin&):voidgetjs(st1:xinxi,n:int,j:i
24、nt)setjs(js:int=0):int 基类kaoqin类name20:charkechen10:charkeshu3:charqueke10:chartm3:chartiaoshi:int=0kaoqin()kaoqin()setname(n:char*):voidsettime(y:int,m:int,d:int):voidsetqklx(qk:char*):voidsetcishu(jc:char*):voidsetkechen(kc:char*):voidgetname():char*getqklx():char*继承派生类qkkc类renci:intkcshu:int=0qkk
25、c()qkkc()getrc(st1:xinxi,n:int,j:int):intqkn20:char4.2.2算法的分析 整个系统的设计过程对于我来说算是个学习、探索的过程,在编程的过程中不断地进行调试,在调试过程中选择菜单查询学生的旷课记录,程序不执行,后来通过改错发现程序中没有加入选择的case语句。后来在switch后加一个case就可以自动执行了。在设置查询函数的过程中虽然设置了以姓名和学号来查找学生考勤信息的记录,但在调试时发现还有欠缺,因为考虑到实际查询过程中不一定都知道学生姓名或学号,于是我采用了|这一符号!程序如下:cout输入你要查询的学生姓名、学号、班级、课程名称或课程类
26、型: xuehao | xuehao | banji | kechen | queke; int i=0; for(i;ig;i+) if(strcmp(name,st1i.getname()=0 | strcmp(xuehao,st1i.getxuehao()=0 | strcmp(banji,st1i.getbanji()=0 | strcmp(kechen,st1i.getkechen()=0 | strcmp(queke,st1i.getqklx()=0) uj=i; j+; 以此来实现除了学生姓名和学号来查询,更增加了通过班级、课程名和课程类型来查询学生考勤记录!在该函数中,我设置了
27、if语句用来判断系统中是否存有用户要修改的学生缺课信息。如果没有,则提示用户没有该学生的缺课信息,用户可以选择继续输入要修改的学生姓名或者退出修改环节,可以在循环语句中改变循环进行的条件从而终止循环。至于在修改后显示该学生的缺课信息,运行时发现系统并没有做到这一点,对源代码检查之后发现是修改函数中显示函数的调用出了点问题,显示函数的实参有误,应该把要修改缺课信息的学生所在的考勤类对象作为实参,然后用显示函数的形参引用实参对象,通过对象调用信息类的成员函数,从而实现显示功能。小 结通过此次的学生考勤管理的设计,我不但对C+语言编程有了更加深刻的认识,还积累了许多软件开发的经验。整个系统的设计对于
28、我来说都是在学习和探索中摸索出来的,这使我学会了在对待问题时应该考虑到哪些方面和怎么解决问题。虽然在设计时间上紧迫,但我也学会了许多。在整个设计过程中,出现过很多的问题,很多繁琐的东西都需要反复的修改,主要是前期工作不彻底,对系统的需求分析的要求认识不够清楚,使得在后边的工作中不得不经常反复去修改。除此之外,我对于怎样用文件保存数据还没有深入了解,但我将数据保存到文件后又因为文件打不开而无法访问文件“kaoqin.txt”的数据。在设置查询函数的过程中,本来想用while语句来分条查询学生考勤管理信息。例如1.根据学号查询 2.根据姓名查询 3.根据班级查询 4.根据年龄查询 5.根据课程查询
29、,可是在实际编程的过程中,由于共有9部分信息,而且其中日期一部分又包含3个分支年、月、日,所有操作过程中存在很大的难度,思维太复杂不够清晰。于是我果断采用了|这一运算符,使得在查询过程中,可以随意使用任意一种方式进行查询,而且在编码过程中也十分简单。如此就轻松的解决了查询这一个函数的编程!在调试过程中我发现在主函数中把字符数组名赋值给字符指针然后用字符指针指向字符数组;语句可以输出字符数组里全部的内容,但利用函数返回指针值却不能做到这一点,在我思考一番后终于明白了,这与内存中的地址值有关。使我体会到设置中每一步的重要性。所以在分析一个问题时,我们需要站在一个有远见的高度。这次实验后我发现我掌握
30、得还不够。我遇到了很多的问题,有的通过思考或查看书本解决了,有的还留在脑子里,只有通过孜孜不倦的求索我们才会有进步,平时遇到的一些小问题一定要重视,越是基础的知识越要理解透彻。比如现在对于指针和数组方面的知识还不够清楚,这使得我在编程的过程中遇到了许多问题。虽然有些知识已经通过查看资料解决了,但有些依然没有能弄明白,因此我也感到了自身知识的贫乏,。另外在完成学生考勤系统之后,我也感觉到了我在编程方面的整体实力都有了提高,许多平时模糊的小知识,现在基本上都已经很清楚了!参考文献1杜茂康等编著C+.NET程序设计 北京:清华大学出版社,20092周鸣争主编 大学计算机基础 成都:电子科技大学出版社
31、,20093周鸣争主编 C语言程序设计教程 成都:电子科技出版社,2005附录#include #include #include #includeusing namespace std; class time /建立日期类public: time(int y=0,int m=0,int d=0) year=y;month=m;day=d; time() protected: int year,month,day; ; class kaoqin:public time /建立考勤类 public: kaoqin() tiaoshi+; kaoqin()tiaoshi-; void setnam
32、e(char *n)strcpy(name,n); /学生姓名 void settime(int y,int m,int d)year=y;month=m;day=d;/日期 void setage(char *a)strcpy(age,a);/年龄 void setxuehao(char *xh)strcpy(xuehao,xh);/学号 void setbanji(char *bj)strcpy(banji,bj);/班级 void setsex(char *xb)strcpy(sex,xb);/性别 void setqklx(char *qk)strcpy(queke,qk); /课程类
33、型 void setjieci(char *jc)strcpy(jieci,jc); /缺课节次 void setkechen(char *kc)strcpy(kechen,kc); /课程 char *getname()char *n;n=name;return n; char *getqklx()char *qk=queke;return qk; char *getjieci()char *jc;jc=jieci;return jc; char *getkechen()char *gk;gk=kechen;return gk; char *getage()char *a;a=age;ret
34、urn a; char *getsex()char *xb;xb=sex;return xb; char *getxuehao()char *xh;xh=xuehao;return xh; char *getbanji()char *bj;bj=banji;return bj; int *gettime(); private: char name20; char age3,jieci3,kechen10,queke10,sex10,xuehao10,banji10; int tm3; static int tiaoshi; ;int kaoqin:tiaoshi=0; int *kaoqin:
35、gettime() int *t; t=tm; tm0=year; tm1=month; tm2=day; return t; /缺课课程类 class qkkc:public kaoqin public: qkkc()kcshu+; qkkc()kcshu-; int getrc(kaoqin st1,int n,int j); char qkn20;/公有数据成员 private: int renci; static int kcshu;/静态数据成员; int qkkc:kcshu=0; int qkkc:getrc(kaoqin st1,int n,int j) renci=0; re
36、nci+; for(int i=0;in;i+) if(*(st1i+1.gettime()+1)=*(st1j.gettime()+1)&*(st1i+1.gettime()+2)= *(st1j.gettime( )+2) if(strcmp(qkn,st1i.getkechen()=0) renci+; return renci; /缺课学生类 class qkxs:public kaoqin public: qkxs()qst+; qkxs()qst-; void print(kaoqin &st1); int getjs(kaoqin st1,int n,int j); int se
37、tjs(int js=0) jieshu=js; char qstn20; private: int jieshu; static int qst; /静态数据成员; int qkxs:qst=0; /类的实现void qkxs:print(kaoqin &st1) cout| 缺课日期| 年龄| 性别| 学号| 班级 第几节课| 课程名称| 缺课类型|endl; cout|*st1.gettime()|*(st1.gettime()+1)*(st1.gettime()+2)|st1.getage()|st1.getsex() |st1.getxuehao()|st1.getbanji()|st1.getjieci()|st1.getkechen()|st1.getqklx()|endl; int qkxs:getjs(kaoqin st1,int n,int j) int i=0,js=0; kaoqin min; if(*(st1j.getjieci()+2)!=0) js=+2; else js+; for(i=0;in;i+) if(*(st1i+1.gettime()+1)=*(st1j.gettime()+1)&*(st1i+1.gettime()+2)=*(st1j.get