职工管理实训报告_第1页
职工管理实训报告_第2页
职工管理实训报告_第3页
职工管理实训报告_第4页
职工管理实训报告_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计软131班高级语言程序设计实训报告广西科技大学鹿山学院《高级语言程序设计》课程实训报告题目:职工信息管理专业:软件工程班级:131班姓名:孙迪学号:20133276 二零一四年6月5日目录题目与要求··························11.1问题提出···························11.2本系统涉及的知识点······················11.3功能要求···························1功能设计···························12.1算法设计···························12.2部分模块流程图························2程序代码设计························33.1输入模块···························33.2查询模块···························33.3修改模块···························4C程序设计总结·······················5结束语···························5*附录:程序源代码·······················6题目与要求1.1问题提出本人计划编写一个职工信息管理系统,主要用来管理职工的各项信息。1.2本系统涉及的知识点结构、数组、循环、函数、分支、指针、文件1.3功能要求能从键盘输入职工的信息能从指定的文件中读入职工的信息能按职工号查询职工的信息能按学历统计职工数能查询到指定年份需要退休的职工的信息(男:60岁,女55岁)能删除指定职工号的职工信息能将职工信息保存在指定的文件中2功能设计2.1算法设计利用switch语句设计如图所示的菜单 2、根据所选菜单编写相应代码:1)输入函数write:利用循环输入的方式,将职工信息存入结构数组,并依次写入文件work.txt。2)读取职工信息reads:读取并输出所有职工信息。判断输入格式1.录入信息…….判断输入格式1.录入信息1.浏览全部2.查询信息1.浏览全部2.查询信息2.按照工号3.删除信息主菜单2.按照工号3.删除信息主菜单2.按照学历4.修改信息选择主模块

2.按照学历4.修改信息选择主模块2.返回上级2.退休情况0.退出

