中南大学C 课程设计报告-职工工资信息管理系统_第1页
中南大学C 课程设计报告-职工工资信息管理系统_第2页
中南大学C 课程设计报告-职工工资信息管理系统_第3页
中南大学C 课程设计报告-职工工资信息管理系统_第4页
中南大学C 课程设计报告-职工工资信息管理系统_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1、 中南大学课程设计报告课程名称:高级程序设计实践(C+) 指导老师: 李刚 专 业: 班 级: 学 号: 姓 名: 2015年6月27日目录第一章 总体设计································ 11.1 C+课程设计要求及题目··&

2、#183;···································· 11.2 设计分析···········

3、83;·················································

4、83;···· ········· 1第二章 详细设计·································32.1 程序的结构

5、··················································

6、··· ····· 3 2.2 相关模块········································

7、·················· 3第三章 运行结果及操作方法······················23第四章 心得体会······

8、;··························28practices. The development of various undertakings, requires each party to pay and hard work. No free ride thing under the Sun, if you cannot

9、 play a vanguard and exemplary role of party members is unworthy party members. Both staff members and no staff members, both vigorous and resolute working style, good at policy advocacy, and to perform good decisions of party committees and Governments, determined to complete work assigned by the s

10、uperior party. Third, focus on improving service, the ability27第一章 总体设计1.1 C+课程设计要求及题目职工工资信息管理系统:设计一个职工信息管理案例,实现不同类别职工的工资数据。职工的种类包括:正式职工和临时工。定义一个基本的职工类,基本信息包括:编号、姓名、性别、年龄、家庭住址、基本职务工资。派生出正式职工类,增加的属性包括:岗位津贴、养老金、住房公积金、所得税、医疗保险、所得税,实发工资;临时工增加的属性包括:奖金、所得税、实发工资。1.正式职工:实发工资=基本职务工资+岗位津贴-养老金-住房公积金-所得税-医疗保险;2

11、.临时工:实发工资=基本职务工资+奖金-所得税;基本功能与技术要求:1、数据文件管理功能:利用输入输出流创建新文件、打开文件、保存文件。2、计算与统计功能:采用静态数据成员与成员函数完成记录中相关数据的统计;1)能够打开已存在的数据表文件,对数据表中与某关键字匹配的相关记录进行数据统计(包括:工资总额、平均值、不同价格区间的图书)2)计算每个职工的实发工资。3、记录管理功能:利用继承与派生思想创建不同的类;记录的管理采用链表或者指针数组实现;采用抽象类、虚函数等实现对象与函数的动态关联,体现多态性。1)输入添加/插入记录:利用重载运算符“>>”完成对任意一条记录输入、添加或插入数据

12、表中,并保存到数据文件中。2)查询、显示记录:能够打开已存在的数据表文件,根据用户要求按所给记录关键字查询一个或多个相关联记录的各项信息。利用重载运算符“<<”输出个对象的信息。3)修改记录:能够打开已存在的数据表文件,并对确定的任意记录进行修改,在修改过程中,应显示记录信息,给出确认提示,并对更新的记录信息进行文件保存。4)删除记录:能够打开已存在的数据表文件,可以删除数据表中的任一记录,要求具备逻辑删除(具有恢复功能)和物理删除功能,并对新的数据表信息进行文件保存。1.2 设计分析根据基本功能与技术要求,程序要实现对职工数据文件管理功能,计算与统计功能,记录管理功能。因此,程序

13、中需要构造很多实现这些目的的函数来一一完成题目要求。其次,职工又分为,正式职工和非正式职工,而且两者的基本信息有不同的,也有相同的,所以应该根据题目要求定义一个基类,即基本职工类。它的私有数据包括编号,姓名,性别,年龄,家庭住址,基本职务工资,并对它们初始化。然后又派生了两个类,分别代表正式职工和非正式职工。正式职工:在基类的基础上增加了岗位津贴,养老金,住房公积金,所得税,医疗保险,所得税和实发工资,并进行初始化。临时职工:在基类的基础上增加了奖金,所得税,实发工资,并对他们进行初始化。最后,构造不同的函数来实现不同的功能,比如添加,修改,保存,删除,恢复等一系列功能,最后完成主函数,最后对

