C++综合实验四.docx
《C++综合实验四.docx》由会员分享,可在线阅读,更多相关《C++综合实验四.docx(46页珍藏版)》请在冰豆网上搜索。
C++综合实验四
《程序设计语言》实验报告
实验序号:
04 实验项目名称:
面向对象的程序设计
学 号
姓 名
专业、班
实验地点
文波楼219
指导教师
时间
2012/12/19
一、实验目的及要求
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
2.日期类Date的设计(构造函数)
a)题目描述
定义一个日期类Date,能提供和设置由年、月、日组成的日期。
编写程序,提供类的构造函数用于根据输入初始化日期类Date的对象;提供函数用于输出日期类对象的日期,按照如下格式输出:
yyyy-mm-dd
b)输入描述
初始化日期类Date对象的数据,分别是年、月、日。
程序有多个测试用例。
c)输出描述
按照指定格式输出的日期。
d)样例输入
20101230
20121830
2012610
e)样例输出
2010-12-30
ERRORDATE
2012-06-10
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
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
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
6.简单集合运算 10分
a)题目描述
请设计实现集合类,元素类型为整形。
该集合类支持集合元素增加、删除、查询;并支持集合并、交、差运算;利用你设计的集合类,实现本题要求。
程序应体现面向对象程序设计思想,结构合理。
为保证结果唯一,集合元素递增排列。
假设集合元素个数不超100个
b)输入描述
开始为两个正整数m,n;后续m个整数构成集合A,再后续n个整数构成集合B
c)输出描述
集合A、B和他们的并、交、差集;每个集合元素间以,分隔;不同集合显示在不同行
d)样例输入
35
123
35821
e)样例输出
{1,2,3}
{1,2,3,5,8}
{1,2,3,5,8}
{1,2,3}
{}
7.图形类——继承和派生
a)题目描述
定义一个图形类,其中有保护类型的成员数据:
高度和宽度,一个公有的构造函数。
由该图形类建立两个派生类:
矩形类和等腰三角形类。
在每个派生类中都包含一个函数Area(),分别用来计算矩形和等腰三角形的面积。
提示:
classpic
{
};
classrecg:
publicpic
{
};
classtag:
publicpic
{
};
b)输入描述
输入矩形的长和宽以及等腰三角形的底边长和高。
c)输出描述
矩形的面积和等腰三角形的面积
d)样例输入
35
35
e)样例输出
15
7.5
8.人民币类(类型转换)
a)题目描述
人民币类有两种表达形式,如,第1种:
1元3角5分;第2种:
1.35元。
设计一个人民币类RMB,实现求两个金额之差。
b)输入描述
多组测试用例,每组数据包括两行,第一行3个整数,代表第一个金额,采用的是人民币的第1种表达形式;第二行1个double型数据,代表第二个金额,采用的是人民币的第2种表达形式。
c)输出描述
对应输出第一个金额减第二个金额的差。
结果保留两位小数。
d)样例输入
235
1.56
111
0.91
e)样例输出
0.79
0.20
9.教师工资计算(抽象类)
a)题目描述
某学校对教师每月工资的计算公式如下:
固定工资+课时补贴。
教授的固定工资为5000元,每个课时补贴50元;副教授的固定工资为3000元,每个课时补贴30元;讲师的固定工资为2000元,每个课时补贴20元。
定义教师抽象类,派生不同职称的教师类,编写程序求若干教师的月工资。
b)输入描述
输入有多个测试例组成。
每个测试例含一个字符p表示教授,v表示副教授,j表示讲师,接下来一个正整数n表示工作时间。
c)输出描述
每个测试例对应一行输出教师的工资。
d)样例输入
p200
v250
j100
e)样例输出
15000
10500
4000
10.计算图形面积和周长(抽象类)
a)题目描述
一个矩形可用两个点表示,一个三角形可用三个点来表示,一个圆可用一个点和一个半径来表示。
请实现一个抽象类Shape及接口方法(doublearea();doubleperimeter())和三个派生类Rect、Triagle、Circle,通过构造三种派生类的对象的方式来计算给出的矩形、三角形和圆形的面积area和周长perimeter。
b)输入描述
有多行输入,第一行为几何形状的数目n,其余n行,每行代表一个形状,其中每行第一个字符串为几何形状字符串,矩形为Rect,三角形为Triangle,圆形为Circle(请注意大小写)。
其余为相应形状的几何数据数字,之间用空格分隔(每个点用x,y两个坐标表示,x坐标在前,y坐标在后),如
Rectx1y1x2y2
Circlexyr
Trianglex1y1x2y2x3y3
c)输出描述
有多行结果,每行为对应几何形状的面积和周长(PI=3.14159,保留到小数点后5位),两个数字之间用一个空格分隔.
d)样例输入
3
Rect0024
Circle003
Triangle002220
e)样例输出
8.0000012.00000
28.2743118.84954
2.000006.82843
11.简单高精度计算
a)题目描述
整型是经常使用的数据类型,常用的32位整数表示精度不超过10位十进制整数。
在很多运算中往往需要更高的精度,这时就必须自己编程突破系统已经定义数据类型的限制。
一个可行的方法是采用一个数组表示一个大的整数,每一个数组元素表示这个大整数的一位。
例如定义一个数组a[30],其各个元素分别为:
9,8,7,6,5,4,3,2,1,0,9,8,7,6,5,4,3,2,1,0,9,8,7,6,5,4,3,2,1,0,则可以用来表示30位十进制整数987654321098765432109876543210。
请你编写程序(不考虑负数):
i.定义一个非负整数类BigInteger,在类中使用动态分配存储空间来存放整数的各个数位,并实现非负大整数的
1.初始化、复制、赋值、输入、显示;
2.关系运算
3.加法、减法(求两个操作数之差的绝对值,结果非负)、乘法运算;
ii.编写主程序利用非负整数类BigInteger完成各类运算,并输出结果
b)输入描述
输入有多组样例,每组样例由三行组成,第一行为操作数a,第二行为运算符op,第三行为操作数b。
其中a,b均为位数少于1000位的非负整数,op为下列运算之一:
+、-、*、==、!
=、>、>=、<、<=(其中减法定义为求两个操作数之差的绝对值)
c)输出描述
计算aopb的结果(算术运算的结果少于1000位),针对每组输入样例输出一行。
输出的算术运算结果要符合一般的数学表示习惯(例如,最高有效位的左边不能有前导的’0’),输出的关系运算结果以1表示真,0表示假。
d)样例输入
7798422038462027206418091570017038214954325158287284501126509864550
+
6644654478671
154455686168668608742
-
570620325535649714352477856211346877690604957811744787310
138********264274782575849549700031
*
104278462284302057284605155421424724
261800913745549144387657570462003847824
==
30945390762104982326
61806052973400618783421149497858757508903905734886054976023347098394999878472342427167682
!
=
550319305638993185926221
33485160132480328875209155849017229
>
48706055658499024618501666452069820990222680543730745561173
223255953006515880343449832824383387870686263650800589681213456312563835423612992344693965267757962348828739
>=
8459231671237698245612414056673245577830476701292941849484054454038774
712609293697698786056941590556285144547080247621820218851422961751623938783603762
<
180********49773972123323007151923718757730213899815509196276039659381252042527294867590492
136********1754460256400172008142164350078857012092315307
<=
907145092560931574534094350840314027165670909824872
e)样例输出
7798422038462027206418091570017038214954325158287284507771164343221
570620325535649714352477856211346877536149271643076178568
1439720272653527639853476844171700671299791197920011931807664846966444
0
1
0
1
1
0
四、实验结果与数据处理
第一题
//文件名:
hp
//功能:
设计员工类Employee(静态数据成员)
//完成时间:
2012-12-13
#include
#include
usingnamespacestd;
classEmployee
{
protected:
intnum,wage;
staticintcount;
staticinttotalWage;
charname[18],sex[3];
public:
Employee(intnu,char*nm,char*sx,intwg);
Employee(){};
~Employee();
ShowBase();
staticintShowStatic();
};
Employee:
:
ShowBase()
{
cout<<"\n个人基本信息:
";
cout<<"\n编号:
"<cout<<"\n姓名:
"<cout<<"\n性别:
"<cout<<"\n工资"<}
Employee:
:
ShowStatic()
{
cout<<"\n人数:
"<cout<<"总工资:
"<returntotalWage;
}
intEmployee:
:
count=0;
intEmployee:
:
totalWage=0;
Employee:
:
Employee(intnu,char*nm,char*sx,intwg)
{
num=nu;wage=wg;
strcpy(name,nm);
strcpy(sex,sx);
++count;
totalWage+=wg;
}
Employee:
:
~Employee(){}
intmain()
{
intn;cin>>n;
Employee*m=newEmployee[n];
intnu,wg;
charnm[18],sx[3];
for(inti=0;i{
cin>>nu>>nm>>sx>>wg;
m[i]=Employee(nu,nm,sx,wg);
}
Employee:
:
ShowStatic();
for(i=0;im[i].ShowBase();
return0;
delete[]m;
}
第二题
//文件名:
cc
//功能:
日期类Date的设计(构造函数)
//完成时间:
2012-12-13
#include
#include
usingnamespacestd;
classdate
{
protected:
inty,m,d;
staticintx;
public:
date(inty,intm,intd);
date(){};
~date(){};
voiddisplay(inty,intm,intd);
staticintgetx();
};
intdate:
:
x=1;
intdate:
:
getx()
{
returnx;
}
voiddate:
:
display(inty,intm,intd)
{
cout<(2)<(2)<}
date:
:
date(inty,intm,intd)
{
if(m>12)
{cout<<"ERRORDATE"<if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
{
if(d>31)
{cout<<"ERRORDATE"<}
if(m==2)
{
if(y%4==0&&y%100!
=0||y%400==0)
{
if(d>29)
{cout<<"ERRORDATE"<}
else
{
if(d>28)
{cout<<"ERRORDATE"<}
}
if(m==4||m==6||m==9||m==11)
{
if(d>30)
{cout<<"ERRORDATE"<}
}
intmain()
{
inty,m,d;
intk;
cin>>y>>m>>d;
dateA;
date(y,m,d);
k=A.getx();
if(k)
A.display(y,m,d);
return0;
}
第三题
//文件名:
g4
//功能:
复数类Imaginary(友元函数)
//完成时间:
2012-12-14
#include
usingnamespacestd;
classImaginary
{
private:
floata,b;
public:
Imaginary(){a=0,b=0;}
Imaginary(floati,floatj);
~Imaginary();
friendImaginaryAdd(Imaginary&A,Imaginary&B);
friendImaginarySub(Imaginary&A,Imaginary&B);
voidprint()
{
if(a==0)
{
if(b==0)
cout<else
cout<
}
if(a)
{
cout<if(b>0)
cout<<"+"<
else
if(b==0)
cout<else
cout<
}
}
};
ImaginaryAdd(Imaginary&A,Imaginary&B)
{
float