易妖游戏网
您的当前位置:首页C++课程设计报告——考勤统计

C++课程设计报告——考勤统计

来源:易妖游戏网
《面向对象程序设计》课程设计

考勤统计

一 目的

1、课程设计目的

根据所学知识,编写指定题目的C++语言程序,并规地完成课程设计报告。通过课程设计,加深对《C++面向对象程序设计》课程所学知识的理解,熟练掌握和巩固C++语言的基本知识和语法规,掌握C++语言的基础知识,理解面向对象系统的封装性;熟练使用C语言中的函数、数组、指针、链表和字符串等基本知识;能够进行程序调试过程中的异常处理;进一步掌握利用C++进行类的定义和操作方法;综合利用上述知识,学习设计并编写面向对象的C++简单应用程序;培养解决复杂任务功能分解方法(自顶向下逐步求精、模块化设计、信息隐藏等)。

学会编制结构清晰、风格良好、数据结构适当的C++语言程序,从而具备利用计算机编程分析解决综合性实际问题的初步能力

2、系统设计目的

本系统设计目的在于,设计建立考勤系统,可以对研究生进出实验室进行签到记录,方便快捷直观地统计考勤信息。同时,利用系统统计管理可直观了解查询到当天实验室的签到考勤情况,并作出科研时间排名,对每个人的科研情况有更好的管理和了解。

二 需求分析

1、输入数据需求分析

用户可从键盘输入相关信息:、学号、签到时间(时、分、秒)、离开时间(时、分、秒、)等等。

2、输出数据需求分析

可直观明了看到当天到达实验室科研的人员的相关信息,在屏幕上依次显示每个人的学号、、签到时间、离开时间、科研时间(以分钟为单位)、排名情况(按科研时间)。

3、程序使用功能需求分析

系统主要包含3大使用功能:

1) 研究生信息录入功能,能够提示用户逐项输入研究生信息(时、分、秒分三次逐项输入),并检查输入信息的合法性(如时、分、秒的取值围,用户输入非法字符提示等),同时以分为单位计算每位同学的科研时间;用户能够进行多次的信息录入,直到程序运行退出为止;

2) 考勤信息浏览功能,显示所有研究生的考勤情况;有良好的版面依次显示每个人学号、、签到时间、离开时间、科研时间、排名情况等等;用户可以随时调用查看浏览当前考勤的总体情况,直到程序运行停止为止;

3) 排序功能,按科研时间长短进行排序并显示。用户可录入信息并实时根据所录入信

中南民族大学计算机科学学院 专业 计算机科学与技术 学号:201521091067 姓名 :刘申臣

3

《面向对象程序设计》课程设计

息对当前排名情况进行排序或修改。

4、非使用功能需求分析

系统主要包含以下非使用功能:

1) 使用菜单选择操作,具有友好的人机交互提示和显示,方便用户输入及查看程序运行过程、结果;

2) 对于运行解决问题的步骤(例如从键盘输入的数据、输出到显示器的结果),除了能够在显示器上显示以外,能够处理后的结果用文件的方式保存到outfile.txt文件中。

3) 程序算法说明清晰,理论分析与计算正确,运行情况良好,实验测试数据无误,容错性强(能对错误输入进行判断控制)编程风格良好(包括缩进、空行、适当注释、变量名和函数名见名知意,程序容易阅读等)。

三 概要设计

1、总体设计

本系统主要有三大板块构成:类的定义声明、功能实现函数、主函数;总体结构如图1所示:

考勤统计系统 学生类的定义声明 程序功能实现函数 图1总体设计流程图

主函数及函数调用 2、类的概要设计设计

定义一个Student类,主要包括、学号、到达小时、到达分钟、到达秒数、离开小时、离开分钟、离开秒数、科研时间、排名、总人数等数据成员;构造函数、设置信息函数和获取信息函数等成员函数,具体结构如图2所示:

中南民族大学计算机科学学院 专业 计算机科学与技术 学号:201521091067 姓名 :刘申臣 3

《面向对象程序设计》课程设计

