资源描述
中国石油大学(华东)信息与控制工程学院
《程序设计实习》报告
小型公司工资管理系统的设计
专业班级:电子信息工程
学 号:10052222
姓 名:王博
时 间:2011.7.14~2011.7.17
2011年7月
目录
一、 实习内容…………………………………………………………………………1
二、 设计思路…………………………………………………………………………2
三、 程序清单…………………………………………………………………………3
四、 运行结果…………………………………………………………………………4
五、 程序使用说明……………………………………………………………………5
六、 总结及心得体会…………………………………………………………………6
程序设计实习报告
一、实习内容
本次实习的内容是设计一个小型公司的工资管理系统,通过这个系统实现对经理、技术员、销售员及销售经理等公司成员的职工号、姓名、年龄、月工资等信息的数据输入、数据处理、数据的输出显示、数据的备份等功能。本次实习主要是针对较难综合题目进行分析、编程、调试和运行,这利于我们进一步掌握面向过程和面向对象程序的基本方法和编程技巧,巩固所学理论知识,使理论与实践相结合,提高分析问题解决问题的能力。
本次实习的题目及要求如下:
1..题目:小型公司工资管理系统的设计
2.设计说明与基本要求:
(1 )公司主要有4类人员:
经理、技术员、销售员、销售经理。要求存储这些人的职工号、姓名、性别、年龄、月工资等信息;
(2) 工资的计算方法:
经理:固定月薪为8000元;
技术员:工作时间×工资(100元/小时);
销售员:销售额×4%提成;
销售经理:底薪(5000元)+下属销售员销售额总额×0.5%;
(3) 员工基本数据的输入:
要求每类人员不能少于4人,其中销售员需要8名,每名销售经理手下有2名销售员。
(4) 各类的数据成员访问权限设置为:protected
3.实现的基本功能:
(1 )菜单选择功能; (2)数据的输入;
(3)数据的统计; (4)数据的输出,显示;
(5)数据的备份; (6)退出系统。
二、设计思路
1.类的层次结构
2.设计思路
首先要总体设计,要有一个菜单,用于选择各项功能,用来进行数据的录入,数据的统计,数据的打印,数据的备份,进入多级菜单,退出系统等功能。这就要充分利用了类的继承与派生的知识,先定义一个基类base,由基类共有派生出技术员类 Tec,销售员类Sel,经理类Man,又由经理类公有派生出销售经理类Sma。把基类定义成虚基类,通过基类去写的派生类就可以调用基类的公有成员。程序中宜使用全局变量,便于修改,简便清晰。定义完类后,定义各函数,因为各功能的实现需要定义与其功能相适应的函数,所以定义了数据输入函数ph1( ),数据打印函数ph3( ),数据统计函数ph2( ),数据备份函数save( ),进入多级菜单进行统计函数ph4( )等。将主函数放在最后来实现整个程序的运行,运用switch语句选择系统进行的工作,在主菜单中进行调用各函数,从而实现各功能。程序中要求销售经理工资排序则采用的冒泡排序法实现。
三、程序清单
# include <iostream>
# include <fstream>
# include <iomanip>
# include <string>
using namespace std;
fstream outfile;
int m,i,t,x;
int salary[4]={0,0,0,0};
int s[4]={0,0,0,0};
void menu() //定义主菜单函数
{cout<<"★★小型公司工资管理系统★★"<<endl;
cout<<"┌─────────────┐"<<endl;
cout<<"│ 请选择您所需的操作 │"<<endl;
cout<<"│ 数据输入:1,并按回车键 │"<<endl;
cout<<"│ 数据统计:2,并按回车键 │"<<endl;
cout<<"│ 数据打印:3,并按回车键 │"<<endl;
cout<<"│ 数据备份:4,并按回车键 │"<<endl;
cout<<"│ 退出系统:5,并按回车键 │"<<endl;
cout<<"│ 多级菜单:6,并按回车键 │"<<endl;
cout<<"└─────────────┘"<<endl;
cout<<"请选择一个操作: ";
}
void menus() //定义多级菜单函数
{cout<<"★★小型公司工资管理系统★★"<<endl;
cout<<"┌────────────────┐"<<endl;
cout<<"│ 请选择您所需的操作 │"<<endl;
cout<<"│ 技术员基本情况 :1,并按回车键│"<<endl;
cout<<"│ 经理基本情况 :2,并按回车键│"<<endl;
cout<<"│ 销售经理基本情况 :3,并按回车键│"<<endl;
cout<<"│ 销售员基本情况 :4,并按回车键│"<<endl;
cout<<"│ 返回上一级 :5,并按回车键│"<<endl;
cout<<"└────────────────┘"<<endl;
cout<<"请选择一个操作: ";
}
void heng() //定义heng函数
{cout<<"┈┈┈┈┈┈┈┈┈┈" <<endl;}
void form() //定义form函数
{cout<<"┌────┬───┬────┬────┬──────┐"<<endl;
cout<<"│ 职工号 │ 姓名 │ 性别 │ 年龄 │ 工资 │"<<endl; }
void forms() //定义forms函数
{outfile<<"┌────┬───┬────┬────┬──────┐"<<endl;
outfile<<"│ 职工号 │ 姓名 │ 性别 │ 年龄 │ 工资 │"<<endl; }
void head() //定义head函数
{cout<<"┌────┬───┬────┬────┬──────┐"<<endl;
cout<<"│ 职工号 │ 姓名 │ 性别 │ 年龄 │ 工资 │"<<endl;}
void end() //定义end函数
{cout<<"└────┴───┴────┴────┴──────┘"<<endl;}
class Base //定义基类
{protected:
int a,b,n;
string c;
char d;};
class Tec:protected Base //技术员类
{public:
void print1 ()
{cout<<"技术员的编号: ";
cin>>a;
cout<<"其姓名: ";
cin>>c;
cout<<"性别(m/w):";
cin>>d;
cout<<"年龄: ";
cin>>n;
cout<<"工作时间: ";
cin>>b;}
void out1()
{cout<<"├────┼───┼────┼────┼──────┤"<<endl;
cout<<"│"<<setw(8)<<a<<"│"<<setw(6)<<c<<"│"<<setw(8)<<d<<"│"<<setw(8)<<n<<"│"<<setw
(12)<<int(b*100)<<"│"<<endl;}
int a1(){return a;}
int b1(){return b;}
string c1(){return c;}
char d1(){return d;}
int n1(){return n;}
}Tec,tec[4];
class Man:protected Base //经理类
{public:
void out2()
{cout<<"├────┼───┼────┼────┼──────┤"<<endl;
cout<<"│"<<setw(8)<<a<<"│"<<setw(6)<<c<<"│"<<setw(8)<<d<<"│"<<setw(8)<<b<<"│"<<setw
(12)<<"8000"<<"│"<<endl;}
int a2(){return a;}
int b2(){return b;}
string c2(){return c;}
char d2(){return d;}
int n2(){return n;}
void print2 ()
{cout<<"经理的编号: ";
cin>>a;
cout<<"其姓名: ";
cin>>c;
cout<<"性别(m/w):";
cin>>d;
cout<<"年龄: ";
cin>>b;}
}Man,man[4];
class Sel:protected Base //销售员类
{public:
void print3 ()
{cout<<"销售员的编号: ";
cin>>a;
cout<<"其姓名: ";
cin>>c;
cout<<"性别(m/w):";
cin>>d;
cout<<"年龄: ";
cin>>b;
cout<<"销售额: ";
cin>>n;
cout<<"所属销售经理的编号: ";
cin>>f;}
int printsnum() {return f;}
int printmoney(){return n;}
void out()
{ cout<<"├──────┼─────┼──────┤"<<endl;
cout<<"│"<<setw(9)<<a<<" │"<<setw(9)<<c<<" │"<<setw(9)<<n<<" │"<<endl;}
void out3()
{cout<<"├────┼───┼────┼────┼─────┼─────────┤"<<endl;
cout<<"│"<<setw(8)<<a<<"│"<<setw(6)<<c<<"│"<<setw(8)<<d<<"│"<<setw(8)<<b<<"│"<<setw
(10)<<int(n*0.04)<<"│"<<setw(18)<<f<<"│"<<endl;}
int a3(){return a;}
int b3(){return b;}
string c3(){return c;}
char d3(){return d;}
int n3(){return n;}
int f3(){return f;}
private:
int f;
}Sel,sel[8];
class Sma:protected Man //销售经理类
{public:
void print4 ()
{cout<<"销售经理的编号: ";
cin>>a;
cout<<"其姓名: ";
cin>>c;
cout<<"性别(m/w):";
cin>>d;
cout<<"年龄: ";
cin>>b;}
int printnum(){return a;}
string printname(){return c;}
int a4(){return a;}
int b4(){return b;}
string c4(){return c;}
char d4(){return d;}
int n4(){return n;}
void mout()
{cout<<"├────┼───┼────┼────┼──────┤"<<endl;
cout<<"│"<<setw(8)<<a<<"│"<<setw(6)<<c<<"│"<<setw(8)<<d<<"│"<<setw(8)<<b<<"│"<<setw
(12)<<int(5000+0.005*s[i])<<"│"<<endl;}
};Sma sma[4];
void ph1() //定义数据输入函数
{ for(i=0;i<4;i++)
tec[i].print1();heng();
for(i=0;i<4;i++)
man[i].print2();heng();
for(i=0;i<8;i++)
sel[i].print3();heng();
for(i=0;i<4;i++)
sma[i].print4();heng();
menu();}
void ph2() //定义数据统计函数
{int salary[4]={0,0,0,0};
int s[4]={0,0,0,0};
for(int j=0;j<=3;j++)
{cout<<"\n职工号为"<<sma[j].printnum()<<"销售经理"<<sma[j].printname()<<"下属销售员的业绩为:"<<endl;
cout<<'\n'<<endl;
cout<<"┌──────┬─────┬──────┐"<<endl;
cout<<"│ 职工号 │ 姓名 │ 销售额 │"<<endl;
for(i=0;i<8;i++)
{if(sel[i].printsnum()==sma[j].printnum())
{sel[i].out();
s[j]+=sel[i].printmoney();
}salary[j]=s[j];}
cout<<"├──────┼─────┴──────┤"<<endl;
cout<<"│"<<" 销售额总计:"<<"│"<<setw(24)<<s[j]<<"│"<<endl;
cout<<"└──────┴────────────┘"<<endl;}
cout<<"\n销售经理按工资排序为: "<<'\n'<<endl;
form();
for(i=0;i<3;i++)
for(j=0;j<3-i;j++)
if(s[j]<s[j+1])
{m=s[j];s[j]=s[j+1];s[j+1]=m;}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(salary[j]==s[i])
{sma[j].mout();break;}
cout<<"└────┴───┴────┴────┴──────┘"<<endl;
menu ();}
void ph3 () //定义数据打印函数
{cout<<" 请等待......"<<endl;
cout<<"职工基本情况一览表如下"<<endl;
for(;;) //死循环
{menus();
cin>>m;
if(m==1)
{cout<<"技术员"<<endl;
form();
for(int i=0;i<4;i++)
tec[i].out1();
cout<<"└────┴───┴────┴────┴──────┘"<<endl;
heng();continue;}
else if(m==2)
{cout<<"经理"<<endl;
form();
for(i=0;i<4;i++)
man[i].out2();
cout<<"└────┴───┴────┴────┴──────┘"<<endl;
heng();continue;}
else if(m==3)
{cout<<"销售经理"<<endl;
form();
for(i=0;i<2;i++)
for(int j=0;j<4;j++)
if(salary[j]==s[i])
{sma[j].mout();break;}
cout<<"└────┴───┴────┴────┴──────┘"<<endl;
heng();continue;}
else if (m==4)
{cout<<"销售员"<<endl;
cout<<"┌────┬───┬────┬────┬─────┬─────────┐"<<endl;
cout<<"│ 职工号 │ 姓名 │ 性别 │ 年龄 │ 工资 │ 所属部门经理编号 │"<<endl;
for(int k=0;k<=7;k++)
sel[k].out3();
cout<<"└────┴───┴────┴────┴─────┴─────────┘"<<endl;
heng();continue;}
else if(m==5)break;
else cout<<"你的选择有误,请重新选择。。:"<<endl;}}
void ph4 () //定义进入多级菜单,数据统计函数
{ cout<<"职工基本情况一览表如下:"<<endl;
cout<<"技术员"<<endl;
head();
for(i=0;i<4;i++)
tec[i].out1();
end();
cout<<"-------------------------------------------"<<endl;
cout<<"经理"<<endl;
head();
for(i=0;i<4;i++)
man[i].out2();
end();
cout<<"-------------------------------------------"<<endl;
cout<<"销售经理"<<endl;
head();
for(i=0;i<4;i++)
sma[i].mout();
end();
cout<<"-------------------------------------------"<<endl;
cout<<"销售员"<<endl;
cout<<"┌────┬───┬────┬────┬─────┬─────────┐"<<endl;
cout<<"│ 职工号 │ 姓名 │ 性别 │ 年龄 │ 工资 │ 所属部门经理编号 │"<<endl;
for(i=0;i<8;i++)
sel[i].out3();
cout<<"└────┴───┴────┴────┴─────┴─────────┘"<<endl;
cout<<"-------------------------------------------"<<endl;
menu();
}
void save() //定义数据备份函数
{cout<<"数据备份中,请稍等...."<<endl;
outfile.open("D:save.txt",ios::trunc|ios::out);
outfile<<"技术员"<<endl;
forms();
for(i=0;i<4;i++)
{outfile<<"├────┼───┼────┼────┼──────┤"<<endl;
outfile<<"│"<<setw(8)<<tec[i].a1()<<"│"<<setw(6)<<tec[i].c1()<<"│"<<setw(8)<<tec[i].d1
()<<"│"<<setw(8)<<tec[i].n1()<<"│"<<setw(12)<<int(tec[i].b1()*100)<<"│"<<endl;
}outfile<<"└────┴───┴────┴────┴──────┘"<<endl;
outfile<<"┈┈┈┈┈┈┈┈┈┈" <<endl;
outfile<<"经理"<<endl;
forms();
for(i=0;i<4;i++)
{outfile<<"├────┼───┼────┼────┼──────┤"<<endl;
outfile<<"│"<<setw(8)<<man[i].a2()<<"│"<<setw(6)<<man[i].c2()<<"│"<<setw(8)
<<man[i].d2()<<"│"<<setw(8)<<man[i].b2()<<"│"<<setw(12)<<"8000"<<"│"<<endl;}
outfile<<"└────┴───┴────┴────┴──────┘"<<endl;
outfile<<"┈┈┈┈┈┈┈┈┈┈" <<endl;
outfile<<"销售经理"<<endl;
forms();
for(i=0;i<4;i++)
{outfile<<"├────┼───┼────┼────┼──────┤"<<endl;
outfile<<"│"<<setw(8)<<sma[i].a4()<<"│"<<setw(6)<<sma[i].c4()<<"│"<<setw(8)
<<sma[i].d4()<<"│"<<setw(8)<<sma[i].b4()<<"│"<<setw(12)<<int(5000+0.005*salary[i])
<<"│"<<endl;}
outfile<<"└────┴───┴────┴────┴──────┘"<<endl;
outfile<<"┈┈┈┈┈┈┈┈┈┈" <<endl;
outfile<<"销售员"<<endl;
outfile<<"┌────┬───┬────┬────┬─────┬─────────┐"<<endl;
outfile<<"│ 职工号 │ 姓名 │ 性别 │ 年龄 │ 工资 │ 所属部门经理编号 │"<<endl;
for(i=0;i<8;i++)
{outfile<<"├────┼───┼────┼────┼─────┼─────────┤"<<endl;
outfile<<"│"<<setw(8)<<sel[i].a3()<<"│"<<setw(6)<<sel[i].c3()<<"│"<<setw(8)<<sel[i].d3
()<<"│"<<setw(8)<<sel[i].b3()<<"│"<<setw(10)<<int(sel[i].n3()*0.04)<<"│"<<setw(18)<<sel
[i].f3()<<"│"<<endl;
}outfile<<"└────┴───┴────┴────┴─────┴─────────┘"<<endl;
outfile<<"┈┈┈┈┈┈┈┈┈┈" <<endl;
outfile.close();
cout<<"备份完成!"<<endl;}
int main() //主函数
{menu();
for(i=1;i<=10;i++)
{cin>>x;
switch (x)
{case 1:ph1();break;
case 2: ph2();break;
case 3:ph4();break;
case 4:save();menu();break;
case 6:ph3();menu();break;}
if(x==5)
{char t;
cout<<"您确定要退出吗?退出:请按 Y,否:请按N"<<endl;
cout<<"请选择:";
cin>>t;
for(;;)
{if(t!='n'&&t!='N'&&t!='y'&&t!='Y')
cout<<"您的选择有误,请重新选择(Y/N):";
else break;cin>>t;}
if(t=='n'||t=='N')menu();
else break;}}
return 0;}
四、运行结果
五、程序的使用说明
1.菜单说明 :
(1)数据输入指通过键盘输入经理、技术员、销售员及销售经理等公司成员的职工号、姓名、年龄等各项数据;
(2)数据统计指统计各销售经理下属销售员的销售额及销售总额,销售经理按工资进行的冒泡排序;
(3)数据打印指按照表格的格式在屏幕上输出个员工的信息;
(4)数据备份指将所有员工的信息保存到文件;
(5)退出指结束程序的运行;
(6)进入多级菜单。
2.其他说明:
(1)选择功能是输入的必须是数字,否则系统可能会运行出错,得到不确定的结果。
(2)由于程序设计的限制,输入名字时不能输入过长,否则系统出错;
六、总结及心得体会
通过四天的实习,我基本完成了设计一个小型公司工资管理系统的程序的任务,这使我对c++以及它的使用有了更深一步的理解和熟练,不过期间也遇到不少问题,由于对基础知识掌握的不够好,对全局变量的掌握不好,所以在出现错误是没能及时解决。
刚开始时感觉无从下手,不过分步进行编辑,编译,调试,运行,比较容易进行编程。记得刚学习c++是感觉特别难,始终没有搞清楚c++是门什么样的课,而通过这次实习我能够基本掌握C++语言编程的基础知识,通过这次编写的较难的程序,对于编程有了更多的了解和更贴切的体会。我想这有利于今后对c++的使用,锻炼我们缜密的思维提高我们的独立思考,独立解决问题,综合运用所学知识的能力,提高了上机动手编程的能力。
通过本次实习,我加深了对类与派生的理解,对于类的保护成员只对本身成员函数使用,而不能被公有派生出的成员函数使用。了解了类与派生类之间的关系,练习了for循环switch的用法,全局变量的定义以及它的使用,一维数组的定义使用,并看到了一维数组使用的优点,通过编写一个小型工资管理系统,学会了简单的面向对象的编程方法,包括类的结构设计、类的继承、虚函数与多态性等知识的应用以及文件的操作,并学会了模块化程序设计的方法。在主菜单中调用各函数的算法,掌握了如何去调用一个函数,以及函数的定义与调用的关系,定义在调用前的话,可以直接进行函数的调用,否则要先声明该函数,然后才能调用该函数。定义一个类对象即对一个类进行实例化,了解到该对象调用类的成员函数的方法。掌握用冒泡法对数组进行从小到大的排序。了解到如何使一个系统看起来比较规整,有条理性。了解到类中定义虚函数的用法,在该类的派生类中定义了同名的成员函数时,该派生类的成员函数仍然是虚函数。了解虚基类的使用和虚函数的使用。
在这次实习中,知道了自己的动手能力还有待进一步提高,一开始总是不能够把书本上学的知识运用到编写的程序上,就觉得好像没有信心完成,甚至有了放弃的念头,但是在认真看了课本及于同学的讨论之后,一项一项的任务渐渐完成,也就逐渐有了信心,渐渐觉得不怕出现错误,觉得改正错误挺有趣的,特别是改正过来使得成就感无法言说,实习中我也感觉到了请教别人与别人交流的重要性,这可能是你事半功倍,而且能是你的程序更简洁方便。再就是,在编译、连接、调试的过程中应定要有足够的耐心,因为这个过程中可能出现很多错误,我们也要记清常出的错误,以便下次出现时能更好更快的改正,遇到问题更要全面的分析。
总之,这次实习是极有意义的一次实践,提高了自身的能力,这对以后的学习生活都有极大地意义……
27
展开阅读全文