教师工资管理系统 王晋瑞张大漠_第1页
教师工资管理系统 王晋瑞张大漠_第2页
教师工资管理系统 王晋瑞张大漠_第3页
教师工资管理系统 王晋瑞张大漠_第4页
教师工资管理系统 王晋瑞张大漠_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、中南大学本科生课程设计(实践)任务书、设计报告(C+应用基础课程设计)题 目工资管理系统 学生学号学生姓名指导教师学 院专业班级指导老师计算机基础教学实验中心2011年09月08日教师工资管理系统摘要:每个教师的信息为:教师号、姓名、性别、单位名称、家庭住址、联系电话、基本工资、津贴、生活补贴、应发工资、电话费、水电费、房租、所得税、卫生费、公积金、合计扣款、实发工资。注:应发工资=基本工资+津贴+生活补贴;合计扣款=电话费+水电费+房租+所得税+卫生费+公积金;实发工资=应发工资 合计扣款。具体实现如下功能:A、教师信息处理(1) 输入教师信息(2) 插入(修改)教师信息:(3) 删除教师信

2、息:(4) 浏览教师信息:提示:具体功能及操作参考题1。B、教师数据处理:(1) 按教师号录入教师基本工资、津贴、生活补贴、电话费、水电费、房租、所得税、卫生费、公积金等基本数据。(2) 教师实发工资、应发工资、合计扣款计算。提示:计算规则如题目。(3) 教师数据管理提示:输入教师号,读出并显示该教师信息,输入新数据,将改后信息写入文件(4) 教师数据查询:提示:输入教师号或其他信息,即读出所有数据信息,并显示出来。(5) 教师综合信息输出提示:输出教师信息到屏幕。1.教师工资管理系统开发设计思想对于一个管理系统而言,主函数,函数以及成员函数是其重要组成部分。系统开发设计也是从该三方面入手,下

3、面加以详细阐述。(1)主函数的设计在做一个系统开发前,一定要明确系统的功能以及功能实现时的输出(屏幕显示)。编写主函数的主要任务就是确定调用函数以及控制屏幕显示。确定调用的函数根据要求,该系统至少应该实现五种基本功能:输出工作信息,删除工资信息,修改工资信息,查找工资信息,列出所有信息。实现以上任何一种功能都必须要调用一个函数,根据标识符的定义规则,依次命名为AddNew(),DoDelete(),DoMotify(),DoFind(),List().屏幕显示一个系统要想处理信息,首先必须要输出菜单及提示信息,通过用户在键盘上的输入来选择某个功能。本系统的屏幕显示如上。为实现该屏幕显示,输出语

4、句完全可以放在main()函数中,但为了使主函数清晰明了,我设计了一个菜单函数Main()供其调用。(2)函数的设计编写函数的目的就是编写一个能实现某种功能的函数供主函数调用。根据C+面向对象的特点,函数也可以调用类中的成员函数。这样主函数,函数以及成员函数之间的层次分明,关系就清晰明了,不会有冗长的感觉。函数设计的主要任务是确定调用的成员函数以及屏幕显示。确定调用的成员函数。不同的函数调用的成员函数是不尽相同的,基本上每个函数都有一个对应的成员函数,例如AddNew()与AddItem(),DoDelete()与RemoveItem(),DoFind()与Search(),DoMotify(

5、)与Replace(),List()与Worker.List()对应,这些成员函数都是共有函数,并且只被其对应函数唯一调用一次。当然,每个函数不可能只调用一个成员函数,例如AddNew()还调用了另外两个函数Input()和Actualpay()。屏幕显示编写函数也需要控制输出以及功能间的转换,从而每一个函数都需要有一个循环来控制其结束。结束的条件都是“当输入的编号为0时结束”,循环语句有while也有dowhile,例如DoDelete()和DoFind()用的是dowhile, AddNew()用到的是while语句。(3)成员函数的设计。成员函数是系统的灵魂,因为所有的处理过程的细节都在

