C语言课程实习报告学院:工程学院专业:岩土工程班级:052052-33学号:20051002623姓名:刘恒第一题:工资信息管理系统一`题目要求工资信息管理系统【要求】该系统能够实现工资信息管理。系统包括录入,浏览,查询,统计等功能。其中录入功能要求能够添加新的工资信息到文件;浏览功能要求能按照工资卡号,姓名分类浏览,提供分屏显示;有排序功能,排序后按照工资卡号升序或实发工资降序输出;查询功能要求能够按照工资卡号,姓名查询;统计功能要求能够按照月份累计统计某职工在某时间段实发工资总金额。(1)文件中一行数据对应一个职工工资信息;(2)工资信息的数据结构采用结构体数组,一个数组元素对应一条工资单记录;(3)工资单信息包括工资卡号,姓名,月份,应发工资,水费,电费,税金,实发工资等;(4)实发工资=应发工资-水费-电费-税金,其中税金计算方法为:①应发工资<800元,税金=0;②800元<应发工资<1400元,税金=(应发工资-800)*5%;③应发工资>1400元,税金=(应发工资-1400)*10%二`需求分析根据题目要求,由于工资信息是以文本文件的方式存放在文件里的,所以应提供文件的输入,输出等操作;在程序中需要知道职工的工资信息,应提供录入,浏览,查询,排序,统计等操作功能;另外,还应提供键盘式选择菜单实现功能选择。三`总体设计通过分析整个系统,根据上面的需求分析,可以将这个系统的设计分为如下几个模块:图一.系统功能模块图四`详细设计1.主函数主函数一般设计得比较简洁,只提供输入,处理和输出部分的函数调用。其中各功能模块用菜单方式选择。【流程图】工资信息管理系统数据输入数据添加数据浏览数据查找工资排序工资统计如下图所示:图二.主函数流程图【程序】#includestdio.h#includestdlib.h#includemath.h#includealloc.h#defineN150voidenter();search();voidadd();voidbrowse();voidstat();voidorder();voidnum_order();voidT_wage_order();voidmenu();voidstat();voidreadfiles();intallwage();voidmenu(){intn,w;system(cls);do{puts(\t\t*********************MENU*********************\n\n);puts(\t\t\t\t1.Enternewdata);puts(\t\t\t\t2.Additiondata);puts(\t\t\t\t3.Browseall);puts(\t\t\t\t4.Searchdata);puts(\t\t\t\t5.orderdata);puts(\t\t\t\t6.Statbymonth);puts(\t\t\t\t7.Exit);puts(\n\n\t\t**********************************************\n);printf(Choiceyournumber(1-7):[]\b\b);/*对选择的数字进行判断*/scanf(%d,&n);if(n1||n7){w=1;getchar();}elsew=0;}while(w==1);switch(n){case1:enter();break;/*输入模块*/case2:add();break;/*追加模块*/case3:browse();break;/*浏览模块*/case4:search();break;/*查找模块*/case5:order();break;/*排序模块*/case6:stat();break;/*统计模块*/显示一系列功能选项输入n,判断n是否是0-7根据n的值调用各功能模块函数case7:exit(0);/*退出*/}}voidsave();intload();voidinput();voidprintf_face();voidprintf_one();voidprintf_back();intT_wage();/************************主函数*************************/main(){menu();}2.各功能模块设计⑴.输入模块【数据结构】【分析】看各数据信息,工资卡号、姓名是字符型,可以用字符型数组;工资应采用实型。数据信息应放在文件中。structinfowage{charnum[15];charname[20];intmonth;intS_wage;intwater_rate;intelectric_charge;inttax;intT_wage;}IM[N];/*IM[N]中每个元组元素对应一个职工*/【注意】:N为职工人数,应采用宏定义#defineN150。【流程图】:图三。输入模块流程图[程序]:voidenter()/*输入模块*/{inti,n;printf(Howmanyinformations(0-%d)?:,N-1);scanf(%d,&n);/*要输入的记录个数*/printf(\nEnterdatanow\n\n);for(i=0;in;i++)输入用户要输入职工记录的个数ni从0到n-1调用输入函数input(i)i!=0保存调用函数save(n){printf(\nInput%dthinfo.\n,i+1);input(i);/*调用输入函数*/}if(i!=0)save(n);/*调用保存函数*/printf_back();/*一个任务结束时让用户选择是浏览还是返回*/}⑵.追加模块[需求分析]:该模块的功能是添加新的工资信息,从键盘输入并逐条写到原来的输入文件中,注意采用追加不是覆盖的方式.[流程图]:图四.追加模块流程图[程序]:voidadd()/*追加模块*/{inti,k,n,m;FILE*fp;n=load();printf(HowmanyIMloyeesareyouwanttoadd(0-%d)?:,N-1-n);scanf(%d,&m);/*输入要追加的记录个数*/k=n+m;for(i=n;ik;i++){printf(\nInput%dthinfo.\n,i-n+1);input(i);/*调用输入函数*/}if((fp=fopen(infowage.txt,ab))==NULL)/*以ab方式打开文件,追加保存*/{printf(Cannotopenfile\n);}for(i=0;in;i++)调用加载函数n=load();并计算可以记录个数n输入用户要追加职工记录的个数mK=m+ni从n到k调用输入函数input(i)保存追加的记录if(fwrite(&IM[i],sizeof(structinfowage),1,fp)!=1)/*输出到文件*/printf(filewriteerror\n);fclose(fp);printf_back();/*一个任务结束时让用户选择是浏览还是返回*/}⑶.浏览模块[需求分析]该模块的功能是显示所有职工记录信息.[流程图]图五.浏览模块流程图[程序]:voidbrowse()/*浏览模块*/{inti,k,n;n=load();/*加载记录*/printf_face();/*调用显示数据结构项目函数*/for(i=0;in;i++){if((i!=0)&&(i%5==0))/*目的是分屏显示*/{printf(\n\nPassanykeytocontinue...);getch();puts(\n\n);}printf_one(i);/*调用显示一个记录的函数*/}printf(\tThereare%dinfo.\n,n);printf(\nPassanykeytoback...);getch();/*按任意键*/menu();}⑷.查找模块[需求分析]:该模块的功能是根据输入的职工姓名或者工资卡号查找对应的记录.显示职工记录(5个一屏)按任意键显示下一屏按任意键返回主菜单[流程图]图六:查找模块流程图[程序]:search()/*查找模块*/{intk=0;intw1,w2;do{printf(\n\nWhichwaydoyouchoose?\n\t1.Byname2.Bynum[]\b\b);scanf(%d,&w1);if(w1==1)name_search();/*姓名查找*/elsenum_search();/*卡号查找*/if(k!=-1){printf(\n\nSuccessful.^_^.);printf(\n\nWhatdoyouwanttodo?\n\t1.Searchanother2.Back[]\b\b);scanf(%d,&w2);}}while(w2==1);menu();}name_search()/*姓名查找*/{inti,n,k,w=1;structinfowagee;n=load();do{k=-1;printf(\n\nEnternamethatyouwanttosearch!Name:);scanf(%s,e.name);/*输入要找的名字*/printf_face();/*调用显示数据结构项目函数*/for(i=0;in;i++)/*查找数据*/if(strcmp(e.name,IM[i].name)==0){k=i;/*找到记录*/printf_one(k);break;/*调用显示一个记录的函数*/}if(k==-1){printf(\n\nNoexist!);}}while(k==-1&&w==1);}num_search()/*卡号查找*/{inti,k,n,w=1;structinfowages;n=load();查找模块卡号查找姓名查找do{k=-1;printf(\n\nEnternumthatyouwanttosearch!NO.:);scanf(%s,s.num);/*输入要找的号码*/printf_face();/*调用显示数据结构项目函数*/for(i=0;in;i++)/*查找数据*/if(strcmp(s.num,IM[i].num)==0){k=i;/*找到记录*/printf_one(k);break;/*调用显示一个记录的函数*/}if(k==-1){printf(\n\nNoexist!);}}while(k==-1&&w==1);}(5).排序模块。[需求分析]:该模块的功能是将职工按照卡号升序或者实发工资降序排列输出。【流程图】:图七:排序模块流程图【程序】:voidorder()/*排序模块*/{intk=0;intw1,w2;do{printf(\n\nWhichwaydoyouchoose?\n\t1.Bynum2.ByT_wage[]\b\b);scanf(%d,&w1);if(w1==1)num_order();/*按照卡号排序*/elseT_wage_order();/*按照实发工资排序*/if(k!=-1){printf(\n\nSuccessful.^_^.);printf(\n\nWhatdoyouwanttodo?\n\t1.orderanother2.Back[]\b\b);scanf(%d,&w2);}}while(w2==1);menu();}/*返回菜单函数*/排序按照卡号升序排列按照实发工资降序排列保存返回主菜单保存返回主菜单voidnum_order()/*卡号排序*/{inti,j,k,n;structinfowages;n=load();for(i=0;in-1;i++){k=i;for(j=i+1;jn;j++)/*选择排序法*/if(IM[j].numIM[k].num)k=j;s=IM[i];IM[i]=IM[k];IM[k]=s;printf(%11s%-17s%6d%6d%6d%6d