《语c言程序设计基础课程设计工资系统报告--大学毕设论文.doc》由会员分享,可在线阅读,更多相关《语c言程序设计基础课程设计工资系统报告--大学毕设论文.doc(51页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 目录一、需求分析-2二、概要设计-2三、详细设计-4四、调试分析-4五、用户手册-5六、测试数据-6七、程序代码-14 第1页一、需求分析1. 第一步,依据身份进行登录,管理员和职工所能进行的操作不同,具备较高安全性,同时用户可根据需要修改自己的密码,管理员还可添加和删除用户, 首次使用时不存在用户,管理员可进行注册,注册成功后再进入使用。2. 多职工信息进行操作时,建立动态链表,每个节点包含一个职员的工号、姓名、工资等全部信息,通过链表构建一个完整的职工信息库,链表具备录入、删除、修改、查询及统计功能,各功能显示在菜单中,由主函数分别调用。3. 为了避免一个函数体过长,进行细化子函数,小型
2、子函数在各个主调函数里多次调用,便于使用。4. 以可读可写可追加方式新建一个文本文件,用于存储链表里所有节点上包含的信息,将节点信息导入文件时,从头指针开始,依次写入。5. 查询、修改、删除、职工信息时,调用子函数以只读方式打开系统库文件,并将文件从头至尾读取一遍,每次读取一个节点的长度,将每次读取到的信息依次导入到链表的节点中去,再对链表进行所需功能的操作。修改和删除完成后,将整个链表包含的信息重新写入文件,写入之前打开系统库文件同时进行格式化。6. 统计职工最高、最低工资及工资均方差时,以同时方式将职工工资等信息导入到链表中,然后以子菜单的形式输出统计的项目,包括各部门和全公司以及最高、最
3、低工资和工资均方差。统计各部门最高、最低工资和工资均方差时需再调用子函数分别进行操作。统计全公司最高、最低工资和工资均方差时采用多分支结构进行。7. 通过屏幕操作等函数对界面进行处理,相对美观。菜单及所有操作提示信息均采用中文输出,每一步操作后会有相应的提示。如文件不存在或为空时,会提示“文件打开失败!”或“文件是空的!”或输入有误时提示重新输入。 二、 概要设计1. 函数设计main(); 主函数控制整个程序流程,先登录再进行子函数调用menu1(); 管理员菜单函数menu2(); 职工菜单函数,可操作范围比管理员小createlianbiao(); 创建链表函数,用链表构建整个信息库in
4、put(); 录入函数,将链表存进文件readwenjian(struct employee_gz *head); 读取文件内容到指定链表 第2页search(struct employee_gz *head,char xinxi); 查询员工工资信息 shuchuxinxi(struct employee_gz *head,char xinxi); 输出查询到的员工信息xiugai(struct employee_gz *head,char infor); 修改链表信息送到主修改里去modify(struct employee_gz *head); 修改文件里员工工资信息Delete(str
5、uct employee_gz *head); 删除文件里某员工信息shanchujd(struct employee_gz *head,char info); 删除节点信息zhuceyh(); 注册账号tianjiayh(); 添加账户信息 deleteyh(); 删除用户信息 choose(struct employee_gz *head,char bumen); 选择统计的项目count_zdgz(struct employee_gz *head,char bumen); 用于某部门计算最低工资count_zggz(struct employee_gz *head,char bumen)
6、; 用于某部门计算最高工资count_pjgz(struct employee_gz *head,char bumen); 用于某部门计算平均工资count_gzfc(struct employee_gz *head,char bumen); 用于某部门计算工资方差count_gz(struct employee_gz *head,char bumen); 浏览统计的各项工资指标tianjiayh(); 管理员可进行添加职工账户信息,用于职工登录系统查询信息2. 流程控制(1) 主函数模块int main()读取账户文件;do 管理员登录;函数分支:1)录入记录:调用读取职工工资信息文件函数和
7、创建链表函数后写入文件; 2)删除记录:调用读取职工工资信息文件函数和修改链表函数后重新写入文件; 3)查询记录:调用读取职工工资信息文件函数和输出所查节点信息函数; 4)修改记录:调用读取职工工资信息文件函数和修改节点信息函数后重新写入文件; 5)统计记录:采用两层多分支结构,第一层分支结构进行部门选择,调用读取职工工资信息文件函数和统计最低、最高、平均工资和工资方差函数,统计全公司工资时直接查找和计算; 6)重新登录:返回主函数; 7)添加登录账户:调用添加账户函数; 8)修改账户密码:调用修改密码函数; 9)删除登录账户:调用删除账户函数; 0)退出系统:exit(0); 职工登录; 第
8、3页函数分支:1)查询个人记录:调用输出符合搜索条件的节点信息函数; 2)浏览公司记录:调用统计工资函数; 3)重新登录:返回主函数; 4)修改登录密码:调用修改密码函数; 0)退出系统:exit(0);while(退出系统:exit(0)三、详细设计1. 基本数据类型 (1)字符串型; (2)长整数型;2. 程序设计步骤说明及注释 (1)函数介绍及调用关系见概要设计。 (2)注释见附录(源代码中以标出注释)。四、 调试分析1. 开始创建了链表之后,将整个链表中的信息写入文件时,写入方式不对,向文件里写入数据块内容时,数据以二进制方式存储,新建文件和打开文件的方式必须加上b,并用循环控制,从头
9、结点开始,每次写入一个节点,数据长度为1,而不是其他的数字。2. 修改和删除后文件里的数据出现错乱,再次查询时出现乱码,原因还是操作后的写入方式不对,需要以“wb”方式将原文件清空再将整个链表中的信息写入。 3. 进行工资信息统计时,输出结果有错误,加入员工数的输出后发现输出的员工数比录入的多,且其工资为0的情况,进行查询函数检验时发现会输出多余的空信息(无职工名、无工号、工资为零等)或者重复输出,原因应该是存入文件时存在问题,因此在输出查询信息及统计时加入了限制条件将空节点或者多余的信息筛选掉。4. 统计分为各部门和全公司,如果只用一个子函数实现所有统计功能则比较繁琐、函数体太大,因此需再使
10、用子函数分别对各项目进行统计,那么进行不同部门的统计时调用子函数就比较困难。因此在这些统计最低工资、最高工资、平均工资、工资方差的函数中,需要定义一个部门变量,在条件语句里把部门信息通过参数传递在子函数中使用,从而通过条件语句找到该部门信 第4页 息并统计。5. 在删除和修改函数中,为了避免繁琐,同样调用子函数对链表进行操作,在 进行修改方式和删除方式选择时,需要重新定义一个共同变量并传递给子函数,在判断语句里采用“或”语句对姓名和工号同时搜索。6. 在进行职工信息添加时,开始没有避免重复信息的输入,输入已有的职工工号时,应提示“已有该职工信息!”,因此要对原文件的内容进行便利检索,同时要对正
11、在建立的链表进行检索,因为无法将原文件内容与正在建立的链 表连接起来,只能通过对两个链表进行两次检索,将正在建立的链表以追加的方式写到已经建立好的文件中(添加到元数据后面)。7. 进行菜单内的操作提示输入有误时,再按任意键会直接退到主菜单,再要进行该操作需重新选择菜单,耗费时间,使用循环语句控制,提示“输入有误时!”再次提示输入,将新输入的数据重新赋给变量,知道输入信息正确时,包括部门及职务的合法性检验。8. 将职工的基金、税金、应发工资等信息修改后,输出查询的各项结果除以修改的其他的不变,那么就不符合要求,因为应发工资等于基本工资与岗位工资、奖金之和,实发工资等于应发工资减去基金和税金,因此
12、修改这些信息时,需要重新计算,保证各项信息正确。9. 上一界面或者上一语句操作完成后需跳转下一语句,有时会出现两层信息重叠在一起,甚至错误,原因是没有清除上一层内容,因此需要在很多地方加入清屏操作或是删除上一行的操作,进行删除上面多行时,要从所需删的最下面一行开始删除,依次向上。10. 职工登录后,把其工号(用户名)作为参数传递给子函数,查询其个人信息 时,按此工号对文件里的内容(先将文件内容读到链表里)进行检索后输出。11. 开始没有修改登录密码的操作,不便于用户使用,增加修改密码函数后,管 理员和职工可以各自修改自己的密码,保证用户安全。后来还同时添加了删 除登录账户函数,便于管理员管理。
13、12. 考虑到首次使用时,没有任何账户信息,也没有存储用户的文件,而导致运 行故障。因此首次运行时,增加语句完成管理员用户的注册,注册成功后管 理员再进行相关操作。五、用户手册1. 本程序的运行环境为windows xp或windows 7(32位)的操作系统 ,执行文件为 第5页 GONGZI1.EXE。2. 打开运行程序后,按照提示进行登录操作身份分为管理员和职工,依据自己的身份对应用户名及密码登录,身份不符将不能登录,需重新输入。管理员首次运行应先录入信息,并添加对应的职工登录账户信息。 3. 职工登录后菜单与管理员不同,职工只能查询自己信息和浏览公司及各部门最高、最低工资以及平均工资和
14、工资方差信息,并可选择重新登录。4. 管理员进行管理时,可添加、删除登录账户,管理员和职工用户可根据喜好修改自己的登录密码。5. 完成所需操作后可选择重新登录或退出程序。 六、 测试数据1. 文件中包含的所有数据 第6页 2. 注册账户 3.管理员和职工菜单 第7页 4. 录入职工信息 第8页 5. 查询信息 6. 修改信息 第9页 7. 删除信息 8. 统计单位及项目选择 第10页 9. 输出统计信息 第11页 10. 查询个人信息 第12页 11. 信息合法性校验 第13页 12. 提示信息 第14页 13. 修改密码 第15页 七、 附录 源程序文件清单: 数据:C:KESHE(员工工资
15、信息文件) C:XITONGJIAMI(账户登录名及密码文件) 源程序#include#include#include#include#include#includestruct employee_gz *createlianbiao();/*声明创建链表函数*/struct employee_gz *input(); /*声明录入函数*/struct employee_gz *count_gz(struct employee_gz *head,char bumen);/*声明统计函数*/struct employee_gz *search(struct employee_gz *head,c
16、har xinxi);/*声明查询函数*/struct employee_gz *modify(struct employee_gz *head); /*声明修改文件函数*/struct employee_gz *xiugai(struct employee_gz *head,char infor);/*声明修改链表函数*/struct employee_gz *Delete(struct employee_gz *head); /*声明删除函数*/struct employee_gz *shanchujd(struct employee_gz *head,char info);/*声明删除节
17、点函数*/void zhuceyh(); /*声明注册账号函数*/void menu1(); /*声明管理员菜单函数*/void menu2(); /*声明职工菜单函数*/void tianjiayh(); /*声明添加账户信息函数*/void deleteyh(); /*声明删除用户函数*/void xiugaimm(char yhm,char shenfen); /*声明修改账户密码函数*/void choose(struct employee_gz *head,char bumen); /*声明统计中的选择函数*/struct employee_gz *readwenjian(struc
18、t employee_gz *head);/*声明读取文件函数*/struct employee_gz *shuchuxinxi(struct employee_gz *head,char xinxi);/*声明输出信息函数*/void count_zdgz(struct employee_gz *head,char bumen);/*声明计算最低工资函数*/void count_zggz(struct employee_gz *head,char bumen);/*声明计算最高工资函数*/void count_pjgz(struct employee_gz *head,char bumen)
19、;/*声明计算平均工资函数*/void count_gzfc(struct employee_gz *head,char bumen);/*声明计算工资方差函数*/struct employee_gz char gonghao20; /*职工工号*/ char sfzh20; /*身份证号*/ char name20; /*姓名*/ char bumen20; /*部门*/ char zhiwu20; /*职位*/ char jiguan20; /*籍贯*/ long int jbgz; /*基本工资*/ long int jijin; /*基金*/ long int yfgz; /*应发工资
20、*/ long int shuijin; /*税金*/ long int jiangjin; /*奖金*/ long int sfgz; /*实发工资*/ long int gwgz; /*岗位工资*/ struct employee_gz *next; /*指向下一节点的指针*/;struct pass char shenfen20; /*用户身份*/ char yhm20; /*用户名*/ char mima20; /*密码*/ struct pass *next; /*指向下一节点的指针*/;int main() FILE *pfp; struct employee_gz *head;
21、struct pass *ptr,*dl,*mhead,*tail; char bumen20; char xinxi20; char yhm20; char shenfen20; char mima20; int choice,a,b=0; system(graftabl 936); textmode(C80);textcolor(25);textbackground(7); clrscr(); head=NULL; mhead=NULL; tail=NULL; if(pfp=fopen(C:xitongjiami.txt,rb)=NULL) gotoxy(20,6);cprintf(账户信
22、息文件打开失败!); getch();clrscr(); gotoxy(20,2);cprintf(请建立文件并注册用户!); gotoxy(20,3);cprintf(请完成下面的注册!); zhuceyh(); clrscr(); pfp=fopen(C:xitongjiami.txt,rb); while(!feof(pfp) /*将文件中的数据导入链表中*/ ptr=(struct pass *)malloc(sizeof(struct pass); fread(ptr,sizeof(struct pass),1,pfp); if(mhead=NULL) mhead=ptr; else
23、 tail-next=ptr; tail=ptr; ptr-next=NULL; fclose(pfp); dl=mhead; gotoxy(22,5);cprintf(您的身份是:1(管理员) 2(职工); /*登录选择*/ scanf(%d,&a); gotoxy(22,5);delline(); /*删除光标所在行*/ if(a=1) /*管理员登录*/ strcpy(shenfen,guanliyuan); gotoxy(24,5);cprintf(用户名:); gotoxy(24,6);cprintf(密 码:); gotoxy(32,5);scanf(%s,&yhm); gotox
24、y(32,6);scanf(%s,&mima); while(dl!=NULL) if(strcmp(dl-shenfen,shenfen)=0&strcmp(dl-yhm,yhm)=0&strcmp(dl-mima,mima)=0) b=1; do /*菜单循环控制*/ clrscr();menu1(); gotoxy(16,11);cprintf(输入您的选择:); scanf(%d,&choice); clrscr(); /*清屏*/ switch(choice) /*函数调用*/ case 1:input();break; case 2:Delete(head);break; case
25、 3:search(head,xinxi);break; case 4:modify(head);break; case 5:count_gz(head,bumen);break; case 6:main(); case 7:tianjiayh();break; case 8:xiugaimm(yhm,shenfen); main();break; case 9:deleteyh();break; case 0:exit(0); default:gotoxy(32,3);cprintf(输入有误!); getch();break; while(choice!=0); dl=dl-next; i
26、f(b=0) clrscr();gotoxy(20,6); cprintf(用户名或密码错误!请重新登录!);getch(); main(); else if(a=2) /*职工登录*/ strcpy(shenfen,zhigong); gotoxy(22,5);cprintf(工 号:); gotoxy(22,6);cprintf(密 码:); gotoxy(30,5);scanf(%s,&yhm); gotoxy(30,6);scanf(%s,&mima); while(dl!=NULL) if(strcmp(dl-shenfen,shenfen)=0&strcmp(dl-yhm,yhm)
27、=0&strcmp(dl-mima,mima)=0) b=1; do /*菜单循环控制*/ clrscr();menu2(); gotoxy(24,11);cprintf(输入您的选择:); scanf(%d,&choice); clrscr(); switch(choice) /*函数调用*/ case 1:strcpy(xinxi,yhm); /*以工号查询*/ head=readwenjian(head); shuchuxinxi(head,xinxi); getch();break; case 2:count_gz(head,bumen);break; case 3:main(); c
28、ase 4:xiugaimm(yhm,shenfen);break; case 0:exit(0); default:gotoxy(32,3);cprintf(输入有误!); getch();break; while(choice!=0); dl=dl-next; if(b=0) clrscr();gotoxy(20,6); cprintf(用户名或密码错误!请重新登录!);getch(); main(); else gotoxy(20,6);cprintf(输入有误!请重新输入!);getch(); main(); void menu1() /*管理员菜单*/ gotoxy(12,3); c
29、printf( 职工工资管理系统); gotoxy(12,4); cprintf(*菜单*); gotoxy(12,5); cprintf(* * 1 录入工资记录 2 删除工资记录 * *); gotoxy(12,6); cprintf(* * 3 查询工资记录 4 修改工资记录 * *); gotoxy(12,7); cprintf(* * 5 统计工资信息 6 重新登录系统 * *); gotoxy(12,8); cprintf(* * 7 添加账户信息 8 修改登录密码 * *); gotoxy(12,9); cprintf(* * 9 删除系统用户 0 安全退出系统 * *); go
30、toxy(12,10); cprintf(*);void menu2() /*职工菜单*/ gotoxy(22,3); cprintf( 职工工资系统); gotoxy(22,4); cprintf(*菜单*); gotoxy(22,5); cprintf(* * 1 查询个人工资信息 * *); gotoxy(22,6); cprintf(* * 2 浏览公司工资信息 * *); gotoxy(22,7); cprintf(* * 3 重新登录工资系统 * *); gotoxy(22,8); cprintf(* * 4 修改账户登录密码 * *); gotoxy(22,9); cprintf
31、(* * 0 安全退出工资系统 * *); gotoxy(22,10); cprintf(*);struct employee_gz *readwenjian(struct employee_gz *head)/*读取文件函数*/ FILE *fp; struct employee_gz *ptr,*tail; int size=sizeof(struct employee_gz); head=NULL; tail=NULL; ptr=NULL; if(fp=fopen(C:keshe.txt,rb)=NULL) /*以只读方式打开文件*/ clrscr();gotoxy(20,6); cprintf(文件打开失败!请重新登录!); getch();main(); while(!feof(fp) /*将文件中的数据