6、成员函数中完成的。编写成员函数实际上就是一个算法的实现。成员函数的设计包括两方面内容:成员函数算法的实现和成员函数过程的实现。成员函数算法的实现工资管理系统不能单凭数组来处理数据,因为企业教师数是不确定的,并且数组在删除和查找某条信息是相当繁琐。所以该系统需要一个全新的数据处理方式链表。链表是最简单也是最常用的一种动态数据结构,它是对动态获得的内存进行组织的一种结构。它不需要实现定义固定的长度,灵活性更强。链表是算法的关键。在添加新的数据时,可以表头插入也可以表尾插入,这两种插入方法决定了其他成员函数数据的处理。本系统中采取的是表尾插入的方法。在删除某信息时需要判断数据是在表头,表中还是表尾,

7、如果删除的是在表中,则需要将删除的前后链表连接起来。总之,本系统大量运用了链表的5种基本操作:建立链表、链表的插入、删除、输入和查找。成员函数过程的实现算法确定后还需要控制屏幕显示、条件的判断以及调用其它成员函数。成员函数之间是可以相互调用的,例如成员函数List()就调用了成员函数ListCount()来统计当前链表信息的总数,同时还调用了成员函数Print()来输出Worker_pay()的信息。整个过程中还有一个重要的指针,Worker_pay *Find(),它被Search(),RemoveItem()以及AddItem()所调用。其次成员函数中大量运用到了程序控制结构。例如,Add

8、Item()中用if来判断是否是链表的表头,List()中用到了while语句来实现循环输出。最后屏幕上则需要显示一些完成了某种功能的标志,例如“成功删除编号为xx的信息”,“成功修改编号为xx的信息”等。(3)系统结构框架系统的结构框架主要是系统的流程图以及函数之间的调用关系,该图能描述系统清晰准确的表现出系统的功能实现。教师工资管理系统结构框架教师工资管理系统图输出主菜单输入选项添加教师工资信息删除教师工资信息修改教师工资信息输出全体教师工资信息输出指定教师工资信息RemovrItem().List()Search()Replace()AddItem()DoFind()List()DoMo

9、tify()DoDelete()AddNew()退出结束2教师工资管理系统功能及系统设计介绍该工资管理系统可以分为5个模块,每个模块都有其对应的功能以及其设计。下面对系统的功能和模块的实现进行简要分析。(1)输入模块输入模块的功能是创建存储教师工资信息的存储系统以及添加某教师的工资信息。其中的信息包括教师编号,基本工资,津贴,房租,交通费以及银行储蓄。为实现输入的功能,有两个方面的任务:定义结构体以及建立链表。 定义结构体 结构体的名称为Worker_pay,其中包含的信息有教师编号(num),基本工资(pay0),津贴(pay1),房租(pay2),交通费(pay3),储蓄(pay4)以及个

10、人所得税(tax),应扣数(deduct),实发数(actualpay)。定义一个pay的数组时为了简化变量的定义,使程序更有条理。 建立链表 通过从表尾插入的方法来建立链表,首先要先设立一个头指针(head)来存放链表的首地址。然后,不断用new运算符生成一个新的起点,将这个起点链入已有的链表尾部;如果链表中还没有结点,则这个新结点将是首结点,否则,将新结点的地址赋给原有链表的尾结点的next指针。(2)删除模块删除模块的功能是删除某教师的工资信息。当然,信息包括所有输入的信息,以及程序内部函数计算的信息例如个人所得税,实发数。从一个链表中删去一个结点,首先从表头开始,找到被删结点后,只要改

11、变链接关系即可,使被删结点的前去结点的指针域指向被删结点的后继结点。如果删去的结点是首结点,则将第二个结点的地址作为新的链表的首地址返回;如果删去的结点是链尾,则将被删结点的前驱作为新的链尾。(3)修改模块修改模块的功能是修改某教师的部分工资信息。要修改某教师的信息首先必须从表头开始搜寻,当找到指定的编号是,重新对其赋值即可。(4)查找模块查找模块的功能就是输出指定编号教师的工资信息。查找链表中的信息时比较简单的,在上面的模块中也用到了,主要是注意查找叶必须从表头开始。(5)列表模块列表模块的功能是输出当月全体教师的工资信息。列表模块就是依次输出链表中各结点的数据。首先要知道链表头结点的地址,

