综合实验四参考答案.docx
《综合实验四参考答案.docx》由会员分享,可在线阅读,更多相关《综合实验四参考答案.docx(58页珍藏版)》请在冰豆网上搜索。
综合实验四参考答案
综合实验四面向对象的程序设计
[实验目的]
1.掌握类和对象的定义
2.掌握面向对象的程序设计方法
3.掌握类的继承与派生
4.掌握基类和虚函数的用法
5.掌握运算符重载的方法
6.掌握I/O流类的操作
[实验环境]
1.软件需求:
VisualC++6.0
2.硬件需求:
PentiumIII450以上的CPU处理器,64MB以上的内存,200MB的自由硬盘空间
[实验内容]
1.设计员工类Employee(静态数据成员)分
a)题目描述
定义一个描述员工(Employee)基本情况的类,数据成员包括编号(num)、姓名(name)、性别(sex)、工资(wage)、人数(count)、总工资(totalWage)。
其中姓名定义为长度为18的字符数组,性别定义为长度为3的字符数组,其它数据类型为整型,总工资和人数为静态数据成员,函数成员包括构造函数、显示基本函数(ShowBase)和显示静态数据函数(ShowStatic),其中构造函数由已知参数编号(nu),姓名(nm)、性别(sx)和工资(wg)构造对象,显示基本数据函数用于显示学生的编号、姓名、性别和工资,显示静态数据函数为静态成员函数,用于显示人数和总工资;要求所有数据成员为protected访问权限,所有成员函数为public访问权限,在主函数中定义若干个员工对象,分别显示员工基本信息,以及显示员工人数和总工资。
b)输入描述
第一行要求输入一个小于10的数字n,表示即将录入的员工数量,换行后从键盘录入每个员工的数据,依次是编号,姓名,性别,工资,每个员工占一行
c)输出描述
第一行显示“人数:
”,第二行显示“总工资:
”,后面分别显示每个员工的信息,每个员工之间空一行
d)样例输入
2
1008张三男2500
1009李四女2600
e)样例输出
人数:
2
总工资:
5100元
个人基本信息:
编号:
1008
姓名:
张三
性别:
男
工资:
2500
个人基本信息:
编号:
1009
姓名:
李四
性别:
女
工资:
2600
参考程序:
/********************************************************
2012IMISC++Practice4(Objectorientedprogramming)
Task1
Programmedby
YEHuanzhuo
Lakeside
Nov.28,2012
********************************************************/
#include
#include
usingnamespacestd;
classEmployee
{
protected:
intnum;
charname[18];
charsex[3];
intwage;
staticintcount;
staticinttotalWage;
public:
Employee(intnu,char*nm,char*sx,intwg);
~Employee();
voidShowBase();
staticvoidShowStatic();
};
intEmployee:
:
count=0;
intEmployee:
:
totalWage=0;
Employee:
:
Employee(intnu,char*nm,char*sx,intwg)
{
num=nu;
strcpy(name,nm);
strcpy(sex,sx);
wage=wg;
count++;
totalWage+=wg;
}
Employee:
:
~Employee()
{
count--;
totalWage-=wage;
}
voidEmployee:
:
ShowBase()
{
cout<<"个人基本信息:
\n";
cout<<"编号:
"<cout<<"姓名:
"<cout<<"性别:
"<cout<<"工资:
"<}
voidEmployee:
:
ShowStatic()
{
cout<<"人数:
"<cout<<"总工资:
"<}
intmain()
{
intn,i,nu,wg;
charnm[18],sx[3];
cin>>n;
Employee**a=newEmployee*[n];
for(i=0;i{
cin>>nu>>nm>>sx>>wg;
a[i]=newEmployee(nu,nm,sx,wg);
}
Employee:
:
ShowStatic();
for(i=0;i{
a[i]->ShowBase();
deletea[i];
if(i!
=n-1)
cout<}
delete[]a;
return0;
}
2.日期类Date的设计(构造函数)
a)题目描述
定义一个日期类Date,能提供和设置由年、月、日组成的日期。
编写程序,提供类的构造函数用于根据输入初始化日期类Date的对象;提供函数用于输出日期类对象的日期,按照如下格式输出:
yyyy-mm-dd
b)输入描述
初始化日期类Date对象的数据,分别是年、月、日。
程序有多个测试用例。
c)输出描述
按照指定格式输出的日期。
d)样例输入
20101230
20121830
2012610
e)样例输出
2010-12-30
ERRORDATE
2012-06-10
参考程序:
/********************************************************
2012IMISC++Practice4(Objectorientedprogramming)
Task2
Programmedby
YEHuanzhuo
Lakeside
Nov.28,2012
********************************************************/
#include
#include
usingnamespacestd;
classDate
{
intyear;
intmonth;
intday;
public:
Date(inty,intm,intd);
voidshow();
};
Date:
:
Date(inty,intm,intd)
{
year=y;
month=m;
day=d;
}
voidDate:
:
show()
{
cout<(2)<(2)<}
intmain()
{
inty,m,d,leap,md[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
while(cin>>y>>m>>d)
{
if(y>=0&&y<=9999&&m>=1&&m<=12)
{
leap=y%4==0&&y%100!
=0||y%400==0;
if((m==2&&d<=md[m]+leap)||(m!
=2&&d<=md[m]))
{
DateD(y,m,d);
D.show();
}
else
cout<<"ERRORDATE"<}
else
cout<<"ERRORDATE"<}
return0;
}
3.复数类Imaginary(友元函数)
a)题目描述
根据以下主函数的功能来设计复数类Imaginary,使其能正确运行。
类Imaginary中应该具有描述复数的实部和虚部的私有数据成员a和b,还有相应的构造函数和按照“a±bi”格式显示复数的成员函数print()。
设计类Imaginary的2个友元函数分别进行复数的加、减运算,并在这些函数调用类Imaginary的成员函数print()显示结果。
intmain()
{
floatx1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;//输入4个数据,分别表示进行运算的两个复数的实部和虚部
Imaginaryimag1(x1,y1),imag2(x2,y2);//用x1、y1创建Imaginary类对象imag1
Add(imag1,imag2);//调用友元函数求两个复数之和,按a±bi的格式显示运算结果(a和b均为实数)
Sub(imag1,imag2);//求两个复数之差并显示运算结果
return0;
}
b)输入描述
输入4个数据,分别表示进行运算的两个复数的实部和虚部
c)输出描述
2行,分别显示两个复数进行加、减运算的结果
d)样例输入
1325
e)样例输出
3+8i
-1-2i
参考程序:
/********************************************************
2012IMISC++Practice4(Objectorientedprogramming)
Task3
Programmedby
YEHuanzhuo
Lakeside
Nov.28,2012
********************************************************/
#include
usingnamespacestd;
classImaginary
{
private:
floata,b;
public:
Imaginary(floatx,floaty):
a(x),b(y){}
voidprint()
{
if(a)
{
cout<if(b>0)
cout<<"+";
}
elseif(b==0)
{
cout<<0;
return;
}
if(b==1)
cout<<"i";
elseif(b==-1)
cout<<"-i";
elseif(b)
cout<
}
friendvoidAdd(Imaginaryc,Imaginaryd);
friendvoidSub(Imaginaryc,Imaginaryd);
};
voidAdd(Imaginaryc,Imaginaryd)
{
Imaginarye(c.a+d.a,c.b+d.b);
e.print();
cout<}
voidSub(Imaginaryc,Imaginaryd)
{
Imaginarye(c.a-d.a,c.b-d.b);
e.print();
cout<}
intmain()
{
floatx1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;//输入4个数据,分别表示进行运算的两个复数的实部和虚部
Imaginaryimag1(x1,y1),imag2(x2,y2);//用x1、y1创建Imaginary类对象imag1
Add(imag1,imag2);//调用友元函数求两个复数之和,按a±bi的格式显示运算结果(a和b均为实数)
Sub(imag1,imag2);//求两个复数之差并显示运算结果
return0;
}
4.二进制类
(1)——运算符重载
a)题目描述
将一个16位二进制数表示成0和1的字符序列,即用一个字符数组来存放这个二进制数。
在这个类中设置两个构造函数,一个是传递整数参数的,另一个是传递字符串参数的。
因为用户在创建对象时传递的二进制数,可能是以整数形式给出,也可能是以数字串形式给出,系统应该都能接受。
另外有一个类型转换函数int(),用来将类类型向整型转换。
两个重载运算符“+”,“-”,用来完成两个二进制数之间的加减运算。
classbinary{//定义二进制类
charbits[16];//二进制字模数组
public:
binary(char*);//字符串参数构造函数
binary(int);//整型参数构造函数
friendbinaryoperator+(binary,binary);//重载“+”
friendbinaryoperator-(binary,binary);//重载“-”
operatorint();//类类型转换函数
voidprint();
};
主函数设计如下:
intmain()
{
binaryn1="1011";
binaryn2=int(n1)+15;
binaryn3=n1-binary(7);
n1.print();
n2.print();
n3.print();
cout<cout<cout<cout<return0;
}
b)输入描述
无
c)输出描述
略
d)样例输入
无
e)样例输出
0000000000001011
0000000000011010
0000000000000100
31
21
9
-1
参考程序:
/********************************************************
2012IMISC++Practice4(Objectorientedprogramming)
Task4
Programmedby
YEHuanzhuo
Lakeside
Nov.28,2012
********************************************************/
//iftheprogramisjudgedbyOJ,pleasefollowC++headfilestandard
#include
#include
//usingnamespacestd;
classbinary{//定义二进制类
charbits[16];//二进制字模数组
public:
binary(char*);//字符串参数构造函数
binary(int);//整型参数构造函数
friendbinaryoperator+(binary,binary);//重载“+”
friendbinaryoperator-(binary,binary);//重载“-”
operatorint();//类类型转换函数
voidprint();
};
binary:
:
binary(char*b)
{
inti,slen=strlen(b);
for(i=0;ibits[i]=b[slen-1-i]-'0';//youmayuseintorchar
for(;i<16;i++)//filltherestwithzero
bits[i]=0;
}
binary:
:
binary(inta)
{
inti=0;
while(a)
{
bits[i++]=a%2;
a/=2;//a>>=1;
}
for(;i<16;i++)
bits[i]=0;
}
binary:
:
operatorint()
{
inta=0,b=1,i;
for(i=0;i<16;i++)
{
if(bits[i])
a+=b;
b<<=1;//b*=2;
}
returna;
}
voidbinary:
:
print()
{
inti;
for(i=15;i>=0;i--)
cout<<(int)bits[i];
cout<}
binaryoperator+(binaryx,binaryy)
{
binaryz(0);
inti,a=0;
for(i=0;i<16;i++)
{
z.bits[i]=x.bits[i]+y.bits[i]+a;
a=z.bits[i]/2;
z.bits[i]%=2;
}
returnz;
}
binaryoperator-(binaryx,binaryy)
{
binaryz(0);
inti,a=0;
for(i=0;i<16;i++)
{
z.bits[i]=x.bits[i]-y.bits[i]-a;
if(z.bits[i]<0)
{
a=1;
z.bits[i]+=2;
}
else
a=0;
}
returnz;
}
intmain()
{
binaryn1="1011";
binaryn2=int(n1)+15;
binaryn3=n1-binary(7);
n1.print();
n2.print();
n3.print();
cout<cout<cout<cout<return0;
}
5.二进制类
(2)——运算符重载
a)题目描述
在上一题的基础上,将+、-运算符定义为binary类的成员函数。
并且重载运算符~、&、|,分别将二进制数按位取反、数按位与及按位或。
主函数设计如下:
intmain()
{
binaryn1="1011";
binaryn2=int(n1)+15;
binaryn3=n1-binary(7);
n1.print();
n2.print();
n3.print();
binaryn4=n1&n2;
binaryn5=n1|n2;
binaryn6=~n1;
n4.print();
n5.print();
n6.print();
return0;
}
b)输入描述
无
c)输出描述
略
d)样例输入
无
e)样例输出
0000000000001011
0000000000011010
0000000000000100
0000000000001010
0000000000011011
111111*********0
参考程序:
/********************************************************
2012IMISC++Practice4(Objectorientedprogramming)
Task5
Programmedby
YEHuanzhuo
Lakeside
Nov.28,2012
********************************************************/
//iftheprogramisjudgedbyOJ,pleasefollowC++headfilestandard
#include
#include
//usingnamespacestd;
classbinary{//定义二进制类
charbits[16];//二进制字模数组
public:
binary(char*);//字符串参数构造函数
binary(int);//整型参数构造函数
binaryoperator+(binary);//重载“+”
binaryoperator-(binary);//重载“-”
binaryoperator~();//重载“~”
binaryoperator&(binary);//重载“&”
binaryoperator|(binary);//重载“|”
operatorint();//类类型转换函数
voidprint();
};
binary:
:
binary(char*b)
{
inti,slen=strlen(b);
for(i=0;ibits[i]=b[slen-1-i]-'0';//youmayuseintorchar
for(;i<16;i++)//filltherestwithzero
bits[i]=0;
}
binary:
:
binary(inta)
{
inti=0;
while(a)
{
bits[i++]=a%2;
a/=2;//a>>=1;
}
for(;i<16;i++)
bits[i]=0;
}
binary:
:
operatorint()
{
inta=0,b=1,i;
for(i=0;i<16;i++)
{
if(bits[i])
a+=b;
b<<=1;//b*=2;
}
returna;
}
voidbinary:
:
print()
{
inti;
for(i=15;i>=0;i--)
cout<<(int)bits[i];
cout<