沈阳航空工业学院课程设计学号班级姓名指导教师年月日沈阳航空工业学院课程设计任务书一、课程设计题目:工资管理系统二、课程设计工作自三、课程设计内容用C语言编写软件完成以下任务:1输入工资数(职工数据要有职工号.姓名.所属部门.工龄和工资)保存在paid.dat文件中.2对现有的职工数据根据所属部门排序,并显示出企业的平均工资.3职工涨工资(根据工龄按比例进行工资调整).4查询职工的相关数据.四、课程设计要求:程序质量:1贯彻结构化程序设计思想.2用户界面友好,功能明确,操作方便.可以加以其他功能和修饰.3用户界面的菜单中包含职工信息录入,排序及显示.工资调整,信息查询.退出5项.所有职工数据的改变都应该在paid.dat文件中体现出来.4代码应适当缩进,并给出必要的注释,以增强程序的可读行.课程设计说明书:课程结束后,上交课程设计说明书(打印稿和电子稿),其内容如下:1封面2课程设计任务书3目录4需求分析(分析题目的要求)5程序流程图(总体流程图和主要功能模块流程图)6核心技术的实现说明及相应程序段7个人总结8参考资料9源程序及适当的注释指导教师:_____学生签名:_____目录一、需求分析…………………………………………1二、程序流程图………………………………………2三、核心技术的实现说明及相应程序段……………5四、个人总结…………………………………………16五、参考文献……………………………………17六、源程序…………………………………………18一、需求分析经过对程序设计题目的分析可知,整个程序的设计实现大致分为五个模块,其中每一个模块对应一个函数,他们的功能分别是:输入职工数据函数(shuru),职工排序函数(sort_part),增加职工工资函数(add_paid),职工信息的查询函数(search_worker),以及主函数main().1、输入职工数据函数实现的功能是按照工号对职工的数据输入并保存在paid.dat;2、职工排序函数按照题目的具体要求实现的是按职工部门排序并算出平均工资。3、增加职工工资函数允许职工按照根据工龄按比例进行工资调整。4、职工信息的查询函数输出paid.dat文件中的职工的相关数据。除上面介绍的功能之外,程序还具有退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。每一个职工记录都包含职工号.姓名.所属部门.工龄和工资,在程序当中,将职工记录类型定义为结构体类型,添加以及追加的职工信息直接写入D盘的paid.dat文件中,其他函数每次对职工记录的访问,其数据来源都是paid.dat文件,这样做不但可以保证职工数据的一致性,而且可以对职工数据进行永久保存,保证每次运行程序都可以采用原来的数据。二、程序流程图1主函数2录入职工信息函数工资管理系统输入值n=1?真假输入值n=2?输真假入职输入值n=3?职工真假工排输入值n=4?信序真假息及平涨查均工询工资职退出资工信息3涨工资函数定义指针fp整型数据i结构体变量pp字符串数组number[50]判断文件Paid.txt是否存在是否创建文件paid.txtWhile循环输入各项数据将数据写入文件关闭文件定义变量打开文件NoyesReturn输入每年增加工资假While(!feof(fp))真调出文件中的工资数据Break计算现在工资输出职工信息关闭文件4排序函数定义变量no打开文件yes继续假while(!fof)真return跳出循环工资累加Return求平均工资For循环(t=0;tall-1;t++k=0;kall-1-t;k++)pp[k].work..partpp[k+1].work.part假真将部门替换break将相应职工信息替换过来输出职工信息关闭文件5查询函数三、核心技术的实现说明及相应程序段本程序主要由四个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能。在这些函数当中,输入数据函数、查询函数、涨工资函数和排序函数是程序中较为核心的部分,下面分别进行说明:1录入职工信息,职工信息包括职工编号,姓名,部门,工资和工作年龄,本函数的功能是把职工信息写入到文件中。在程序中建立一个文件paid.txt.定义一个结构体变量。输入职工的基本信息把职工信息写入到文件中。之后再次输入下一个职工的编号,并且判断职工编号是否为0当不为零时,继续输入职工其它信息,并且把信息写入到文件中。直到输入的职工编号为零退出此函数voidshuru(){//定义文件类型指针FILE*fp;定义指针fp整型数据j.结构体变量pp字符串数组number[50]判断文件Paid.txt是否存在是否创建文件paid.txtWhile循环输入各项数据打印职工数据关闭文件inti;//定义结构体变量ppstructPaidpp;charnumer[50];//打开文件if((fp=fopen(d:\\paid.txt,a+))==NULL){fp=fopen(d:\\paid.txt,w+);}while(strcmp(pp.work_num,e)!=0){printf(\n请输入职工编号:);scanf(%s,pp.work_num);printf(\n请输入职工姓名:);scanf(%s,pp.work_name);printf(\n请输入职工部门:);scanf(%s,pp.work_part);printf(\n请输入职工工资:);scanf(%d,&pp.work_paid);printf(\n请输入职工工龄:);scanf(%d,&pp.work_age);//把员工信息写入到文件中fprintf(fp,%s\t%s\t%s\t%d\t%d\n,pp.work_num,pp.work_name,pp.work_part,pp.work_paid,pp.work_age);printf(\n退出请输入e\n继续请按任意数字\n);scanf(%s,pp.work_num);}fclose(fp);}2排序函数的功能是对学生信息进行排序,打开文件paid.txt。定义结构体变量数组,把工人信息读取到结构体数组中,用冒泡法进行排序并且输出排序结果,此函数还有计算平均工资的功能。voidsort_part(){FILE*fp;inti,all,temp_i,k,t,sum=0;structPaidpp[10];chartemp_ch[55];if((fp=fopen(d:\\paid.txt,r+))==NULL){printf(\n不能打开文件paid.txt);return;}i=0;//判断文件是否结束while(!feof(fp)){fscanf(fp,%s\t%s\t%s\t%d\t%d\n,pp[i].work_num,pp[i].work_name,pp[i].work_part,&pp[i].work_paid,&pp[i].work_age);sum+=pp[i].work_paid;i++;}all=i;printf(\n%d个员工的平均工资%lf,all,(float)sum/all);printf(\n);fclose(fp);for(t=0;tall-1;t++)for(k=0;kall-1-t;k++)if(strcmp(pp[k].work_part,pp[k+1].work_part)0){strcpy(temp_ch,pp[k].work_num);strcpy(pp[k].work_num,pp[k+1].work_num);strcpy(pp[k+1].work_num,temp_ch);strcpy(temp_ch,pp[k].work_name);strcpy(pp[k].work_name,pp[k+1].work_name);strcpy(pp[k+1].work_name,temp_ch);strcpy(temp_ch,pp[k].work_part);strcpy(pp[k].work_part,pp[k+1].work_part);strcpy(pp[k+1].work_part,temp_ch);temp_i=pp[k].work_paid;pp[k].work_paid=pp[k+1].work_paid;pp[k+1].work_paid=temp_i;temp_i=pp[k].work_age;pp[k].work_age=pp[k+1].work_age;pp[k+1].work_age=temp_i;}fp=fopen(d:\\paid.txt,w+);for(i=0;iall;i++){fprintf(fp,%s\t%s\t%s\t%d\t%d\n,pp[i].work_num,pp[i].work_name,pp[i].work_part,pp[i].work_paid,pp[i].work_age);printf(%s\t%s\t%s\t%d\t%d\n,pp[i].work_num,pp[i].work_name,pp[i].work_part,pp[i].work_paid,pp[i].work_age);}fclose(fp);}3增加职工工资,自己设置一个职工工资的增加法则可,读取职工信息并且把职工的工资进行按工龄增加。最后把职工信息全部写入到文件中。关闭文件voidadd_paid(){FILE*fp;inti,j,gongzi;structPaidpp[10];charnumber[50];printf(\n请输入职工每年增加的工资:);scanf(%d,&gongzi);if((fp=fopen(d:\\paid.txt,r+))==NULL){printf(\n不能打开文件paid.txt);return;}i=0;j=0;while(!feof(fp)){fscanf(fp,%s\t%s\t%s\t%d\t%d\n,pp[j].work_num,pp[j].work_name,pp[j].work_part,&pp[j].work_paid,&pp[j].work_age);pp[j].work_paid=pp[j].work_paid+pp[j].work_age*gongzi;j++;}fclose(fp);if((fp=fopen(d:\\paid.txt,w+))==NULL){printf(\n不能打开文件paid.txt);return;}for(i=0;ij;i++){fprintf(fp,%s\t%s\t%s\t%d\t%d\n,pp[i].work_num,pp[i].work_name,pp[i].work_part,pp[i].work_paid,pp[i].work_age);printf(%s\t%s\t%s\t%d\t%d\n,pp[i].work_num,pp[i].work_name,pp[i].work_part,pp[i].work_paid,pp[i].work_age);}fclose(fp);}4职工信息的查询是通过打开文件paid.txt并且读取文件中的职工信息,并输出职工信息到屏幕上。当文件结束,关闭文件,退出函数voidsearch_worker(){FILE*fp;intj;structPaidpp[10];charnumber[50];if((fp=fopen(d:\\paid.txt,r+))==NULL){printf(\n不能打开文件paid.txt);return;}j=0;while(!feof(fp)){fscanf(fp,%s\t%s\t%s\t%d\t%d\n,pp[j].work_num,pp[j].work_name,pp[j].work_part,&pp[j].work_paid,&pp[j].work_age);printf(%s\t%s\t%s\t%d\t%d\n,pp[j].work_num,pp[j].w