12、也就是head的值,然后设一个指针变量p,先指向第一个结点,输出p所指结点的数据与的值,然后使p后移一个结点,再输出其数据与的值;依链表顺序而行,依次输出相应结点数据域的值,直到链表的尾结点。(5)调试过程中遇到的主要问题及解决办法设计初期,先完成初步构思,写出主函数。然后对主函数所涉及的各个模块进行编程,将各个模块利用指针和链表联系起来。在环境中进行调试,应一边编译,一边调试,并且要一个模块一个模块的调试。直至此模块完全没有错误时,在进入下一模块的调试。不能直接输入全部的代码一次性调,这样错误会很多,并且不易找出和修改。在完成程序的编译链接后,要用多组数据进行审查,确保做到系统无误。 设计过

13、程中,不应忽视环境提示的警告,有时程序运行不正确与警告也有很大的关系。这次设计中遇到很多问题都是提示类型不匹配,这时就要认真检查前面的代码,及时改正并且认真仔细,杜绝此类错再次发生。 编写代码时应该少用全局变量,全局变量在编写试看似定义次数少,很方便。但全局变量出错几率较大,且不易修改,每次修改时都要全面考虑,所以应避免用到。 程序调试中碰到的错误可以使自己学到知识。养成良好的编程习惯,可以节省很多时间,避免很多不必要的错误。在编辑完整个程序后,进行调试阶段总是会数显head无定义。解决办法:再类的定义是忘记声明指针Worker_pay *head;。3总结经过一周的C+课程实践,我对C+语言

14、设计有了一个更深,更全面的了解,尤其体会到了C+面向对象操作对简化程序的重要作用。下面是我的几点体会:刚拿到课题时,我一脸的茫然,看到如此庞大的工程,不知如何下手。这个工资管理系统中教师子信息竟然包含15条,以前从来没有遇到过如此多的变量。和同学讨论很久好,我发现其实可以化繁为简的,信息中15条不一定全都要,因为其中本身就有重复的,例如津贴和补贴。并且可以有一个pay的数组来处理数据。所以做任何事情都必须要开动脑筋,积极思考,有时还要学会化繁为简。在编程时条理清晰是至关重要的。主函数,函数,成员函数之间的层次关系,调用关系一定要有一个全面的把握,尤其要体会类的封装性。另外很重要的一点就是一定要

15、对链表的五种操作熟练的掌握。在编译,链接,调试的过程中一定要有耐心。因为一个程序中会有很多小的错误,甚至有的问题要几个小时才能解决。遇到问题,一定要全面分析,有时候还要向同学请教。总得来说,编程时极需要耐心的。总之,C+课程设计实践为我们提供了一个综合运用所学知识,解决实际问题的平台,增强了我们实践动手的能力和工程实践能力,并且锻炼和培养了我们的自学能力,让我们对C+有了一个更全面的了解。4输入过程即截图:附源代码:/题目:工资管理系统/代码如下:#include <stdio.h> /标准输入输出头文件#include <stdlib.h> /standard lib

16、rary标准库头文件包含了C、C+语言的最常用的系统函数 该文件包含了的C语言标准库函数的定义#include <malloc.h> / malloc的全称是memory allocation,中文叫动态内存分配#include <string.h> /字符串处理#include <conio.h> /conio是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等#define TITLE "n 月份 教师编号 姓名

17、应发数 各种折扣 实发数n"#define DATA " %2d %4ld %-10s %6.1f %6.1f %6.1fn",p1->month,p1->num,p1->name,p1->should_pay,p1->rebate,p1->actual_paytypedef struct pay /结构体声明,pay为绰号 long num; /教师编号 short month; /月份 char name20; /姓名,占长度为20 float jb,ji,gt,bt,ft,jt; / float should_pay;/应