2.返回上级2.退休情况0.退出职工信息管理系统模块图2.2部分模块流程图读文件按照工号查询流程图:读文件输入工号i输入工号i文件结束文件结束结束按顺序读取文件 Y N结束按顺序读取文件输出id相关信息输出id相关信息若i与id相等 N Y结束结束3程序代码设计3.1输入模块1)函数原形:voidwrite(),ids(),sexs(),year()2)功能:利用while循环语句和scanf、gets、getchar函数完成对结构数组的输入,并用fwrite写入文件.其中职工号由ids()判断,性别由sexs()判断,出生日期由year()判断,学历由edus()判断.每成功输入一个数据都将打印在屏幕上ids()函数判断id未存在,范围在1000-9999间,若不满足,提示并要求重新输入,若输入的工号为0,则中止输入.sexs()函数判断输入的性别是否为男或女,若不是,则提示并要求重新输入.year()函数判断若输入的日期格式不为****-**-**,则提示格式错误;若年份不在1900-2014之间,提示年份错误;若月份不在01-12间,则提示月份错误;若日期>31,其中4,6,9,11月的日期>30,则提示日期错误.edus()函数判断若输入的学历不为小学/初中/高中/大学,则提示并要求重新输入3.2查询模块函数原型:main1(),reads(),serch(),eduserch(),tuixiu()功能:在main()函数中选择查询子菜单,通过main1()函数选择查询选项或输入0返回主菜单serch()函数:读取work.txt文件内容,将存在的id打印,用户输入id后,输出该id的所有信息.eduserch()函数:调用edus()提示和判断用户输入学历,输出为该学历职工的所有信息和总计人数.tuixiu()函数:提示用户输入年份,若有职工到此年份为退休,则依次输出职工信息并输出统计的人数.3.3修改模块函数原型:change()功能:读取work.txt文件,打印所有工号姓名,用户输入工号后输出该工号所有信息并对各项信息编号,用户输入信息编号后提示用户输入新数据,修改成功后将用w+方式重写文件,用户可继续修改或输入0退出修改4C程序设计总结遇到问题:1.录入函数中scanf写在while条件内,使每次循环都要求输入内容,若输入0则中止while,导致输入结束后写入了id为0的数据.2.删除函数中的删除方式为:遍历文件,标记目标id下标,使用for循环覆盖此数据,重新写入文件,导致文件内容尾出现空数据解决:加入delid0()函数,剔除数据间的空数据,判断数据是否有效,w+方式写入有效数据前的内容,较繁琐总结:本程序简洁明了,功能齐全,经大量调试最终出现0错误与警告;录入模块有详细报错,与用户交互性强,易于使用;查询模块拥有查询子菜单列出查询类型,方便用户使用,查询前列出名单,查询过程中按需求提示,查询后按需提示;修改模块可连续修改同一职工的多项信息,增强了实用性,适当提示与输入检测使其更便于使用.本程序存储方式为结构体数组,避开了链表的复杂操作,使程序更简单易行,但不足之处是占用内存大于链表,如有机会,下次会尝试使用链表.5结束语崔亚楠老师在实训过程中悉心解答和解决我们遇到的问题,感谢崔老师.参考文献[1]谭浩强,C程序设计(第四版),北京:清华大学出版社,2010.6*附录:程序源代码//职工管理系统,完整源代码#include"stdio.h"#include"stdlib.h" //strcpy原型#defineNAMES10 //名字#defineEDUS5 //学历#defineSITES30 //地址#defineDATES11 //日期#defineSEXS3 //姓名#defineMAN50 //人数上限#defineMALLsizeof(works) //获取字节长//定义结构体typedefstructwork{ intid; charname[NAMES]; charsex[SEXS]; chardate[DATES]; charedu[EDUS]; intwage; charsite[SITES]; intphone;}works;worksworker[MAN];//欢迎信息voidmenu0(y){ system("cls"); puts("\n\n\n\n\t\t┏━━━━━━━━━━━━━━━━━━━━┓\n\\t\t┃\t\t\t\t\t┃\n\\t\t┃\t职工管理系统\t\t┃\n\\t\t┃\t\t\t┃\n\\t\t┃\t\t\t\t\t┃\n\\t\t┗━━━━━━━━━━━━━━━━━━━━┛\n\\n");if(y==0){ printf("\t\t\t欢迎使用正在进入...\n");}if(y==1){ printf("\t\t\t感谢使用正在退出...\n");}getch();}//主菜单voidmenu(){ system("cls"); puts("\n\n\t\t┏━━━━━━━━━主菜单━━━━━━━━━┓\n\\t\t┃\t\t\t\t\t┃\n\\t\t┃\t1.录入信息\t\t┃\n\\t\t┃\t\t\t\t\t┃\n\\t\t┃\t2.查询信息\t\t┃\n\\t\t┃\t\t\t\t\t┃\n\\t\t┃\t3.删除信息\t\t┃\n\\t\t┃\t\t\t\t\t┃\n\\t\t┃\t4.修改信息\t\t┃\n\\t\t┃\t\t\t\t\t┃\n\\t\t┃\t0.退出\t\t┃\n\\t\t┃\t\t\t\t\t┃\n\\t\t┗━━━━━━━━━━━━━━━━━━━━━┛\n\\t\t\t\t请选择(0-4):\\n");}//输入时voidwrite_menu(){ system("cls"); puts("\n\n\t\t━━━━━━━━━━录入信息━━━━━━━━━━\n\n");}//判断性别voidsexs(i){ chary[SEXS]; intn=1; FILE*fp; if((fp=fopen("work.txt","r+"))==NULL){ printf("无法打开\n"); } while(gets(y)){ if(strcmp(y,"男")==0||strcmp(y,"女")==0){ strcpy(worker[i].sex,y); break; } else{ write_menu(); printf("输入错误(请输入男/女)\n"); continue; } } fclose(fp);}//判断出生日期voidyear(i){ chars[DATES],y[5]; intn=1,y1=0; FILE*fp; if((fp=fopen("work.txt","r+"))==NULL){ printf("无法打开\n"); } while(gets(s)){ strncpy(y,s,5); //把年份复制给y1并转换成int型 y1=atoi(y); if(s[10]=='\0'&&s[4]=='-'&&s[7]=='-'){ //长度为10,第5位和第8位为'-' if(y1>2014||y1<1900){ write_menu(); printf("年份输入错误,请重新输入(年份应在1900-2014之间)\n\n"); continue; } if((s[5]>'1'||s[5]<'0')||((s[5]=='1'&&s[6]>'2')||(s[5]=='0'&&s[6]=='0'))){ write_menu(); //月份>12或为00,月份第一位为0或1 printf("月份输入错误,请重新输入(月份应为01-12)\n\n"); continue; } //闰年二月为29天否则不大于28 //4,6,9,11月小于等于30 if((s[8]<'0'||s[8]>'3')||(s[8]=='0'&&s[9]=='0')||(s[8]=='3'&&s[9]>'1')||(((y1%4==0&&y1&100!=0)||(y1%400==0))&&(s[5]=='0'&&s[6]=='2'&&s[8]=='3'))||((s[5]=='0'&&s[6]=='2')&&((s[8]=='2'&&s[9]>'8')||s[8]=='3'))||(((s[5]=='0'&&(s[6]=='4'||s[6]=='6'||s[6]=='9'))||(s[5]=='1'&&s[6]=='1'))&&s[8]=='3'&&s[9]=='1')){ write_menu(); printf("日期输入错误,请重新输入\(闰年二月为29否则不大于28,4,6,9,11月小于等于30)\n\n"); continue; } strcpy(worker[i].date,s); break; } else{ write_menu(); printf("输入错误,请重新输入(格式:2000-01-01)\n\n"); continue; } } fclose(fp);}//判断工号intids(i){ intid,n=0,c=0; FILE*fp; if((fp=fopen("work.txt","r+"))==NULL){ printf("无法打开\n"); } while(scanf("%d",&id)){ while(!feof(fp)){ fread(&worker[n],MALL,1,fp); if(worker[n].id==id&&worker[n].id!=0){ //搜索相同的id c=1; break; } n++; } if(c!=1){ if(id==0) return0; //输入0时返回0,在输入函数中结束 elseif(id>=1000&&id<=9999){ getchar(); worker[i].id=id; break; } else{ write_menu(); printf("输入错误(范围:1000-9999)\n"); continue; } } write_menu(); printf("已存在,请重新输入\n"); c=0; } fclose(fp);}//判断学历voidedus(i){ chary[EDUS]; intn=1; FILE*fp; if((fp=fopen("work.txt","r+"))==NULL){ printf("无法打开\n"); } while(gets(y)){ if(strcmp(y,"小学")==0||strcmp(y,"初中")==0 ||strcmp(y,"高中")==0||strcmp(y,"大学")==0){ strcpy(worker[i].edu,y); break; } else{ write_menu(); printf("输入错误(请输入小学/初中/高中/大学)\n\n"); continue; } } fclose(fp);}//剔除所有id为0的数据(数据整理)voiddelid0(){ inti=0,num=0,n=0,c=0,t=0; FILE*fp; fp=fopen("work.txt","r+"); while(!feof(fp)){ fread(&worker[i],MALL,1,fp); if(worker[i].id==0&&t==0){ c=i; t=1; } i++; } i--; num=i; i=0; rewind(fp); //剔除数据间的空数据,(删除数据时会产生) while(!feof(fp)){ fread(&worker[i],MALL,1,fp); i++; } i=0; rewind(fp); while(!feof(fp)){ //剔除结尾空数据,(写入时可能产生) fread(&worker[i],MALL,1,fp); if(worker[i].id==0&&t==0){ c=i; t=1; } i++; } if(t=1){ fp=fopen("work.txt","w+"); for(n=0;n<c;n++){ //只写入有效数据前的 fwrite(&worker[n],MALL,1,fp); } fclose(fp); } fclose(fp);}//输入,写入文件voidwrite(){ FILE*fp; intid=0,i=0,eduid; charc; if((fp=fopen("work.txt","a+"))==NULL){ printf("无法打开\n"); } write_menu(); printf("工号(输入0返回):\n\n"); while(i<50){ id=ids(i); if(id==0){ write_menu(); printf("任意键返回\n"); break; } write_menu(); printf("工号:%d\n\n名字:\n",worker[i].id); gets(worker[i].name); write_menu(); printf("工号:%d名字:%s\n\n性别:\n",worker[i].id,worker[i].name); sexs(i); write_menu(); printf("工号:%d名字:%s性别:%s\n\n出生日期:\n",worker[i].id,worker[i].name,worker[i].sex); year(i); write_menu(); printf("工号:%d名字:%s性别:%s\n出生日期:%s\n\n学历:\n",worker[i].id,worker[i].name,worker[i].sex,worker[i].date); edus(i); write_menu(); printf("工号:%d名字:%s性别:%s\n\出生日期:%s学历:%s\n\n工资:\n",worker[i].id,worker[i].name,worker[i].sex,worker[i].date,worker[i].edu); scanf("%d",&worker[i].wage); getchar(); write_menu(); printf("工号:%d名字:%s性别:%s\n\出生日期:%s学历:%s工资:%d\n\n地址:\n",worker[i].id,worker[i].name,worker[i].sex,worker[i].date,worker[i].edu,worker[i].wage); scanf("%s",&worker[i].site); getchar(); write_menu(); printf("工号:%d名字:%s性别:%s\n\出生日期:%s学历:%s工资:%d\n住址:%s\n\n电话:\n",worker[i].id,worker[i].name,worker[i].sex,worker[i].date,worker[i].edu,worker[i].wage,worker[i].site); scanf("%d",&worker[i].phone); getchar(); write_menu(); printf("工号:%d名字:%s性别:%s\n\出生日期:%s学历:%s工资:%d\n住址:%s电话:%d\n",worker[i].id,worker[i].name,worker[i].sex,worker[i].date,worker[i].edu,worker[i].wage,worker[i].site,worker[i].phone); if(fwrite(&worker[i],MALL,1,fp)!=1){ //写入文件 printf("保存失败"); } printf("\n继续输入工号或0退出\n"); i++; } fclose(fp);}//输出所有职工信息voidreads(){ system("cls"); puts("\n\n\t\t━━━━━━━━━━全部职工━━━━━━━━━━\n\n"); inti=0; FILE*fp; if((fp=fopen("work.txt","r+"))==NULL){ printf("无法打开\n"); } while(!feof(fp)){ fread(&worker[i],MALL,1,fp); if(worker[i].id==0){ //跳过id为0的id i++; continue; } printf("工号:%d名字:%s性别:%s\n\出生日期:%s学历:%s工资:%d\n住址:%s电话:%d\n\n",worker[i].id,worker[i].name,worker[i].sex,worker[i].date,worker[i].edu,worker[i].wage,worker[i].site,worker[i].phone); i++; } printf("\n任意键返回\n"); fclose(fp);}//按工号查询voidserch(){ system("cls"); puts("\n\n\t\t━━━━━━━━━━工号查询━━━━━━━━━━\n\n"); intn,i=0,t=0; FILE*fp; if((fp=fopen("work.txt","r+"))==NULL){ printf("无法打开\n"); } //列出已有工号 printf("目前存在的工号:\n"); while(!feof(fp)){ fread(&worker[i],MALL,1,fp); if(worker[i].id==0){ //跳过id为0的id i++; continue; } printf("%6d",worker[i].id); i++; } i=0; rewind(fp); //定位到文件起始位置 printf("\n输入工号\n\n"); scanf("%d",&n); while(!feof(fp)){ t=0; fread(&worker[i],MALL,1,fp); if(worker[i].id==0){ //跳过id为0的id i++; continue; } if(n==worker[i].id){ system("cls"); puts("\n\n\t\t━━━━━━━━━━工号查询━━━━━━━━━━\n\n"); printf("工号:%d名字:%s性别:%s\n\出生日期:%s学历:%s工资:%d\n住址:%s电话:%d\n\n",worker[i].id,worker[i].name,worker[i].sex,worker[i].date,worker[i].edu,worker[i].wage,worker[i].site,worker[i].phone); } else t=1; i++; } if(t==1){ system("cls"); puts("\n\n\t\t━━━━━━━━━━工号查询━━━━━━━━━━\n\n"); printf("id不存在"); } printf("\n任意键返回\n"); fclose(fp);}//搜索学历voideduserch(){ system("cls"); puts("\n\n\t\t━━━━━━━━━━学历查询━━━━━━━━━━\n\n"); charn[EDUS],y[EDUS],i=0,num=0; FILE*fp; if((fp=fopen("work.txt","r+"))==NULL){ printf("无法打开\n"); } printf("输入学历\n\n"); while(gets(y)){ if(strcmp(y,"小学")==0||strcmp(y,"初中")==0 ||strcmp(y,"高中")==0||strcmp(y,"大学")==0){ strcpy(n,y); break; } else{ system("cls"); puts("\n\n\t\t━━━━━━━━━━学历查询━━━━━━━━━━\n\n"); printf("输入错误(请输入小学/初中/高中/大学)\n\n"); continue; } } system("cls"); puts("\n\n\t\t━━━━━━━━━━学历查询━━━━━━━━━━\n\n"); while(!feof(fp)){ fread(&worker[i],MALL,1,fp); if(n[0]=='0'){ break; } //搜索edu的首字符是否与输入的相等 if(worker[i].edu[0]==n[0]){ printf("工号:%d名字:%s性别:%s\n\出生日期:%s学历:%s工资:%d\n住址:%s电话:%d\n\n",worker[i].id,worker[i].name,worker[i].sex,worker[i].date,worker[i].edu,worker[i].wage,worker[i].site,worker[i].phone); num++; } i++; } if(n[0]!='0') printf("\n共%d人",num); printf("\n\n任意键返回\n"); fclose(fp);}//退休查询voidtuixiu(){ system("cls"); puts("\n\n\t\t━━━━━━━━━━退休查询━━━━━━━━━━\n\n"); chary[4]; inti=0,n=0,c=0,t=0; FILE*fp; if((fp=fopen("work.txt","r+"))==NULL){ printf("无法打开\n"); } printf("输入年份(将输出在该年份退休的职工,男60,女55退休):\n\n"); scanf("%d",&n); printf("至%d年退休的员工:\n",n); while(!feof(fp)){ fread(&worker[i],MALL,1,fp); if(strcmp(worker[i].sex,"男")==0){ strncpy(y,worker[i].date,4); //把date的年份复制给y c=atoi(y); //y转换为int型赋给c if(n-c>=60){ t++; printf("\n"); printf("工号:%d名字:%s性别:%s\n\出生日期:%s学历:%s工资:%d\n住址:%s电话:%d\n\n",worker[i].id,worker[i].name,worker[i].sex,worker[i].date,worker[i].edu,worker[i].wage,worker[i].site,worker[i].phone); } } if(strcmp(worker[i].sex,"女")==0){ strncmp(y,worker[i].date,4); c=atoi(y); if(n-c>=55){ t++; printf("\n"); printf("工号:%d名字:%s性别:%s\n\出生日期:%s学历:%s工资:%d\n住址:%s电话:%d\n\n",worker[i].id,worker[i].name,worker[i].sex,worker[i].date,worker[i].edu,worker[i].wage,worker[i].site,worker[i].phone); } } i++; } if(t==0){ printf("\n无"); } printf("共%d人\n任意键返回\n",t); fclose(fp);}//删除指定职工voiddel(){ intn=0,i=0,s,num; FILE*fp; if((fp=fopen("work.txt","r+"))==NULL){ printf("无法打开\n"); } system("cls"); puts("\n\n\t\t━━━━━━━━━━删除职工━━━━━━━━━━\n\n"); while(!feof(fp)){ fread(&worker[i],MALL,1,fp); if(worker[i].id==0){ //跳过id为0的id i++; continue; } printf("工号:%d名字:%s\n",worker[i].id,worker[i].name); i++; } i=0; rewind(fp); printf("\n输入要删除的职工号\n"); scanf("%d",&s); while(!feof(fp)){ fread(&worker[i],MALL,1,fp); if(worker[i].id==s){ num=i; //num标记要删除的工号 } i++; //i统计人数,下标 } i--; for(n=num;n<i;n++){ worker[n]=worker[n+1]; } if((fp=fopen("work.txt","rt+"))==NULL){ printf("无法打开\n"); } for(n=0;n<i;n++){ if(fwrite(&worker[n],MALL,1,fp)!=1){ printf("\n无法保存\n"); } } printf("\n删除成功!\n"); getch(); fclose(fp);}//重写数据voidallw(i){ intn; FILE*fp; fp=fopen("work.txt","w+"); for(n=0;n<i;n++){ fwrite(&worker[n],MALL,1,fp); } fclose(fp);}//信息修改voidchange(){ intn=0,i=0,s,num,t=0,c=0; FILE*fp; if((fp=fopen("work.txt","r+"))==NULL){ printf("无法打开\n"); } system("cls"); puts("\n\n\t\t━━━━━━━━━━修改信息━━━━━━━━━━\n\n"); while(!feof(fp)){ fread(&worker[i],MALL,1,fp); if(worker[i].id==0){ //跳过id为0的id i++; continue; } printf("工号:%d名字:%s\n",worker[i].id,worker[i].name); i++; } i=0; rewind(fp); printf("\n输入要修改的职工号\n"); scanf("%d",&s); getchar(); while(!feof(fp)){ fread(&worker[i],MALL,1,fp); if(worker[i].id==s){ num=i; system("cls"); puts("\n\n\t\t━━━━━━━━━━修改信息━━━━━━━━━━\n\n"); printf("1.工号:%15d\n2.名字:%15s\n3.性别:%15s\n\4.出生日期:%15s\n5.学历:%15s\n6.工资:%15d\n7.住址:%15s\n8.电话:%15d\n\n",worker[i].id,worker[i].name,worker[i].sex,worker[i].date,worker[i].edu,worker[i].wage,worker[i].site,worker[i].phone); } i++; } printf("输入要修改的数据编号\n"); while(scanf("%d",&s)&&s!=0){ getchar(); switch(s){ case1:printf("新工号\n");ids(num);break; case2:printf("新姓名\n");gets(worker[num].name);break; case3:printf("新性别\n");sexs(num);break; case4:printf("新出生年月\n");year(num);break; case5:printf("新学历\n");edus(num);break; case6:printf("新工资\n");scanf("%d",&worker[num].wage);getchar();break; case7:printf("新住址\n");scanf("%s",&worker[num].site);getchar();break; case8:printf("新电话\n");scanf("%d",&worker[num].phone);getchar();break; default:printf("选项输入错误\n");break; } allw(i); //重写文件 s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论