工资信息管理系统C语言.docx
《工资信息管理系统C语言.docx》由会员分享,可在线阅读,更多相关《工资信息管理系统C语言.docx(16页珍藏版)》请在冰豆网上搜索。
工资信息管理系统C语言
工资信息管理系统
一、题目要求
设计工资信息管理系统,要求该系统能够实现工资信息管理。
系统包括录入、浏览、查询、统计等功能。
其中录入功能要求能够添加新的工资信息到文件,浏览功能要求能按照工资卡号、姓名分类浏览,提供分屏显示;有排序功能,排序后按照工资卡号升序或实发工资降序输出;查询功能要求能够按照工资卡号、姓名查询;统计功能要求能够按照月份累计统计某职工在某时间段实发工资总金额。
二、需求分析
根据题目要求,由于工资信息是存放在文件中,所以应提供文件的输入输出等操作;在程序中需要浏览工资信息,应提供显示、查找、排序等操作;另外还应提供键盘式选择彩旦实现功能选择。
三、总体设计
四、详细设计
1.主函数
voidmain()
{
menu();/*主函数只用于调用菜单*/
2.菜单
menu()
{
intn,w1;
do
{
puts("\t\t***************MENU***************\n\n");
puts("\t\t\t\t1.enterdata");
puts("\t\t\t\t2.additiondata");
puts("\t\t\t\t3.browseall");
puts("\t\t\t\t4.search");
puts("\t\t\t\t5.order");
puts("\t\t\t\t6.exit");
puts("\n\n\t\t**********************************\n");
printf("Choiceyournumber(1-6):
[]\b\b");
scanf("%d",&n);
if(n<1||n>6)
{
w1=1;
getchar();
}
elsew1=0;
}
while(w1==1);
switch(n)
{
case1:
enter();break;
case2:
add();break;
case3:
browse();break;
case4:
search();break;
case5:
order();break;
case6:
exit(0);
}
return1;}
3.各功能模块设计
1)录入模块
数据结构
structemployer
{
intmonth;
charnum[11];
charname[20];
floatyfgz;
floatsf;
floatdf;
floatsj;
floatsfgz;
}emp[N];
N为职工人数,在此宏定义为100,
#defineN100
那么此阶段的流程图如下
[程序]
enter()
{inti,n;
printf("Howmanyemployers(0-%d)?
:
",N-1);
scanf("%d",&n);
printf("\nEnterdatanow\n\n");
for(i=0;i{printf("\ninput%dthemployerrecord.\n",i+1);
input(i);
}
if(i!
=0)save(n);
printf_back();
}
2)追加模块
先确定要追加信息的条数,调用n=load()函数,再调用输入函数input(),最后保存追加的记录。
整个过的的流程图如下:
[程序]
add()
{inti,n,m,k;
FILE*fp;
n=load();
printf("Howmanyemployersareyouwanttoadd(0-%d)?
:
",N-1-n);
scanf("%d",&m);
k=m+n;
for(i=n;i{printf("\nInput%dthemployerrecord.\n",i-n+1);
input(i);
}
if((fp=fopen("record.txt","ab"))==NULL)
{printf("cannotopenfile\n");
}
for(i=n;iif(fwrite(&emp[i],sizeof(structemployer),1,fp)!
=1)
printf("error\n");
fclose(fp);
printf_back();
}
3)查询模块
下面是流程图:
[程序]
search()
{inti,n,k,w1=1,w2,w3,w4;
structemployere;
n=load();
do
{
do
{k=1;
printf("\n\nEnternamethatyouwanttosearch!
name:
");
scanf("%s",e.name);
printf_face();
for(i=0;iif(strcmp(e.name,emp[i].name)==0)
{k=i;
printf_one(k);break;
}
if(k==-1)
{printf("\n\nNOexist!
please");
printf("\n\nAreyouagain?
\n\t1).again2).NOandback[]\b\b");
scanf("%d",&w1);
if(w1==2)break;
}
}
while(k==-1&&w1==1);
w4=0;w3=0;
if(k!
=-1)
{printf("\n\nWhatdoyouwanttodo?
\n\t1).Searchanother2).Backmenu[]\b\b");
scanf("%d",&w2);
}
if(w3==1||w4==1)
{save(n);
printf("\n\nSuccessful.^_^.");
printf("\n\nWhatdoyouwanttodo?
\n\t1).Searchanother2).Back[]\b\b");
scanf("%d",&w2);
}
}
while(w2==1);
menu();
}
4)浏览模块
流程图
[程序]
browse()
{inti,n;
n=load();
printf_face();
for(i=0;i{if((i!
=0)&&i%10==0)
{printf("\n\nPsaaanykeytocontinue...");getch();
puts("\n\n");
}
printf_one(i);
}
printf("\tThereare%drecord.\n",n);
printf("\nPassanykeytoback...");
getch();
menu();
}
5)排序模块
此阶段按工人工资卡号升序排列
程序如下:
order()
{inti,j,n;
chart[11];
n=load();
for(i=0;i{
for(j=i+1;jif(strcmp(emp[i].num,emp[j].num)>0)
{
strcpy(t,emp[i].num);
strcpy(emp[i].num,emp[j].num);
strcpy(emp[j].num,t);
}
}
save(n);
puts("\n\n");
printf_back();
}
4.公共函数
1)保存函数
程序如下:
save(intn)
{FILE*fp;
inti;
if((fp=fopen("record.txt","wb"))==NULL)
{printf("\nCannotopenfile\n");
returnNULL;
}
for(i=0;iif(emp[i].yfgz!
=0)
if(fwrite(&emp[i],sizeof(structemployer),1,fp)!
=1)
printf("error\n");
fclose(fp);
return1;}
2)加载函数
程序如下:
load()
{FILE*fp;
inti;
if((fp=fopen("record.txt","rb"))==NULL)
{printf("\nCannotopenfile\n");
returnNULL;
}
for(i=0;!
feof(fp);i++)
fread(&emp[i],sizeof(structemployer),1,fp);
fclose(fp);
return(i-1);
}
3)工资信息输入函数
程序如下:
record_input(inti)
{
intj;
printf("month:
");scanf("%d",&emp[i].month);
no_input(i,i);
printf("name:
");scanf("%s",&emp[i].name);
printf("yfgz:
");scanf("%f",&emp[i].yfgz);
printf("sf:
");scanf("%f",&emp[i].sf);
printf("df:
");scanf("%f",&emp[i].df);
}
4)输入工资卡号的函数
程序如下:
no_input(inti,intn)
{intj,k,w1;
do
{w1=0;
printf("NO.:
");
scanf("%s",emp[i].num);
for(j=0;emp[i].num[j]!
='\0';j++)
if(emp[i].num[j]<'0'||emp[i].num[j]>'9')
{puts("Inputerror!
Onlybemadeupof(0-9).Pleasereinput!
\n");
w1=1;break;
}
if(w1!
=1)
for(k=0;kif(k!
=i&&strcmp(emp[k].num,emp[i].num)==0)
{puts("Thisrecordisexist.pleasereinput!
\n");
w1=1;break;
}
}
while(w1==1);
}
5)计算税金的函数
程序如下:
sj(inti)
{if(emp[i].yfgz<800)
emp[i].sj=0;
if(emp[i].yfgz>800&&emp[i].yfgz<1400)
emp[i].sj=(emp[i].yfgz-800)*0.05;
if(emp[i].yfgz>1400)
emp[i].sj=(emp[i].yfgz-1400)*0.1;
}
6)计算实发工资的函数
程序如下:
sfgz(inti)
{emp[i].sfgz=emp[i].yfgz-emp[i].sf-emp[i].df-emp[i].sj;
}
7)显示数据结构项目函数
程序如下:
voidprintf_face()
{printf("\n\tNO.namemonthyfgzsfdfsjsfgz\n");
}
8)显示一个记录的函数
程序如下:
voidprintf_one(inti)
{printf("%s%s%d%f%f%f%f%f\n",emp[i].num,emp[i].name,emp[i].month,emp[i].yfgz,emp[i].sf,emp[i].df,emp[i].sj,emp[i].sfgz);
}
9)一个任务结束时的选择浏览还是返回的函数
程序如下:
printf_back()
{intk,w;
printf("\n\n\tSuccessful.^_^\n\n");
printf("Whatdoyouwanttodo?
\n\n\t1)Browseallnow\t2).Back:
[]\b\b");
scanf("%d",&w);
if(w==1)browse();
elsemenu();
}
5上机操作
(1)主菜单
(2)录入模块
输入1后提示输入记录的条数,输入3后界面如下
再逐条输入信息后界面如下
(3)追加模块
输入2后,回到主菜单,在输入2选在追加信息,提示输入追加信息条数,输入1后界面如下
再将追加的信息录入后界面如下
(4)查询模块
输入2后回到主菜单,输入4进入查询,输入职工名字ccc后可获得其工资信息,界面如下
(5)浏览模块
输入2后回到主菜单,输入3浏览工资信息,界面如下
(6)排序模块
点任意键返回主菜单后输入5,可按工人工资卡号升序将信息排列后显示出来,界面如下
点任意键返回主菜单后输入6退出。
上机演示完毕。