《计算机技术基础》课程项目设计报告书题目:教师工资管理系统专业:资源勘查工程班级及组号:三班二组组长学号姓名:110440317赵功哲组员学号姓名:110440318曹慧110440319郑帅110440311张涛110440320李萧朋110440312孙肖辉指导老师:程慧芳设计时间:2012年5月28日~2012年6月9日1.设计目的与内容要求经历半个学期的c语言学习以后,对它有了一定的认识,它可以实现很多有趣的问题。但我深知真正要掌握它的精髓还有很长的路要走,书本上的知识是远远不够的。作为一名合格的程序员,不但要有科学的方法还要有细致、耐心、负责的精神。这正是我学习c语言的过程中所得到的对今后学习和工作最有用最重要的收获。2.小组分工和每位组员的贡献说明为了锻炼大家的分工和合作能力,提高大家对C语言的了解我们具体分工如下:赵功哲同学,分开每个模板的任务及具体方法曹慧同学:思考输入模块,并做程序设计;张涛同学:思考删除模块,并做程序设计;郑帅同学:思考修改模块,并做程序设计;李萧鹏同学:思考查找模块,并做程序设计;孙肖辉同学:列表模块调试过程中遇到的主要问题及解决办法最后我们共同讨论程序的设计,流程图的流程,并不断修改,完善程序。3教师工资管理系统摘要:每个教师的信息为:教师号、姓名、性别、单位名称、家庭住址、联系电话、基本工资、津贴、生活补贴、应发工资、电话费、水电费、房租、所得税、卫生费、公积金、合计扣款、实发工资。注:应发工资=基本工资+津贴+生活补贴;合计扣款=电话费+水电费+房租+所得税+卫生费+公积金;实发工资=应发工资-合计扣款。具体实现如下功能:A、教师信息处理(1)输入教师信息(2)插入(修改)教师信息:(3)删除教师信息:(4)浏览教师信息:提示:具体功能及操作参考题1。B、教师数据处理:(1)按教师号录入教师基本工资、津贴、生活补贴、电话费、水电费、房租、所得税、卫生费、公积金等基本数据。(2)教师实发工资、应发工资、合计扣款计算。提示:计算规则如题目。(3)教师数据管理提示:输入教师号,读出并显示该教师信息,输入新数据,将改后信息写入文件(4)教师数据查询:提示:输入教师号或其他信息,即读出所有数据信息,并显示出来。(5)教师综合信息输出提示:输出教师信息到屏幕。1.教师工资管理系统开发设计思想对于一个管理系统而言,主函数,函数以及成员函数是其重要组成部分。系统开发设计也是从该三方面入手,下面加以详细阐述。(1)主函数的设计在做一个系统开发前,一定要明确系统的功能以及功能实现时的输出(屏幕显示)。编写主函数的主要任务就是确定调用函数以及控制屏幕显示。①确定调用的函数根据要求,该系统至少应该实现五种基本功能:输出工作信息,删除工资信息,修改工资信息,查找工资信息,列出所有信息。实现以上任何一种功能都必须要调用一个函数,根据标识符的定义规则,依次命名为AddNew(),DoDelete(),DoMotify(),DoFind(),List().②屏幕显示一个系统要想处理信息,首先必须要输出菜单及提示信息,通过用户在键盘上的输入来选择某个功能。为实现该屏幕显示,输出语句完全可以放在main()函数中,但为了使主函数清晰明了,我设计了一个菜单函数Main()供其调用。(2)函数的设计编写函数的目的就是编写一个能实现某种功能的函数供主函数调用。根据C++面向对象的特点,函数也可以调用类中的成员函数。这样主函数,函数以及成员函数之间的层次分明,关系就清晰明了,不会有冗长的感觉。函数设计的主要任务是确定调用的成员函数以及屏幕显示。①确定调用的成员函数。不同的函数调用的成员函数是不尽相同的,基本上每个函数都有一个对应的成员函数,例如AddNew()与AddItem(),DoDelete()与RemoveItem(),DoFind()与Search(),DoMotify()与Replace(),List()与Worker.List()对应,这些成员函数都是共有函数,并且只被其对应函数唯一调用一次。当然,每个函数不可能只调用一个成员函数,例如AddNew()还调用了另外两个函数Input()和Actualpay()。②屏幕显示编写函数也需要控制输出以及功能间的转换,从而每一个函数都需要有一个循环来控制其结束。结束的条件都是“当输入的编号为0时结束”,循环语句有while也有do…while,例如DoDelete()和DoFind()用的是do…while,AddNew()用到的是while语句。(3)成员函数的设计。成员函数是系统的灵魂,因为所有的处理过程的细节都在成员函数中完成的。编写成员函数实际上就是一个算法的实现。成员函数的设计包括两方面内容:成员函数算法的实现和成员函数过程的实现。①成员函数算法的实现工资管理系统不能单凭数组来处理数据,因为企业教师数是不确定的,并且数组在删除和查找某条信息是相当繁琐。所以该系统需要一个全新的数据处理方式——链表。链表是最简单也是最常用的一种动态数据结构,它是对动态获得的内存进行组织的一种结构。它不需要实现定义固定的长度,灵活性更强。链表是算法的关键。在添加新的数据时,可以表头插入也可以表尾插入,这两种插入方法决定了其他成员函数数据的处理。本系统中采取的是表尾插入的方法。在删除某信息时需要判断数据是在表头,表中还是表尾,如果删除的是在表中,则需要将删除的前后链表连接起来。总之,本系统大量运用了链表的5种基本操作:建立链表、链表的插入、删除、输入和查找。②成员函数过程的实现算法确定后还需要控制屏幕显示、条件的判断以及调用其它成员函数。成员函数之间是可以相互调用的,例如成员函数List()就调用了成员函数ListCount()来统计当前链表信息的总数,同时还调用了成员函数Print()来输出Worker_pay()的信息。整个过程中还有一个重要的指针,Worker_pay*Find(),它被Search(),RemoveItem()以及AddItem()所调用。其次成员函数中大量运用到了程序控制结构。例如,AddItem()中用if来判断是否是链表的表头,List()中用到了while语句来实现循环输出。最后屏幕上则需要显示一些完成了某种功能的标志,例如“成功删除编号为xx的信息”,“成功修改编号为xx的信息”等。(3)系统结构框架系统的结构框架主要是系统的流程图以及函数之间的调用关系,该图能描述系统清晰准确的表现出系统的功能实现。2教师工资管理系统功能及系统设计介绍该工资管理系统可以分为5个模块,每个模块都有其对应的功能以及其设计。下面对系统的功能和模块的实现进行简要分析。(1)输入模块输入模块的功能是创建存储教师工资信息的存储系统以及添加某教师的工资信息。其中的信息包括教师编号,基本工资,津贴,房租,交通费以及银行储蓄。为实现输入的功能,有两个方面的任务:定义结构体以及建立链表。①定义结构体结构体的名称为Worker_pay,其中包含的信息有教师编号(num),基本工资(pay[0]),津贴(pay[1]),房租(pay[2]),交通费(pay[3]),储蓄(pay[4])以及个人所得税(tax),应扣数(deduct),实发数(actualpay)。定义一个pay的数组时为了简化变量的定义,使程序更有条理。②建立链表通过从表尾插入的方法来建立链表,首先要先设立一个头指针(head)来存放链表的首地址。然后,不断用new运算符生成一个新的起点,将这个起点链入已有的链表尾部;如果链表中还没有结点,则这个新结点将是首结点,否则,将新结点的地址赋给原有链表的尾结点的next指针。(2)删除模块删除模块的功能是删除某教师的工资信息。当然,信息包括所有输入的信息,以及程序内部函数计算的信息例如个人所得税,实发数。从一个链表中删去一个结点,首先从表头开始,找到被删结点后,只要改变链接关系即可,使被删结点的前去结点的指针域指向被删结点的后继结点。如果删去的结点是首结点,则将第二个结点的地址作为新的链表的首地址返回;如果删去的结点是链尾,则将被删结点的前驱作为新的链尾。(3)修改模块修改模块的功能是修改某教师的部分工资信息。要修改某教师的信息首先必须从表头开始搜寻,当找到指定的编号是,重新对其赋值即可。(4)查找模块查找模块的功能就是输出指定编号教师的工资信息。查找链表中的信息时比较简单的,在上面的模块中也用到了,主要是注意查找叶必须从表头开始。(5)列表模块列表模块的功能是输出当月全体教师的工资信息。列表模块就是依次输出链表中各结点的数据。首先要知道链表头结点的地址,也就是head的值,然后设一个指针变量p,先指向第一个结点,输出p所指结点的数据与的值,然后使p后移一个结点,再输出其数据与的值;依链表顺序而行,依次输出相应结点数据域的值,直到链表的尾结点。(5)调试过程中遇到的主要问题及解决办法①设计初期,先完成初步构思,写出主函数。然后对主函数所涉及的各个模块进行编程,将各个模块利用指针和链表联系起来。在环境中进行调试,应一边编译,一边调试,并且要一个模块一个模块的调试。直至此模块完全没有错误时,在进入下一模块的调试。不能直接输入全部的代码一次性调,这样错误会很多,并且不易找出和修改。在完成程序的编译链接后,要用多组数据进行审查,确保做到系统无误。设计过程中,不应忽视环境提示的警告,有时程序运行不正确与警告也有很大的关系。这次设计中遇到很多问题都是提示类型不匹配,这时就要认真检查前面的代码,及时改正并且认真仔细,杜绝此类错再次发生。编写代码时应该少用全局变量,全局变量在编写试看似定义次数少,很方便。但全局变量出错几率较大,且不易修改,每次修改时都要全面考虑,所以应避免用到。程序调试中碰到的错误可以使自己学到知识。养成良好的编程习惯,可以节省很多时间,避免很多不必要的错误。②在编辑完整个程序后,进行调试阶段总是会数显head无定义。解决办法:再类的定义是忘记声明指针Worker_pay*head;。4教师工资管理系统结构框架图5技术难点、项目特色与作品效果图//题目:工资管理系统//代码如下:教师工资管理系统输出主菜单输入选项添加教师工资信息删除教师工资信息修改教师工资信息输出指定教师工资信息输出全体教师工资信息AddNew()DoDelete()DoMotify()DoFind()List()AddItem()RemovrItem()Replace()Search().List()退出结束#includestdio.h//标准输入输出头文件#includestdlib.h//standardlibrary标准库头文件包含了C、C++语言的最常用的系统函数该文件包含了的C语言标准库函数的定义#includemalloc.h//malloc的全称是memoryallocation,中文叫动态内存分配#includestring.h//字符串处理#includeconio.h//conio是ConsoleInput/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等#defineTITLE\n月份教师编号姓名应发数各种折扣实发数\n#defineDATA%2d%4ld%-10s%6.1f%6.1f%6.1f\n,p1-month,p1-num,p1-name,p1-should_pay,p1-rebate,p1-actual_paytypedefstructpay//结构体声明,pay为绰号{longnum;//教师编号shortmonth;//月份charname[20];//姓名,占长度为20floatjb,ji,gt,bt,ft,jt;//floatshould_pay;//应发数floatfz,cx,hf,gr;floatrebate;//各种折扣floatactual_pay;//实发数structpay*next;//建立链表