数据成员 (protected) name——姓名 number——学号 reachHour——到达小时 reachMinute——到达分钟 reachSecond——到达秒数 leaveHour——离开小时 leaveMinute——离开分钟 leaveSecond——离开秒数 time——科研时间 rank——时间排序 count——总人数(静态成员) Student()——构造函数 set_name( )——设置姓名 set_number( )——设置学号 set_reachHour( )——设置到达小时 set_reachMinute( )——设置到达分钟 set_reachSecond( )——设置到达秒数 set_leaveHour( )——设置离开小时 set_leaveMinute( )——设置离开分钟 set_leaveSecond( )——设置离开秒数 set_time( )——设置科研时间 set_rank( )——设置排名 Student类 设置信息函数 成员函数 (public获取信息函数 get_name( )——获取姓名 get_number( )——获取学号 get_reachHour( )——获取到达小时 get_reachMinute( )——获取到达分钟 get_reachSecond( )——获取到达秒数 get_leaveHour( )——获取离开小时 get_leaveMinute( )——获取离开分钟 get_leaveSecond( )——获取离开秒数 get_time( )——获取科研时间 get_rank( )——获取排名 图2 类的主要设计概要图

中南民族大学计算机科学学院 专业 计算机科学与技术 学号:201521091067 姓名 :刘申臣

3

《面向对象程序设计》课程设计

3、功能实现函数的设计

功能实现函数部分主要包含了菜单显示函数、信息登记函数、计算科研时间函数、排序函数、保存数据函数以及打印信息函数,具体结构如图3所示:

ShowInte rface( ) 界面菜单 函数,显示选项以 及提示信息 Student *Registration( ) Student类的指针函数,登记录入人员信息 功能实现函数

ResearchTime( ) 计算时间函数,计算每个人的科研总时间 Sort( ) 排序函数,根据每个人的科研时间按分钟进行排序 Save( ) 保存数据函数,将录入成功的人员信息以txt格式文件方式保存 Show( ) 打印信息函数,将录入成功的人员信息经排序后显示到屏幕 图3功能实现函数结构图

4、主函数的设计

主函数部分主要是获取用户的输入指令而执行相应的命令,包括了录入信息,打印信息和退出三个板块,具体结构如图4所示

主函数 main() 图4 主函数结构图

*temp——定义类的指针对象 input——用户菜单按键输入指令 ShowInterface( )——调用函数显示菜单 输入指令为“e” 录入信息 Registration( )——登记信息 ResearchTime( )——计算时间 Sort( )——进行排序 Save( )——保存数据 输入指令 输入指令为“o” 打印信息 输入指令为“e” 退出程序 Show()——打印处理后信息 exit(0)——退出 中南民族大学计算机科学学院 专业 计算机科学与技术 学号:201521091067 姓名 :刘申臣 3

《面向对象程序设计》课程设计

四 详细设计

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 = 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<<"显示容"<4、登记信息函数

在类和函数衔接处需定义初始化静态数据count为0,即int Student::count = 0;同时为Student类定义一个全局指针对象并动态分配空间,即Student *pall = new Student[100];。

中南民族大学计算机科学学院 专业 计算机科学与技术 学号:201521091067 姓名 :刘申臣 3

《面向对象程序设计》课程设计

为方便使用类中的数据可将函数定义为类的对象函数即Student *Registration( ),在函数中定义Student *temp动态空间对象temp = new Student以及字符型info,整型reachHour、reachMinute、reachSecond、leavaHour、leaveMinute、leaveSecond等局部变量,并初始为空NULL,用输出流cout显示提示信息,例如cout<< \"请输入你的:\";对用户进行输入提示,通过标准输入流cin将获取的字符赋给info,调用set_name( )和set_number( )函数,用语句temp->set_name(info);等实现设置对象信息。

为了保证用户输入时间时的合法性,避免输入错误时间或非法字符同时提示用户重新输入,在设置时间部分需要用一个判断循环结构实现相应功能,逻辑算法伪代码如下:

输入>>参数 //到达小时

if ( 参数 >=0 且 参数 <24 ) //判断是否输入正确

是 temp->set_reachHour(参数) //调用函数将参数传入设置到达小时 否则 执行do

输出 << \"输入有误,请重新输入整点:\"; //提示用户重新输入 cin.clear(); //清除输入错误状态 cin.sync(); //清空缓冲区 输入>> 参数;

当while( 参数 <0 或 参数 >=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) //调用函数将总时间传入设置时间 (算法结构结束)

由此可计算出各对象在实验中的科研总时间,为时间排序提供参数数据。

中南民族大学计算机科学学院 专业 计算机科学与技术 学号:201521091067 姓名 :刘申臣 3

《面向对象程序设计》课程设计

6、排序函数

定义排序函数Sort( ),其中函数声明整型变量count,并将Student类中总人数数据成员复制给count即int count = Student::count;同时定义Student类型对象temp,作为排序算法中过渡变量,排序算法为选择排序法,具体实现代码如下:

for(int i=0;ifor(int j =i+1;j}

从而实现了按照对象的科研总时间进行了从小到大排序,并且保证了每个对象中的各项数据不乱序。

{

if(pall[i].get_time() < pall[j].get_time()) //判断对象时间大小 }

{ //如果前一对象小于后一对 temp = pall[i]; pall[j] = temp; }

象,则交换两个对象在 置

pall[i] = pall[j]; Student类中pall储存位

7、保存数据函数

为了实现使每天签到考勤的数据信息方便保存,定义Save( )保存数据函数,其中传入参数类型Student *temp即类的对象,声明定义从存到硬盘的输出流文件操作对象os,即ofstream os;同时以追加的方式建立并打开文件“outfile.txt”,即os.open(\"out.file.txt\调用排序函数Sort()处理对象信息,仿照标准输出流cout将各个对象输出到文件中,例如os << temp->get_number()即把对象学号输出保存到文件中,对象其他信息同理输出保存,一个对象输出完成后,使对象指针指向下一个对象即temp++,最后通过关闭文件描述符os.close();关闭文件保存完毕。

8、打印信息函数

定义打印函数Show(),实现将当天签到登记过的用户信息打印到屏幕上。定义整型局部变量count,并将Student类中总人数数据成员复制给count即int count = Student::count;调用排序函数Sort()对已经录入信息进行排序处理,然后按顺序依次输出各人员信息,实现关键代码如下:

for(int i=0;i{ //输出对象相关信息

cout << pall[i].get_number() << \" \" << pall[i].get_name()<< \" \"; cout << pall[i].get_reachHour() << \":\"<< pall[i].get_reachMinute() <<

中南民族大学计算机科学学院 专业 计算机科学与技术 学号:201521091067 姓名 :刘申臣 3

《面向对象程序设计》课程设计

\":\"<< pall[i].get_reachSecond() << \" \";

cout << pall[i].get_leaveHour() << \":\"<< pall[i].get_leaveMinute() << \":\"<< pall[i].get_leaveSecond() << \" \" << pall[i].get_time() << \"分钟\"<< \" \";

cout << i+1 << endl; /显示对象的排名即排名多少第几次输出 }

同时使用cout打印出标题选项、学号、到达时间、离开时间、科研总时间、排名等等。

9、主函数

主函数主要是各函数的调用,首先定义Student类指针对象*temp并初始化为空NULL,定义一个字符型变量input并初始化为空NULL,代表用户从键盘出入的菜单选项。用cout搭建排版进入系统的欢迎界面,使用嵌套循环结构体实现使用菜单选择操作,具有友好的人机交互提示和显示,方便用户输入及查看程序运行过程、结果功能,具体结构体伪代码如下所示:

当while(input不为“e”)时: 执行:

调用ShowInterface( )显示菜单栏; 输入 >> input; 判断输入input的字符; 如果是“l”:

提示用户进入录入信息板块;

调用Registration()函数登记信息并传入temp中;

调用ResearchTime(temp)函数计算总时间; 调用Save(temp)函数保存数据; 将*temp传入全局对象pall[]; 提示用户录入成功并退出判断循环; 如果是“o”;

提示用户进入输出信息板块; 调用Show()函数打印信息; 提示读取成功并退出判断循环; 如果是“e”:

提示用户使用并退出; 如果是其他字符:

提示用户输入有误重新输入并退出判断循环; (算法结构结束)

通过上述循环结构体实现了面向对象编程,使用户按照提示性界面从键盘输入不同命令符,执行相应的功能,从而完成了整个系统的编程完毕。

五 调试分析

中南民族大学计算机科学学院 专业 计算机科学与技术 学号:201521091067 姓名 :刘申臣

3

《面向对象程序设计》课程设计

1、指针对象未动态分配空间

在登记信息函数Registration()中,如果单单只定义了Student类对象*temp,程序运行时当录入第一个对象时,程序终止并报错,报错结果如图5所示:

输入:l↙

2015↙

图5 对象未分配空间报错图

解决办法:在登记信息函数Registration()中,定义Student类对象*temp后,使动态分配空间给temp传递对象即temp = new Student;经调试程序运行正确,运行结果如图6所示:

输入:l↙ 2015↙ tom↙ 8↙0↙0↙ 9↙0↙0↙

图6 对象分配空间调试图

2、排序不成功

3

中南民族大学计算机科学学院 专业 计算机科学与技术 学号:201521091067 姓名 :刘申臣

《面向对象程序设计》课程设计

在排序函数Sort()中,起初声明传入参数类型为Student *temp,并以此对象进行排序,当录入两个对象信息后,选择输出信息,发现程序出现问题,预想中的排序并未实现,运行结果如图7所示:

输入:l↙ 2015↙ wasd↙ 8↙0↙0↙ 9↙0↙0↙ 输入:l↙ 2014↙ asdf↙ 8↙0↙0↙ 20↙0↙0↙

图7 排序不成功图

解决办法:在类外定义全局对象变量并动态分配空间即Student *pall = new Student[100];Sort()函数定义为无参类型函数,从而对所有对象进行排序,经调试程序运行正确,运行结果如图8所示:

输入:l↙ 2015↙ wasd↙ 8↙0↙0↙ 9↙0↙0↙ 输入:l↙ 2014↙ asdf↙ 8↙0↙0↙ 20↙0↙0↙

图8 排序调试图

3、用户输入错误陷入死循环

中南民族大学计算机科学学院 专业 计算机科学与技术 学号:201521091067 姓名 :刘申臣 3

《面向对象程序设计》课程设计

在登记信息函数Registration()中,定义整型变量时、分、秒等,当程序运行时,如果用户从键盘键入了非法字符,程序陷入了死循环并报错,运行结果如图9所示:

输入:l↙ 2015↙ wasd↙ z↙

图9 非法字符死循环报错图

解决办法:在判断用户输入是否正确循环中,使用语句cin.clear( ),cin.sync( )即清除错误输入并清除缓冲区,经调试程序运行正确,运行结果如图10所示:

输入:l↙ 10001↙ Lucy↙ 28↙ **-*/↙ 12↙ 9986↙ qwe[]↙ 0↙ 100↙ zxc;++↙

0↙

输入:l↙10025↙ James↙ 8↙ ++sad↙ 5↙ 0↙ 0↙ 23↙ 79↙ +-qwds↙ ,.;↙

0↙ 0↙

图10 非法字符死循环调试图

六 测试结果

1、录入信息测试

依次录入三个人人员信息,具体录入数据和程序截图如表1所示:

表1 录入信息测试表

中南民族大学计算机科学学院 专业 计算机科学与技术 学号:201521091067 姓名 :刘申臣 3

《面向对象程序设计》课程设计

输入 程序运行截图 无 (运行初始化界面) l↙ 1001↙ 三↙ 28↙ six↙ 8↙ 61↙ ++↙ 30↙ -1↙ */↙ 0↙ 25↙ qwe↙ 12↙ -5↙ 0↙ 62↙ w↙ 0↙ (接上表1)

中南民族大学计算机科学学院 专业 计算机科学与技术 学号:201521091067 姓名 :刘申臣 3

《面向对象程序设计》课程设计

输入 程序运行截图 l↙ 200014↙ 四↙ 12↙ 0↙ 20↙ 22↙ 30↙ 0↙ l↙ 20152109↙ 王五↙ 20↙ 0↙ 0↙ 6↙ 0↙ 0↙

2、输出信息测试

中南民族大学计算机科学学院 专业 计算机科学与技术 学号:201521091067 姓名 :刘申臣

3

《面向对象程序设计》课程设计

当系统提示成功录入三个人员信息后,选择输出,具体程序截图如表2所示:

表2 输出信息测试表

输入 程序运行截图 o↙ 3、退出系统测试

当用户不在使用系统后,选择退出系统,程序运行截图如表3所示:

表3 退出系统测试表 输入 程序运行截图 e↙ 4、保存数据测试

中南民族大学计算机科学学院 专业 计算机科学与技术 学号:201521091067 姓名 :刘申臣

3

《面向对象程序设计》课程设计

当用户使用完系统后,为保证数据的保存,可在文件中查看保存的当天考勤信息,数据保存文件据如图11所示:

图11 数据保存文件图

七 用户使用说明

1、录入信息

1) 打开程序所在目录,并运行程序,进入程序运行界面; 2) 按照程序菜单提示,按下键盘“l”键;

3) 根据程序提示信息依次键入学号、、到达小时、到达分钟、到达秒数、离开小时、

离开分钟、离开秒数等信息;

4) 输入完相关信息,直到程序界面显示“信息录入成功”,录入信息步骤即完成。

2、输出信息

1) 打开程序所在目录,并运行程序,进入程序运行界面; 2) 按照程序菜单提示,按下键盘“o”键;

