程序设计基础实践报告.doc_第1页
程序设计基础实践报告.doc_第2页
程序设计基础实践报告.doc_第3页
程序设计基础实践报告.doc_第4页
程序设计基础实践报告.doc_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机程序设计实践中南大学程序设计基础实践报告 题 目 职工工资信息管理系统 学生姓名 张兰兰 学 院 信息科学与工程学院 专业班级 物联网工程1301班 完成时间 2014.7.3 指导教师 汪杰 目 录一、课程设计目的和要求. 二、课程设计基本内容.三、程序功能简介. 四、主体内容. 4.1 设计分析. 4.2 程序结构. 4.3 模块的功能及程序说明. 4.4 相关模块源程序. 4.5 操作方法(流程). 4.6 试验结果(包括输入数据和输出结果). 4.7 设计体会. 4.8 参考文献.五、用户使用说明. 六、对本设计过程及方法、手段的改进建议.1、 课程设计的目的和要求本次课程设计,是基于“面向对象编程(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文件源程序#includestaff.h#includeformal.h#includecasual.hstring 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文件源程序#includestaff.h#includeformal.h#includecasual.hvoid SaveToFile(fstream &file, staff *s)/用于保存信息到指定文件if (&file = &cout)staff *p = s;while (p)cout *p next;elsefstream temp;temp.open(path, ios:out);staff *p = s;while (p)temp *p next;temp.close();ReadFromFile函数cpp文件源程序#includestaff.h#includeformal.h#includecasual.hvoid 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 : 定义控制台应用程序的入口点。#include stdafx.h#include #include #include #includeformal.h#includestaff.h#includecasual.hfstream file;/文件流string path;/路径,记录打开的文件路径string input;/记录输入staff *head = NULL;/头指针staff *recover = NULL;/记录可恢复信息int main(int argc, char *argv, char *envp)system(color 1A);while (1)system(cls);if (file.is_open()/已打开文件cout 当前打开文件: path endl;cout 新建n2-打开n3-保存n4-另存为n5-输入信息n6-插入信息n7-显示信息n8-查询信息n9-统计关键字(工资总额,平均值)na-删除信息nb-恢复信息nq-退出n;getline(cin, input);system(cls);switch (input0)case 1:/新建/询问是否保存已打开的文件if (file.is_open()cout path endl;cout 是否保存当前已打开的文件?(Y/N):;getline(cin, input);if (Y = input0 | y = input0)SaveToFile(file, head);cout 保存成功. endl;elsecout 保存失败. endl;file.close();cout 请输入新文件路经:;getline(cin, input);/打开文件file.open(input, ios:in);if (file)/文件已存在file.close();/先关闭文件cout 文件已存在,是否替换?(Y/N):;string temp = input;/临时保存文件路径getline(cin, input);if (!(Y = input0 | y = input0)/取消新建cout 新建失败. endl;break;elsecout 已替换. endl;input = temp;if (head)/释放内存delete head;head = NULL;path = input;file.open(path, ios:in | ios:out | ios:trunc);break;case 2:/打开cout 请输入要打开的文件路径:;getline(cin, input);if (input = path)/已打开cout 已打开该文件! endl;break;/是否存在文件fstream temp;temp.open(input, ios:in);if (!temp)cout 文件不存在,打开失败! endl;break;temp.close();/询问是否保存if (file.is_open()cout 是否保存文件: path n;path = input;cout (Y/N):;getline(cin, input);if (y = input0 | Y = input0)SaveToFile(file, head);cout 保存成功. endl;elsecout 未保存. endl;file.close();elsepath = input;file.open(path, ios:in | ios:out | ios:app);ReadFromFile(file, &head);cout 已读入信息:n;SaveToFile(fstream &)cout, head);break;case 3:/保存if (!file.is_open()/未打开文件cout 当前未打开文件! endl;elseSaveToFile(file, head);cout 已保存到: path endl;break;case 4:/另存为cout 请输入另存为的文件路径:;getline(cin, input);fstream temp;string _path = input;/临时路径temp.open(_path, ios:in);if (temp)/文件已存在cout 文件已存在,是否替换?(Y/N):;getline(cin, input);if (!(Y = input0 | y = input0)/输入的不是Y/y则取消另存为cout 取消另存. endl;break;/另存到_pathstring str = path;/保存pathpath = _path;SaveToFile(temp, head);cout 文件已另存到 _path next) s = s-next;while (1)staff *p;/临时变量cout *p;if (!head)s = head = p;elses = s-next = p;break;case 6:/插入信息if (!head)cout 当前无信息,无法插入! endl;elseSaveToFile(fstream &)cout, head);cout GetNO() != no)if (!s-next)/不存在指定编号cout 编号输入错误! next;if (flag) break;/编号输入错误则退出while (1)staff *p;/临时变量cout *p;p-next = s-next;s-next = p;s = p;break;case 7:/显示信息if (head)SaveToFile(fstream &)cout, head);elsecout 当前未打开文件! endl;break;case 8:/查询信息if (!head)cout 当前无信息,终止查询! endl;elseSaveToFile(fstream &)cout, head);cout 请输入要查询的内容:;getline(cin, input);staff *s = head;cout n查询结果:n;cout next;/临时保存s-next = NULL;SaveToFile(fstream &)cout, s);s-next = p;/还原if (!s-next)break;elses = s-next;break;case 9:/统计关键字(工资总额,平均值)if (!head)/无信息可统计cout 当前未输入信息! GetMoney();s = s-next; while (s);cout 工资总额: money endl;cout 平均值: money / population endl;break;case a:/删除信息if (!head)/无信息可删除cout 当前未输入信息! endl;break;char choice = 0;/记录选择cout A(逻辑删除,可恢复)/B(物理删除,不可恢复):;getline(cin, input);if (A = input0 | a = input0)choice = A;else if (B = input0 | b = input0)choice = B;elsecout 输入错误! endl;break;while (1)system(cls);if (A = choice)cout 以下删除可恢复:;else if (B = choice)cout 以下删除不可恢复:;system(pause);/显示信息SaveToFile(fstream &)cout, head);cout GetNO() = no)/第一条信息符合if (A = choice)/逻辑删除,先保存if (p)p-next = head;elserecover = head;head = head-next;if (A = choice)if (p)p-next-next = NULL;elserecover-next = NULL;else/符合的信息不是第一条staff *s = head;/定位要删除的信息之前的一条while (s-next & s-next-GetNO() != no)s = s-next;if (!s-next)/未找到匹配编号cout next = s-next;elserecover = s-next;s-next = s-next-next;if (A = choice)if (p)p-next-next = NULL;elserecover-next = NULL;break;case b:/恢复信息if (!recover)cout 无可恢复信息! endl;break;SaveToFile(fstream &)cout, recover);cout next)s = s-next;s-next = recover;recover = NULL;cout 已恢复! endl;elsecout 未恢复! endl;break;case q:if (head | recover)cout 还有残留信息,确认退出?(Y/N):;getline(cin, input);if (Y = input0 | y = input0)return 0;elsecontinue;elsereturn 0;default:continue;system(pause);c.类模块(每个类的信息作为一个文件)基类staff的.h文件和cpp文件#include stdafx.h#include #include #include typedef char TYPE;#define STAFF 0/基本职工类#define FORMAL 1/正式工#define CASUAL 2/临时工#define INT 3/整数#define DECIMAL 4/小数#define MAX_IGNORE 256class staff/基本职工类(基类)protected:string no;/编号string name;/姓名string sex;/性别unsigned age;/年龄string address;/家庭住址double base_wage;/基本职务工资public:TYPE type;/职工类型(子类类别)staff *next;/链表指针protected:void InputBasicInfo(istream &input);/用于输入基类的基本信息void OutputBasicInfo(ostream &output);/用于输出基类的基本信息virtual void CalcMoney() = 0;/计算实发工资,并返回public:staff() :type(STAFF), next(NULL)/初始化staff() if (next)delete next; /删除链表friend istream &operator(istream &input, staff &s);/用于输入基类的基本信息并且调用子类的输入函数friend ostream &operator(ostream &output, staff &s);/用于输出基类的基本信息并且调用子类的输出函数friend void ReadFromFile(fstream &file, staff *s);/用于从文件读取信息string GetNO() return no; /获取编号virtual double GetMoney() = 0;/获取工资bool operator=(string str);/查询信息时用#includestaff.h#includeformal.h#includecasual.hbool staff:operator=(string str)/查询信息时用double data = atof(str.c_str();if (str = no)return true;/编号if (str = name)return true;/姓名if (str = sex)return true;/性别if (data = age)return true;/年龄if (str = address)return true;/家庭住址if (data = base_wage) return true;/基本职务工资if (FORMAL = type)/正式工return *(formal *)this = str;else if (CASUAL = type)/临时工return *(casual *)this = str;return false;void staff:InputBasicInfo(istream &input)/用于输入基类的基本信息if (&input = &cin)/从键盘输入cout 编号:;getline(input, no);cout 姓名:;getline(input, name);cout 性别:;getline(input, sex);age = atoi(InputNormalInfo(input, 年龄, INT).c_str();cout age;input.ignore(MAX_IGNORE, :);getline(input, address);input.ignore(MAX_IGNORE, :) base_wage;void staff:OutputBasicInfo(ostream &output)/用于输出基类的基本信息output 编号: no n;output 姓名: name n;output 性别: sex n;output 年龄: age n;output 家庭住址: address n;output 基本职务工资: base_wage (istream &input, staff &s)/用于输入基类的基本信息并且调用子类的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论