职工工资管理系统设计实验报告.docx
《职工工资管理系统设计实验报告.docx》由会员分享,可在线阅读,更多相关《职工工资管理系统设计实验报告.docx(47页珍藏版)》请在冰点文库上搜索。
职工工资管理系统设计实验报告
工业大学信息工程学院
实验报告
课程名称:
c语言
实验名称:
实验类型:
验证性□综合性√设计性□
实验室名称:
电西8楼
班级:
计12-2学号:
2
:
亚赛组别:
同组人:
勾涛付启恒成绩:
实验日期:
2013-3-3
1题目与要求
程序设计的目的和要求
1.目的:
1)复习、巩固程序设计的基础知识,进一步加深对程序设计语言的理解和掌握;熟练使用函数、结构体、文件、数组、循环与选择、链表和指针等知识点,熟练应用C语言综合知识。
2)为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。
提高学生适应实际,实践编程的能力;
3)培养学生在项目开发中团队合作精神、创新意识及能力。
2.要求:
1)对系统进行功能模块分析、控制模块分析正确,符合题目要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理;
2)系统设计要实用、编程简练、功能全面、界面美观、操作使用便捷、程序运行稳定;
3)说明书、流程图要清晰;
4)记录设计情况(备查,也为编写设计说明书作好准备);
5)要求采用模块化程序设计方法,及锯齿型书写格式,要求上机调试通过,能正确运行;
6)设计上交容:
设计报告一份(按格式书写);源程序一份(电子版,能编译成可执行文件并能正常运行。
每个班由班长负责收集并上交)。
题目:
职工工资管理系统
1)、应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能清晰美观。
2)、输入功能:
职工信息的录入(包括从文件中导入职工信息数据),可以一次完成若干条记录的输入。
3)、浏览功能:
完成对全部职工信息的显示。
4)、查找功能:
完成按查询职工的相关信息,并显示。
完成按ID号查询职工的相关信息,并显示。
5)、删除功能:
通过输入ID号完成对职工的信息进行删除。
6)、添加功能:
完成添加新职工的信息。
7)、修改功能:
通过输入ID号完成对职工的信息进行修改。
8)、计算功能:
计算职工的各项工资,并得出实发工资。
[个人收入所得税按现行税率计算]
9)、统计功能:
统计并输出符合指定条件的职工人数及其占总人数和百分比。
[如实发工资在5000元以上。
10)、保存功能:
可以将职工信息数据保存至指定的文件中。
11)、退出职工工资管理系统。
职工信息应至少包括以下数据:
ID号、、基础工资、职务工资、住房公积金、个人收入所得税,水电费、实发工资。
1.1:
我实现的题目中的问题:
主菜单页面制作;
职工数据输入;
职工全部数据浏览;
按、学号查找职工数据;
通过ID号对职工数据进行删除;
通过ID号对职工数据修改;
职工数据统计(将自己题目做完后完成了其它功能)。
1.2本系统涉及的知识点:
结构体、数组、循环、选择、函数调用、分支、指针、全局变量、文件读取、保存
1.3我实现的题目功能:
主菜单页面制作;
职工数据输入;
职工全部数据浏览;
按、学号查找职工数据;
通过ID号对职工数据进行删除;
通过ID号对职工数据修改;
职工数据统计;
2功能设计
2.1算法设计
2.1.1进入主函数后执行newu函数,利用switch语句设计如图1所示的主菜单
请输入要执行的功能对应选项(1-10)
1.录入职工信息
2.浏览职工信息
3.添加职工信息
4.查询职工信息
5.删除职工信息
6.修改职工信息
7.员工实发工资
8.职工工资排序
9.职工工资统计
10.返回菜单
2.1.2选择1后录入职工信息,执行input函数利用循环录入职工各项信息,输入完毕后将所有数据存入文件。
2.1.3输入2后浏览职工信息,执行view函数,读取文件,利用循环将职工各项信息显示
2.1.4输入3后添加职工信息,执行tianjia函数,读取文件,输入添加人数,然后调用input1函数,利用全局变量D自动将新添加的职工信息补充到已存职工信息后面(利用循环),保存至文件
2.1.5输入4后查找职工信息(利用switch语句,通过ID号和查找),利用charge函数,读取存入到文件中的职工信息,选取相应的使用通过ID号(charge1函数)和查找(charge2)的函数对职工信息查找
2.1.6输入5后通过ID号删除职工信息,调用delete函数,读取文件,利用循环将与输入ID号相同的文件中的职工信息删除。
2.1.7输入6后通过输入ID号修改员工信息,调用xiugai函数,读取文件通过循环将所需各项信息修改
2.1.8输入7后统计员工工资,调取gongzhi函数,将员工实发工资输出,其中实发工资在输入函数input函数中利用选择和循环计算得出
2.1.9输入8后进行职工工资函数,调取tongji函数,读取文件,利用循环将职工工资比较,进行排序
2.1.10输入9后进行职工工资统计,调取tongji函数,将职工工资分为5000以上、3000-4000、2000-3000、2000以下四个档次,其中对数据的统计在输入函数input函数中实现。
2.1.11输入10为返回函数,即调用newu函数返回主菜单
2.1.12输入11为写入对使用此系统的意见:
2.2模块流程图
3程序代码设计
structWorker
{
intnum;//ID
charname[20];//
intsalary1;//基础工资
intsalary2;//职务工资
intsalary3;//住房公积金
intsalary4;//社保金
floatsalary5;
}stu[10000];//定义一个足够大的结构体数组
函数功能说明:
结构体数组,用来存放题目所需信息,定义10000个结构体是为了构建足够大的结构体使所有数据正常存取。
voidinput(intn)----------------------------输入函数
{
voidsave(intn);//声明一个保存函数
voidnewu();//声明一个菜单函数
inti=0;
for(i=0;i{
printf("\n请输入职工号:
");
scanf("%d",&stu[i].num);
printf("\n请输入:
");
scanf("%s",&stu[i].name);
printf("\n请输入基础工资:
");
scanf("%d",&stu[i].salary1);
printf("\n请输入职务工资:
");
scanf("%d",&stu[i].salary2);
printf("\n请输入住房公积金:
");
scanf("%d",&stu[i].salary3);
printf("\n请输入社保金额:
");
scanf("%d",&stu[i].salary4);
if(stu[i].salary1+stu[i].salary2-stu[i].salary3-stu[i].salary4>3500)
{
inta;
floatb;
a=stu[i].salary1+stu[i].salary2-stu[i].salary3-stu[i].salary4-3500;
if(a>1500&&a<4500)
{
b=(float)(a*0.1-105);
stu[i].salary5=stu[i].salary1+stu[i].salary2-b;
}
if(a>9000&&(a<4500||a==4500))
{
b=(float)(a*0.1-555);
stu[i].salary5=stu[i].salary1+stu[i].salary2-b;
}
}
stu[i].salary5=stu[i].salary1+stu[i].salary2;
}
save(n);//对结构体数据进行储存
newu();//返回菜单
}
函数功能说明:
将职工信息存入文件,save函数是保存函数,将录入的信息(职工的、编号、基础工资、职务工资、住房公积金、社保金额)存入指定文件中,newu函数是主菜单函数,执行完输入函数后转入主菜单进行其他功能的进行。
此函数过for循环将多个职工信息录入。
下面的if语句是用来统计职工工资的,在此函数录入职工信息的同时将其信息统计。
voidtianjia()----------------------------------------------添加函数
{
voidinput1(intn);
inti;
printf("←请输入添加的人数→;");
scanf("%d",&i);
input1(i);
}
函数功能说明:
此函数为添加函数,通过此函数输入要添加的人数,再转入input1函数,添加职工信息。
voidinput1(intn)--------------------------添加函数
{
voidsave(intn);
voidnewu();
inti=0;
for(i=D;i{
printf("\n请输入职工号:
");
scanf("%d",&stu[i].num);
printf("\n请输入:
");
scanf("%s",&stu[i].name);
printf("\n请输入基础工资:
");
scanf("%d",&stu[i].salary1);
printf("\n请输入职务工资:
");
scanf("%d",&stu[i].salary2);
printf("\n请输入住房公积金:
");
scanf("%d",&stu[i].salary3);
printf("\n请输入员工社保金额:
");
scanf("%d",&stu[i].salary4);
if(stu[i].salary1+stu[i].salary2-stu[i].salary3-stu[i].salary4>3500)
{
inta;
floatb;
a=stu[i].salary1+stu[i].salary2-stu[i].salary3-stu[i].salary4-3500;
if(a>1500&&a<4500)
{
b=(float)(a*0.1-105);
stu[i].salary5=stu[i].salary1+stu[i].salary2-b;
}
if(a>9000&&(a<4500||a==4500))
{
b=(float)(a*0.1-555);
stu[i].salary5=stu[i].salary1+stu[i].salary2-b;
}
}
stu[i].salary5=stu[i].salary1+stu[i].salary2;
}
save(n);
newu();
}
函数功能说明:
此函数为添加函数,在原有职工信息的基础上再添加新的职工信息,定义一个全局变量D是原先输入的职工个数,此添加函数直接从D项开始录入新的职工信息,If下面的语句是实发工资的计算,在录入职工信息的过程中将实发工资计算出来,实发工资的函数见下面的函数。
voidsave(intn)-----------------------保存函数(将结构体的数据储存到文件中)
{
FILE*fp,*fp1;//
inti;
if((fp=fopen("abc.dat","wb"))==NULL)
{
printf("cannotopenfile\n");
return;
}
for(i=0;iif(fwrite(&stu[i],sizeof(structWorker),1,fp)!
=1)
printf("filewriteerror\n");
D=i;
if((fp1=fopen("abcd.dat","wb"))==NULL)
{
printf("cannotopenfile\n");
return;
}
fwrite(&D,2,1,fp1);//记录结构体数组的个数并经其储存到文件中
fclose(fp);
fclose(fp1);
}
函数功能说明:
此函数为保存函数,将输入或修改后的职工信息存入文件,在其中定义两个指针,各指向一个文件,一个文件存各职工信息,一个文件存职工个数,函数容为文件读取的固定格式。
voidview(intn)----------------------------------------------浏览函数
{
inti;
FILE*fp,*fp1;//定义两个指针文件
if((fp=fopen("abc.dat","rb"))==NULL)//以读的方式打开文件
{
printf("cannotopenfile\n");
exit(0);
}
if((fp1=fopen("abcd.dat","rb"))==NULL)//以读的方式打开文件
{
printf("cannotopenfile\n");
exit(0);
}
fread(&D,2,1,fp1);//读出文件中的D的值
printf("\nID基础工作职务工资住房公积金社保金实发工资\n");
for(i=0;i{
fread(&stu[i],sizeof(structWorker),1,fp);
printf("%5d%6s%5d%4d%6d%5d%5.2f\n",stu[i].num,stu[i].name,stu[i].salary1,stu[i].salary2,stu[i].salary3,stu[i].salary4,stu[i].salary5);
}
fclose(fp);
fclose(fp1);
newu();
}
函数功能说明:
此函数为浏览函数,先打开文件读取数据,再通过循环将文件中结构体中的数据依次输出。
voidnewu()----------------------------------------------------菜单函数(界面函数)
{
voidtianjia();//函数声明
voiddelet();//函数声明
voidcharge();//函数声明
voidpaixu();//函数声明
voidxiugai();//函数声明
voidtongji();//函数声明
voidgongzhi();//函数声明
inti,n;//菜单(界面)
printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆欢迎登入职工管理系统☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf("<1>录入职工信息<2>浏览职工信息\n");
printf("<3>添加员工信息<4>查询员工信息\n");
printf("<5>删除员工信息<6>员工信息修改\n");
printf("<7>员工实发工资<8>员工工资排序\n");
printf("<9>员工工资统计<10>返回菜单\n");
printf("<9>意见反馈\n");
printf("\n☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf("★请您在(1-7)中选择一个数字进行相应的操作★:
");
scanf("%d",&n);
if(n==1)
{
printf("★请确定您本次将要录入职工的数目★:
");
scanf("%d",&i);
}
switch(n)
{
case1:
input(i);break;
case2:
view(D);break;
case3:
tianjia();break;
case4:
charge();break;
case5:
delet();break;
case6:
xiugai();break;
case7:
gongzhi();break;
case8:
paixu();break;
case9:
tongji();break;
case10:
newu();break;
case11:
yijian();break;
}
}
函数功能说明:
此函数为主菜单页面,通过此菜单运用switch函数可以实现系统11个功能的调用,通过对老师上传的例系统分析,我设计了此想主菜单页面。
voiddelet()----------------------------------------------------删除函数
{
intnum,i,n,m;
FILE*fp,*fp1;
if((fp=fopen("abc.dat","wb"))==NULL)//以写的方式打开文件
{
printf("cannotopenfile\n");
exit(0);
}
if((fp1=fopen("abcd.dat","wb"))==NULL)//以写的方式打开文件
{
printf("cannotopenfile\n");
exit(0);
}
fread(&D,sizeof(int),1,fp1);
printf("*请输入您想删除的员工ID号*:
");//找到要删除员工的ID
scanf("%d",&num);
for(i=0;i{
fread(&stu[i],sizeof(structWorker),1,fp);
if(stu[i].num==num&&i{
n=i;
fread(&stu[i+1],sizeof(structWorker),1,fp);
stu[n]=stu[i+1];//将后一个人的数据赋予前一个人,从而实现对员工信息的有效删除
i++;
n++;
}
}
for(i=0;i{
fwrite(&stu[i],sizeof(structWorker),1,fp);//删除一个人的数据后D就要减一
}
D=D-1;
fwrite(&D,sizeof(int),1,fp1);
fclose(fp);
fclose(fp1);
printf("是否继续删除员工信息1继续?
2返回菜单");
scanf("%d",&m);
if(m==1)
delet();
newu();
}
函数功能说明:
此函数为删除函数,主要原理是通过循环将所输入编号的职工的信息替换为其编号的下一个职工的信息将输入编号的职工的信息删除。
voidcharge()------------------------------------------------查找函数
{
intnum;
printf("按查找请按1按ID号查找请按2:
");
scanf("%d",&num);
switch(num)
{
case1:
charge1();break;
case2:
charge2();break;
}
}
函数功能说明:
此函数为查找函数的主菜单,此函数使用switch语句可以调取charge1(按查找)、charge2(按ID号查找)两个查找方式。
voidcharge1()-----------------------------------------------------------查找函数
{
FILE*fp,*fp1;//利用ID号进行查找信息
inti;
charname[20];
printf("请输入您要查询的员工:
");
scanf("%s",name);
if((fp=fopen("abc.dat","rb"))==NULL)//打开文件
{
printf("cannotopenfile\n");
exit(0);
}
if((fp1=fopen("abcd.dat","rb"))==NULL)
{
printf("cannotopenfile\n");
exit(0);
}
fread(&D,2,1,fp1);
for(i=0;i{
fread(&stu[i],sizeof(structWorker),1,fp);
if(strcmp(stu[i].name,name)==0)
{
printf("%-5d%-6s%d%d%d\n",stu[i].num,stu[i].name,stu[i].salary1,stu[i].salary2,stu[i].salary3);
break;
}
}
fclose(fp);
fclose(fp1);
newu();
}
函数工呢说明:
此函数为使用查找方式将某位职工的信息查找,使用strcmp函数将存入文件的职工与输入的比较,将指定的文件中某个职工信息查找出来。
voidcharge2()-------------------------------------------------------------利用ID号进行查找信息
{
FILE*fp,*fp1;
intnum,i;
printf("请输入您要查询的员工ID:
");
scanf("%d",&num);
if((fp=fopen("abc.dat","rb"))==NULL)//打开文件
{
printf("cannotopenfile\n");
exit(0);
}
if((fp1=fopen("abcd.dat","rb"))==NULL)
{
printf("cannotopenfile\n");
exit(0);
}
fread(&D,2,1,fp1);
for(i=0;i{
fread(&stu[i],sizeof(structWorker),1,fp);
if(stu[i].num