18、发数 float fz,cx,hf,gr;float rebate;/各种折扣 float actual_pay;/实发数 struct pay *next;/建立链表PAY;FILE *fp;/指针变量指向FILEPAY *p1=NULL,*p2=NULL,*head=NULL;/初值为空void menu();PAY *input();void output();void save(PAY *head);PAY *open();PAY *insert();void search();PAY *del();PAY *revise();/*主程序模块*/void main(void) shor

19、t sel; do menu(); scanf("%d",&sel);/ 格式输入函数,读入十进制数 switch(sel) case 1: head=input(); /输入模块 break; case 2: head=insert(); /插入模块 break; case 3: head=revise(); /修改模块 break; case 4: head=del(); /删除模块 break; case 5: search(); /查找模块 break; case 6: output(); /输出模块 break; case 7: save(head); /

20、保存模块 break; case 0: break; while(sel!=0);/*菜单*/void menu() printf("nnnnnnn");/格式化输出函数 换行 printf("tttt *主菜单功能选项 晋瑞手打*nn");/tab符 printf("tttt1.创建工资档案n"); printf("tttt2.添加工资信息n"); printf("tttt3.修改工资信息n"); printf("tttt4.删除工资信息n"); printf("

21、tttt5.查找工资信息n"); printf("tttt6.分类信息列表n"); printf("tttt7.保 存 信 息n"); printf("tttt0.退 出n"); printf("nnnnnnnn");/*输入模块*/PAY *input() short n=1; p1=(PAY*)malloc(sizeof(PAY); if(p1=NULL) printf("内存不足,无法创建链表!"); getch(); /从控制台读取一个字符,但不显示在屏幕上 printf(&q

22、uot;n请输入第%d位教师的信息(以教师编号为0结束)晋瑞手打:n",n); printf(" 教师编号:"); scanf("%d",&p1->num); if(p1->num=0) printf("按任意键返回!"); getch(); free(p1); return 0; getchar(); printf(" 姓名:"); gets(p1->name); printf(" 工资月份:"); scanf("%d",&p1-

23、>month); printf(" 基本工资,津贴,岗贴,补贴,房贴,交通费:n"); scanf("%f,%f,%f,%f,%f,%f",&p1->jb,&p1->ji,&p1->gt,&p1->bt,&p1->ft,&p1->jt); printf(" 房租,储蓄,会费:n"); scanf("%f,%f,%f,%f",&p1->fz,&p1->cx,&p1->hf); p1-&g

24、t;should_pay=p1->jb+p1->ji+p1->gt+p1->bt+p1->ft+p1->jt;if(p1->should_pay<800) p1->gr=0; else if(p1->should_pay>=800&&p1->should_pay<2000) p1->gr=(p1->should_pay-800)*5/100; else if(p1->should_pay>=2000&&p1->should_pay<5000) p1-