14、程序代码进行优化,完成程序的设计。第二章 详细设计2.1 程序的结构程序的前半部分,定义了基类basic,对编号,姓名,性别,年龄,家庭住址,基本职务工资这些数据进行了初始化,把它们封装起来,然后利用继承和派生思想,分别对正式职工和非正式职工创建了派生类,把它们独有的数据初始化并保存封装。接下来,又创建了一个类link,用于链接数据库文件。前半部分主要是类的创建,继承,派生,对职工的属性进行封装,初始化,以便后面调用。程序的中间部分,主要构造了一系列函数,对前面类中初始化的数据进行操作,首先构造了正式职工类插入新结点函数,接下来是,正式职工类输入新纪录的函数,非正式职工类插入新结点函数,非正式

15、职工类输入新纪录的函数,输入函数,正式职工工资信息输出函数,非正式职工工资信息输出函数,输出函数,修改函数,删除函数,恢复函数,统计函数。依次完成了职工信息的输入,输出,保存,修改,删除,恢复。程序的后半部分,是主函数部分,定义了存储正式和非正式职工结点的类指针,定义了程序运行界面,在循环系统中依此调用了链接函数,输入函数,输出函数,查找函数,删除函数,恢复函数,修改函数,统计函数和文件保存函数。2.2 相关模块(一)基类基本职工类对编号,姓名,性别,年龄,基本工资,住址初始化,设置默认参数,并将姓名,性别,年龄,基本工资,住址定义为保护数据。源程序:class basic /基本职工类 pu

16、blic: int id; /职工编号 basic *next; /利用basic创建指向basic类对象的指针, basic() /构造函数初始化,设置默认参数 this->id = 0; /编号 this->name="未注明" /姓名 /this指针是指向本类对象的指针 this->sex = "未注明" /性别 this->age = 0; /年龄 this->s = 0; /基本工资 this->add = "未注明" /住址 this->next=NULL; /指针变量next是空

17、的 void set() /输入函数 cout<<"编号:" cin>>id; cout<<"姓名:" cin>>name; cout<<"性别:" cin>>sex; cout<<"年龄:" cin>>age; cout<<"基本工资:" cin>>s; cout<<"住址:" cin>>add; void display() /输

