工资管理系统.docx
《工资管理系统.docx》由会员分享,可在线阅读,更多相关《工资管理系统.docx(24页珍藏版)》请在冰豆网上搜索。
工资管理系统
学年论文(课程设计)
题目:
工资管理系统
学院河北大学工商学院
学科门类工科
专业电气
学号2011482
姓名
指导教师张充
2012年6月12日
工资管理系统
摘要
工资信息管理系统主要是让登录人员实现输入数据、添加数据、浏览数据、查询数据、统计数据等功能。
并且实现计算的功能:
由应发工资、水费、电费、税金可直接计算出实发工资并输出。
浏览时按序浏览,方便用户使用。
目录
1.需求分析……………………………………………………………
2.总体设计……………………………………………………………
3.详细设计……………………………………………………………
3.1流程图…………………………………………………………
3.2结构体…………………………………………………………
3.3各功能模块设计………………………………………………
4.调试与测试…………………………………………………………
4.1调试中遇到的问题……………………………………………
4.2成功运行界面…………………………………………………
5.总结…………………………………………………………………
6.参考文献……………………………………………………………
7.附录…………………………………………………………………
一、需求分析
工资信息存放在文件中,提供文件的输入、输出等操作;要实现浏览功能,提供显示、排序操作;而查询功能要求实现查找操作;另外还应该提供键盘式选择菜单以实现功能选择。
二、整体设计
整个系统可以分为信息输入、信息添加、信息浏览、信息排序、信息查询和信息统计模块。
每个模块函数实现,然后在主函数中调用各模块函数。
三、详细设计
3.1流程图:
3.2结构体:
工资信息采用结构体数组:
StructSalary_Info
{
intCard_No;//工资卡号
Charname[20];//姓名
intmonth;//月份
floatInit_Salary;//应发工资
floatWater_Rate;//水费
floatElectric_Rate;//电费
floattax;//税金
floatFinal_Salary;//实发工资
};
3.3各功能模块设计
(1)主函数提供输入、处理和输出部分的函数调用,各功能模块采用菜单方式选择。
(2)输入模块
首先确定要输入工资信息的员工的个数,然后按照工资卡号、姓名、月份、应发工资、水费、电费的顺序输入信息,税金和实发工资根据输入的信息进行计算得到,这些信息被录入到文件中。
文件操作函数:
fopen,fwrite,fclose.
税金的计算:
if(应发工资<=800)
税金=0;
elseif(应发工资>800&&应发工资<=1400)
税金=(应发工资-800)*5%;
elseif(应发工资>1400)
税金=(应发工资-1400)*10%;
实发工资=应发工资-水费-电费-税金。
(3)添加模块
增加新的员工工资信息,同样先确定要新增工资信息的员工的个数从键盘输入并逐条写到原来的输入文件中,采用追加而不是覆盖的方式。
(4)浏览模块
通过菜单选择按照工资卡号还是姓名浏览。
如果按照卡号浏览,则显示的记录按照卡号升序输出;按照姓名浏览则按照字典序输出(排序功能在该模块中插入实现)。
(5)查询模块
实现按照员工工号查询,查询时实发工资先经过公式计算再输出。
(6)统计模块
输入起止月份,按照职工卡号和月份查询记录,把起止月份之间的实发工资金额累加并输出。
(7)排序模块
运用冒泡排序,通过遍历,改变数据顺序。
四、调试与测试
4.1调试中遇到的问题:
1.目录菜单开始直接写在了主函数中,导致思路不清晰,写乱代码,最后在同学的建议下,通过调用函数实现该功能。
2.for循环嵌套时,“{”“}”符号会放错位置,导致程序运行错误,最后通过仔细检查代码,得以解决。
3.文件操作过程中出现一些问题,导致不能运行,同学帮忙修改,最后老师给讲解了一下。
•当然其实编程序过程中有很多错误,如名称不一致、符号错误、大小写区分等等,不得不再仔细看代码,所以写程序时一定要仔细,避免不必要的麻烦。
4.2成功运行界面:
(1)开始菜单界面
(2)输入数据界面(可以选择输入员工的个数很方便)
(3)添加数据界面
(4)浏览数据界面
按卡号浏览(按卡号排序,浏览)
按姓名浏览
(5)查询数据界面
(6)统计工资界面
五、总结
程序最终能够实现员工工资信息的输入,添加,浏览,查询,统计等功能。
实现输入和添加功能时,可以提前确定输入或者要添加的员工个数,进而输入员工工资信息;浏览信息时分为按卡号浏览和按姓名浏览。
程序还有好多不足之处,如:
输入月份时没有限定数据范围(1—12),主菜单排版不够美观。
这次编程获得的最重要的教训:
写编程时,看到题目后要先规划,再分模块写,写程序一定要仔细。
还有,要认真学习C++,同时多实践,才能养成良好编程习惯。
参考文献
C++程序设计
作者:
王挺周会平贾丽丽等
出版社:
清华大学出版社
出版年:
2010年3月第2版。
附录
程序源代码:
#include
#include
structSalary_Info
{
intCard_No;//工资卡号
charname[20];//姓名
intmonth;//月份
floatInit_Salary;//应发工资
floatWater_Rate;//水费
floatElectric_Rate;//电费
doubletax;//税金
doubleFinal_Salary;//实发工资
};
Salary_Infomoney[100],huan[1]={1,"cc",2,2000,100,100,90,90},huan2[1]={0,"cc",2,2000,100,100,90,90};
intservice();
voidinput();
voidadd();
voidlist();
voidcha();
voidji();
intmain()//主函数
{
cout<<"--------------欢迎使用工资管理系统---------------"<for(inti=0;;i++)//调用函数
{
inta;
a=service();
if(a==1)
{
input();
}
elseif(a==2)
{
add();
}
elseif(a==3)
{
list();
}
elseif(a==4)
{
cha();
}
elseif(a==5)
{
ji();
}
elseif(a==0)
{
return0;
}
}
return0;
}
intservice()//目录
{
intz;
cout<<"**********输入数据请输入1**********"<cout<<"**********添加数据请输入2**********"<cout<<"**********浏览数据请输入3**********"<cout<<"**********查询数据请输入4**********"<cout<<"**********统计工资请输入5**********"<cout<<"**********退出系统请输入0**********"<cin>>z;
returnz;
}
voidinput()//添加模块
{
ofstreamoutfile;
outfile.open("text.txt",ios:
:
out);
if(!
outfile)
{
cout<<"error"<}
else
{
intj=0;
intlen;
cout<<"请输入员工个数:
"<cin>>len;
cout<<"请输入员工的工资卡号、姓名、月份、应发工资、水费、电费:
"<for(inti=0;i{
cin>>money[i].Card_No>>money[i].name>>money[i].month>>money[i].Init_Salary>>money[i].Water_Rate>>money[i].Electric_Rate;
if(money[i].Init_Salary<=800)
{
money[i].tax=0;
money[i].Final_Salary=money[i].Init_Salary-money[i].Water_Rate-money[i].Electric_Rate-money[i].tax;
}
elseif(money[i].Init_Salary>800&&money[i].Init_Salary<=1400)
{
money[i].tax=(money[i].Init_Salary-800)*0.05;money[i].tax;
money[i].Final_Salary=money[i].Init_Salary-money[i].Water_Rate-money[i].Electric_Rate-money[i].tax;
}
elseif(money[i].Init_Salary>1400)
{
money[i].tax=(money[i].Init_Salary-800)*0.1;money[i].tax;
money[i].Final_Salary=money[i].Init_Salary-money[i].Water_Rate-money[i].Electric_Rate-money[i].tax;
}
outfile.write((char*)&money[j],sizeof(money));//往文件中输入记录,并把每条记录放在money数组里,达到累计的作用,不用len+len2
j++;
}
outfile.close();//关闭文件
}
}
voidadd()
{
ofstreamoutfile;
outfile.open("text.txt",ios:
:
out|ios:
:
app);//打开文件
if(!
outfile)
{
cout<<"error"<}
else
{
intj=0;
intlen2;
cout<<"请输入要添加的员工个数:
"<cin>>len2;
cout<<"请输入添加员工的工资卡号、姓名、月份、应发工资、水费、电费:
"<for(inti=0;i{
cin>>money[i].Card_No>>money[i].name>>money[i].month>>money[i].Init_Salary>>money[i].Water_Rate>>money[i].Electric_Rate;
if(money[i].Init_Salary<=800)
{
money[i].tax=0;cout<money[i].Final_Salary=money[i].Init_Salary-money[i].Water_Rate-money[i].Electric_Rate-money[i].tax;
}
elseif(money[i].Init_Salary>800&&money[i].Init_Salary<=1400)
{
money[i].tax=(money[i].Init_Salary-800)*0.05;money[i].tax;
money[i].Final_Salary=money[i].Init_Salary-money[i].Water_Rate-money[i].Electric_Rate-money[i].tax;
}
elseif(money[i].Init_Salary>1400)
{
money[i].tax=(money[i].Init_Salary-800)*0.1;money[i].tax;
money[i].Final_Salary=money[i].Init_Salary-money[i].Water_Rate-money[i].Electric_Rate-money[i].tax;
}
outfile.write((char*)&money[j],sizeof(money));
j++;
}
outfile.close();
}
}
voidlist()//浏览模块
{
inti=0,j=i+1,c;
fstreaminfile,outfile;
infile.open("text.txt",ios:
:
in);
if(!
infile)
{
cout<<"error";
}
else
{
cout<<"请选择浏览方式:
按卡号浏览输入1,按姓名浏览输入0"<cin>>c;
if(c==1)
{
cout<<"所有员工的工资卡号、姓名、月份、应发工资、水费、电费、税金、实发工资为:
"<while(infile.peek()!
=EOF)
{
infile.read((char*)&money[i],sizeof(money));
i++;
}
for(intp=0;p
for(inth=p+1;h
{
if(money[p].Card_No>money[h].Card_No)
{
huan[1]=money[p];
money[p]=money[h];
money[h]=huan[1];
}
}
for(intk=0;k
{
cout<}
}
}
if(c==0)
{
while(infile.peek()!
=EOF)//名字排序
{
infile.read((char*)&money[i],sizeof(money));
i++;
}
for(intp=0;p
for(inth=p+1;h
{
if(strcmp(money[p].name,money[h].name)>0)//字符串,所以用strcmp
{
huan[1]=money[p];
money[p]=money[h];
money[h]=huan[1];
}
}
for(intk=0;k
{
cout<}
}
}
voidcha()//查询模块
{
ifstreaminfile("text.txt",ios:
:
in);
if(!
infile)
cout<<"error";
else
{
intcha,i=0;
cout<<"输入查询的员工卡号:
"<cin>>cha;
cout<<"查询的工资卡号、姓名、月份、应发工资、水费、电费、税金、应发工资为"<while(infile.peek()!
=EOF)
{
infile.read((char*)&money[i],sizeof(money));
start4:
if(money[i].Card_No==cha)
{
cout<intb;
cout<<"是否要继续查询数据:
退出查询输入0,继续查询输入1"<cin>>b;
if(b==1)
{
cout<<"输入查询的员工卡号:
"<cin>>cha;
gotostart4;
}
}
i++;
}
}
}
voidji()//统计模块
{
ifstreaminfile("text.txt",ios:
:
in);
if(!
infile)
{
cout<<"error";
}
else
{
intqi,zhi;
charname[20];
intka1,ka2;
inta;
cout<<"选择查询方式:
按员工卡号范围查询输入1,按员工姓名查询输入0:
"<cin>>a;
cout<<"请输入查询的起止月份:
"<cin>>qi>>zhi;
if(qi>zhi)
{
inthold;
hold=qi;
qi=zhi;
zhi=hold;
}
if(a==1)
{
cout<<"请输入查询的员工卡号范围"<cin>>ka1>>ka2;
if(ka1>ka2)
{
inthuan;
huan=ka1;
ka1=ka2;
ka2=huan;
}
}
elseif(a==0)
{
cout<<"请输入查询的员工姓名:
"<cin>>name;
}
inti=0;
doublesum=0;
while(infile.peek()!
=EOF)
{
infile.read((char*)&money[i],sizeof(money));
if(money[i].month>=qi&&money[i].month<=zhi)//用逻辑符号
{
if(a==1)
{
if(money[i].Card_No>=ka1&&money[i].Card_No<=ka2)
{
cout<sum+=money[i].Final_Salary;
}
}
elseif(a==0)
{
if(strcmp(money[i].name,name)==0)
{
cout<sum+=money[i].Final_Salary;
}
}
}
i++;
}
cout<"<}
}