25、>gr=(p1->should_pay-2000)*1/10+60; elsep1->gr=(p1->should_pay-5000)*2/10+60+300; p1->rebate=p1->fz+p1->cx+p1->hf+ p1->gr; p1->actual_pay=p1->should_pay-p1->rebate; while(p1!=NULL) if(n=1) head=p1; else p2->next=p1; n+; p2=p1; p1=(PAY*)malloc(sizeof(PAY); if(p1=

26、NULL) printf("内存不足,无法创建链表!"); getch(); printf("请输入第%d位教师的信息(以教师编号为0结束)晋瑞手打:n",n); printf(" 教师编号:"); scanf("%d",&p1->num); getchar(); if(p1->num=0) p1=NULL; break; printf(" 姓名:"); gets(p1->name); printf(" 工资月份:"); scanf("%d

27、",&p1->month); printf(" 基本工资,津贴,岗贴,补贴,房贴,交通费:n"); scanf("%f,%f,%f,%f,%f,%f",&p1->jb,&p1->ji,&p1->gt,&p1->bt,&p1->ft,&p1->jt); printf(" 房租,储蓄,会费:n"); scanf("%f,%f,%f,%f",&p1->fz,&p1->cx,&p1

28、->hf); p1->should_pay=p1->jb+p1->ji+p1->gt+p1->bt+p1->ft+p1->jt;if(p1->should_pay<800) p1->gr=0; else if(p1->should_pay>=800&&p1->should_pay<2000) p1->gr=(p1->should_pay-800)*5/10; else if(p1->should_pay>=2000&&p1->should_pa

29、y<5000) p1->gr=(p1->should_pay-2000)*1/10+60; elsep1->gr=(p1->should_pay-5000)*2/10+60+300; p1->rebate=p1->fz+p1->cx+p1->hf+p1->gr; p1->actual_pay=p1->should_pay-p1->rebate; p2->next=NULL;printf("教师信息已输入,请按任意键返回,并存盘"); getch(); return head;/*输出模块*/

30、void output() short sel,flag,month; float min,max; do do printf("nn请选择您的列表方式 晋瑞手打:n"); printf("tt1.全部清单n"); printf("tt2.按月输出n"); printf("tt3.按工资段输出n"); printf("tt0.返回n"); scanf("%d",&sel); while(sel!=1&&sel!=2&&sel!=3&am

31、p;&sel!=0); head=open(); if(head=NULL) return; else switch(sel) case 1: printf("nttt *全部清单*n"); printf(TITLE); p1=head; do printf(DATA); p1=p1->next; while(p1!=NULL); break; case 2: flag=0; printf("输入要查的月份 晋瑞手打:"); scanf("%d",&month); printf("nttt*第%d月工资

32、清单*n",month); printf(TITLE); p1=head; do if(p1->month=month) printf(DATA); p1=p1->next; flag=1; else p1=p1->next; while(p1!=NULL); if(flag=0) printf("没有该月清单n"); break; case 3: flag=0; printf("输入最低工资:"); scanf("%f",&min); printf("输入最高工资:"); sc

33、anf("%f",&max); printf("ntt *%5.1f到%5.1f工资的名单*n",min,max); printf(TITLE); p1=head; do if(p1->actual_pay>min&&p1->actual_pay<max) printf(DATA); p1=p1->next; flag=1; else p1=p1->next; while(p1!=NULL); if(flag=0) printf("没有该工资段的教师n"); break; c

34、ase 0: break; while(sel!=0);/*保存文件*/void save(PAY *head) short write; fp=fopen("pay.txt","w"); if(fp=NULL) printf("创建文件失败!"); getch(); return; p1=p2=head; while(p1!=NULL) write=fwrite(p1,sizeof(PAY),1,fp); if(!write) printf("无法写入文件!"); getch(); return; p1=p1-&

35、gt;next; fclose(fp); printf("成功存盘!晋瑞手打"); getch();/*打开文件*/PAY *open() short n=1,read; fp=fopen("pay.txt","r"); if(fp=NULL) printf("无法打开档案文件!晋瑞手打"); getch(); return NULL; if(p1=p2=(PAY*)malloc(sizeof(PAY)=NULL) printf("内存不足!"); getch(); return NULL; r

36、ead=fread(p1,sizeof(PAY),1,fp); if(!read) printf("文件读取出错!1"); getch(); return NULL; if(p1->next=NULL) head=p1; else do if(n=1) head=p1; else p2->next=p1; n+; p2=p1; if(p1=(PAY*)malloc(sizeof(PAY)=NULL) printf("内存不足!"); getch(); return NULL; read=fread(p1,sizeof(PAY),1,fp);

37、if(!read) printf("文件读取出错!2"); getch(); return NULL; while(p1->next!=NULL); p2->next=p1; return head; fclose(fp);/*插入模块*/PAY *insert() PAY *p3=NULL; char sel; head=open(); if(head=NULL) return NULL; else do printf("请输入要插入的教师信息晋瑞手打:n"); p3=(PAY*)malloc(sizeof(PAY); if(p3=NULL

38、) printf("内存不足,无法创建链表!"); getch(); printf(" 教师编号:"); scanf("%d",&p3->num); getchar(); printf(" 姓名:"); gets(p3->name); printf(" 工资月份:"); scanf("%d",&p3->month); printf(" 基本工资,津贴,岗贴,补贴,房贴,交通费:n"); scanf("%f,%f,

39、%f,%f,%f,%f",&p3->jb,&p3->ji,&p3->gt,&p3->bt,&p3->ft,&p3->jt); printf(" 房租,储蓄,会费:n"); scanf("%f,%f,%f,%f",&p3->fz,&p3->cx,&p3->hf); p3->should_pay=p3->jb+p3->ji+p3->gt+p3->bt+p3->ft+p3->jt;if

40、(p3->should_pay<800) p1->gr=0; else if(p3->should_pay>=800&&p3->should_pay<2000) p1->gr=(p3->should_pay-800)*5/100; else if(p3->should_pay>=2000&&p3->should_pay<5000) p1->gr=(p3->should_pay-2000)*1/10+60; elsep1->gr=(p3->should_pay-5

41、000)*2/10+60+300; p3->rebate=p3->fz+p3->cx+p3->hf+ p1->gr; p3->actual_pay=p3->should_pay-p3->rebate; p1=head; while(p1!=NULL) p2=p1; p1=p1->next; p2->next=p3; p3->next=NULL; printf("成功插入,是否继续?是(Y) 否(N)n"); sel=getch(); while(sel='Y'|sel='y')

42、; printf("n任意键返回,并存盘n"); getch(); return head;/*查找模块*/void search() short sel; long num; char name20,choose; head=open(); if(head=NULL) return; else do do printf("n选择查找方式晋瑞手打:n"); printf("tt1.按教师编号查找n"); printf("tt2.按姓名查找n"); scanf("%d",&sel); ge

43、tchar(); while(sel!=1&&sel!=2); switch(sel) case 1: printf("输入要查的教师编号:"); scanf("%ld",&num); break; case 2: printf("输入要查的姓名:"); gets(name); break; p1=head; while(p1->next!=NULL)&&(p1->num!=num)&&(strcmp(p1->name,name)!=0) /用成p1!=NULL

44、有问题? p1=p1->next; if(p1->num=num)|strcmp(p1->name,name)=0) printf("您要查找的信息如下:n"); printf(TITLE); printf(DATA); else printf("没有该信息!n"); printf("是否继续?是(Y) 否(N)n"); choose=getch(); while(choose='Y'|choose='y'); printf("任意键返回"); getch(); /

45、*删除模块*/PAY *del() short sel; long num; char name20,choose; head=open(); if(head=NULL) return NULL; else do do printf("n选择删除方式:n"); printf("tt1.按教师编号删除n"); printf("tt2.按姓名删除n"); scanf("%d",&sel); getchar(); while(sel!=1&&sel!=2); switch(sel) case 1:

46、 printf("输入要删除的教师编号晋瑞手打:"); scanf("%ld",&num); break; case 2: printf("输入要删除的姓名:"); gets(name); break; p1=head; if(p1->num=num)|strcmp(p1->name,name)=0) head=p1->next; printf("删除信息成功!"); else while(p1->next!=NULL)&&(p1->num!=num)&

47、&(strcmp(p1->name,name)!=0) p2=p1; p1=p1->next; if(p1->num=num)|strcmp(p1->name,name)=0) p2->next=p1->next; free(p1); printf("n删除信息成功!n"); else printf("n没有该信息!n"); printf("是否继续?是(Y) 否(N)n"); choose=getch(); while(choose='Y'|choose='y

48、9;); printf("任意键返回,并存盘"); getch(); return head;/*修改模块*/PAY *revise() short sel; long num; char name20,choose; head=open(); if(head=NULL) return NULL; else do do printf("n查找要修改的对象晋瑞手打:n"); printf("tt1.按教师编号查找n"); printf("tt2.按姓名查找n"); scanf("%d",&sel); getchar(); while(sel!=1&&sel

温馨提示

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

评论

0/150

提交评论