18、出函数 cout<<"-"<<endl; cout<<"| 编号 | 姓名 | 性别 | 年龄 | 基本工资 | 住址 | "<<endl; cout<<"-"<<endl; printf("| %5d| %13s| %5s| %5d| %9d| %17s|n",id,name.c_str(),sex.c_str(),age,s,add.c_str(); cout<<"-"<<endl; /*%md,

19、m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。 当调用库函数,要输入的是string类型参数,而库函数内部实现用的是C语言的char,因此需要将string对象, 转化为char对象,而c_str()提供了这样一种方法。*/ virtual void infromfile(ifstream &); /从文件读取(in from file),virtual 虚函数的作用是实现多态性(例子定义了四个类A、B、C、D,其中B、C继承了A,而D继承了B、C。然后我们用A类,定义了四个指针分别指向不同的对象,这时指针根据不同的类对象正确输出,这就是所

20、说的多态性。) virtual void writetofile(ofstream &); /写入到文件,参数是ostream类的地址,用来支持写入到磁盘里 protected: string name; string sex; int age; int s;/salary string add; ;(二)派生类正式职工类首先,定义了链表后驱指针,然后,对私有数据:岗位津贴,养老金,住房公积金,所得税,医疗保险,所得税,实发工资初始化,设置默认参数,并保存。 源程序:class formal:public basic public: char type; /类型(type):正式,临时

21、等;见派生类正式职工类 formal *next; /定义链表的后驱指针 formal() /初始化 this->type = 'f' /f表示formal(正式) this->jintie = 0; this->yanglao = 0; this->zhufang= 0; this->shui1 = 0; this->yiliao = 0; this->shui2= 0; this->shifaoff= 0; this->next = NULL; void set_f() /输入数据 type = 'f'

22、cout<<"岗位津贴:" cin>>jintie; cout<<"养老保险:" cin>>yanglao; cout<<"住房公积金:" cin>>zhufang; cout<<"所得税:" cin>>shui1; cout<<"医疗保险:" cin>>yiliao; cout<<"所得税:" cin>>shui2; shifaof

23、f=s+jintie+yanglao+zhufang+yiliao-shui1-shui2; cout<<"实发工资:"<<shifaoff<<endl; void dispay_f() cout<<"-"<<endl; cout<<"| 岗位津贴 | 养老保险 | 住房公积金 | 所得税 | 医疗保险 | 所得税 | 实发工资 |"<<endl; cout<<"-"<<endl; printf("

24、| %9d| %9d| %11d| %7d| %9d| %8d| %9d|n",jintie,yanglao,zhufang,shui1,yiliao,shui2,shifaoff); cout<<"-"<<endl; void infromfile(ifstream&); /从文件读取,同上 void writetofile(ofstream&); /写入到文件 int shifaoff; /把实发工资设为公用数据 private: int jintie; /岗位津贴 int yanglao ; /养老保险 int zhu

25、fang; /住房公积金 int shui1; /所得税 int yiliao; /医疗保险 int shui2; /所得税 ;(三)派生类临时职工类首先定义非正式职工信息链表后驱指针,对其私有数据:奖金,所得税,实发工资,初始化,设置默认参数,并保存。源程序:class informal : public basic public: char type; informal *next; /定义临时职工信息链表的后驱指针 informal() this->type = 'i'/见派生类正式职工类 this->jiang= 0; this->shui3=0; t

26、his->shifaofi=0; this->next = NULL; void set_i() type = 'i' cout<<"奖金:" cin>>jiang; cout<<"所得税:" cin>>shui3; shifaofi=s+jiang-shui3; cout<<"实发工资:" cout<<shifaofi; cout<<endl; void display_i() cout<<"-&qu

27、ot;<<endl; cout<<"| 奖金 | 所得税 | 实发工资 | "<<endl; cout<<"-"<<endl; printf("| %14d| %14d| %16d|n",jiang,shui3,shifaofi); void infromfile(ifstream &); /从文件读取,同上上 void writetofile(ofstream &); /写入到文件 int shifaofi;/同上 private: int jiang;/奖

28、金 int shui3;/所得税 ;(四)构造链接函数用于链接数据库文件源程序:class link /link类,用于链接数据库文件 public: string printmenu(void); /menu=菜单 private: string newdata(void); /newdata+新数据 string opendata(void); /公开数据 ;(五) 构造输入函数选择要输入的职工类别,依此输入编号,姓名,性别,年龄,住址,基本工资,输入y继续输入该职工类职工信息,输入其他字符,结束当前职工类信息的输入。源程序:/构造输入函数formal *insert_f(formal *

29、head,formal *pn) /正式职工类插入(insert)新结点函数,就是可以输入新数据,参数是指向类对象的指针变量 /每个结点中的指针域指向下一个结点,head是“头指针”,指向第一个结点,表示链表的开始,而最后一个指针的指针域为NULL(空地址),表示链表的结束。 formal *pc,*pa; pc=pa=head; if(head=0) /如果没有第一个结点 head=pn; /最后一个指针变量跟head没区别 pn->next=0; /所以,最后一个指针变量指向的下一个指针(结点)不存在 return head; if(pn->id <= head->

30、id) /,pn是最后一个指针变量,如果新结点编号小于最小的编号(注意:这里head不停地更新到小的编号) pn->next=head; /那么新的指针变量变为头指针,用于下次的比较,表明head指针不断地被赋给编号小的结点, head=pn; return head; while(pc->next!=0&&pn->id>=pc->id) / 找到编号最大的结点的指针变量pa pa=pc; pc=pc->next; if(pn->id >= pc->id)/pn成为编号小的结点的指针变量 pc->next=pn; pn

31、->next=0; else pn->next=pc; pa->next=pn; return head; formal *input_f(formal *head) /正式职工类输入新记录的函数参数和返回值相通,参数为指向类对象的指针变量 formal *fo,*p;/定义指向类对象的指针变量 char k; do system("cls");/执行控制台命令cls,就是CMD下面的cls,功能是清屏,清除敲入回车键前所有显示的信息 fo= new formal();/把新的构造函数赋给指针变量 cout<<"请输入要添加职工信息:

32、"<<endl; fo->set(); /调用fo指向的set函数,fo指向的是正式职工类的输入函数 fo->set_f(); /本行+钱一行为获取新信息,set()在20几行 p=insert_f(head,fo); /调用插入结点函数把刚输入的信息插入到链表中 n1+; /正式职工结点数 cout<<"是否继续输入?(y/n):" cin>>k;/输入char类型字符,是y或者n while(k='y' | k='Y');/输入Y继续插入数据,输入其他任意键返回 return p;

33、 informal *insert_i(informal *head,informal *pn) /临时职工类插入新结点函数 informal *pc,*pa; pc=pa=head; if(head=0) head=pn; pn->next=0; return head; if(pn->id <= head->id) pn->next=head; head=pn; return head; while(pc->next!=0&&pn->id>=pc->id) pa=pc; pc=pc->next; if(pn->

34、;id >= pc->id) pc->next=pn; pn->next=0; else pn->next=pc; pa->next=pn; return head; informal *input_i(informal *head) /临时职工类输入新记录的函数 informal *inf,*p; char k; do system("cls"); inf= new informal(); cout<<"请输入要添加职工信息:"<<endl; inf->set(); inf->se

35、t_i(); /获取新信息 p=insert_i(head,inf); /调用插入结点函数 n2+; /临时职工结点数 cout<<"是否继续输入?(y/n):" cin>>k; while(k='y' | k='Y'); /输入Y继续插入数据,输入其他任意键返回 return p; int input(formal *head_f,informal *head_i) /输入函数,两个参数 int k=0; for(;) system("cls"); cout<<"请选择你要添

36、加的职工信息的类别:(1.正式职工 or 2.临时职工 3.返回)" cin>>k; switch(k) case 1 : head_f = input_f(head_f); break;/调用输入新记录的函数,并把返回值赋给指针变量head_f case 2 : head_i = input_i(head_i);break; default:return 1; (六)构造输出函数用于把输入的职工信息显示在电脑屏幕上,以便核对,纠正,数据统计。源程序:void output_f(formal *head) /正式职工工资信息输出函数 formal *p; p = head

37、->next; /把编号最小的结点的指针变量赋给下一个结点的指针变量,上面已把head调成指向编号最小的结点的函数 while(p != NULL)/当下一个指针存在 p->display(); /输出基本(姓名等)信息 p->dispay_f();/输出工资信息 p = p->next; /循环 void output_i(informal *head) /非正式职工工资信息输出函数 informal *p; p = head->next; while(p != NULL) p->display(); p->display_i(); p = p-&g

38、t;next; int output(formal *head_f,informal *head_i) /输出函数,两个参数 system("cls"); if(head_f->next=NULL) cout<<"无正式职工工资信息"<<endl; else cout<<"正式职工工资信息:"<<endl; output_f(head_f);/调用上面的函数,说明在主函数中只有调用本函数即可,本函数再调用上面的输出函数 if(head_i->next=NULL) cout&l

39、t;<"无临时职工工资信息"<<endl; else cout<<"临时职工工资信息:"<<endl; output_i(head_i); system("pause"); /ystem("pause")就是从程序里调用“pause”命令; / 而“pause”这个系统命令的功能很简单,就是在命令行上输出一行类似于“Press any key to exit”的字,等待用户按一个键,然后返回。 return 1; (七)修改函数(对输入的信息修改)选择要修改的职工类别(1,

40、正式职工 2,非正式职工 3,返回),输入要修改的职工编号,然后重新输入此职工的信息。源程序:formal *edit_f(formal *head) /修改正式职工信息 formal *p; int num; if(head=0) cout<<"无正式职工信息!" system("pause");/功能同上 return 0; cout<<"请输入要修改的职工编号:"<<endl; cin>>num; p=head; while(num!=p->id) if(p->next

41、=0) break; p=p->next; if(p->id=num) cout<<"请输入新的职工信息:"<<endl; p->set(); /调用p指向的结点的输入函数 /基本信息 p->set_f(); /工资信息 system("pause");/功能同上 else cout<<"无此临时职工信息!"<<endl; system("pause"); return head; return head; informal *edit_i(i

42、nformal *head) /修改非正式职工信息 informal *p; int num; if(head=0) cout<<"无临时职工信息!" system("pause"); return 0; cout<<"请输入要修改的职工编号:" cin>>num; p=head; while(num!=p->id) if(p->next=0) break; p=p->next; if(p->id=num) cout<<"请输入新的职工信息:"

43、<<endl; p->set(); p->set_i(); system("pause"); else cout<<"无此临时职工信息!" system("pause"); return head; return head; int edit(formal *head_f,informal *head_i) /修改函数,两个参数,调用上面两个函数 int k=0; system("cls");/清屏 for(;) cout<<"请选择您要修改的职工信息类别:

44、(1.正式职工 or 2.临时职工 3.返回)" cin>>k; switch(k) case 1 : head_f = edit_f(head_f); break; /功能同上 case 2 : head_i = edit_i(head_i);break; default:return 1; (8)查找函数(从输入的信息中查找需要的信息)选择要查找的职工类别,(1,正式职工 2,非正式职工 3,返回),然后输入要查找的职工编号,此职工的信息将被查找出来。源程序:int find(formal *head_f,informal *head_i)/查找函数(按照编号查找),

45、两个参数 formal *ps;informal *pt;/指向类对象的指针变量 int fid; system("cls"); ps = new formal();pt = new informal(); /ps,pt指向所有的新增构造函数 ps = head_f; pt = head_i; /ps指向头指针,不是直接查找,而是一个个地找 cout<<"请输入您要查找的职工编号:" cin>>fid;/输入要查找的编号 if(ps=NULL) else while(ps->id!=fid)/当id数存在且不是第一个就执行w

46、hile语句,说明有两个以上时执行。 if(ps->next = NULL) break; /如果ps指向的id是最后一个id ,break跳出while ps = ps->next;/如果if不成立 不停地向下找,直到ps-=fid if(pt = NULL) else while(pt->id!=fid) if(pt->next = NULL) break; pt = pt->next; if(ps->id = fid) ps->display(); ps->dispay_f(); else if(pt->id = fid) pt-&g

47、t;display(); pt->display_i(); else cout<<"无此职工信息!"<<endl; system("pause"); return 1; (9)删除函数(删除不需要的信息)选择要删除的职工类别(1,正式职工 2,非正式职工 3,返回),输入要删除的职工编号。此职工信息将被删除。源程序:formal *revertf;formal *del_f(formal *head_f,int num) /删除正式职工信息 formal *p1,*p2,*p3; if(head_f=0) cout<&

48、lt;"无正式职工信息!"goto end; p1=head_f; while(num!=p1->id) if(p1->next=0)break; p2=p1;p1=p1->next; if(num=p1->id) p3=p1; if(p1=head_f) head_f=p1->next; else p2->next=p1->next; n1-; cout<<"删除(正式职工):"<<p1->id<<"目标:"<<num<<&q

49、uot; 成功!"<<endl; revertf=insert_f(revertf,p3); else cout<<"没有找到正式职工中编号为"<<num<<"的职工"<<endl; end: return(head_f); informal *reverti;informal *del_i(informal *head_i,int num) /删除非正式职工信息 informal *p1,*p2,*p3; if(head_i=0) cout<<"无临时职工信息!

50、"goto end; p1=head_i; while(num!=p1->id) if(p1->next=0)break; p2=p1;p1=p1->next; if(num=p1->id) p3=p1; if(p1=head_i) head_i=p1->next; else p2->next=p1->next; n2-; cout<<"删除(临时职工):"<<p1->id<<"目标:"<<num<<" 成功!"<

51、;<endl; reverti=insert_i(reverti,p3); else cout<<"没有找到临时职工中编号为"<<num<<"的职工"<<endl; end: return(head_i); int del(formal *head_f,informal *head_i)/删除函数,两个参数 int did;system("cls");cout<<"请输入要删除的职工编号:"cin>>did;del_f(head_f,di

52、d); /在正式职工类链表中删一遍del_i(head_i,did); /同样在非正式职工类链表中再删一遍system("pause");return 1; (10)恢复函数(恢复误删的信息) 选择要恢复的职工信息类别,输入职工编号。源程序:formal *rev_f(formal *head) /正式职工类恢复函数 formal *p;int num=0;if(revertf=0) goto end;cout<<"请输入您要恢复的职工编号:"cin>>num;p=revertf;while(p!=0) if(p->id=n

53、um) break;p=p->next;n1+;head=insert_f(head,p); end:return(head); informal *rev_i(informal *head) /非正式职工类恢复函数 informal *p;int num=0;if(reverti=0) goto end;cout<<"请输入您要恢复的编号:"cin>>num;p=reverti;while(p!=0)if(p->id=num) break;p=p->next;n2+;head=insert_i(head,p); end:retur

54、n(head); int rev(formal *head_f,informal *head_i)/恢复函数,两个参数 int t;system("cls");cout<<"请选择要恢复的职工类型:1.正式 2.非正式" cin>>t; if(t=1)rev_f(head_f); /在正式职工类链表中恢复cout<<"恢复成功!"<<endl; if(t=2) rev_i(head_i); /在非正式职工类链表中恢复 cout<<"恢复成功!"<<endl; system("pause"); return 1; (11)统计函数(对输入德信息统计,计算平均值,总和)对输入的职工信息进行统计分析,求出平均值,总和。源程序:formal *tong_f(formal *head_f)/正式职工类统计函数 int zong=0,ave=0; formal *p; p=head_f->next; while(p!=0) zong+=p-

温馨提示

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

评论

0/150

提交评论