已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象程序设计课程设计考勤统计一 目的1、课程设计目的根据所学知识,编写指定题目的C+语言程序,并规范地完成课程设计报告。通过课程设计,加深对C+面向对象程序设计课程所学知识的理解,熟练掌握和巩固C+语言的基本知识和语法规范,掌握C+语言的基础知识,理解面向对象系统的封装性;熟练使用C语言中的函数、数组、指针、链表和字符串等基本知识;能够进行程序调试过程中的异常处理;进一步掌握利用C+进行类的定义和操作方法;综合利用上述知识,学习设计并编写面向对象的C+简单应用程序;培养解决复杂任务功能分解方法(自顶向下逐步求精、模块化设计、信息隐藏等)。学会编制结构清晰、风格良好、数据结构适当的C+语言程序,从而具备利用计算机编程分析解决综合性实际问题的初步能力2、系统设计目的本系统设计目的在于,设计建立考勤系统,可以对研究生进出实验室进行签到记录,方便快捷直观地统计考勤信息。同时,利用系统统计管理可直观了解查询到当天实验室的签到考勤情况,并作出科研时间排名,对每个人的科研情况有更好的管理和了解。二 需求分析1、输入数据需求分析用户可从键盘输入相关信息:姓名、学号、签到时间(时、分、秒)、离开时间(时、分、秒、)等等。2、输出数据需求分析可直观明了看到当天到达实验室科研的人员的相关信息,在屏幕上依次显示每个人的学号、姓名、签到时间、离开时间、科研时间(以分钟为单位)、排名情况(按科研时间)。3、程序使用功能需求分析系统主要包含3大使用功能:1) 研究生信息录入功能,能够提示用户逐项输入研究生信息(时、分、秒分三次逐项输入),并检查输入信息的合法性(如时、分、秒的取值范围,用户输入非法字符提示等),同时以分为单位计算每位同学的科研时间;用户能够进行多次的信息录入,直到程序运行退出为止;2) 考勤信息浏览功能,显示所有研究生的考勤情况;有良好的版面依次显示每个人学号、姓名、签到时间、离开时间、科研时间、排名情况等等;用户可以随时调用查看浏览当前考勤的总体情况,直到程序运行停止为止;3) 排序功能,按科研时间长短进行排序并显示。用户可录入信息并实时根据所录入信息对当前排名情况进行排序或修改。4、非使用功能需求分析系统主要包含以下非使用功能:1) 使用菜单选择操作,具有友好的人机交互提示和显示,方便用户输入及查看程序运行过程、结果;2) 对于运行解决问题的步骤(例如从键盘输入的数据、输出到显示器的结果),除了能够在显示器上显示以外,能够处理后的结果用文件的方式保存到outfile.txt文件中。3) 程序算法说明清晰,理论分析与计算正确,运行情况良好,实验测试数据无误,容错性强(能对错误输入进行判断控制)编程风格良好(包括缩进、空行、适当注释、变量名和函数名见名知意,程序容易阅读等)。三 概要设计1、总体设计考勤统计系统学生类的定义声明程序功能实现函数主函数及函数调用本系统主要有三大板块构成:类的定义声明、功能实现函数、主函数;总体结构如图1所示:图1总体设计流程图2、类的概要设计设计定义一个Student类,主要包括姓名、学号、到达小时、到达分钟、到达秒数、离开小时、离开分钟、离开秒数、科研时间、排名、总人数等数据成员;构造函数、设置信息函数和获取信息函数等成员函数,具体结构如图2所示:Student类数据成员(protected)name姓名number学号reachHour到达小时reachMinute到达分钟reachSecond到达秒数leaveHour离开小时leaveMinute离开分钟leaveSecond离开秒数time科研时间rank时间排序成员函数(public)count总人数(静态成员)Student()构造函数设置信息函数set_name( )设置姓名set_number( )设置学号set_reachHour( )设置到达小时set_reachMinute( )设置到达分钟set_reachSecond( )设置到达秒数set_leaveHour( )设置离开小时set_leaveMinute( )设置离开分钟set_leaveSecond( )设置离开秒数set_time( )设置科研时间set_rank( )设置排名获取信息函数get_name( )获取姓名get_number( )获取学号get_reachHour( )获取到达小时get_reachMinute( )获取到达分钟get_reachSecond( )获取到达秒数get_leaveHour( )获取离开小时get_leaveMinute( )获取离开分钟get_leaveSecond( )获取离开秒数get_time( )获取科研时间get_rank( )获取排名图2 类的主要设计概要图3、功能实现函数的设计功能实现函数ShowInterface( )界面菜单函数,显示选项以及提示信息Student *Registration( )Student类的指针函数,登记录入人员信息ResearchTime( )计算时间函数,计算每个人的科研总时间Sort( )排序函数,根据每个人的科研时间按分钟进行排序Save( )保存数据函数,将录入成功的人员信息以txt格式文件方式保存Show( )打印信息函数,将录入成功的人员信息经排序后显示到屏幕功能实现函数部分主要包含了菜单显示函数、信息登记函数、计算科研时间函数、排序函数、保存数据函数以及打印信息函数,具体结构如图3所示:图3功能实现函数结构图4、主函数的设计主函数部分主要是获取用户的输入指令而执行相应的命令,包括了录入信息,打印信息和退出三个板块,具体结构如图4所示主函数main()*temp定义类的指针对象input用户菜单按键输入指令ShowInterface( )调用函数显示菜单输入指令输入指令为“e”录入信息Registration( )登记信息ResearchTime( )计算时间Sort( )进行排序Save( )保存数据输入指令为“o”打印信息Show()打印处理后信息输入指令为“e”退出程序exit(0)退出图4 主函数结构图四 详细设计1、头文件为保证程序的合法性、标准性和代码的编译实现,需首先声明以下#include头文件:1) #include输入输出流,C+开发环境必备头文件;2) #include可用于字符数组处理的编译预处理头文件;3) #include文件流,可用于代码执行文件操作;同时通过语句using namespace std;声明标准命名空间,声明各标识符可见范围。2、类的声明及成员函数为了保证数据的封装性以及面向对象编程的结构清晰明了,先用语句class Student ;声明定义了一个Student类,在类中包含了protected和public两种访问权限数据成员或函数。protected(保护属性访问权限部分):对象中的姓名和学号两个信息为了方便和避免歧义可用string(字符串型)数据类型声明定义,以变量name、number分别表示姓名和学号,即string name;string number;迎合用户需求分别以reachHour、reachMinute、reachSecond、leaveHour、leaveMinute、leaveSecond、time、rank等变量表示到达小时、到达分钟、到达秒数、离开小时、离开分钟、离开秒数、科研总时间和排名,这些数据都是以数字表示,因此,这些变量的数据类型声明定义使用int(整型)。public(公共访问属性部分):为了方便各函数可使用Student类中总人数这一数据,在公共访问部分声明定义静态数据总人数count即static int count;通过定义声明构造函数Student()来初始化类的对象,根据传入参数类型不同重载出两个构造函数并进行变量的初始化,例第一个传入整型数据构造函数中初始化到达小时leaveHour = 0;其他整型数据变量同理初始化为0;第二个构造函数声明传入参数为对象Student &p,初始化name = ; number = p.number;用const修饰保证数据不被修改。为了编序方便增加设置信息和获取信息的成员函数,例如设置姓名void set_name(string nm) name = nm; count+; ,每当设置姓名时总人数加1,获取姓名string get_name() const return name; ,用const修饰保证整型返回值不被修改,其他变量(到达离开时、分、秒,总时间,排名)设置获取函数同理进行声明定义。3、显示菜单函数为使得程序运行可进行菜单选择操作以及良好的人机交互界面,用输出流cout搭建菜单界面,用语句cout显示内容endl;设计构建菜单显示界面。4、登记信息函数在类和函数衔接处需定义初始化静态数据count为0,即int Student:count = 0;同时为Student类定义一个全局指针对象并动态分配空间,即Student *pall = new Student100;。为方便使用类中的数据可将函数定义为类的对象函数即Student *Registration( ),在函数中定义Student *temp动态空间对象temp = new Student以及字符型info,整型reachHour、reachMinute、reachSecond、leavaHour、leaveMinute、leaveSecond等局部变量,并初始为空NULL,用输出流cout显示提示信息,例如coutset_name(info);等实现设置对象信息。为了保证用户输入时间时的合法性,避免输入错误时间或非法字符同时提示用户重新输入,在设置时间部分需要用一个判断循环结构实现相应功能,逻辑算法伪代码如下:输入参数 /到达小时if ( 参数 =0 且 参数 set_reachHour(参数) /调用函数将参数传入设置到达小时否则执行do输出 参数;当while( 参数 =24 )时执行 /用户输入错误时间字符时重复提示输入循环退出 temp-set_reachHour(参数) /将输入正确后的参数传入设置小时(算法结构结束)同理,用此算法结构分别对分钟、秒数(其中判断参数范围为大于或等于0 且小于60)进行用户的输入判断合法与否,保证登记的用户相关信息正确无误同时错误时可以提示用户重新输入。5、计算科研总时间函数为使数据使用的方便性,定义计算时间函数ResearchTime( )中传入参数类型为Student *temp即类的对象,定义一个整型的局部变量reschT用作总时间传递给设置总时间函数,计算科研时间时考虑到可能存在科研时间段跨越0点情况,所以计算语法结构伪代码如下:if( 对象离开的小时 = 对象到达小时 )/计算不过0点情况是 总时间 = (离开小时*60+离开分钟) - (到达小时*60+到达分钟) temp-set_time(reschT) /调用函数将总时间传入设置时间否则 总时间 = ( (23-对象到达小时)*60 + (60-对象到达分钟) )+(对象离开小时*60 +对象离开分钟) temp-set_time(reschT) /调用函数将总时间传入设置时间(算法结构结束)由此可计算出各对象在实验中的科研总时间,为时间排序提供参数数据。6、排序函数定义排序函数Sort( ),其中函数内声明整型变量count,并将Student类中总人数数据成员复制给count即int count = Student:count;同时定义Student类型对象temp,作为排序算法中过渡变量,排序算法为选择排序法,具体实现代码如下:for(int i=0;icount;i+) /控制第一层循环,使从第一个对象开始依次比较 for(int j =i+1;jcount;j+) /控制第二层循环,选择剩余对象与上一层比较 if(palli.get_time() pallj.get_time() /判断对象时间大小 /如果前一对象小于后一对 temp = palli;象,则交换两个对象在 palli = pallj; Student类中pall储存位 pallj = temp; 置从而实现了按照对象的科研总时间进行了从小到大排序,并且保证了每个对象中的各项数据不乱序。7、保存数据函数为了实现使每天签到考勤的数据信息方便保存,定义Save( )保存数据函数,其中传入参数类型Student *temp即类的对象,声明定义从内存到硬盘的输出流文件操作对象os,即ofstream os;同时以追加的方式建立并打开文件“outfile.txt”,即os.open(out.file.txt,ios:app);调用排序函数Sort()处理对象信息,仿照标准输出流cout将各个对象输出到文件中,例如os get_number()即把对象学号输出保存到文件中,对象其他信息同理输出保存,一个对象输出完成后,使对象指针指向下一个对象即temp+,最后通过关闭文件描述符os.close();关闭文件保存完毕。8、打印信息函数定义打印函数Show(),实现将当天签到登记过的用户信息打印到屏幕上。定义整型局部变量count,并将Student类中总人数数据成员复制给count即int count = Student:count;调用排序函数Sort()对已经录入信息进行排序处理,然后按顺序依次输出各人员信息,实现关键代码如下:for(int i=0;icount;i+) /控制循环,使从第一个到总数个依次进行输出 /输出对象相关信息 cout palli.get_number() palli.get_name() ; cout palli.get_reachHour() : palli.get_reachMinute() : palli.get_reachSecond() ; cout palli.get_leaveHour() : palli.get_leaveMinute() : palli.get_leaveSecond() palli.get_time() 分钟 ; cout i+1 input; 判断输入input的字符; 如果是“l”: 提示用户进入录入信息板块;调用Registration()函数登记信息并传入temp中; 调用ResearchTime(temp)函数计算总时间; 调用Save(temp)函数保存数据; 将*temp传入全局对象pall; 提示用户录入成功并退出判断循环; 如果是“o”; 提示用户进入输出信息板块; 调用Show()函数打印信息; 提示读取成功并退出判断循环; 如果是“e”: 提示用户谢谢使用并退出; 如果是其他字符: 提示用户输入有误重新输入并退出判断循环;(算法结构结束)通过上述循环结构体实现了面向对象编程,使用户按照提示性界面从键盘输入不同命令符,执行相应的功能,从而完成了整个系统的编程完毕。五 调试分析1、指针对象未动态分配空间在登记信息函数Registration()中,如果单单只定义了Student类对象*temp,程序运行时当录入第一个对象时,程序终止并报错,报错结果如图5所示:输入:l 2015图5 对象未分配空间报错图解决办法:在登记信息函数Registration()中,定义Student类对象*temp后,使动态分配空间给temp传递对象即temp = new Student;经调试程序运行正确,运行结果如图6所示:输入:l 2015 tom 800 900图6 对象分配空间调试图2、排序不成功在排序函数Sort()中,起初声明传入参数类型为Student *temp,并以此对象进行排序,当录入两个对象信息后,选择输出信息,发现程序出现问题,预想中的排序并未实现,运行结果如图7所示:输入:l 2015 wasd 800 900输入:l 2014 asdf 800 2000图7 排序不成功图解决办法:在类外定义全局对象变量并动态分配空间即Student *pall = new Student100;Sort()函数定义为无参类型函数,从而对所有对象进行排序,经调试程序运行正确,运行结果如图8所示:输入:l 2015 wasd 800 900输入:l 2014 asdf 800 2000图8 排序调试图3、用户输入错误陷入死循环在登记信息函数Registration()中,定义整型变量时、分、秒等,当程序运行时,如果用户从键盘键入了非法字符,程序陷入了死循环并报错,运行结果如图9所示:输入:l 2015 wasd z图9 非法字符死循环报错图解决办法:在判断用户输入是否正确循环中,使用语句cin.clear( ),cin.sync( )即清除错误输入并清除缓冲区,经调试程序运行正确,运行结果如图10所示:输入:l 10001 Lucy 28 *-*/ 12 9986 qwe 0 100 zxc;+0输入:l10025 James 898 +sad 5 0 0 23 79 +-qwds ,.;0 0图10 非法字符死循环调试图六 测试结果1、录入信息测试依次录入三个人人员信息,具体录入数据和程序截图如表1所示:表1 录入信息测试表输入程序运行截图无(运行初始化界面)l1001张三28six861+30-1*/025qwe12-5062w0(接上表1)输入程序运行截图l200014李四1202022300l20152109王五20006002、输出信息测试当系统提示成功录入三个人员信息后,选择输出,具体程序截图如表2所示:表2 输出信息测试表输入程序运行截图o3、退出系统测试当用户不在使用系统后,选择退出系统,程序运行截图如表3所示:表3 退出系统测试表输入程序运行截图e4、保存数据测试当用户使用完系统后,为保证数据的保存,可在文件中查看保存的当天考勤信息,数据保存文件据如图11所示:图11 数据保存文件图七 用户使用说明1、录入信息1) 打开程序所在目录,并运行程序,进入程序运行界面;2) 按照程序菜单提示,按下键盘“l”键;3) 根据程序提示信息依次键入学号、姓名、到达小时、到达分钟、到达秒数、离开小时、离开分钟、离开秒数等信息;4) 输入完相关信息,直到程序界面显示“信息录入成功”,录入信息步骤即完成。2、输出信息1) 打开程序所在目录,并运行程序,进入程序运行界面;2) 按照程序菜单提示,按下键盘“o”键;3) 程序界面即可输出打印当天考勤信息,若
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年北京市和平里医院编外工作人员招聘14人笔试备考试题及答案详解
- 2026四川广安市前锋区瑞丰粮油有限责任公司招聘见习生1人笔试备考题库及答案详解
- 2026湖北武汉市华中农业大学植物科学技术学院高蛋白玉米研究团队科研实验助理岗位招聘笔试参考题库及答案详解
- 2026四川绵阳市三台县妇幼保健院招聘编外聘用人员4人笔试参考题库及答案详解
- 智能调度2026年搬家服务协议
- 国际知识产权保护合作协议
- 德尔菲法技术支持服务协议
- 2026年中国华电集团有限公司山东公司校园招聘(第三批)笔试备考试题及答案详解
- 2026浙江台州市开发投资集团有限公司招聘1人笔试备考题库及答案详解
- 2026年杭州市红十字会医院高层次和特殊专业技术岗位招聘1人笔试模拟试题及答案详解
- 2024年陕西省西安市灞桥区西安国际港务区铁一中陆港初级中学陆港分校小升初分班考数学试题
- GB/T 28294-2024钢铁渣复合料
- 2024年安徽省初中学业水平考试中考英语试卷(真题+答案)
- DB11T 489-2024 建筑基坑支护技术规程
- 《春夜喜雨》完美版课件
- 2021年山东省淄博市中考生物真题
- GB/T 38537-2020纤维增强树脂基复合材料超声检测方法C扫描法
- GB/T 28037-2011信息技术投影机通用规范
- GA/T 1400.2-2017公安视频图像信息应用系统第2部分:应用平台技术要求
- 多维阅读第4级Animal Fathers 动物爸爸 课件
- 颈动脉超声检查课件
评论
0/150
提交评论