C课程设计职工工资管理系统报告内含程序完整清单.docx
《C课程设计职工工资管理系统报告内含程序完整清单.docx》由会员分享,可在线阅读,更多相关《C课程设计职工工资管理系统报告内含程序完整清单.docx(26页珍藏版)》请在冰豆网上搜索。
C课程设计职工工资管理系统报告内含程序完整清单
1概述
本课程设计是《面向对象程序设计》课程的后继教学环节,学好C++语言就必须坚持用面向对象的思维方式分析问题、解决问题,最好的方法是仿照教材编写C++实际应用程序。
此次课程设计的题目及要求:
实现一个简单的工资管理系统。
1.1程序的基本功能
系统的主要功能是计算职工当月工资并存档。
公司内有5种不同类型的职工:
技术人员、销售人员、文秘、技术经理和销售经理,他们的工资计算方式各不相同。
1.2其它功能
将工资信息存入salary.txt文件中,工资信息包含雇员编号、姓名、职务、月份、月收入。
Info.txt文件中只存留一些信息及会员最后进入系统时输入的数据,最多含有编号、姓名、职务、月份的信息。
1.3扩展功能
采用了会员制度,并将登入信息及编号、密码存入number.txt文件中。
2课题的分析
通过对课题的深入分析,我将这个课题分为以下几个模块,深入详细得剖析它们。
2.1会员登入系统模块即systemhead静态全局函数模块
程序运行后,先进行会员选择判断。
为减少会员重新注册,通过输入两次编号及密码,增加繁琐度。
同时在一定的方面上,又方便忘记密码的会员。
通过密码匹配,雇员的工资信息这一隐私得到了很好的保障。
2.2查询功能模块即search函数模块
首先,从info.txt中提取编号,与salary.txt中的编号进行匹配,匹配成功,输出工资信息,直到文件!
indata.eof()==0。
.
2.3职务信息匹配及处理模块即systembody静态全局函数模块模块4
从info.txt中提取职务信息,用switch语句进行匹配,据匹配情况调用不同的函数进行输入、处理、显示并以增加方式记录到salary.txt中。
2.4循环控制模块即while
(1)模块
为了更加方便使用,尽量改善系统,实现search函数及systembody函数功能,在search函数及systembody函数模块的基础上加了一些必要的语句,并增加了外层循环控制。
3详细设计
作为一个面向对象程序设计,我们不得不先从类的声明开始设计,而后是一个整体的流程图做框架。
最后在从小的模块结构着手。
3.1
类声明
3.2
系统简略流程图
3.3会员登入系统模块即systemhead静态全局函数模块
清空info.txt并将编号存入到info.txt中
图3.3登入系统模块详细流程图
否
是否会员
输入编号及密码
打开name.txt并输出编号及密码
匹配?
关闭name.txt
否
是
以增加方式打开name.txt并输入编号及密码
关闭name.txt
.输入编号及密码
3.4查询功能模块即search函数模块
1
0
否
是
输出info.txt中的职务信息
将info.txt的编号与salary.txt中的编号进行匹配
是否打开info.txt
!
indata.eof()?
图3.4查询功能模块
以默认方式打开info.txt
以默认方式打开salary.txt
从文件info.txt中提取编号并关闭文件
输出“以上是你的工资信息!
”
关闭salary.txt
3.5职务信息匹配及处理模块即systembody静态全局函数模块
3.6循环控制模块即while
(1)模块
图3.6循环控制模块即while
(1)模块
1
0
2
输入选择操作
查询功能模块
Info及recordinfo调用
systembody调用
选择?
结束
4课程设计总结
4.1完成情况
本次面向对象课程设计的所有功能基本完成,并且扩展功能也成功的实现!
可执行文件能正常执行指令并运行!
4.2遇到的问题及解决
图4.2.1错误
[Error]C:
\Users\权\Desktop\main.o(.data$_vt$8Employee+0xc):
main.cpp:
undefinedreferenceto`Employee:
:
countSalary(void)'
错误:
没有定义Employee类中的countSalary函数!
改正:
将原先的“virtualvoidcountSalary();”改为”virtualvoidcountSalary(){}”
图4.2.2错误
错误分析:
(会员板块中)提示:
“数字1表示是!
其他键表示否!
”,但定义的选择变量为整型。
加上我当时输入字符p。
改正:
“其他键表示否!
”改为”数字0表示否”。
输入时按提示进行输入即可!
图4.2.3错误
调试分析:
错误发生在systemhead静态全局函数内的文件输入循环模块中!
改正:
将以nocreate方式即”ifstreamindata("d:
\\number.txt",ios:
:
nocreate);“该为默认打开方式即“ifstreamindata("d:
\\number.txt");”。
图4.2.4错误
调试分析:
错误发生在调用systembody静态全局函数前后的while循环模块中,很有可能是数据存取混乱造成的。
改正:
systemhead静态全局函数内“ofstreamoutdata("d:
\\info.txt",ios:
:
trunc);”改为先清
后在以默认方式输入!
且将存取整型编号的变量类型从字符型改为整型。
图4.2.5错误
错误:
后面莫名其妙的跟着一个提示语句指令。
分析调试:
当语句指令是基类info函数内的语句,很有可能是循环控制出现了一些问题。
改正:
见程序源代码!
参考文献
[1]下面给出几个参考文献的格式参考
[2]匿名,不知道,非常多.计算机实用教程.北京:
XX大学出版社,2004,123~234
[3][美]DonisSomething.VisualX#2008技术内幕.北京:
YYY大学出版社,2007,56~78
[4]JohnsSmith,JamesNothing.ProgramminginC++orAnythingandSomething.http:
//www.world.ic.ac.uk/lab/cplusplus/nothing/index.html2007
[5]Anonymous.SomethingtoSay.2007
[6]《面向对象程序设计》,郑莉,清华大学出版社,
[7]《面向对象程序设计C++语言》,朱战立等编西安电子科技大学出版社
[8]《面向对象程序设计----VisualC++》,刘斌等编,清华大学出版社
[9]《面向对象程序设计----C++语言描述》,RichardJohnsonbaugh(美)等著,蔡宇辉等译,机械工业出版社,2003
附录
本系统有三个源程序文件构成,分别为system.h,system.cpp及main.cpp。
同时含有三个系统文件,分别为info.txt,name.txt及salary.txt,且全部存放在D盘根目录下,请勿随意移动或修改系统文件。
当会员正式进入系统,info.txt是先清空后用来存储会员输入的信息,最多含有编号、姓名、职务及月份。
当仅会员注册时,会将编码及密码存储到name.txt中。
当仅会员登入的编号及密码进行匹配时,会打开输入文件name.txt,提取编号及密码,进行匹配。
当仅当输入工资数据时,会将工资、编号、姓名、职务、月份存储到salary.txt中。
当仅当查询工资信息时,会打开salary.txt,提取编号、姓名、职务、月份及工资。
该系统是一个只适合5种及5种职务的工资管理系统。
并将职务分为技术人员、销售人员、文秘、技术经理和销售经理,其代号分别为1,2,3,4,5。
雇员编号以整型变量存储,编号所取范围在-65536至65535之内(包括边界值),首位数字表示相应的职务代码。
该系统能力有限,请根据指示严格输入相应字符!
程序清单
Main函数
#include"system.cpp"
#include"cstring"
staticvoidsystemhead();
staticvoidsystembody();
staticvoidtechnician();
staticvoidsalesman();
staticvoidsecretary();
staticvoidtechmanager();
staticvoidsalesmanager();
usingnamespacestd;
voidmain()
{
systemhead();//调用systemhead静态全局函数
cout<<"\n\n1:
查询工资";
cout<<"\n\n2:
输入工资数据";
cout<<"\n\n0:
退出系统!
\n\n";
cout<<"请选择您需要的操作!
!
\n";
while
(1)
{
intxuanze;
cin>>xuanze;
if(xuanze==1)
{
employeea;
cout<a.search();
cout<<"\n\n输入工资数据请按数字2,退出系统请按数字0!
\n\n";
}//查询工资信息
if(xuanze==2)
{
employeea;
a.info();
a.recordinfo();//输入处理工资数据并暂时记录
systembody();//调用systembody静态全局函数
cout<<"\n\n查询工资请按数字1,退出系统请按数字0!
\n\n";
}
if(xuanze==0)exit(0);
}
}
staticvoidsalesmanager()
{
SalesManagera5;
floatsum;
cout<<"请输入整个月的总营业额:
";
cin>>sum;
a5.setsalesnum(sum);
a5.countSalary();
a5.recordSalary();
}
staticvoidtechmanager()
{
TechManagera4;
intgra;
cout<<"请输入这个月的评级:
";//1,2,3三个等级
cin>>gra;
a4.setgrade(gra);
a4.countSalary();
a4.recordSalary();
}
staticvoidsecretary()
{
Secretarya3;
floatbon;
cout<<"请输入这个月的额外奖励:
";
cin>>bon;
a3.setbonus(bon);
a3.countSalary();
a3.recordSalary();
}
staticvoidsalesman()
{
Salesmana2;
floatsum;
cout<<"请输入整个月的营业额:
";
cin>>sum;
a2.setsalesnum(sum);
a2.countSalary();
a2.recordSalary();
}
staticvoidtechnician()
{
Techniciana1;
floathour;
cout<<"请输入整个月的工作时间:
";
cin>>hour;
a1.setHour(hour);
a1.countSalary();
a1.recordSalary();
}
staticvoidsystembody()
{
ifstreamindata("info.txt");
if(indata==NULL)exit(0);
intnum;
charna[25];
intsta;
indata>>num>>na>>sta;//职务代号分别为1,2,3,4,5
switch(sta)
{
case1:
technician();break;
case2:
salesman();break;
case3:
secretary();break;
case4:
techmanager();break;
case5:
salesmanager();break;
default:
cout<<"职务代号错误!
\n请重新输入!
";
}
}
staticvoidsystemhead()
{
charx,y='y';
intnum;
charsecret[6];
while(y)
{
cout<<"\n\n系统会员请输入'y',非系统会员请输入‘n’\n";
cin>>x;
if(x)
{
cout<<"请输入编号(首位为职务代号且为不超过5位数的整数):
\n";
cin>>num;
cout<<"请输入密码(6及6位字符以下):
\n";
cin>>secret;//输入编号及密码
ifstreamindata("number.txt");
if(indata==NULL)
{
cout<<"文件打开失败!
请联系管理员!
\n";exit(0);//文件没打开,退出程序
}
intnum1;charsecret1[6];
indata>>num1;
while(!
indata.eof())
{
indata>>secret1;
if((num==num1)&&(strcmp(secret,secret1)==0))
{
y=0;//改变判断变量的值,停止外层循环
break;//终止内层循环
}
indata>>num1;
}
indata.close();//检验登入信息
}
else
{
cout<<"请输入编号(首位为职务代号且为不超过5位数的整数):
\n";
cin>>num;
cout<<"请输入密码(6及6位字符以下):
\n";
cin>>secret;//注册输入编号及密码
ofstreamoutdata("number.txt",ios:
:
app);
outdata<outdata.close();//将编号及密码保存到number.txt中
cout<}
}
ofstreamoutdata("info.txt",ios:
:
trunc);
outdata.close();//清空文件内容
ofstreamoutdata1("info.txt");
outdata1<outdata.close();//输入编号至info.txt
}
System.cpp
#include
#include
#include"system.h"
usingnamespacestd;
voidEmployee:
:
info()
{
charna[25];intsta,mon;
cout<<"请依次输入姓名、职务代号及月份(以空格符分隔):
";
cin>>na>>sta>>mon;
name=na;status=sta;month=mon;//存储姓名、职务、月份
}
voidEmployee:
:
search()
{
intnum;
ifstreamindata0("info.txt");
if(indata0==NULL)exit(0);
indata0>>num;
indata0.close();//从文件info.txt中提取编号
intnum1;charna1[25];intsta1;intmon1;floatsal;
intmon0;
ifstreamindata("salary.txt");
if(indata==NULL)exit(0);
while(!
indata.eof())
{
indata>>num1>>na1>>sta1>>mon1>>sal;
if(num==num1)
cout<//依次输出该雇员的工资信息
}
if(indata.eof())
cout<<"\n\n以上是你的工资信息!
\n\n";
indata.close();
}
voidEmployee:
:
recordinfo()
{
ofstreamoutdata("info.txt",ios:
:
app);
outdata<outdata.close();//添加姓名、职务、月份至存有编号的info.txt中
}
voidEmployee:
:
recordSalary()
{
ifstreamindata("info.txt");
indata>>number>>name>>status>>month;
indata.close();//依次输出该雇员的工资信息
intnum1;charna1[25];intsta1;intmon1;floatsal;
ifstreamindata1("salary.txt");
if(indata1==NULL)exit(0);
while(!
indata1.eof())
{
indata1>>num1>>na1>>sta1>>mon1>>sal;
if(month!
=mon1)
cout<else
exit(0);
//依次输出该雇员的工资信息
}
cout<//显示工资信息
ofstreamoutdata("salary.txt",ios:
:
app);
outdata<<'\n'<outdata.close();
}
voidTechnician:
:
setHour(floatx)
{
workHour=x;
}
Technician:
:
Technician(floatx)
{
hourSalary=x;
}
voidTechnician:
:
countSalary()
{
salary=workHour*hourSalary;
}
voidSalesman:
:
setsalesnum(floatx)
{
salesnum=x;
}
Salesman:
:
Salesman(floatx)
{
getRate=x;
}
voidSalesman:
:
countSalary()
{
salary=salesnum*getRate;
}
voidSecretary:
:
setbonus(floatx)
{
bonus=x;
}
Secretary:
:
Secretary(floatx)
{
fixedSalary=x;
}
voidSecretary:
:
countSalary()
{
salary=fixedSalary+bonus;
}
Manager:
:
Manager(floatx)
{
fixedSalary=x;
}
voidTechManager:
:
setgrade(intx)
{
grade=x;
}
TechManager:
:
TechManager(floatx)
{
gradeBonus=x;
}
voidTechManager:
:
countSalary()
{
salary=fixedSalary+grade*gradeBonus;
}
SalesManager:
:
SalesManager(floatx)
{
getRate=x;
}
voidSalesManager:
:
countSalary()
{
salary=fixedSalary+salesnum*getRate;
}
voidTechnician:
:
setHour(floatx)
{
workHour=x;
}
Technician:
:
Technician(floatx)
{
hourSalary=x;
}
voidTechnician:
:
countSalary()
{
salary=workHour*hourSalary;
}
voidSalesman:
:
setsalesnum(floatx)
{
salesnum=x;
}
Salesman:
:
Salesman(floatx)
{
getRate=x;
}
voidSalesman:
:
countSalary()
{
salary=salesnum*getRate;
}
voidSecretary:
:
setbonus(floatx)
{
bonus=x;
}
Secretary:
:
Secretary(floatx)
{
fixedSalary=x;
}
voidSecretary:
:
countSalary()
{
salary=fixedSalary+bonus;
}
Manager:
:
Manager(floatx)
{
fixedSalary=x;
}
voidTechManager:
:
setgrade(intx)
{
grade=x;
}
TechManager:
:
TechManager(floatx)
{
gradeBonus=x;
}
voidTechManager:
:
countSalary()
{
salary=fixedSalary+grade*gradeBonus;
}
SalesManager:
:
SalesManager(floatx)
{
getRate=x;
}
voidSalesManager:
:
countSalar