《职工工资管理系统设计实验报告.docx》由会员分享,可在线阅读,更多相关《职工工资管理系统设计实验报告.docx(48页珍藏版)》请在三一办公上搜索。
1、47信息工程学院计算机基础训练程序设计报告内蒙古工业大学信息工程学院实 验 报 告课程名称: c语言 实验名称:实验类型: 验证性 综合性 设计性实验室名称: 电西8楼 班级: 计12-2 学号:201220201042姓名: 孙亚赛 组别: 同组人: 勾涛 付启恒 成绩: 实验日期: 2013-3-3 47 目录1 题目与要求32 功能设计52.1算法设计52.2 模块流程图73 程序代码设计84 C程序设计总结225 结束语236 源程序231 题目与要求程序设计的目的和要求1.目的:1)复习、巩固程序设计的基础知识,进一步加深对程序设计语言的理解和掌握;熟练使用函数、结构体、文件、数组、
2、循环与选择、链表和指针等知识点,熟练应用C语言综合知识。2)为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能力;3)培养学生在项目开发中团队合作精神、创新意识及能力。2.要求:1)对系统进行功能模块分析、控制模块分析正确,符合题目要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理;2)系统设计要实用、编程简练、功能全面、界面美观、操作使用便捷、程序运行稳定;3)说明书、流程图要清晰;4)记录设计情况(备查,也为编写设计说明书作好准备);5)要求采用模块化程序设计方法,及锯齿型书写
3、格式,要求上机调试通过,能正确运行;6)设计上交内容:设计报告一份(按格式书写);源程序一份(电子版,能编译成可执行文件并能正常运行。每个班由班长负责收集并上交)。题目:职工工资管理系统1)、应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能清晰美观。2)、输入功能:职工信息的录入(包括从文件中导入职工信息数据),可以一次完成若干条记录的输入。3)、浏览功能:完成对全部职工信息的显示。4)、查找功能:完成按姓名查询职工的相关信息,并显示。完成按ID号查询职工的相关信息,并显示。5)、删除功能:通过输入ID号完成对职工的信息进行删除。6)、添加功能:完成添加新职工的信息。7)、修
4、改功能:通过输入ID号完成对职工的信息进行修改。8)、计算功能:计算职工的各项工资,并得出实发工资。个人收入所得税按现行税率计算9)、统计功能:统计并输出符合指定条件的职工人数及其占总人数和百分比。如实发工资在5000元以上。10)、保存功能:可以将职工信息数据保存至指定的文件中。11)、退出职工工资管理系统。职工信息应至少包括以下数据:ID号、姓名、基础工资、职务工资、住房公积金、个人收入所得税,水电费、实发工资。1.1:我实现的题目中的问题:主菜单页面制作;职工数据输入;职工全部数据浏览;按姓名、学号查找职工数据;通过ID号对职工数据进行删除;通过ID号对职工数据修改;职工数据统计(将自己
5、题目做完后完成了其它功能)。1.2本系统涉及的知识点:结构体、数组、循环、选择、函数调用、分支、指针、全局变量、文件读取、保存1.3我实现的题目功能:主菜单页面制作;职工数据输入;职工全部数据浏览;按姓名、学号查找职工数据;通过ID号对职工数据进行删除;通过ID号对职工数据修改;职工数据统计;2 功能设计2.1算法设计2.1.1进入主函数后执行newu函数,利用switch语句设计如图1所示的主菜单请输入要执行的功能对应选项(1-10)1. 录入职工信息2. 浏览职工信息3. 添加职工信息4. 查询职工信息5. 删除职工信息6. 修改职工信息7. 员工实发工资8. 职工工资排序9. 职工工资统
6、计10. 返回菜单2.1.2选择1后录入职工信息,执行input函数利用循环录入职工各项信息,输入完毕后将所有数据存入文件。2.1.3输入2后浏览职工信息,执行view函数,读取文件,利用循环将职工各项信息显示2.1.4输入3后添加职工信息,执行tianjia函数,读取文件,输入添加人数,然后调用input1函数,利用全局变量D自动将新添加的职工信息补充到已存职工信息后面(利用循环),保存至文件2.1.5输入4后查找职工信息(利用switch语句,通过ID号和姓名查找),利用charge函数,读取存入到文件中的职工信息,选取相应的使用通过ID号(charge1函数)和姓名查找(charge2)
7、的函数对职工信息查找2.1.6输入5后通过ID号删除职工信息,调用delete函数,读取文件,利用循环将与输入ID号相同的文件中的职工信息删除。2.1.7输入6后通过输入ID号修改员工信息,调用xiugai函数,读取文件通过循环将所需各项信息修改2.1.8输入7后统计员工工资,调取gongzhi函数,将员工实发工资输出,其中实发工资在输入函数input函数中利用选择和循环计算得出2.1.9输入8后进行职工工资函数,调取tongji函数,读取文件,利用循环将职工工资比较,进行排序2.1.10输入9后进行职工工资统计,调取tongji函数,将职工工资分为5000以上、3000-4000、2000-
8、3000、2000以下四个档次,其中对数据的统计在输入函数input函数中实现。2.1.11输入10为返回函数,即调用newu函数返回主菜单2.1.12输入11为写入对使用此系统的意见:2.2 模块流程图职工工资信息管理系统主菜单newu()输入模块input()添加模块input1()浏览模块view()排序模块paixu()按姓名查询charge2()查询模块charge()按员工ID号查询charge1()按实发工资排序paixu()删除模块delete()修改模块员工工资统计3 程序代码设计struct Worker int num; /ID号码 char name20; /姓名 in
9、t salary1; /基础工资 int salary2; /职务工资 int salary3; /住房公积金 int salary4; /社保金 float salary5;stu10000; /定义一个足够大的结构体数组函数功能说明:结构体数组,用来存放题目所需信息,定义10000个结构体是为了构建足够大的结构体使所有数据正常存取。void input(int n)-输入函数 void save(int n); /声明一个保存函数 void newu(); /声明一个菜单函数 int i=0; for (i=0;i 3500) int a; float b; a = stui.salary
10、1 + stui.salary2 - stui.salary3 - stui.salary4 - 3500; if (a1500&a9000&(a4500|a=4500) b = (float)(a * 0.1 - 555); stui.salary5 = stui.salary1 + stui.salary2 - b; stui.salary5 = stui.salary1 + stui.salary2 ; save(n); /对结构体数据进行储存 newu(); /返回菜单函数功能说明:将职工信息存入文件,save函数是保存函数,将录入的信息(职工的姓名、编号、基础工资、职务工资、住房公积
11、金、社保金额)存入指定文件中,newu函数是主菜单函数,执行完输入函数后转入主菜单进行其他功能的进行。此函数中通过for循环将多个职工信息录入。下面的if语句是用来统计职工工资的,在此函数录入职工信息的同时将其信息统计。void tianjia()-添加函数 void input1(int n); int i; printf (请输入添加的人数;); scanf (%d,&i); input1(i);函数功能说明:此函数为添加函数,通过此函数输入要添加的人数,再转入input1函数,添加职工信息。void input1(int n)-添加函数 void save(int n); void ne
12、wu(); int i=0; for (i=D;i 3500) int a; float b; a = stui.salary1 + stui.salary2 - stui.salary3 - stui.salary4 - 3500; if (a1500&a9000&(a4500|a=4500) b = (float)(a * 0.1 - 555); stui.salary5 = stui.salary1 + stui.salary2 - b; stui.salary5 = stui.salary1 + stui.salary2 ; save(n); newu();函数功能说明:此函数为添加函
13、数,在原有职工信息的基础上再添加新的职工信息,定义一个全局变量D是原先输入的职工个数,此添加函数直接从D项开始录入新的职工信息,If下面的语句是实发工资的计算,在录入职工信息的过程中将实发工资计算出来,实发工资的函数见下面的函数。void save(int n)-保存函数(将结构体的数据储存到文件中) FILE *fp,*fp1; / int i; if (fp=fopen(abc.dat,wb)=NULL) printf (cannot open filen); return ; for (i=0;in+D;i+) if (fwrite(&stui,sizeof(struct Worker)
14、,1,fp)!=1) printf (file write errorn); D = i; if (fp1=fopen(abcd.dat,wb)=NULL) printf (cannot open filen); return ; fwrite(&D,2,1,fp1);/记录结构体数组的个数并经其储存到文件中 fclose(fp); fclose(fp1); 函数功能说明:此函数为保存函数,将输入或修改后的职工信息存入文件,在其中定义两个指针,各指向一个文件,一个文件存各职工信息,一个文件存职工个数,函数内容为文件读取的固定格式。void view(int n)-浏览函数 int i; FIL
15、E *fp,*fp1; /定义两个指针文件 if (fp=fopen(abc.dat,rb)=NULL) /以读的方式打开文件 printf (cannot open filen); exit(0); if (fp1=fopen(abcd.dat,rb)=NULL) /以读的方式打开文件 printf (cannot open filen); exit(0); fread(&D,2,1,fp1); /读出文件中的D的值 printf (nID号码 姓名 基础工作 职务工资 住房公积金 社保金 实发工资n); for (i=0;iD;i+) fread(&stui,sizeof(struct W
16、orker),1,fp); printf (%5d %6s %5d %4d %6d %5d %5.2fn,stui.num ,stui.name ,stui.salary1 ,stui.salary2 ,stui.salary3,stui.salary4,stui.salary5 ); fclose(fp); fclose(fp1); newu();函数功能说明:此函数为浏览函数,先打开文件读取数据,再通过循环将文件中结构体中的数据依次输出。void newu()-菜单函数(界面函数) void tianjia(); /函数声明 void delet(); /函数声明 void charge(
17、); /函数声明 void paixu(); /函数声明 void xiugai(); /函数声明 void tongji(); /函数声明 void gongzhi(); /函数声明 int i,n; /菜单(界面) printf (欢迎登入职工管理系统n); printf ( 录入职工信息 浏览职工信息 n); printf ( 添加员工信息 查询员工信息 n); printf ( 删除员工信息 员工信息修改 n); printf ( 员工实发工资 员工工资排序 n);printf ( 员工工资统计 返回菜单 n);printf ( 意见反馈 n); printf (nn); printf
18、 (请您在(1-7)中选择一个数字进行相应的操作:); scanf (%d,&n); if (n=1) printf (请确定您本次将要录入职工的数目:); scanf (%d,&i); switch (n) case 1: input(i); break; case 2: view(D); break; case 3: tianjia();break; case 4: charge(); break; case 5: delet(); break; case 6: xiugai(); break; case 7: gongzhi();break; case 8: paixu(); break
19、; case 9: tongji(); break;case 10: newu(); break;case 11: yijian();break; 函数功能说明:此函数为主菜单页面,通过此菜单运用switch函数可以实现系统11个功能的调用,通过对老师上传的例系统分析,我设计了此想主菜单页面。void delet()-删除函数 int num,i,n,m; FILE *fp,*fp1; if (fp=fopen(abc.dat,wb)=NULL) /以写的方式打开文件 printf (cannot open filen); exit(0); if (fp1=fopen(abcd.dat,wb)
20、=NULL)/以写的方式打开文件 printf (cannot open filen); exit(0); fread(&D,sizeof(int),1,fp1); printf (*请输入您想删除的员工ID号*:); /找到要删除员工的ID号码 scanf (%d,&num); for (i=0;iD;i+) fread(&stui,sizeof(struct Worker),1,fp); if (stui.num=num&iD) n = i; fread(&stui+1,sizeof(struct Worker),1,fp); stun = stui+1; /将后一个人的数据赋予前一个人,
21、从而实现对员工信息的有效删除 i+; n+; for (i=0;iD-1;i+) fwrite(&stui,sizeof(struct Worker),1,fp); / 删除一个人的数据后D就要减一 D = D - 1; fwrite(&D,sizeof(int),1,fp1); fclose(fp); fclose(fp1); printf(是否继续删除员工信息 1继续? 2返回菜单); scanf(%d,&m); if (m=1) delet(); newu(); 函数功能说明:此函数为删除函数,主要原理是通过循环将所输入编号的职工的信息替换为其编号的下一个职工的信息将输入编号的职工的信息
22、删除。void charge()-查找函数 int num; printf (按姓名查找请按1 按ID号查找请按2:); scanf (%d,&num); switch (num) case 1: charge1(); break; case 2: charge2(); break; 函数功能说明:此函数为查找函数的主菜单,此函数使用switch语句可以调取charge1(按姓名查找)、charge2(按ID号查找)两个查找方式。void charge1()-查找函数 FILE *fp,*fp1; /利用ID号进行查找信息 int i; char name20; printf (请输入您要查询
23、的员工姓名:); scanf (%s,name); if (fp=fopen(abc.dat,rb)=NULL) /打开文件 printf (cannot open filen); exit(0); if (fp1=fopen(abcd.dat,rb)=NULL) printf (cannot open filen); exit(0); fread(&D,2,1,fp1); for (i=0;iD;i+) /利用循环的方法找到信息 fread(&stui,sizeof(struct Worker),1,fp); if (strcmp(stui.name ,name)=0) printf (%-
24、5d %-6s %d %d %d n,stui.num ,stui.name ,stui.salary1 ,stui.salary2 ,stui.salary3 ); break; fclose(fp); fclose(fp1); newu();函数工呢说明:此函数为使用姓名查找方式将某位职工的信息查找,使用strcmp函数将存入文件的职工姓名与输入的姓名比较,将指定的文件中某个职工信息查找出来。void charge2()-利用ID号进行查找信息 FILE *fp,*fp1; int num,i; printf (请输入您要查询的员工ID号码:); scanf (%d,&num); if (
25、fp=fopen(abc.dat,rb)=NULL) /打开文件 printf (cannot open filen); exit(0); if (fp1=fopen(abcd.dat,rb)=NULL) printf (cannot open filen); exit(0); fread(&D,2,1,fp1); for (i=0;iD;i+) /利用循环的方法找到信息 fread(&stui,sizeof(struct Worker),1,fp); if (stui.num = num) printf (%-5d %-6s %d %d %d n,stui.num ,stui.name ,s
26、tui.salary1 ,stui.salary2 ,stui.salary3 ); break; newu(); fclose (fp); fclose (fp1);函数功能说明:此函数为利用ID号查找职工信息,原理与使用姓名查找特定职工信息相似,使用for循环将文件中与输入特定ID号相同的职工信息查找到并且输出。void paixu()-排序函数 FILE *fp,*fp1; int n,i,j,k; struct Worker temp; if (fp=fopen(abc.dat,rb)=NULL) printf (cannot open filen); exit(0); if (fp1
27、=fopen(abcd.dat,rb)=NULL) printf (cannot open filen); exit(0); fread(&D,2,1,fp1); for (n=0;nD;n+) /利用冒泡法排序 fread(&stun,sizeof(struct Worker),1,fp); for (i=0;iD-1;i+) k = i; for (j=i+1;j stuk.salary5 ) k = j; temp=stuk;stuk=stui;stui=temp; printf (nnID号码 姓名 基础工作 职务工资 住房公积金 社保金 实发工资n); for (i=0;iD;i+)
28、 printf (%5d %6s %5d %4d %6d %5d %5.2fnnnn,stui.num ,stui.name ,stui.salary1 ,stui.salary2 ,stui.salary3,stui.salary4,stui.salary5 ); fclose(fp); fclose(fp1); newu();函数功能说明:此函数为排序函数,利用职工工资排序,使用的原理是冒泡法(for语句嵌套)。void xiugai()-修改函数 FILE *fp,*fp1; /fp1统计一共有fp多少组数据,fp中用来存储机体数据; int num,i,a,b; if (fp=fope
29、n(abc.dat,wb)=NULL)/以写的方式打开文件(即对文件进行初始化) printf (cannot open filen);/以读的方式打开文件 exit(0); if (fp1=fopen(abcd.dat,rb)=NULL) printf (cannot open filen); exit(0); fread(&D,sizeof(int),1,fp1); /读出fp1中的D即是fp中的数据个数 for (i=0;iD;i+) fread(&stui,sizeof(struct Worker),1,fp); printf (请输入您想修改员工的ID号码:); scanf (%d,&num); for (i=0;iD;i+) if (stui.num=num) /开始修改信息 printf (ID号码是否修改(1为修改n为不修改) ); scanf(%d,&a); if (a=1) printf (ID号码改为:); scanf (%d,&stui.num ); printf (姓名是否修改(1为修改n为不修改) ); scanf(%d,&a); if (a=1)