《c语言课程设计报告职工工资管理系统.docx》由会员分享,可在线阅读,更多相关《c语言课程设计报告职工工资管理系统.docx(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、课程设计报告课程设计报告题 目:职工工资治理系统设 计 者:专业班级: 学 号: 指导教师: 所属院系:2023 年 6 月 29 日一 设计需求说明一、职工工资治理系统功能设计要求1. 输入记录:将每一个职工的姓名、ID 号以及根本工资、职务工资、岗位津贴、医疗保险、公积金的数据作为一个记录。 该软件能建立一个的数据文件或给已建立好的数据文件增加记录。2. 显示记录:依据用户供给的记录或者依据职工姓名显示一个或几个职工的各项工资和平均工资。3. 修改记录:可以对数据文件的任意记录的数据进展修改并在修改前后对记录内容进展显示。4. 查找记录:可以对数据文件的任意记录的数据进展查找并在查找前后对
2、记录内容进展显示。5. 删除记录:可删除数据文件中的任一记录。6. 恢复记录:能恢复被删除的任一记录。7. 统计: (A) 计算各项工资平均工资及总工资, (B) 统计符合指定条件(如职工工资前三项之和在 2023 元以上、20231500 元、15001000 元) 以内的工资职工人数及占总职工人数的百分比。(C)按字符表格形式打印全部职工工资信息表及平均工资( 包括各项总的平均工资)。8. 保存数据文件功能。9. 翻开数据文件功能。经过逐层逐块、不断细化、求精过程,编写程序并进展测试、验证,可以逐10个模块地分开调试,并通过文件包含或用工程文件的形式进展逐步联合调试。程序运行结果如下表所示
3、(记录个数至少 8 个)。二模块设计分析欢送画面主菜单保存与读取按ID 号查找修改 ID 号修改姓名修改根本工资修改职务工资按姓名查找修改津贴修改医保修改公积金系统功能模块图:输显查删添修统退入示找除加改计出功功功功功功功程能能能能能能能序工作程序分析输入:输入职工工资资料通过构造体的数组来进展操作,先头定义数组 em,先输入需要输入的职工人数 m, 然后进入循环,每次循环将各项输入构造体数组对应项的对应成员中,当循环次数等于人数时,完成全部员工的资料输入,退出循环。同时将数据储存在 ckerk_list 文件中并自动保存至磁盘。注:如首次使用,尚未输入数据,请先输入数据。输入的数据将自动保存
4、。再次选择输入功能时原数据将被掩盖。保存:将输入的资料存入磁盘读取文件 clerk_list,假设文件不存在,打印“翻开失败并退出。假设存在,则通过循环语句将输入到构造体数组的数据逐个输入磁盘。读取:读取磁盘中的资料翻开文件 clerk_list ,假设文件不存在,打印“翻开失败”并退出。假设存在,读取文件中的数据,并返回职工人数。显示:显示职工工资资料先通过读取函数的返回值确定职工人数 m,再通过循环将员工工资资料逐个打印,当循环次数到达 m 时退出循环。其中总工资由程序计算,总工资=根本工资+职务工资+津贴-医疗保险-公积金删除:删除某员工的资料打印员工资料并提示输入要删除职工的姓名,输入
5、后假设该职工不存在则打印“查无此人”;假设存在,则显示该职工资料并询问是否确定删除。假设确定,则删除。删除时,通过比照输入的姓名与资料中的姓名做比照从而确定要删除的项 i,从第 i 项开头,将后一项的各成员的值赋给前一项各对应的成员,完成对第 i 项的删除。添加:添加的员工资料而不掩盖原有资料打印原有职工资料,询问要添加的职工人数并询问是否确定添加。逐个逐项输入员工信息,之后程序计算其总工资。完成后显示“添加成功”,打印的员工资料并自动保存。添加的方法为:定义一个一样类型的构造体数组,将原有项复制后增加的项,并保存的数组。查找:按 ID 好查询与按姓名查找员工资料依据提示输入要查询的 ID 号
6、或姓名,程序通过循环语句将输入的数字与以保存的构造体数组中的数据比照,假设一样,则打印“已找到”及该员工的资料;当循环次数等于人数时完毕循环,假设至完毕循环时也没有找到一样的,则打印“查无此人”。修改:修改特定员工的特定资料打印员工信息并提示输入要修改资料的职工姓名。按提示确定要修改,确定要修改的工程,输入要修改成的结果并将该结果赋给对应项的对应成员,完成对特定职工特定工程的修改。统计通过循环对构造体数组中的每一项经行统计,计算工资总额为,将工资总额除以人数计算出平均工资。依据每名职工的资料计算根本工资、职务工资、津贴之和在 1000-1500 圆 1500-2023 圆 2023 圆以上的员
7、工占总员工的百分比。三源程序代码附各局部解释#include #include #include #include #define N 100struct clerkint num;/ID 号char name20;/姓名int jbgz;/根本工资int zwgz;/职务工资int jt;/ 津贴int yb;/医疗保险int gjj;/公积金/int total;/总工资em100;void menu; void input; void save(int); void display; void del; void add; void search;void search_num;void
8、 search_name; void modify;void sta;void start; /*定义各函数*/void start /开头界面system(“cls“);/清屏system(“color 1E“); /设置文字颜色为黄色 背风光蓝色printf(“nnnnnn“); printf(“*“);printf(“*欢 迎 使 用 工 资 管 理 系 统*“); printf(“*nnnnn“); printf(“tttt制作: n“);printf(“tttt2023 年 6 月nnnn“);printf(“ttt*按任意键进入*n“);void menu /菜单界面system(
9、“cls“);system(“color 1F“); printf(“*菜单*nn“);printf(“1输入nn“);printf(“2显示nn“);printf(“3查找nn“);printf(“4删除nn“);printf(“5添加nn“);printf(“6修改nn“);printf(“7统计nn“);printf(“8退出nn“);printf(“说明:*如首次使用 尚未输入数据 请先输入数据 n存 n*再次选择输入功能时原数据将被掩盖nn“);*输入的数据将自动保void input/*录入函数*/int i,m; system(“cls“);printf(“职工人数(1-100)
10、:n“);scanf(“%d“,&m);for (i=0;im;i+)printf(“请输入职工号: “); scanf(“%d“,&emi.num);printf(“请输入姓名:“); scanf(“%s“,&emi.name); getchar;printf(“请输入根本工资:“); scanf(“%d“,&emi.jbgz);printf(“请输入职务工资:“); scanf(“%d“,&emi.zwgz);printf(“请输入津贴:“); scanf(“%d“,&emi.jt);printf(“请输入医疗保险:“); scanf(“%d“,&emi.yb);printf(“请输入公积
11、金:“); scanf(“%d“,&emi.gjj);emi.total=(emi.jbgz)+(emi.zwgz)+(emi.jt)-(emi.yb)-(emi.gjj);/计算总工资printf(“n“);/计算总工资printf(“n 创立完毕!n“); save(m);/保存职工人数 mvoid save(int m)/*保存文件函数*/int i;FILE*fp;/声明 fp 是指针,用来指向 FILE 类型的对象if (fp=fopen(“clerk_list“,“wb“)=NULL) /翻开职工列表文件为空printf (“翻开失败n“); exit(0);for (i=0;im
12、;i+) /*将内存中职工的信息输出到磁盘文件中去*/if (fwrite(&emi,sizeof(struct clerk),1,fp)!=1)/写入数据块&emi:是要输出数据的地址 sizeof(struct clerk):猎取一个单体的长度 1:数据项的个数 fp:目标文件指针printf(“文件读写错误n“);fclose(fp);/ 缓冲区内最终剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区int load/*导入函数int 型*/FILE*fp; int i=0;if(fp=fopen(“clerk_list“,“rb“)=NULL)elseprintf (“canno
13、t open filen“); exit(0);dofread(&emi,sizeof(struct clerk),1,fp); /读取i+;while(feof(fp)=0);/检测流上的文件完毕符fclose(fp);return(i-1);/返回人数void display/*扫瞄函数*/int i,sum=0; int m=load; system(“cls“);printf(“职工号姓名根本工资职务工资津贴医疗保险 公积金总工资n“);for(i=0;im;i+) /*m 为输入局部的职工人数*/printf(“n%-6d%-6s%-8d%-8d%-8d%-8d%-8d%-8d “,
14、emi.num,emi.name,emi.jbgz,emi.zwgz,emi.jt,emi.yb,emi.gjj,emi.total);sum+=emi.total;/计算员工总工资之和printf(“nn 职工平均工资为:%d n“,sum/m);void del/*删除函数 */int m=load; int i,j,n,t,button; char name20;printf(“n 原来的职工信息:n“); display; /显示删除前的员工信息printf(“n“);printf(“按姓名删除:n“);scanf(“%s“,name);for(button=1,i=0;button&
15、im;i+)/主函数中确定 button=1 时各函数才可以被调用if(strcmp(emi.name,name)=0)/按员工姓名查找到某员工 并调出其资料printf(“n 此人原始记录为:n“);/显示选定员工的信息printf(“职工号姓名根本工资 职务工资津贴医疗保险 公积金总工资 n“);printf(“n%-6d%-6s%-8d%-8d%-8d%-8d%-8d%-8d “,emi.num,emi.name,emi.jbgz,emi.zwgz,emi.jt,emi.yb,emi.gjj,emi.total);printf(“n 确定删除 请按 1,不删除请按 0n“);scanf(
16、“%d“,&n);if(n=1)for(j=i;jm-1;j+)/从第i 项开头 将后一项的各成员的值赋给前一项各对应的成员 完成对第 i 项的删除strcpy(emj.name,emj+1.name); emj.num=emj+1.num; emj.jbgz=emj+1.jbgz; emj.zwgz=emj+1.zwgz; emj.jt=emj+1.jt;emj.yb=emj+1.yb;emj.gjj=emj+1.gjj; emj.total=emj+1.total;.button=0;if(!button)/button=0 说明删除已完成m=m-1;/总员工数削减一人elseprintf
17、(“n 查无此人!n“);printf(“n 删除后的全部职工信息:n“); save(m);/调用保存函数display;/调用扫瞄函数printf(“n 连续删除请按 1,不再删除请按 0n“); scanf(“%d“,&t);switch(t)case 1:del;break; case 0:break; default :break;void add/*添加函数*/FILE*fp; int n;int count=0; int i;int m=load;printf(“n 原来的职工信息:n“); display;printf(“n“);fp=fopen(“emploee_list“,
18、“a“);printf(“请输入想增加的职工数:n“);/确定要参与的职工数 n scanf(“%d“,&n);for (i=m;i=1&t=3)button=1; break;elsebutton=0;printf(“输入错误“);while(button=0);/回到查询选择项while(button=1)switch(t)/选择查询方式case 1:printf(“按工号查询n“);search_num;break; case 2:printf(“按姓名查询n“);search_name;break; case 3:main;break;default:break;void search
19、_num/按职工号查询int a; int i,t;int m=load;printf(“请输入要查找的职工号:n“); scanf(“%d“,&a);for(i=0;im;i+) if(a=emi.num)printf(“职工号姓名根本工资 职务工资津贴医疗保险 公积金总工资n“);printf(“n%-6d%-6s%-8d%-8d%-8d%-8d%-8d “,emi.num,emi.name,emi.jbgz,emi.zwgz,emi.jt,emi.yb,emi.gjj,emi.total);break;%-8dif(i=m)printf(“n 对不起,查无此人n“); printf(“n
20、“);printf(“返回查询函数请按 1,连续查询职工号请按 2n“); scanf(“%d“,&t);switch(t)case 1:search;break; case 2: break; default:break;void search_namechar name30; int i,t;int m=load;printf(“请输入姓名:n“);scanf(“%s“,name); for(i=0;im;i+) if(strcmp(emi.name,name)=0)printf(“n 已找到,其记录为:n“);printf(“职工号姓名根本工资 职务工资津贴医疗保险 公积金总工资 n“)
21、;printf(“n%-6d%-6s%-8d%-8d%-8d%-8d%-8d “,emi.num,emi.name,emi.jbgz,emi.zwgz,emi.jt,emi.yb,emi.gjj,emi.total);%-8dif(i=m) printf(“nn“);printf(“n“);printf(“返回查询菜单请按 1,连续查询姓名请按 2n“); scanf(“%d“,&t);switch(t)case 1:search;break; case 2:break;default :break;void modify /*修改函数*/int num;char name20;int jbg
22、z; int zwgz; int jt;int yb; int gjj;int b,c,i,n,t,button; int m=load;system(“cls“);printf(“n 原来的职工信息:n“); display;printf(“n“);printf(“请输入要修改的职工的姓名:n“); scanf(“%s“,name); for(button=1,i=0;button&i8|c1)printf(“n 选择错误,请重选择!n“);button=0;if(button=1)printf(“n 查无此人n“);doswitch(c)/*由于当找到第i 个职工时,for 语句后i 自加
23、了1,所以下面的应当把改后的信息赋值给第 i-1 个人*/case 1:printf(“职工号改为: “);scanf(“%d“,&num);emi-1.num=num; break;case 2:printf(“姓名改为: “);scanf(“%s“,name);strcpy(emi-1.name,name); break;case 3:printf(“根本工资改为: “);getchar; scanf(“%d“,&jbgz); emi-1.jbgz=jbgz;emi-1.total=( emi-1.jbgz+ emi-1.zwgz + emi-1.jt- emi-1.yb-emi-1.gj
24、j);emi-1.gjj);break;case 4:printf(“职务工资改为: “); scanf(“%d“,&zwgz);emi-1.zwgz=zwgz;emi-1.total=(emi-1.jbgz+emi-1.zwgz+emi-1.jt-emi-1.yb-break;case 5:printf(“津贴改为: “);scanf(“%d“,&jt);emi-1.jt=jt;emi-1.gjj);emi-1.gjj);emi-1.gjj);emi-1.total=(emi-1.jbgz+emi-1.zwgzbreak;case 6:printf(“医疗保险改为: “); scanf(“%
25、d“,&yb);emi-1.yb=yb;emi-1.total=(emi-1.jbgz+emi-1.zwgzbreak;case 7:printf(“公积金改为: “);scanf(“%d“,&gjj);emi-1.gjj=gjj;emi-1.total=(emi-1.jbgz+emi-1.zwgzbreak;case 8:modify; break;+emi-1.jt-+emi-1.jt-+emi-1.jt-emi-1.yb-emi-1.yb-emi-1.yb-printf(“n“);printf(“nn 确定修改 请按 1 ; 重修改 请按 2:n“); scanf(“%d“,&b);wh
26、ile(b=2);printf(“n 修改后的全部职工信息:n“); printf(“n“);save(m);display;printf(“n 按 1 连续修改 ,不再修改请按 0n“); scanf(“%d“,&t);switch(t)case 1:modify;break; case 0:break;default :break;void sta/统计函数int i;int sum=0;int a=0,b=0,c=0; int m=load;system(“cls“);/清屏函数for(i=0;im;i+) /*m 为输入局部的职工人数*/sum+=emi.total; if(emi.t
27、otal)=1000)a+;if(emi.total1500&emi.total2023)c+;printf(“nn 工资总额为:%dn“,sum); printf(“平均工资为:%dn“,sum/m);printf(“n 根本工资、职务工资、津贴之和n“);printf(“在 1000-1500 圆的员工占总员工的百分之%dn“,a*100/m);printf(“在 1500-2023 圆的员工占总员工的百分之%dn“,b*100/m); printf(“在 2023 圆以上的员工占总员工的百分之%dn“,c*100/m); printf(“nn 按任意键连续“);getch;menu;vo
28、id main/主函数int n,button; char a; start;getch;menu;doprintf(“功能选择(1-8):n“); scanf(“%d“,&n); if(n=1&n=7)button=1; break;elsebutton=0;printf(“您输入有误,请重选择!“);while(button=0); while(button=1)switch(n)case 1: input;break;case 2: display;break;case 3: search;break; case 4:del;break; case 5: add;break; case
29、6:modify;break; case 7:sta;break;case 8:exit(0);break; default :break;getchar; printf(“n“);printf(“按任意键连续n“);getch;system(“cls“);/*清屏*/ menu; /*调用菜单函数*/ printf(“功能选择(1-8):n“); scanf(“%d“,&n);printf(“n“);运行结果及截图欢送画面菜单输入功能显示功能27统计功能删除功能28添加功能29修改功能30心得体会通过这两周的 c 语言课程设计,我加深了对 c 语言程序设计的理解,使自己的操作更加娴熟,觉察了自己的缺乏,为自己今后的连续学习指明白方向。在这次课程设计中,我稳固所了学过的学问,能用汇编语言娴熟地运用挨次、选择、循环三大构造,进一步把握构造体数组的使用,文件函数的使用,把握了子程序的定义及调用。并在调试过程中不断觉察与改正错误,完善算法,改进用户体验等等。调试索然繁琐而困难,但极大的促进了我编程力气的提高。由于自己目前力气有限,该程序还有诸多缺乏,感谢指正。感谢教师的悉心教育与细致的帮助。虽然c 语言的课程与课程设计都已完毕,但通过这次课程设计我也觉察了差距,并将在将来努力学习,乐观实践,使自己能真正的把握运用 c 语言。参考文献31
限制150内