福建师范大学闽南科技学院程序设计基础实践报告题目职工工资信息管理系统学生姓名陈显泽学院信息科学与工程学院专业班级土木工程1班完成时间 2017.4.20指导教师褚若波目录一、课程设计目的和要求...................................二、课程设计基本内容....................................三、程序功能简介........................................四、主体内容............................................4.1 设计分析......................................4.2 程序结构......................................4.3 模块的功能及程序说明..........................4.4 相关模块源程序................................4.5 操作方法(流程)................................4.6 试验结果(包括输入数据和输出结果).............4.7 设计体会......................................4.8 参考文献......................................五、用户使用说明........................................六、对本设计过程及方法、手段的改进建议..................一、课程设计的目的和要求本次课程设计,是基于“面向对象编程(C++)”课程学习内容的重要实践环节,其主要目的在于通过综合程序课程设计,培养和提高学生的独立分析问题、解决实际问题的能力和计算机语言编程能力。
本次课程设计时间为2周,要求每位同学在为期两周的时间段内,在编程环境下,用面向对象程序设计思想进行C++程序设计、功能模块调试,在正确、合理的软件功能规划的基础上,实现公用接口与私有实现的分离,独立完成相关设计题所规定的任务、进行课程设计报告编写与整理。
而且也是为了培养从资料文献、科学实验中获得知识的能力,提高从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
对掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。
课程设计结束时,要求进行设计成果演示(由指导老师验收相关程序运行成果并打分);每人须对相关电子文档进行整理上交(包括:程序文件、帮助说明文档);交课程设计报告一份(纸质打印稿)。
二、课程设计的内容设计一个职工信息管理案例,实现不同类别职工的工资数据。
职工的种类包括:正式职工和临时工。
定义一个基本的职工类,基本信息包括:编号、姓名、性别、年龄、家庭住址、基本职务工资。
派生出正式职工类,增加的属性包括:岗位津贴、养老金、住房公积金、所得税、医疗保险、实发工资;临时工增加的属性包括:奖金、所得税、实发工资。
1.正式职工:实发工资=基本职务工资+岗位津贴-养老金-住房公积金-所得税-医疗保险;2.临时工:实发工资=基本职务工资+奖金-所得税;基本功能与技术要求1、数据文件管理功能:利用输入输出流创建新文件、打开文件、保存文件。
2、计算与统计功能:采用静态数据成员与成员函数完成记录中相关数据的统计;1)能够打开已存在的数据表文件,对数据表中与某关键字匹配的相关记录进行数据统计(包括:工资总额、平均值)2)计算每个职工的实发工资。
3、记录管理功能:利用继承与派生思想创建不同的类;记录的管理采用链表或者指针数组实现;采用抽象类、虚函数等实现对象与函数的动态关联,体现多态性。
1)输入/添加/插入记录:利用重载运算符“>>”完成对任意一条记录输入、添加或插入数据表中,并保存到数据文件中。
2)查询、显示记录:能够打开已存在的数据表文件,根据用户要求按所给记录关键字查询一个或多个相关联记录的各项信息。
利用重载运算符“<<”输出个对象的信息。
3)修改记录:能够打开已存在的数据表文件,并对确定的任意记录进行修改,在修改过程中,应显示记录信息,给出确认提示,并对更新的记录信息进行文件保存。
4)删除记录:能够打开已存在的数据表文件,可以删除数据表中的任一记录,要求具备逻辑删除(具有恢复功能)和物理删除功能,并对新的数据表信息进行文件保存。
三、程序功能简介数据文件管理功能:利用输入输出流创建新文件、打开文件、保存文件。
计算与统计功能:用静态数据成员与成员函数完成记录中相关数据的统计;记录管理功能:实现输入,插入,删除,恢复等功能。
四、主体内容4.1 设计分析设置基本类staff,并由此派生出正式职工类formal和临时工类casual.由于在派生类中都要用到同名的同功能函数,所以在基类中定义了虚函数,以实现对象与函数的动态关联。
在整个程序中定义了三个函数string InputNormalInfo(istream &input,string tip, char type);(用于直到输入正确类型的数据才返回)void SaveToFile(fstream &file,staff *s);(用于保存信息到指定文件)void ReadFromFile(fstream &file,staff **s);(用于从文件读取信息),InputNormalInfo函数用于对测试过程中一些由输入错误引起的错误的纠正。
最后在主函数中用SWITCH语句实现了对文件,信息的相关操作。
为了体现C++工程性的特点,本程序中的类,函数单独作为头文件和CPP文件,最后在主程序中调用即可。
即为了实现面向对象中的公用借口与私有实现的分离。
4.2 程序结构4.3 各模块的功能及程序说明a.函数模块(作为三个头文件)①string InputNormalInfo(istream &input,string tip, char type);用于直到输入正确类型的数据才返回。
执行过程中用户可能会由于不小心输入错误,而是系统终止运行,系统就会出错。
用这个函数检查用户的输入是否正确,提高程序的可行性。
②void SaveToFile(fstream &file,staff *s);用于保存信息到指定文件。
此函数执行对职工数据的保存。
③void ReadFromFile(fstream &file,staff **s); 用于从文件读取信息。
b.主函数模块(作为最终的主程序)创建主菜单界面,以供用户选择。
用SWITCH语句和链表实现相关操作。
①职工信息文件模块:case '1':(新建)case '2':(打开)case '3':(保存)case '4':(另存为)②职工信息输入模块:case '5':(输入信息)③职工信息插入模块:case '6':(插入信息)④职工信息显示模块:case '7':(显示信息)⑤职工信息查询模块: case '8':(查询信息)⑥职工信息统计关键字模块: case '9':(统计关键字(工资总额,平均值))⑦职工信息删除模块: case 'a':(删除信息)⑧职工信息恢复模块:case 'b':(恢复信息)⑨退出系统模块:case 'q':(退出程序)c.类模块(每个类作为一个头文件,类的函数作为cpp文件)①staff基本职工类:class staff{}定义了职工的基本信息,数据包括编号,姓名,年龄等。
设置输入输出重载友元函数,计算工资的虚函数。
②formal正式职工类:class formal:public class staff{}增加正式职工的其他数据,比如保险之类的。
明确定义计算工资函数③casual临时工类:class casual:public class staff{}增加临时工的附加信息。
明确定义计算工资函数。
4.4 相关模块源程序a.函数模块①InputNormalInfo函数cpp文件源程序#include"staff.h"#include"formal.h"#include"casual.h"string InputNormalInfo(istream &input, string tip, char type) //用于直到输入正确类型的数据才返回{string str; //临时变量while (1){bool wrong = false; //记录是否输入错误cout << tip;if (INT == type)cout << "(请输入整数)";else if (DECIMAL == type)cout << "(请输入小数或整数)";cout.put(':');getline(input, str);if (INT == type) //整数{for (auto iter = str.cbegin(); iter != str.cend(); iter++) //使用迭代器检查是否输入的都是整数{if (!isdigit(*iter)) //不是数字{wrong = true;break;}}}else if (DECIMAL == type) //小数{bool point = false; //记录是否已经读取到小数点for (auto iter = str.cbegin(); iter != str.cend(); iter++) //使用迭代器检查是否输入的是小数{if (!isdigit(*iter)) //不是数字{if ('.' == *iter && !point) //第一次读取到小数点{point = true; //已经读取小数点continue;}//否则输入错误wrong = true;break;}}}//判断输入是否错误if (!wrong)return str;}}②SaveToFile函数cpp文件源程序#include"staff.h"#include"casual.h"void SaveToFile(fstream &file, staff *s) //用于保存信息到指定文件{if (&file == &cout){staff *p = s;while (p){cout << *p << '\n';p = p->next;}}else{fstream temp;temp.open(path, ios::out);staff *p = s;while (p){temp << *p << '\n';p = p->next;}temp.close();}}③ReadFromFile函数cpp文件源程序#include"staff.h"#include"formal.h"void ReadFromFile(fstream &file, staff **s) //用于从文件读取信息{file.seekg(0, ios::beg);if (*s) //如果已有信息{delete *s;*s = NULL;}string input; //记录读取到的一行staff *p = NULL;staff *tail = NULL; //记录链表尾部do //读取标题{getline(file, input);if ("-正式工-" == input)p = new formal;else if ("-临时工-" == input)p = new casual;elsecontinue;file >> *p;//清除多余的信息if (!*s) //第一次读入tail = *s = p;elsetail = tail->next = p;} while (file.good());file.clear();}b.主函数模块cpp文件源程序// 职工工资信息系统.cpp : 定义控制台应用程序的入口点。