《C++课程实践报告(企业职工工资管理系统)3767.docx》由会员分享,可在线阅读,更多相关《C++课程实践报告(企业职工工资管理系统)3767.docx(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、中南大学本科生课程程设计(实践)任务书、设设计报告(C+应应用基础课课程设计)题 目 企业职工工工资管理理系统 学生学号学生姓名指指导教师学 院物理学院专业班级指导老师计算机基础础教学实验验中心2010年年07月009日企业职工工工资管理系系统摘要:在VVC+环环境下编写写一个基于于控制台方方式(Wiin32 Conssole Appllicattion)的的工资管理理系统,以以实现简单单地处理一一个月内某某企业职工工工资信息息。关键词:工工资管理,基基本工资,个个人所得税税。1.企业工工资管理系系统开发设设计思想对于一个管管理系统而而言,主函函数,函数数以及成员员函数是其其重要组成成部分。系
2、系统开发设设计也是从从该三方面面入手,下下面加以详详细阐述。(1)主函函数的设计计在做一个系系统开发前前,一定要要明确系统统的功能以以及功能实实现时的输输出(屏幕幕显示)。编编写主函数数的主要任任务就是确确定调用函函数以及控控制屏幕显显示。确定调用用的函数根据要求,该该系统至少少应该实现现五种基本本功能:输输出工作信信息,删除除工资信息息,修改工工资信息,查查找工资信信息,列出出所有信息息。实现以以上任何一一种功能都都必须要调调用一个函函数,根据据标识符的的定义规则则,依次命命名为AdddNeww(),DDoDellete(),DooMotiify(),DoFFind(),Liist().屏幕
3、显示示一个系统要要想处理信信息,首先先必须要输输出菜单及及提示信息息,通过用用户在键盘盘上的输入入来选择某某个功能。本系统的屏幕显示如上。为实现该屏屏幕显示,输输出语句完完全可以放放在maiin()函函数中,但但为了使主主函数清晰晰明了,我我设计了一一个菜单函函数Maiin()供供其调用。(2)函数数的设计编写函数的的目的就是是编写一个个能实现某某种功能的的函数供主函数调调用。根据据C+面面向对象的的特点,函函数也可以以调用类中中的成员函函数。这样样主函数,函函数以及成成员函数之之间的层次次分明,关关系就清晰晰明了,不不会有冗长长的感觉。函函数设计的的主要任务务是确定调调用的成员员函数以及及屏
4、幕显示示。确定调用用的成员函函数。不同的函数数调用的成成员函数是是不尽相同同的,基本本上每个函函数都有一一个对应的的成员函数数,例如AAddNeew()与与AddIItem(),DooDeleete()与RemmoveIItem(),DooFindd()与SSearcch(),DoMootifyy()与RReplaace(),Lisst()与与Workker.LList()对应,这这些成员函函数都是共共有函数,并并且只被其其对应函数数唯一调用用一次。当当然,每个个函数不可可能只调用用一个成员员函数,例例如AdddNew()还调用用了另外两两个函数IInputt()和AActuaalpayy()
5、。屏幕显示示编写函数也也需要控制制输出以及及功能间的的转换,从从而每一个个函数都需需要有一个个循环来控控制其结束束。结束的的条件都是是“当输入的的编号为-1时结束束”,循环语语句有whhile也也有dowhille,例如如DoDeeletee()和DDoFinnd()用用的是doowhille, AddNNew()用到的是是whille语句。(3)成员员函数的设设计。成员函数是是系统的灵灵魂,因为为所有的处处理过程的的细节都在在成员函数数中完成的的。编写成成员函数实实际上就是是一个算法法的实现。成成员函数的的设计包括括两方面内内容:成员员函数算法法的实现和和成员函数数过程的实实现。成员函数数算
6、法的实实现工资管理系系统不能单单凭数组来来处理数据据,因为企企业职工数数是不确定定的,并且且数组在删删除和查找找某条信息息是相当繁繁琐。所以以该系统需需要一个全全新的数据据处理方式式链表。链链表是最简简单也是最最常用的一一种动态数数据结构,它它是对动态态获得的内内存进行组组织的一种种结构。它它不需要实实现定义固固定的长度度,灵活性性更强。链表是算法法的关键。在在添加新的的数据时,可可以表头插插入也可以以表尾插入入,这两种种插入方法法决定了其其他成员函函数数据的的处理。本本系统中采采取的是表表尾插入的的方法。在在删除某信信息时需要要判断数据据是在表头头,表中还还是表尾,如如果删除的的是在表中中,
7、则需要要将删除的的前后链表表连接起来来。总之,本系系统大量运运用了链表表的5种基基本操作:建立链表表、链表的的插入、删删除、输入入和查找。成员函数数过程的实实现算法确定后后还需要控控制屏幕显显示、条件件的判断以以及调用其其它成员函函数。成员员函数之间间是可以相相互调用的的,例如成成员函数LList()就调用用了成员函函数LisstCouunt()来统计当当前链表信信息的总数数,同时还还调用了成成员函数PPrintt()来输输出Worrker_pay()的信息息。整个过过程中还有有一个重要要的指针,WWorkeer_paay *FFind(),它被被Searrch(),RemmoveIItem(
8、)以及AAddIttem()所调用。其其次成员函函数中大量量运用到了了程序控制制结构。例例如,AdddIteem()中中用if来来判断是否否是链表的的表头,LList()中用到到了whiile语句句来实现循循环输出。最最后屏幕上上则需要显显示一些完完成了某种种功能的标标志,例如如“成功删除除编号为xxx的信息息”,“成功修改改编号为xxx的信息息”等。(3)系统统结构框架架系统的结构构框架主要要是系统的的流程图以以及函数之之间的调用用关系,该该图能描述述系统清晰晰准确的表表现出系统统的功能实实现。职工工资管管理系统结结构框架职工工资管理系统图图输出主菜单输入选项添加职工工资信息删除职工工资信息
9、修改职工工资信息输出全体职工工资信息输出指定职工工资信息结束退出RemovrItem().List()Search()Replace()AddItem()DoFind()List()DoMotify()DoDelete()AddNew()2企业职工工工资管理理系统功能能及系统设设计介绍该工资管理理系统可以以分为5个个模块,每每个模块都都有其对应应的功能以以及其设计计。下面对对系统的功功能和模块块的实现进进行简要分分析。(1)输入入模块输入模块的的功能是创创建存储职职工工资信信息的存储储系统以及及添加某职职工的工资资信息。其其中的信息息包括职工工编号,基基本工资,津津贴,房租租,交通费费以及银行
10、行储蓄。为为实现输入入的功能,有有两个方面面的任务:定义结构构体以及建建立链表。 定义结构构体 结构体的的名称为WWorkeer_paay,其中中包含的信信息有职工工编号(nnum),基基本工资(pay0),津津贴(paay1),房租租(payy2),交通费费(payy3),储蓄(pay4)以以及个人所所得税(ttax),应扣数(ddeducct),实实发数(aactuaalpayy)。定义义一个paay的数组组时为了简简化变量的的定义,使使程序更有有条理。 建立链表表 通过从表表尾插入的的方法来建建立链表,首首先要先设设立一个头头指针(hhead)来来存放链表表的首地址址。然后,不不断用ne
11、ew运算符符生成一个个新的起点点,将这个个起点链入入已有的链链表尾部;如果链表表中还没有有结点,则则这个新结结点将是首首结点,否否则,将新新结点的地地址赋给原原有链表的的尾结点的的nextt指针。(2)删除除模块删除模块的的功能是删删除某职工工的工资信信息。当然然,信息包包括所有输输入的信息息,以及程程序内部函函数计算的的信息例如如个人所得得税,实发发数。从一个链表表中删去一一个结点,首首先从表头头开始,找找到被删结结点后,只只要改变链链接关系即即可,使被被删结点的的前去结点点的指针域域指向被删删结点的后后继结点。如如果删去的的结点是首首结点,则则将第二个个结点的地地址作为新新的链表的的首地址
12、返返回;如果果删去的结结点是链尾尾,则将被被删结点的的前驱作为为新的链尾尾。(3)修改改模块修改模块的的功能是修修改某职工工的部分工工资信息。要修改某职职工的信息息首先必须须从表头开开始搜寻,当当找到指定定的编号是是,重新对对其赋值即即可。(4)查找找模块查找模块的的功能就是是输出指定定编号职工工的工资信信息。查找链表中中的信息时时比较简单单的,在上上面的模块块中也用到到了,主要要是注意查查找叶必须须从表头开开始。(5)列表表模块列表模块的的功能是输输出当月全全体职工的的工资信息息。列表模块就就是依次输输出链表中中各结点的的数据。首首先要知道道链表头结结点的地址址,也就是是headd的值,然然
13、后设一个个指针变量量p,先指指向第一个个结点,输输出p所指指结点的数数据与的值值,然后使使p后移一一个结点,再再输出其数数据与的值值;依链表表顺序而行行,依次输输出相应结结点数据域域的值,直直到链表的的尾结点。(5)调试试过程中遇遇到的主要要问题及解解决办法设计初期期,先完成成初步构思思,写出主主函数。然然后对主函函数所涉及及的各个模模块进行编编程,将各各个模块利利用指针和和链表联系系起来。在在环境中进进行调试,应应一边编译译,一边调调试,并且且要一个模模块一个模模块的调试试。直至此此模块完全全没有错误误时,在进进入下一模模块的调试试。不能直直接输入全全部的代码码一次性调调,这样错错误会很多多
14、,并且不不易找出和和修改。在在完成程序序的编译链链接后,要要用多组数数据进行审审查,确保保做到系统统无误。 设计过程程中,不应应忽视环境境提示的警警告,有时时程序运行行不正确与与警告也有有很大的关关系。这次次设计中遇遇到很多问问题都是提提示类型不不匹配,这这时就要认认真检查前前面的代码码,及时改改正并且认认真仔细,杜杜绝此类错错再次发生生。 编写代码码时应该少少用全局变变量,全局局变量在编编写试看似似定义次数数少,很方方便。但全全局变量出出错几率较较大,且不不易修改,每每次修改时时都要全面面考虑,所所以应避免免用到。 程序调试试中碰到的的错误可以以使自己学学到知识。养养成良好的的编程习惯惯,可
15、以节节省很多时时间,避免免很多不必必要的错误误。在编辑完完整个程序序后,进行行调试阶段段总是会数数显heaad无定义义。解决办法:再类的定定义是忘记记声明指针针Workker_ppay *headd;。3总结经过两周的的C+课课程实践,我我对C+语言设计计有了一个个更深,更更全面的了了解,尤其其体会到了了C+面面向对象操操作对简化化程序的重重要作用。下下面是我的的几点体会会:刚拿到课课题时,我我一脸的茫茫然,看到到如此庞大大的工程,不不知如何下下手。这个个工资管理理系统中职职工子信息息竟然包含含15条,以以前从来没没有遇到过过如此多的的变量。和和同学讨论论很久好,我我发现其实实可以化繁繁为简的
16、,信信息中155条不一定定全都要,因因为其中本本身就有重重复的,例例如津贴和和补贴。并并且可以有有一个paay的数组组来处理数数据。所以以做任何事事情都必须须要开动脑脑筋,积极极思考,有有时还要学学会化繁为为简。在编程时时条理清晰晰是至关重重要的。主主函数,函函数,成员员函数之间间的层次关关系,调用用关系一定定要有一个个全面的把把握,尤其其要体会类类的封装性性。另外很很重要的一一点就是一一定要对链链表的五种种操作熟练练的掌握。在编译,链链接,调试试的过程中中一定要有有耐心。因因为一个程程序中会有有很多小的的错误,甚甚至有的问问题要几个个小时才能能解决。遇遇到问题,一一定要全面面分析,有有时候还
17、要要向同学请请教。总得得来说,编编程时极需需要耐心的的。总之,C+课程设设计实践为为我们提供供了一个综综合运用所所学知识,解解决实际问问题的平台台,增强了了我们实践践动手的能能力和工程程实践能力力,并且锻锻炼和培养养了我们的的自学能力力,让我们们对C+有了一个个更全面的的了解。附源代码:#incllude#inclludeusingg nameespacce sttd;strucct Woorkerr_payyint num;floaat paay5,bassepayy,taxx,dedduct,Actuualpaay; Workker_ppay *nextt; ;classs Worrker
18、privaate:Workker_ppay *headd;voidd Priint(WWorkeer_paay *);Workker_ppay *Findd(intt);publiic:Workker()heaad=NUULL;int ListtCounnt();voidd AdddItemm(intt numm,flooat ppay55); voidd RemmoveIItem(int); voidd Repplacee(intt); voidd Lisst(); voidd Seaarch(int); voidd Acttualppay(); ;int WWorkeer:LListCCo
19、untt () if(!headd)retturn 0;Workker_ppay *p=heead;int n=0;whille(p)n+;p=pp-neext;retuurn nn;void Workker:AddIItem (intt numm,flooat ppay55) if(!headd)heaad=neew Woorkerr_payy;forr(int ii=0;iipayi=ppayii;heaad-nnum=nnum;heaad-nnext=NULLL;retturn;Workker_ppay *t=heead;whille(t&t-num!=numm) t=t-nnext;i
20、f(tt)couut操作失败败;职工编编号为numm的信息已已经存在!nexxt ) p=p-nexxt;Workker_ppay *p1=nnew WWorkeer_paay;p1-num=num;for(int ii=0;iipayyi=payi;p1-nextt=NULLL;p-nnext=p1;retuurn;void Workker:RemooveIttem(iint nnum) Workker_ppay *t=Fiind(nnum);if(!t) rreturrn;Workker_ppay *p=heead;if(hhead=t) heaad=heead-nextt;dellete
21、 p;couut成功删除除职工编号号为nuum的信息!enndlnexxt!=tt)p=pp-neext;Workker_ppay *p1=pp-neext;p-nnext=p1-nextt;deleete pp1;coutt成功删除除职工编号号为nuum的信息!enndlendll;retuurn;void Workker:Repllace(int nnum) Workker_ppay *p=Fiind(nnum);if(!p)reeturnn;coutt请重新输输入相应信信息enndl;coutt职工编号号基本工资资(元)津津贴房租交交通费银行行储蓄p-nump-pay0p-ppay11p
22、p-paay2p-payy3p-pay4;retuurn;void Workker:Prinnt(Woorkerr_payy *p) coutt.preecisiion(88);couttnumm ppay00 payy1 ppay22 paay3 ppay44 baasepaay taxx ddeducct AActuaalpayyenndl;retuurn;void Workker:Listt() if(LListCCountt=0)couut当前列表表为空,请请先输入数数据!eendl;retturn;Workker_ppay *p=heead;coutt共有信息息LiistCoount
23、()个enndl;coutt职工编号号基本工资资(元)津津贴房租交交通费银行行银行储蓄蓄应发数个个人所得税税应扣数实实发数nnext;couttenndl;retuurn;void Workker:Searrch (int nnum) couttSSearcch.enndl;Workker_ppay *p=Fiind(nnum);if(pp)couut职工编号号基本工资资(元)津津贴房租交交通费银行行银行储蓄蓄应发数个个人所得税税应扣数实实发数enndl;Priint(pp);couttenndl;Workeer_paay *WWorkeer:FFind(int nnum) if (Listt
24、Counnt()=0)couut当前列表表为空,请请先输入数数据!nnum=num) breeak;p=pp-neext;if(!p)couut错误:找找不到该信信息!nn;retturn NULLL;retuurn pp;void Workker:Actuualpaay () if (ListtCounnt()=0)couut当前列表表为空,请请先输入数数据!ppay00taax=0;elsse if(p-payy0taax=(pp-paay0-8000)*0.05;elsse if(p-payy0taax=600+(p-payy0-20000)*0.1;elsse p-ttax=3360+
25、(p-ppay00-50000)*0.2;p-baseepay=p-ppay00+p-payy1;p-deduuct=pp-taax+p-payy2+p-ppay33;p-Actuualpaay=p-payy0+p-ppay11-p-taxx-p-pay2-pp-paay3;p=pp-neext;retuurn;Workeer Woorkerr; int MMenu() couttn*主菜单*endllenndl;int n=1,seleect=-1;couttn+.输入职职工工资信信息enndlendll;couttn+.删除指指定职工的的工资信息息enndlendll;couttn+.修改
26、指指定职工编编号的工资资信息enndlendll;couttn+.查找指指定职工编编号的工资资信息enndlendll;couttn+.输出全全体职工的的工资信息息enndlendll;coutt00.退出enndlendll;couttsellect;retuurn sselecct;char Exitt() charr s;coutts;retuurn ss;void Inpuut(innt *nnum,ffloatt payy5) coutt请输入tt职工编号号基本工资资(元)津津贴房租交交通费银行行储蓄*nuum;if(*num=-1)retuurn;cinpayy0payy1payy
27、2payy3payy4;retuurn;void AddNNew() int num=0;floaat paay5=0,0,0,0,0;couttenndl当输入的的编号为-1是表示示结束输入入enndl;Inpuut(&nnum,ppay);whille(nuum!=-1)Worrker.AddIItem(num,pay);Worrker.Actuualpaay();Inpput(&num,pay);retuurn;void DoFiind() int num;couttenndl当输入的的职工编号号为-1是表示示结束输入入enndl;docouutnuum;if(num=-1)contti
28、nuee;Worrker.Searrch(nnum);whiile(nnum!=-1);retuurn;void DoDeeletee() couttenndl当输入的的职工编号号为-1是表示示结束输入入enndl;int num;docouutnuum;if(num=-1)conttinuee;Worrker.RemooveIttem(nnum);whiile(nnum!=-1);retuurn;void DoMootifyy() couttenndl当输入的的职工编号号为-1是表示示结束输入入enndl;int num;docouutnuum;if(num=-1)conttinuee;Wo
29、rrker.Repllace(num);whiile(nnum!=-1);retuurn;void Listt() Workker.LList(); int mmain() coutt 职工工资资管理系统统n;int seleect;charr s;whille(1)sellect=Menuu();swiitch(seleect)casse 0:s=Exitt();iff(s=y|s=Y)retuurn 00;brreak;casse 1:AdddNeww();brreak;casse 2:DooDeleete();brreak;casse 3:DooMotiify();brreak;casse 4:DooFindd();brreak;casse 5:Liist();brreak;deffaultt:coout无效输入入!enndl;retuurn 00;