1、 摘 要人事工资管理系统的主要目标是辅助企事业单位高层领导决策,提高工作人员的工作效率,从而使企事业单位能够以少的投入获得更好的社会效益与经济效益,像人事系统、工资管理系统等就属于人事工资管理系统的范畴。它是单位实现现代化建设的基础工程,是提高单位的管理水平、业务的运转效率和服务质量的必要手段。因此 许多的程序员都可能面对如何开发一套比较完善的人事工资管理系统是相当有必要的问题。随着计算机技术的飞速发展,计算机在企、事业管理中应用的普及,利用计算机实现企、事业人事工资的管理势在必行。本系统结合人事、财务制度,经过需求分析、总体设计和详细设计,采用功能强大的C 语言作为开以语言,来开发模拟我校的
2、、单机版的教师工资管理系统。整个系统从符合操作简便、接口友好、灵活、实用、安全的要求出发,完成人事、工资管理的全过程,包括新进员工加入时工资的输入、老员工的转出、职位等的变动引起职工工资信息的修改、教师工资信息的查询、统计等工资管理工作。关键字:教师工资; C语言; 管理系统目 录一、需求分析1二、总体设计2三、详细设计32.1 数据定义32.2 算法流程图4五、测试7六、设计总结12参考文献13致谢14附录115一、需求分析随着高等学校的快速发展,高校教师规模越来越大,教职工的数量也越来越多,高校教师工资管理更加的复杂,而工资管理是一项琐碎、复杂而又十分细致的工作, 工资计算、发放、核算的工
3、作量很大,一般不允许出错,如果实行手工操作,每月发放工资须手工填制大量的表格,这就会耗费工作人员大量的时间和精力,计算机 进行工资发放工作,不仅能够保证工资核算准确无误、快速输出,而且还可以利用计算机对有关工资的各种信息进行统计,服务于财务部门其他方面的核算和财务处 理,同时计算机具有着手工管理所无法比拟的优点。本系统具有以下功能:1.教师工资信息输入;2.教师工资信息查询;3.教师工资信息删除;4.教师工资信息插入;5.教师工资信息排序;6.教师工资信息统计;7.教师工资信息保存。 二、总体设计根据系统的需求分析,为了完成系统必须的功能,我们确定工资管理系统的功能如图1所示。教师工资管理系统
4、增加职工工资删除职工工资修改职工工资查询职工工资插入职工工资统计职工工资排序职工工资保存职工工资显示职工工资按职工编号查询按职工姓名查询图1 工资管理系统功能模块图三、详细设计2.1 数据定义1.与职工有关的数据结构char num10; /*职工编号*/char name15; /*职工姓名*/float jbgz; /*基本工资*/float jj; /*奖金*/float kk; /*扣款*/float yfgz; /*应发工资*/float sk; /*税款*/float sfgz; /*实发工资*/2.工资发放的数据结构tpn.jbgz=numberinput(jbgz:); /*输
5、入并检验基本工资*/tpn.jj=numberinput(jiangjin:); /*输入并检验奖金*/tpn.kk=numberinput(koukuan:); /*输入并检验扣款*/tpn.yfgz=tpn.jbgz+tpn.jj-tpn.kk; /*计算应发工资*/tpn.sk=tpn.yfgz*0.12; /*计算税金,这里取应发工资的百分之一十二*/tpn.sfgz=tpn.yfgz-tpn.sk; /*计算实发工资*/3.主函数模块switch(select) case 1:count=Add(gz,count);break; /*增加职工工资记录*/ case 2:count=D
6、el(gz,count);break; /*删除职工工资记录*/ case 3:Qur(gz,count);break; /*查询职工工资记录*/ case 4:Modify(gz,count);break; /*修改职工工资记录*/ case 5:count=Insert(gz,count);break; /*插入职工工资记录*/ case 6:Tongji(gz,count);break; /*统计职工工资记录*/ case 7:Sort(gz,count);break; /*排序职工工资记录*/ case 8:Save(gz,count);break; /*保存职工工资记录*/ case
7、 9:system(cls);Disp(gz,count);break; /*显示职工工资记录*/ default: Wrong();getchar();break; /*按键有误,必须为数值-9*/2.2 算法流程图2.21保存函数Save()的算法流程图如图2所示。FILE *fp;(fp=fopen(outfile,wb)=NULLprintf(nSaving file.n);printf(can not open filen);p!=NULLfclose(fp);fwrite(p,sizeof(SALARY),1,fp);图2 保存函数Save()的算法流程图2.22按编号查找教师工资
8、信息记录printheader(); printdata(tpp); printf(END); printf(press any key to return); getchar();p=Locate(tp,n,searchinput,num);system(cls);printf(n =1 Search by number =2 Search by namen);if(select=1)if(p!=-1)Nofind();图3 按编号查找教师工资信息记录四、编码说明: “工资管理系统总控模块” 的功能由menu()函数实现,根据“工资管理系统总控模块” 的程序流程图编写menu()函数。 “统
9、计职工工资记录子模块” 的功能由Tongji()函数实现,根据“计算实发工资子模块” 的程序流程图编写calc函数。 “查询职工工资记录子模块” 的功能由sort()函数实现,根据“查找记录子模块” 的程序流程图编写search函数。 “删除职工工资记录子模块” 的功能由Del函数实现,根据“删除记录子模块” 的程序流程图编写delete函数。 “插入职工工资记录子模块” 的功能由Insert()函数实现,根据“插入记录子模块” 的程序流程图编写insert()函数。 “保存职工工资记录子模块” 的功能由save()函数实现,根据“插入记录子模块” 的程序流程图编写save()函数。 “排序职
10、工工资子模块” 的功能由Sort()函数实现,根据“排序职工工资子模块” 的程序流程图编写Sort()函数。 case 1:count=Add(gz,count);break; /*增加职工工资记录*/ case 2:count=Del(gz,count);break; /*删除职工工资记录*/ case 3:Qur(gz,count);break; /*查询职工工资记录*/ case 4:Modify(gz,count);break; /*修改职工工资记录*/ case 5:count=Insert(gz,count);break; /*插入职工工资记录*/ case 6:Tongji(gz
11、,count);break; /*统计职工工资记录*/ case 7:Sort(gz,count);break; /*排序职工工资记录*/ case 8:Save(gz,count);break; /*保存职工工资记录*/ case 9:system(cls);Disp(gz,count);break; /*显示职工工资记录*/(源代码见附录1)五、测试在VisualC+ 6.0中运行该系统,得到如图4所示的教师工资管理系统的主界面。图4 教师工资管理系统的主界面在图4所示的系统主界面中,输入1,进入图5所示的输入教师工资信息界面。图5 输入教师工资信息界面输入0返回图4所示的主界面,再输入2
12、,进入图6所示的删除教师工资信息界面。图6 删除教师工资信息界面按任意键返回图4所示的主界面,再输入3,进入图7所示的查询教师工资信息界面。图7 查询教师工资信息界面 按任意键返回图4所示的主界面,再按4,进入图8所示修改教师工资信息界面。图8 修改工资信息界面输入0返回图4所示的主界面,再输入5,进入图9所示的插入教师工资信息界面。图9 插入教师工资信息界面。输入0返回图4所示的主界面,再输入6,进入图10所示的教师工资信息统计界面。图10 教师工资信息统计按任意键返回图4所示的主界面,再按7,进入图11所示教师工资信息排序界面。图11 教师工资信息排序界面。按任意键返回图4所示的主界面,再
13、按8,保存教师工资信息。图12 保存教师工资信息六、设计总结第一次做课设,第一次接触这么庞大的c程序,首先读懂它就有很大的难度,但是按照老师讲过的很多东西,慢慢地和其他人一起讨论,集合了大家的想法,也使得思路更加开阔和多样化。例如,刚编写好程序时,我们将所有子函数方最后面并且没有预先申明,导致程序执行时出错,后来经过老师的讲解,最后重新调整了函数的顺序,最后程序编译成功时,大家都特别高兴。虽然编程看起来似乎是一件很枯燥、乏味的事情,但是经历了这次大程序的编辑之后,现其实里面还是充满乐趣的,一旦真的钻研下去什么事情都可以放下,来认真研究。编程尤其是调试是一项细致深入的工作,需要下工夫、动脑子、善
14、于积累经验,这往往能反映出一个人的水平、经验和科学态度。 C语言实训和平时上课所接触的程序是有很大不同的,平时看的写的都是小程序,致使包括一些知识。从来没有将所有学过的知识集中在一个程序中。所经受的考验和克服的困难是平时所无法比拟的。好在同组的搭档们精诚合作,分工明确,有问题共同解决,攻克了C语言实训的复杂程序。在这里,我作为其中的参与者,感触良多。在这次课程设计中我对C语言有了一个更深的了解认识,也对这个学期学的知识得到巩固,还尝试运行编程,每次运行程序成功,让我对下面的项目就充满信心。通过自己与同学合作编写程序,最终把最初的理论知识转化基本技能。这次的课程设计使我对C语言的学习产生浓厚的兴
15、趣。还是这次课程设计最令人激动的就是合作做项目,虽然那只是一个很小很小的项目,大家在一起学习,取长补短,我们很好的在课设中长知识,提高我们的学习热情。对于以后的学习及我们的专业知识的学习我都有了很大的信心。只要我们努力,所有的事就像我们的C程序一样,只要我们编好了程序,就能正确的运行的。因此我觉得,只要能够细心,下功夫,特别是不懂的问题善于请教老师或者同学,一定可以把课堂上学过的书本知识运用到实践中,将知识真真切切地变为自己的。参考文献1姜灵芝,余健. C语言课程设计案例精编.北京:清华大学出版社,20082王新,孙雷. C语言课程设计.北京:清华大学出版社,20093游洪跃、彭骏、谭斌.C语
16、言程序设计实验与课程设计教程.北京:清华大学出版社,20114王连相.C/C+程序设计上机指导与测试. 北京:中国铁道出版社,20065C语言函数手册,机械工业出版社,1999致谢 一周的课设紧张的结束了,在此期间周老师也很辛苦,给我们讲解了如何去做一个如此庞大的课程设计,给了我们很多的帮助。同时,当我们遇到困难时耐心地为我们作讲解并加以引导,因此,我们再次感谢周老师。总之,第一次接触课程设计一定会遇到好多问题不仅仅是C程序中的相关知识还有许多专业技术知识,我们去克服它得到了许多同学的鼓励和帮助尤其是我的合作伙伴马华和赵晓瑾。最后,我们在做这次课设的时候还参考了许多资料,在此也表示感谢。24附
17、录1 #include stdio.h /*标准输入输出函数库*/#include stdlib.h /*标准函数库*/#include string.h /*字符串函数库*/#include conio.h /*屏幕操作函数库*/#define HEADER1 -ZGGZ- n#define HEADER2 | number| name | jbgz | jj | kk | yfgz | sk | sfgz | n#define HEADER3 |-|-|-|-|-|-|-|-| n#define FORMAT |%-8s|%-10s |%8.2f|%8.2f|%8.2f|%8.2f|%8.
18、2f|%8.2f| n#define DATA p-num,p-name,p-jbgz,p-jj,p-kk,p-yfgz,p-sk,p-sfgz#define END - n#define N 60int saveflag=0; /*是否需要存盘的标志变量*/*定义与职工有关的数据结构*/typedef struct employee /*标记为employee*/char num10; /*职工编号*/char name15; /*职工姓名*/float jbgz; /*基本工资*/float jj; /*奖金*/float kk; /*扣款*/float yfgz; /*应发工资*/flo
19、at sk; /*税款*/float sfgz; /*实发工资*/ZGGZ;void menu() /*主菜单*/system(cls); /*调用DOS命令,清屏.与clrscr()功能相同*/textcolor(10); /*在文本模式中选择新的字符颜色*/gotoxy(10,5); /*在文本窗口中设置光标*/cprintf( The Employee Salary Management System n);gotoxy(10,8);cprintf( *Menu*n);gotoxy(10,9);cprintf( * 1 input record 2 delete record *n);g
20、otoxy(10,10);cprintf( * 3 search record 4 modify record *n);gotoxy(10,11);cprintf( * 5 insert record 6 count record *n);gotoxy(10,12);cprintf( * 7 sort reord 8 save record *n);gotoxy(10,13);cprintf( * 9 display record 0 quit system *n);gotoxy(10,14);cprintf( *n);/*cprintf()送格式化输出至文本窗口屏幕中*/void print
21、header() /*格式化输出表头*/ printf(HEADER1); printf(HEADER2); printf(HEADER3);void printdata(ZGGZ pp) /*格式化输出表中数据*/ ZGGZ* p; p=&pp; printf(FORMAT,DATA);void Disp(ZGGZ tp,int n) /*显示数组tp中存储的记录,内容为employee结构中定义的内容*/int i;if(n=0) /*表示没有职工工资记录*/ printf(n=Not employee record!n); getchar(); return;printf(nn);pri
22、ntheader(); /*输出表格头部*/i=0;while(iNot find this employee record!n);/*作用:用于定位数组中符合要求的记录,并返回保存该记录的数组元素下标值参数:findmess保存要查找的具体内容; nameornum保存按什么在数组中查找;*/int Locate(ZGGZ tp,int n,char findmess,char nameornum)int i=0;if(strcmp(nameornum,num)=0) /*按职工编号查询*/ while(in) if(strcmp(tpi.num,findmess)=0) /*若找到find
23、mess值的职工编号*/ return i; i+; else if(strcmp(nameornum,name)=0) /*按职工姓名查询*/ while(in) if(strcmp(tpi.name,findmess)=0) /*若找到findmess值的姓名*/ return i; i+; return -1; /*若未找到,返回一个整数-1*/*输入字符串,并进行长度验证(长度lens) printf(n exceed the required length! n); /*进行长度校验,超过lens值重新输入*/ while(strlen(n)lens); strcpy(t,n); /
24、*将输入的字符串拷贝到字符串t中*/*输入数值,数值)*/float numberinput(char *notice) float t=0.00; do printf(notice); /*显示提示信息*/ scanf(%f,&t); /*输入如工资等数值型的值*/ if(t=0! n); /*进行数值校验*/ while(t0); return t; /*增加职工工资记录*/int Add(ZGGZ tp,int n) char ch,num10; int i,flag=0; system(cls); Disp(tp,n); /*先打印出已有的职工工资信息*/ while(1) /*一次可
25、输入多条记录,直至输入职工编号为的记录才结束添加操作*/ while(1) /*输入职工编号,保证该编号没有被使用,若输入编号为,则退出添加记录操作*/ stringinput(num,10,input number(press 0return menu):); /*格式化输入编号并检验*/ flag=0; if(strcmp(num,0)=0) /*输入为,则退出添加操作,返回主界面*/ return n; i=0; while(iThe number %s is existing,try again?(y/n):,num); scanf(%c,&ch); if(ch=y|ch=Y) con
26、tinue; else return n; else break; strcpy(tpn.num,num); /*将字符串num拷贝到tpn.num中*/ stringinput(tpn.name,15,Name:); tpn.jbgz=numberinput(jbgz:); /*输入并检验基本工资*/ tpn.jj=numberinput(jiangjin:); /*输入并检验奖金*/ tpn.kk=numberinput(koukuan:); /*输入并检验扣款*/ tpn.yfgz=tpn.jbgz+tpn.jj-tpn.kk; /*计算应发工资*/ tpn.sk=tpn.yfgz*0.
27、12; /*计算税金,这里取应发工资的百分之一十二*/ tpn.sfgz=tpn.yfgz-tpn.sk; /*计算实发工资*/ saveflag=1; n+; return n;/*按职工编号或姓名,查询记录*/void Qur(ZGGZ tp,int n)int select; /*1:按编号查,:按姓名查,其他:返回主界面(菜单)*/char searchinput20; /*保存用户输入的查询内容*/int p=0;if(nNo employee record!n); getchar(); return;system(cls);printf(n =1 Search by number
28、=2 Search by namen);printf( please choice1,2:);scanf(%d,&select);if(select=1) /*按编号查询*/ stringinput(searchinput,10,input the existing employee number:); p=Locate(tp,n,searchinput,num);/*在数组tp中查找编号为searchinput值的元素,并返回该数组元素的下标值*/ if(p!=-1) /*若找到该记录*/ printheader(); printdata(tpp); printf(END); printf(
29、press any key to return); getchar(); else Nofind(); getchar();else if(select=2) /*按姓名查询*/ stringinput(searchinput,15,input the existing employee name:); p=Locate(tp,n,searchinput,name); if(p!=-1) printheader(); printdata(tpp); printf(END); printf(press any key to return); getchar(); else Nofind(); g
30、etchar();else Wrong(); getchar(); /*删除记录:先找到保存该记录的数组元素的下标值,然后在数组中删除该数组元素*/int Del(ZGGZ tp,int n)int sel;char findmess20;int p=0,i=0;if(nNo employee record!n); getchar(); return n;system(cls);Disp(tp,n);printf(n =1 Delete by number =2 Delete by namen);printf( please choice1,2:);scanf(%d,&sel);if(sel=
31、1) stringinput(findmess,10,input the existing employee number:); p=Locate(tp,n,findmess,num); getchar(); if(p!=-1) for(i=p+1;idelete success!n); n-; getchar(); saveflag=1; else Nofind(); getchar(); else if(sel=2) /*先按姓名查询到该记录所在的数组元素的下标值*/ stringinput(findmess,15,input the existing employee name:); p
32、=Locate(tp,n,findmess,name); getchar(); if(p!=-1) for(i=p+1;idelete success!n); n-; getchar(); saveflag=1; else Nofind(); getchar(); return n;/*修改记录。先按输入的职工编号查询到该记录,然后提示用户修改编号之外的值,编号不能修改*/void Modify(ZGGZ tp,int n)char findmess20;int p=0;if(nNo employee record!n); getchar(); return ;system(cls);prin
33、tf(modify employee recorder);Disp(tp,n);stringinput(findmess,10,input the existing employee number:); /*输入并检验该编号*/p=Locate(tp,n,findmess,num); /*查询到该数组元素,并返回下标值*/if(p!=-1) /*若p!=,表明已经找到该数组元素*/ printf(Number:%s,n,tpp.num); printf(Name:%s,tpp.name); stringinput(tpp.name,15,input new name:); printf(jbg
34、z:%8.2f,tpp.jbgz); tpp.jbgz=numberinput(jbgz:); printf(jiangjin:%8.2f,tpp.jj); tpp.jj=numberinput(jiangjin:); printf(koukuan:%8.2f,tpp.kk); tpp.kk=numberinput(koukuan:); tpn.yfgz=tpn.jbgz+tpn.jj-tpn.kk; tpn.sk=tpn.yfgz*0.12; tpn.sfgz=tpn.yfgz-tpn.sk; printf(n=modify success!n); getchar(); Disp(tp,n)
35、; getchar(); saveflag=1;else Nofind(); getchar(); return ;/*插入记录:按职工编号查询到要插入的数组元素的位置,然后在该编号之后插入一个新数组元素。*/int Insert(ZGGZ tp,int n) char ch,num10,s10; /*s保存插入点位置之前的编号,num保存输入的新记录的编号*/ ZGGZ newinfo; int flag=0,i=0,kkk=0; system(cls); Disp(tp,n); while(1) stringinput(s,10,please input insert location after the Number:); flag=0;i=0; while(in) /*查询该编号是否存在,flag=1表示该编号存在*/ if(strcmp(tpi.num,s)=0) kkk=i;flag=1;break; i+; if(