资源描述
课程设计报告课程设计报告题目:职工工资管理系统设计者:专业班级:_学号:指导教师:所属院系:2011年6月29日设计需求说明一、职工工资管理系统功能设计要求1. 输入记录:将每一个职工的姓名、ID号以及基本工资、职务工资、岗位津贴、医疗保险、公积金的数据作为一个记录。该软件能建立一个新的数据文件或给已建立好的数据文件增加记录。2. 显示记录:根据用户提供的记录或者根据职工姓名显示一个或几个职工的各项工资和平均工资。3. 修改记录:可以对数据文件的任意记录的数据进行修改并在修改前后对记录内容进行显示。4查找记录:可以对数据文件的任意记录的数据进行查找并在查找前后对记录内容进行显示。5.删除记录:可删除数据文件中的任一记录。6恢复记录:能恢复被删除的任一记录。7.统计:(A)计算各项工资平均工资及总工资,(B)统计符合指定条件(如职工工资前三项之和在2000元以上、20001500元、15001000元)以内的工资职工人数及占总职工人数的百分比O(C)按字符表格形式打印全部职工工资信息表及平均工资(包括各项总的平均工资)。8保存数据文件功能。9打开数据文件功能。经过逐层逐块、不断细化、求精过程,编写程序并进行测试、验证,可以逐个模块地分开调试,并通过文件包含或用工程文件的形式进行逐步联合调试。程序运行结果如下表所示(记录个数至少8个)。7二模块设计分析系统功能模块图工作程序分析 输入:输入职工工资资料通过结构体的数组来进行操作,先头定义数组em,先输入需要输入的职工人数m,然后进入循环,每次循环将各项输入结构体数组对应项的对应成员中,当循环次数等于人数时,完成全部员工的资料输入,退出循环。同时将数据储存在ckerk_list文件中并自动保存至磁盘。注:如首次使用,尚未输入数据,请先输入数据。输入的数据将自动保存。再次选择输入功能时原数据将被覆盖。 保存:将输入的资料存入磁盘读取文件clerk_list,若文件不存在,打印“打开失败并退出。若存在,则通过循环语句将输入到结构体数组的数据逐个输入磁盘。 读取:读取磁盘中的资料打开文件clerk_list,若文件不存在,打印“打开失败”并退出。若存在,读取文件中的数据,并返回职工人数。 显示:显示职工工资资料先通过读取函数的返回值确定职工人数m,再通过循环将员工工资资料逐个打印,当循环次数达到m时退出循环。其中总工资由程序计算,总工资=基本工资+职务工资+津贴-医疗保险-公积金 删除:删除某员工的资料打印员工资料并提示输入要删除职工的姓名,输入后若该职工不存在则打印“查无此人”;若存在,则显示该职工资料并询问是否确定删除。若确定,则删除。删除时,通过对比输入的姓名与资料中的姓名做对比从而确定要删除的项i,从第i项开始,将后一项的各成员的值赋给前一项各对应的成员,完成对第i项的删除。 添加:添加新的员工资料而不覆盖原有资料打印原有职工资料,询问要添加的职工人数并询问是否确定添加。逐个逐项输入员工信息,之后程序计算其总工资。完成后显示“添加成功”,打印新的员工资料并自动保存。添加的方法为:定义一个相同类型的结构体数组,将原有项复制后增添新的项,并保存新的数组。 查找:按ID好查询与按姓名查找员工资料根据提示输入要查询的ID号或姓名,程序通过循环语句将输入的数字与以保存的结构体数组中的数据对比,若相同,则打印“已找到”及该员工的资料;当循环次数等于人数时结束循环,若至结束循环时也没有找到相同的,则打印“查无此人”。 修改:修改特定员工的特定资料打印员工信息并提示输入要修改资料的职工姓名。按提示确定要修改,确定要修改的项目,输入要修改成的结果并将该结果赋给对应项的对应成员,完成对特定职工特定项目的修改。 统计通过循环对结构体数组中的每一项经行统计,计算工资总额为,将工资总额除以人数计算出平均工资。根据每名职工的资料计算基本工资、职务工资、津贴之和在1000-1500圆1500-2000圆2000圆以上的员工占总员工的百分比。三源程序代码(附各部分解释)#include#include#include#include#defineN100structclerkintnum;/ID号charname20;/姓名intjbgz;/基本工资intzwgz;/职务工资intjt;/津贴intyb;/医疗保险intgjj;/公积金/inttotal;/总工资em100;voidmenu();voidinput();voidsave(int);voiddisplay();voiddel();voidadd();voidsearch();voidsearch_num();voidsearch_name();voidmodify();voidsta();voidstart();/*定义各函数*/voidstart()/开始界面system(cls);清屏system(color1E);/设置文字颜色为黄色背景色蓝色printf(nnnnnn);printf(ItT#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*printf(ItT#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*欢迎使用工资管理系统11Aprintf(*);11#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*printf(tttt制作:n);printf(tttt2011年6月nnnn);printf(ttt*按任意键进入*n);voidmenu()/菜单界面system(cls);system(color1F);printf(*菜单*nn);printf(输入nn);printf(显示nn);printf(查找nn);printf(删除nn);printf(添加nn);printf(修改nn);printf(统计nn);printf(退出nn);printf(说明:*如首次使用尚未输入数据请先输入数据n*输入的数据将自动保存n*再次选择输入功能时原数据将被覆盖nn);voidinput()/*录入函数*/inti,m;system(cls);printf(职工人数(l-100):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(请输入公积金:“);scanf(%d,&emi.gjj);emi.total=(emi.jbgz)+(emi.zwgz)+(emi.jt)-(emi.yb)-(emi.gjj);计算总工资printf(n);计算总工资printf(n创建完毕!n);save(m);/保存职工人数mvoidsave(intm)/*保存文件函数*/inti;FILE*fp;声明fp是指针,用来指向FILE类型的对象if(fp=fopen(clerk_list,wb)=NULL)/打开职工列表文件为空printf(打开失败n);exit(0);for(i=0;im;i+)/*将内存中职工的信息输出到磁盘文件中去*/讦(fwrite(&emi,sizeof(structclerk),l,fp)!=l)写入数据块&emi:是要输出数据的地址sizeof(structclerk):获取一个单体的长度1:数据项的个数fp:目标文件指针printf(“文件读写错误n);10fclose(fp);/缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区intload()/*导入函数int型*/FILE*fp;inti=0;if(fp=fopen(clerk_list,rb)=NULL)printf(cannotopenfilen);exit(0);elsedofread(&emi,sizeof(structclerk),1,fp);/读取i+;while(feof(fp)=0);/检测流上的文件结束符fclose(fp);return(i-l);/返回人数voiddisplay()/*浏览函数*/inti,sum=0;intm=load();system(cls);总工资%-8dprintf(“职工号姓名基本工资职务工资津贴医疗保险公积金n);for(i=0;i=1&t=3)button=1;break;else16button=0;printf(输入错误);while(button=0);回到查询选择项while(button=1)switch(t)/选择查询方式casel:printf(按工号查询n);search_num();break;case2:printf(按姓名查询n);search_name();break;case3:main();break;default:break;voidsearch_num()/按职工号查询inta;inti,t;intm=load();printf(请输入要查找的职工号:n);scanf(%d,&a);for(i=0;im;i+)if(a=emi.num)总工资%-8dprintf(“职工号姓名基本工资职务工资津贴医疗保险公积金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;if(i=m)printf(n对不起,查无此人n);printf(n);printf(返回查询函数请按1,继续查询职工号请按2n);scanf(%d,&t);switch(t)case1:search();break;case2:break;default:break;voidsearch_name()charname30;inti,t;intm=load();printf(请输入姓名:n);scanf(%s,name);for(i=0;im;i+)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);if(i=m)printf(nn);printf(n);printf(返回查询菜单请按1,继续查询姓名请按2n);scanf(%d,&t);switch(t)case1:search();break;case2:break;default:break;voidmodify()/*修改函数*/intnum;charname20;intjbgz;intzwgz;intjt;intyb;intgjj;intb,c,i,n,t,button;intm=load();system(cls);printf(n原来的职工信息:n);display();printf(n);printf(请输入要修改的职工的姓名:n);scanf(%s,name);for(button=1,i=0;button&i8|cl)printf(n选择错误,请重新选择!n);button=0;if(button=l)printf(n查无此人n);doswitch(c)/*因为当找到第i个职工时,for语句后i自加了1,所以下面的应该把改后的信息赋值给第i-l个人*/case1:printf(职工号改为:);scanf(%d,&num);emi-1.num=num;break;case2:printf(姓名改为:);scanf(%s,name);strcpy(emi-1.name,name);break;case3:printf(基本工资改为:);getchar();scanf(%d,&jbgz);emi-1.jbgz=jbgz;emi-1.total=(emi-1.jbgz+emi-1.zwgz+emi-1.jt-emi-1.yb-30emi-1.gjj);break;case4:printf(职务工资改为:);scanf(%d,&zwgz);emi-1.zwgz=zwgz;emi-1.gjj);emi-1.gjj);emi-1.gjj);emi-1.total=(emi-1.jbgz+emi-1.zwgz+emi-1.jt-break;case5:printf(津贴改为:);scanf(%d,&jt);emi-1.jt=jt;emi-1.total=(emi-1.jbgz+emi-1.zwgz+emi-1.jt-break;case6:printf(医疗保险改为:)scanf(%d,&yb);emi-1.yb=yb;emi-1.total=(emi-1.jbgz+emi-1.zwgz+emi-1.jt-break;case7:printf(公积金改为:);scanf(%d,&gjj);emi-1.gjj=gjj;emi-1.total=(emi-1.jbgz+emi-1.zwgz+emi-1.jt-emi-1.yb-emi-1.yb-emi-1.yb-emi-1.yb-emi-1.gjj);break;case8:modify();break;printf(n);printf(nn确定修改请按1;重新修改请按2:n);scanf(%d,&b);while(b=2);printf(n修改后的所有职工信息:n);printf(n);save(m);display();printf(n按1继续修改,不再修改请按0n);scanf(%d,&t);switch(t)case1:modify();break;case0:break;default:break;voidsta()统计函数inti;intsum=0;inta=0,b=0,c=0;intm=load();system(cls);清屏函数for(i=0;im;i+)/*m为输入部分的职工人数*/sum+=emi.total;if(emi.total)=1000)a+;if(emi.total1500&emi.total2000)c+;printf(nn工资总额为:dn,sum);printf(“平均工资为:%dn,sum/m);printf(n基本工资、职务工资、津贴之和n);printf(在1000-1500圆的员工占总员工的百分之dn,a*100/m);printf(在1500-2000圆的员工占总员工的百分之dn,b*100/m);printf(在2000圆以上的员工占总员工的百分之dn,c*100/m);printf(nn按任意键继续);getch();menu();voidmain()/主函数intn,button;chara;start();getch();menu();doprintf(功能选择(l-8):n);scanf(%d,&n);if(n=l&n=7)button=l;break;elsebutton=0;printf(您输入有误,请重新选择!);while(button=0);while(button=l)switch(n)casel:input();break;case2:display();break;case3:search();break;case4:del();break;case5:add();break;case6:modify();break;case7:sta();break;case8:exit(0);break;default:break;getchar();printf(n);printf(“按任意键继续n);getch();system(cls);/*清屏*/menu();/*调用菜单函数*/printf(功能选择(l-8):n);scanf(%d,&n);printf(n);运行结果及截图欢迎画面菜单*运+柔单*帰塗洌:豫邀溯耀逡沁1输典鬱浓遴渺沦魏孰沙液液:迸淨2.显示遽漆滲燿逾塗瘫泼沁3.查找殘邈殘腕奚裁疥瓏愛.蠻凶澎抿4删除遊邈妙淨卷塗渺识汐Q:址淨5添仙瘩塗沁鑒渝沁瞬护澤6修改竭逸決:耀瀝沁邈加沁7统计鼻第邈迫粹遐遽浊话遐戈溢泮s退出说明:*如首次便用尚未输典数拐请先输瓜数据否则使用其他功能时系统讲自动退出癖俞;的数据将自动保存犒次选痒$俞盘劝能旳煤数据将被覆盖功能选择(l-8i:输入功能iHA(i-ioQk醫输知D号:1淸输认姓名:込清输人基本工资:1200诸输典职务工230清输人津贴:0请谕兀医疗保险:田请输廣公积金:1891青输茄E号:2诸输人姓容:bbb淸输入基本工资:.2500请输入职务工资:旳。青输臭津贴:400请输衣医疗保险:57请输阚公积金:600-谙输XjD号:脊显示功能D运1凰;.宙总丄员1aaa12OQ25005913911S22t.t.t.25OQSOO400-57600SO43.5:ccc17OQ00-C:a.170:0机工平均工资再:1S75慘任意键继续统计功能工资总额为:WS0.2平対工资为:-2160呈本工资、职务工资、津贴之印1000-150&:1的员工占总员工的百疔立側150Q-2000圆的员工占总员工的百井之如P2000圆叹上的员工占总员工的百分之40按任賁键继续,删除功能as基本工资一职芬工资se医疗保险公积金总工资1aaa12002302bbb2500S003ccc17000识工平均工资対:1975安姓名删除:jbb比人原始记录为:口号姓窖基本工资职务工资2bbb2E00800涌定删除请按4不删除请按o05918911824005760030430001700津贴医疗保险公积金总工资400576003043添加功能修改功能it输真婪修改的职工的姓名::idd比人原始记录为:!D号姓名基本工资职务工资津贴医疗保险公积金总工资4ddd1400345.34565734510SS涌罡按1;不修改请按01尊要进行修改的选项1.1D号2姓名3基本工资4职箸工资氐津贴&医疗保险人公积金盼返回上层iS选择序号1-出2妊名改対:遇确定修政请按1;重新修改请按2:心得体会通过这两周的c语言课程设计,我加深了对c语言程序设计的理解,使自己的操作更加熟练,发现了自己的不足,为自己今后的继续学习指明了方向。在这次课程设计中,我巩固所了学过的知识,能用汇编语言熟练地运用顺序、选择、循环三大结构,进一步掌握结构体数组的使用,文件函数的使用,掌握了子程序的定义及调用。并在调试过程中不断发现与改正错误,完善算法,改进用户体验等等。调试索然繁琐而艰苦,但极大的促进了我编程能力的提高。由于自己目前能力有限,该程序还有诸多不足,感谢指正。感谢老师的悉心教导与细致的帮助。虽然C语言的课程与课程设计都已结束,但通过这次课程设计我也发现了差距,并将在未来努力学习,积极实践,使自己能真正的掌握运用c语言。参考文献
展开阅读全文