3) 程序界面即可输出打印当天考勤信息,若无信息显示,则参照录入信息步骤录入

信息后,再按下键盘“o”键,输出打印信息。

3、退出系统

1) 打开程序所在目录,并运行程序,进入程序运行界面; 2) 按照程序菜单提示,按下键盘“e”键;

3) 当程序界面显示“使用,再见!”,即代表程序退出成功。

3、查看数据保存

1) 打开程序所在目录,找到“outfile.txt”文件,打开文件; 2) 文本文件显示容即为保存数据容。

中南民族大学计算机科学学院 专业 计算机科学与技术 学号:201521091067 姓名 :刘申臣 3

《面向对象程序设计》课程设计

八 课程设计总结

通过完成本次面向对象程序设计的任务,使我熟练和掌握了这学期所学的有关visual c++中的一些主要知识点和应用点,如类的定义,类的实现,对象的定义,类的继承等等。可以所学有所学,所有所用,不至于自己所学知识由于没有经历可用过程,而放弃对它的兴趣。

面向对象程序设计作为一门软件设计的课程,具有极强的实践性,使我加强了灵活应用理论知识的能力及面向对象程序设计技能。

此次,应用程序的设计和创建,经历了平时在课堂中和考试中,决不会有的重重难题和问题。而这些问题,又都是课本上很少提到的、更深一层的知识领域和应用领域。这些问题,并不是我们平时只靠课本,就可以轻易解决的。所以,锻炼了我们面对难题,自己思索,自己探索,自己查资料发现问题、解决问题的独断能力。

当然,此次任务的完成,也体现出同学之间的团结精神。所遇种种难以解决的问题,大家都会把它当作共同遇到的问题,在一起共同探讨,共同发挥自己所学和所知,投入式的互相帮助和解决困难。

“实践是检验真理的唯一标准”。没有实践,就不会发现和深刻体会它的真实所在。只有通过检验的真理,在自己的心里,才会认可它的真实性。面向对象程序设计的完成,使我们懂得了真理的重要性,理论和实际的相结合,才能真正把握所学和所掌握的知识。

理论的拥有并不能代表我们的实力和能力,一切的事件和其成功都是理论和实践的结合。总之,我们学习和掌握的知识,只有通过实际应用,才能真正的理解和掌握,才能更好的去应用。

中南民族大学计算机科学学院 专业 计算机科学与技术 学号:201521091067 姓名 :刘申臣 3

因篇幅问题不能全部显示,请点此查看更多更全内容