《C语言课程设计 .doc》由会员分享,可在线阅读,更多相关《C语言课程设计 .doc(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 C语言课程设计 学号:7 姓名:万少程 班级:软件(2)班 职工工资管理系统一课题及内容工资管理系统主界面以菜单的形式展现,用户可以按不同的键执行不同的操作,即调用不同的函数; . 用不同的函数实现,除以下模块,还可设计其他功能模块: 1)输入记录:输入职工信息,包括编号、姓名、基本工资、奖金、扣款、应发工资、实发工资等信息,可用结构体数组存放;2)输出记录:输出信息;3)修改记录:可根据编或姓名查找学生记录,修改职工其它自动信息(如基本工资、奖金);4)删除记录:指定编号或姓名,删除该条记录。5)插入记录:输入某个职工编号,在该记录的随后位置插入新的职工记录;6)排序:按实发工资由高到低排
2、序;的人数);8)存储:将职工信息输出至文件保存。二实验思路系统功能模块图:欢迎画面主菜单输出功能修改功能删除功能输入功能保存功能插入功能排序功能统计功能修改编号修改姓名修改奖金修改基本工资修改应发工资修改扣款修改实发工资1.输入:输入职工工资资料 通过结构体的数组来进行操作,先输入需要输入的职工人数n,然后进入循环,每次循环将各项输入结构体数组对应项的对应成员中,当循环次数等于人数时,完成全部员工的资料输入,退出循环。同时将数据储存在文件中,并自动保存至磁盘。2.输出:显示职工工资资料 先通过读取函数的返回值确定职工人数n,再通过循环将员工工资资料逐个打印,当循环次数达到n时退出循环。分别打
3、印出:编号、姓名、基本工资、奖金、扣款、应发工资、实发工资具体情况。3.修改:修改特定员工的特定资料打印员工信息并提示输入要修改资料的职工编号姓名。按提示确定要修改,确定要修改的项目,输入要修改成的结果并将该结果赋给对应项的对应成员,完成对特定职工特定项目的修改。4.删除:指定编号或姓名,删除该条记录 打印员工资料并提示输入要删除职工的编号或姓名,输入后若该职工不存在则打印“无此职工信息!”;若存在,则显示该职工资料并询问是否确定删除。若确定,则删除。删除时,通过对比输入的姓名与资料中的姓名做对比从而确定要删除的项i,从第i项开始,将后一项的各成员的值赋给前一项各对应的成员,完成对第i项的删除
4、,最后输出“完成删除!”。5.插入:输入某个职工编号,在该记录的随后位置插入新的职工记录打印原有职工资料,询问要添加的职工的编号,并询问是否确定添加。逐个逐项输入员工信息,之后程序计算其总工资。完成后显示“是否继续插入:继续插入请按1,退出请按2,谢谢!”,打印新的员工资料并自动保存。添加的方法为:定义一个相同类型的结构体数组,将原有项复制后增添新的项,并保存新的数组。6. 排序:按实发工资由高到低排序 7. 统计:根据实发工资进行比较,完成工作在各个等级的人数统计通过循环对结构体数组中的每一项经行统计,按工资金额分成6的阶段,0-2000,2000-4000,4000-6000,6000-1
5、0000,10000以上,逐一统计人数。8. 存储:将职工信息输出至文件保存利用保存函数对职工信息进行保存。三源程序代码#include#includeint i:typedef struct employee int num; /编号 char name20; /姓名 int jbgz ; /基本工资 int jj; / 奖金 int kk; / 扣款 int yfgz; / 应发工资 int sfgz ; /实发工资 ZGGZ; void start() /开始界面printf(*);printf(*欢迎使用工资管理系统*);printf(*nnnnn);void menu() /菜单界面
6、printf(*n);printf(* 1输入职工记录 t *2 输出职工记录);printf(* 3 修改职工记录t * 4删除职工记录 n);printf(* 5插入职工记录 t * 6按平均工资排序 n);printf(* 7统计职工记录 t * 8存储职工记录 n);printf(*n)/1.输入职工工资int add(ZGGZ tp,int n)/在数组tp中增加工资记录元素 strcpy(tpn.num,num1); printf(请输入职工编号:n) scanf(%d,tpn.num);printf(请输入职工姓名:n);scanf(%s,tpn.name);printf(请输入
7、职工基本工资:n);scanf(%d,&tpn.jbgz);printf(请输入职工奖金:n);scanf(%d,&tpn.jj);printf(请输入职工扣款:n);scanf(%d,&tpn.kk);tpn.yfgz=tpn.jbgz+tpn.jj-tpn.kk;tpn.sk=0.2*tpn.yfgz;tpn.sfgz=tpn.yfgz-tpn.sk;n+;return n+;/2.输出职工工资for(n=0;n100;i+) printf(“职工编号:%d,tpn.num”)printf(“职工姓名:%s,tpn.name”)printf(“职工基本工资:%d,&tpn.jbgz”)pr
8、intf(“职工奖金:%d, &tpn.jj”)printf(“职工扣款:%d, &tpn.kk”)printf(“职工应发工资工资:%d, tpn.yfgz”)printf(“职工实发工资工资:%d, tpn.sfgz”)/3.修改职工记录void modify(ZGGZ tp,int n)/函数用于在数组tp中修改记录元素。 char k1100;int i=0;if(n=0)printf(系统内无任何职工信息,无法修改!n);elseprintf(请输入要修改的编号:);scanf(%s,k1);i=locate(tp,n,k1,1);if(in)printf(请输入职工姓名:n); s
9、canf(%s,tpi.name); printf(请输入职工基本工资:n); scanf(%f,&tpi.jbgz); printf(请输入职工奖金:n); scanf(%f,&tpi.jj); printf(请输入职工扣款:n); scanf(%f,&tpi.kk); tpi.yfgz=tpi.jbgz+tpi.jj-tpi.kk; tpi.sk=0.2*tpi.yfgz; tpi.sfgz=tpi.yfgz-tpi.sk;elseprintf(对不起,没有这个编号,无法修改!n);return n;disp(tp,n);/4.删除职工记录int del(ZGGZ tp,int n) /函
10、数用于先在数组tp中找到满足条件的记录,然后删除该记录。char z1100;int t;int z;if(n=0)printf(系统内无任何职工信息,无法删除!n);return n;elseprintf(请确定删除方式:编号删除请输入1,姓名删除请输入2!n);scanf(%d,&z);if(z=1)printf(请输入需要删除的编号:);scanf(%s,z1);if(z=2)printf(请输入需要删除的姓名:);scanf(%s,z1);t=locate(tp,n,z1,z);if(t=n)printf(无此职工信息!n);elsefor(i=t;in-1;i+)strcpy(tpi
11、.num,tpi+1.num); strcpy(tpi.name,tpi+1.name); tpi.jbgz=tpi+1.jbgz; tpi.jj=tpi+1.jj; tpi.kk=tpi+1.kk; tpi.yfgz=tpi+1.yfgz; tpi.sk=tpi+1.sk; tpi.sfgz=tpi+1.sfgz;n-;printf(已完成删除!n);disp(tp,n);return n;/5.插入职工记录int insert(ZGGZ tp,int n) /函数用于在数组tp中插入记录,并返回数组中的当前记录数int i,x,m,j;char s;char t1100;while(1)
12、disp(tp,n); printf(请输入要在其后插入员工信息的员工编号:n); scanf(%s,t1); j=locate(tp,n,t1,1); if(j!=n) printf(请输入要插入的员工编号:n); scanf(%s,t1); for(x=0;xi+j;i+) strcpy(tpn-i.num,tpn-i-1.num);strcpy(tpn-i.name,tpn-i-1.name);tpn-i.jbgz=tpn-i-1.jbgz;tpn-i.jj=tpn-i-1.jj;tpn-i.kk=tpn-i-1.kk;tpn-i.yfgz=tpn-i-1.yfgz;tpn-i.sk=t
13、pn-i-1.sk;tpn-i.sfgz=tpn-i-1.sfgz; strcpy(tpj+1.num,t1); printf(请输入职工姓名:n); scanf(%s,tpj+1.name); printf(请输入职工基本工资:n); scanf(%f,&tpj+1.jbgz); printf(请输入职工奖金:n); scanf(%f,&tpj+1.jj); printf(请输入职工扣款:n); scanf(%f,&tpj+1.kk); tpj+1.yfgz=tpj+1.jbgz+tpj+1.jj-tpj+1.kk; tpj+1.sk=0.2*tpj+1.yfgz; tpj+1.sfgz=t
14、pj+1.yfgz-tpj+1.sk; n+; disp(tp,n); printf(是否继续插入:继续插入请按1,退出请按2,谢谢!n); scanf(%d,&m); if(m=2) return n; else printf(无此职工信息!n); return n; /6.排序void sort( ZGGZ tp,int n) /函数用于在数组tp中完成利用冒泡排序法实现数组的按实发工资字段的降序排序。ZGGZ t;int j;for(j=0;jn;j+)for(i=0;in-j;i+)if(tpi.sfgztpi+1.sfgz)t=tpi;tpi=tpi+1;tpi+1=t;printf
15、(已完成排序!n);disp(tp,n);void save(ZGGZ tp,int n)FILE *fp;if(fp=fopen(f:zggz.txt,w)=NULL)printf(不能打开文件!);return n;for(i=0;in;i+)if(fwrite(&tpi,sizeof(ZGGZ),1,fp)!=1)printf(文件写入错误!);fclose(fp);printf(文件保存成功!n); /7.统计void tongji(ZGGZ tp,int n) /函数用于在数组tp中完成记录的统计工作,统计该公司职工工资的整体分布情况。int a=0,b=0,c=0,d=0,e=0,
16、f=0,g=0; float t=0;for(i=0;i0&tpi.sfgz=2000&tpi.sfgz=4000&tpi.sfgz=6000&tpi.sfgz=8000&tpi.sfgz=10000)g+;continue;for(i=0;in;i+)t=t+tpi.sfgz;printf(实发工资共%0.3f人民币。n,t);printf(实发工资各阶段人数:n);printf(超过 10000 元的人数有 %d 人!n,g);printf(8000 -10000 元的人数有 %d 人!n,f);printf(6000 - 8000 元的人数有 %d 人!n,d);printf(4000
17、- 6000 元的人数有 %d 人!n,c);printf(2000 - 4000 元的人数有 %d 人!n,b);printf(0000 - 2000 元的人数有 %d 人!n,a);/8.储存记录void main()int choice,count=0,p=0;char c;ZGGZ tp100;FILE *fp;if(fp=fopen(f:zggz.txt,a+)=NULL)printf(cannot open this file!n);exit(0);while(!feof(fp)if(fread(&tpcount,sizeof(ZGGZ),1,fp)=1)count+;fclose
18、(fp);printheader( );menu( );while(choice!=0)printf(Please enter your choice:n);scanf(%d,&choice);switch(choice)case 1:count=add(tp,count);printf(共有职工%d人!n,count);p+;break;case 2:count=del(tp,count);printf(共有职工%d人!n,count);p+;break;case 3:qur(tp,count);break;case 4:modify(tp,count);p+;break;case 5:co
19、unt=insert(tp,count);printf(共有职工%d人!n,count);p+;break;case 6:tongji(tp,count);break;case 7:sort(tp,count);break;case 8:save(tp,count);break;case 9:disp(tp,count);break;case 0:break;default:nofound();break;if(p=0)printf(感谢您的使用,谢谢!n);if(p) printf(是否保存?(Y保存,N不保存)n); getchar(); scanf(%c,&c); if(c=Y|c=y)save(tp,count); printf(感谢您的使用,谢谢!n);四.心得体会通过此次实验课程设计对C语言有了更全面的认识,在编码的过程中也发现了很多以前没有注意到的细节错误,通过实验,查找资料了解到更多新的东西,接触了不少新的函数,更清楚的认识到C语言的博大精深,两个星期以来的不断失败改错也让我认识到,写程序不是一朝一夕,也不是一次就能成功,只有敢于反复正视失败改正错误,才能获得最后的成功,这不仅仅只是一个实验课题,同时也是对我们耐心的考验,对今后工作态度,对人生的考验。