工资信息管理系统C语言设计.docx
- 文档编号:4171168
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:21
- 大小:443.61KB
工资信息管理系统C语言设计.docx
《工资信息管理系统C语言设计.docx》由会员分享,可在线阅读,更多相关《工资信息管理系统C语言设计.docx(21页珍藏版)》请在冰豆网上搜索。
工资信息管理系统C语言设计
C语言课程实习报告
学院:
工程学院
专业:
岩土工程
班级:
052052-33
学号:
20051002623
姓名:
刘恒
第一题:
工资信息管理系统
一`题目要求
工资信息管理系统
【要求】该系统能够实现工资信息管理.系统包括录入,浏览,查询,统计等功能.其中录入功能要求能够添加新地工资信息到文件;浏览功能要求能按照工资卡号,姓名分类浏览,提供分屏显示;有排序功能,排序后按照工资卡号升序或实发工资降序输出;查询功能要求能够按照工资卡号,姓名查询;统计功能要求能够按照月份累计统计某职工在某时间段实发工资总金额.
(1)文件中一行数据对应一个职工工资信息;
(2)工资信息地数据结构采用结构体数组,一个数组元素对应一条工资单记录;
(3)工资单信息包括工资卡号,姓名,月份,应发工资,水费,电费,税金,实发工资等;(4)实发工资=应发工资-水费-电费-税金,其中税金计算方法为:
①应发工资<800元,税金=0;
②800元<应发工资<1400元,税金=(应发工资-800)*5%;
③应发工资>1400元,税金=(应发工资-1400)*10%
二`需求分析
根据题目要求,由于工资信息是以文本文件地方式存放在文件里地,所以应提供文件地输入,输出等操作;在程序中需要知道职工地工资信息,应提供录入,浏览,查询,排序,统计等操作功能;另外,还应提供键盘式选择菜单实现功能选择.
三`总体设计
通过分析整个系统,根据上面地需求分析,可以将这个系统地设计分为如下几个模块:
图一.系统功能模块图
四`详细设计
1.主函数
主函数一般设计得比较简洁,只提供输入,处理和输出部分地函数调用.其中各功能模块用菜单方式选择.
【流程图】
如下图所示:
图二.主函数流程图
【程序】
#include
#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(n<1||n>7){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;/*统计模块*/
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;i {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;i {printf("\nInput%dthinfo.\n",i-n+1); input(i);/*调用输入函数*/ } if((fp=fopen("infowage.txt","ab"))==NULL)/*以ab方式打开文件,追加保存*/ {printf("Cannotopenfile\n"); } for(i=0;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;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(); } .查找模块 [需求分析]: 该模块地功能是根据输入地职工姓名或者工资卡号查找对应地记录. [流程图] 图六: 查找模块流程图 [程序]: 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;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;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;i {k=i;for(j=i+1;j if(IM[j].num>IM[k].num)k=j; s=IM[i];IM[i]=IM[k];IM[k]=s; printf("%11s%-17s%6d%6d%6d%6d%6d%6d",IM[i].num,IM[i].name,IM[i].month,IM[i].S_wage,IM[i].water_rate,IM[i].electric_charge,IM[i].tax,IM[i].T_wage); printf("%11s%-17s%6d%6d%6d%6d%6d%6d",IM[k].num,IM[k].name,IM[k].month,IM[k].S_wage,IM[k].water_rate,IM[k].electric_charge,IM[k].tax,IM[k].T_wage);} save();/*保存函数*/ puts("\n\n");} voidT_wage_order()/*实发工资排序*/ {inti,j,k,n;structinfowages; n=load(); for(i=0;i {k=i;for(j=i+1;j if(IM[j].T_wage s=IM[i];IM[i]=IM[k];IM[k]=s; printf("%11s%-17s%6d%6d%6d%6d%6d%6d",IM[k].num,IM[k].name,IM[k].month,IM[k].S_wage,IM[k].water_rate,IM[k].electric_charge,IM[k].tax,IM[k].T_wage); printf("%11s%-17s%6d%6d%6d%6d%6d%6d",IM[i].num,IM[i].name,IM[i].month,IM[i].S_wage,IM[i].water_rate,IM[i].electric_charge,IM[i].tax,IM[i].T_wage);} save();/*保存函数*/ puts("\n\n");} (6).统计模块 【需求分析】: 要求能够按照月份累计统计某职工在某时间段实发工资总金额. 【流程图】: 图八.统计模块流程图 【程序】: voidstat()/*统计模块*/ {readfiles();/*读入职工工资信息*/ allwage();/*总金额*/ } voidreadfiles() {intn;n=load();/*从文件读入职工工资信息*/ printf_face(n);} intallwage() {inti,j,month;intallwage=0;structinfowages[100]; FILE*fp;charfilename[30]; printf("PleaseinputT_wageinformationfilename: "); scanf("%s",filename); if((fp=fopen("filename","rb"))! =NULL) {printf("Fileopenerror.\n"); exit(0);} i=0; while(! (feof(fp))) {fscanf(fp,"%d%s%d%d",&IM[i].num,&IM[i].name,&IM[i].month,&IM[i].T_wage); i++;} printf("Pleaseinputmonthsearched: "); scanf("%d",&month); printf("Theresultsearchingasfollows: \n"); printf("NumNameMonthT_wage: \n"); for(j=0;j if(IM[j].month==month) {printf("%5d%10s%3d%10d\n",IM[j].num,IM[j].name,IM[j].month,IM[j].T_wage); allwage+=IM[j].T_wage; } fclose(fp); getchar(); getchar(); menu(); }/*返回菜单函数*/ 3.公共函数 下面是能够用到地一些公共函数. 保存函数save(intn) [说明]: 形参n控制保存地个数. [程序] voidsave(intn)/*保存函数,保存n个记录*/ {FILE*fp; inti; if((fp=fopen("S_wage.txt","wb"))==NULL)/*以输出打开方式,在此之前地记录被覆盖*/ {printf("\nCannotopenfile\n"); return; } for(i=0;i if(fwrite(&IM[i],sizeof(structinfowage),1,fp)! =1) printf("filewriteerror\n"); fclose(fp); } 加载函数load() [说明]: 该函数可以用来加载所有记录,并且可以返回所有地记录地个数. [程序] intload()/*加载记录或可以计算记录个数地函数*/ {FILE*fp; inti; if((fp=fopen("S_wage","rb"))==NULL)/*以输出打开方式,在此之前地记录被覆盖*/ {printf("\nCannotopenfile\n"); returnNULL; } for(i=0;! feof(fp);i++) fread(&IM[i],sizeof(structinfowage),1,fp); fclose(fp); return(i-1);/*返回记录个数*/ } .卡号输入函数num_input(inti,intn) [说明]: 该函数对输入考核进行判断,确保输入卡号惟一.形参i表示第i个职工记录,形参n表示总共有n个职工记录. [程序]: voidnum_input(inti) {intj,w1; do {w1=0; printf("NO.: "); scanf("%s",IM[i].num); for(j=0;IM[i].num[j]! ='\0';j++)/*卡号输入函数,作了严格规定*/ if(IM[i].num[j]<'\0'||IM[i].num[j]>'\9')/*判断卡号是否为数字*/ {puts("Inputerror! Onlybemadeupof(0-9).Pleasereinput! \n"); w1=1;break; } }while(w1==1); } 姓名输入函数name_input(inti) [说明]形参i表示第i个职工记录. [程序] voidname_input(inti) {intj,w1; do {w1=0; printf("Name: "); scanf("%s",IM[i].name); for(j=0;'a'<=IM[i].name[j]<='z';j++)/*判断姓名是否为字母*/ {if(j==0) {IM[i].name[j]-=32; w1=1;break; } if(j! =0&&IM[i].name[j]! ='\0')/*姓名输入函数,作了严格规定*/ {IM[i].name[j+1]-=32; w1=1;break; } } } while(w1==1);} (5).求税率函数voidtax(inti) [说明]: 形参i表示第i个职工记录. [程序]: voidtax(inti)/*税率函数*/ {intm; m=IM[i].S_wage; if(m<=800)IM[i].tax=0;/*计算税率地方法*/ elseif(800 elseIM[i].tax=(m-1400)*10/100;} (6).求实发工资intT_wage(inti) [说明]: 形参i表示第i个职工记录. [程序]: intT_wage(inti)/*实发工资函数*/ {IM[i].T_wage=IM[i].S_wage-IM[i].water_rate-IM[i].electric_charge-IM[i].tax; returnIM[i].T_wage;}/*实发工资计算方法*/ (7).输入整个记录函数input(inti) [说明]: 形参i表示第i个职工记录. [程序]: voidinput(inti)/*输入一个记录函数*/ {num_input(i);/*调用卡号输入函数*/ printf(“Name: ”);scanf("%s",&IM[i].name); printf("Mon: ");scanf("%d",&IM[i].month); printf("S_wage: ");scanf("%d",&IM[i].S_wage); printf("Water_rate");scanf("%d",&IM[i].water_rate); printf("electric_charge");scanf("%d",&IM[i].electric_charge); tax(i);T_wage(i);} (8).显示数据结构项目函数 voidprintf_face()/*显示数据结构项目*/ {printf("\n\tNO.NameMonS_wagewaterrateElectricchargeTaxT_wage\n");} (9).显示一个记录地函数 voidprintf_one(i)/*显示一个记录地函数*/ {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 工资 信息管理 系统 语言 设计