C++综合实验四Word格式.docx
《C++综合实验四Word格式.docx》由会员分享,可在线阅读,更多相关《C++综合实验四Word格式.docx(45页珍藏版)》请在冰豆网上搜索。
性别:
男
工资:
2500
1009
四
女
2600
2.日期类Date的设计(构造函数)
定义一个日期类Date,能提供和设置由年、月、日组成的日期。
编写程序,提供类的构造函数用于根据输入初始化日期类Date的对象;
提供函数用于输出日期类对象的日期,按照如下格式输出:
yyyy-mm-dd
初始化日期类Date对象的数据,分别是年、月、日。
程序有多个测试用例。
按照指定格式输出的日期。
20101230
20121830
2012610
2010-12-30
ERRORDATE
2012-06-10
3.复数类Imaginary(友元函数)
根据以下主函数的功能来设计复数类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;
}
输入4个数据,分别表示进行运算的两个复数的实部和虚部
2行,分别显示两个复数进行加、减运算的结果
1325
3+8i
-1-2i
4.二进制类
(1)——运算符重载
将一个16位二进制数表示成0和1的字符序列,即用一个字符数组来存放这个二进制数。
在这个类中设置两个构造函数,一个是传递整数参数的,另一个是传递字符串参数的。
因为用户在创建对象时传递的二进制数,可能是以整数形式给出,也可能是以数字串形式给出,系统应该都能接受。
另外有一个类型转换函数int(),用来将类类型向整型转换。
两个重载运算符“+”,“-”,用来完成两个二进制数之间的加减运算。
classbinary{//定义二进制类
charbits[16];
//二进制字模数组
public:
binary(char*);
//字符串参数构造函数
binary(int);
//整型参数构造函数
friendbinaryoperator+(binary,binary);
//重载“+”
friendbinaryoperator-(binary,binary);
//重载“-”
operatorint();
//类类型转换函数
voidprint();
};
主函数设计如下:
binaryn1="
1011"
;
binaryn2=int(n1)+15;
binaryn3=n1-binary(7);
n1.print();
n2.print();
n3.print();
cout<
<
int(n2)+5<
endl;
n2-binary(5)<
n3+binary(5)<
int(n3)-5<
}
无
略
01011
11010
00100
31
21
9
-1
5.二进制类
(2)——运算符重载
在上一题的基础上,将+、-运算符定义为binary类的成员函数。
并且重载运算符~、&
、|,分别将二进制数按位取反、数按位与及按位或。
binaryn4=n1&
n2;
binaryn5=n1|n2;
binaryn6=~n1;
n4.print();
n5.print();
n6.print();
01010
11011
10100
6.简单集合运算
10分
请设计实现集合类,元素类型为整形。
该集合类支持集合元素增加、删除、查询;
并支持集合并、交、差运算;
利用你设计的集合类,实现本题要求。
程序应体现面向对象程序设计思想,结构合理。
为保证结果唯一,集合元素递增排列。
假设集合元素个数不超100个
开始为两个正整数m,n;
后续m个整数构成集合A,再后续n个整数构成集合B
集合A、B和他们的并、交、差集;
每个集合元素间以,分隔;
不同集合显示在不同行
35
123
35821
{1,2,3}
{1,2,3,5,8}
{}
7.图形类——继承和派生
定义一个图形类,其中有保护类型的成员数据:
高度和宽度,一个公有的构造函数。
由该图形类建立两个派生类:
矩形类和等腰三角形类。
在每个派生类中都包含一个函数Area(),分别用来计算矩形和等腰三角形的面积。
提示:
classpic
classrecg:
publicpic
classtag:
输入矩形的长和宽以及等腰三角形的底边长和高。
矩形的面积和等腰三角形的面积
15
7.5
8.人民币类(类型转换)
人民币类有两种表达形式,如,第1种:
1元3角5分;
第2种:
1.35元。
设计一个人民币类RMB,实现求两个金额之差。
多组测试用例,每组数据包括两行,第一行3个整数,代表第一个金额,采用的是人民币的第1种表达形式;
第二行1个double型数据,代表第二个金额,采用的是人民币的第2种表达形式。
对应输出第一个金额减第二个金额的差。
结果保留两位小数。
235
1.56
111
0.91
0.79
0.20
9.教师工资计算(抽象类)
某学校对教师每月工资的计算公式如下:
固定工资+课时补贴。
教授的固定工资为5000元,每个课时补贴50元;
副教授的固定工资为3000元,每个课时补贴30元;
讲师的固定工资为2000元,每个课时补贴20元。
定义教师抽象类,派生不同职称的教师类,编写程序求若干教师的月工资。
输入有多个测试例组成。
每个测试例含一个字符p表示教授,v表示副教授,j表示讲师,接下来一个正整数n表示工作时间。
每个测试例对应一行输出教师的工资。
p200
v250
j100
15000
10500
4000
10.计算图形面积和周长(抽象类)
一个矩形可用两个点表示,一个三角形可用三个点来表示,一个圆可用一个点和一个半径来表示。
请实现一个抽象类Shape及接口方法(doublearea();
doubleperimeter())和三个派生类Rect、Triagle、Circle,通过构造三种派生类的对象的方式来计算给出的矩形、三角形和圆形的面积area和周长perimeter。
有多行输入,第一行为几何形状的数目n,其余n行,每行代表一个形状,其中每行第一个字符串为几何形状字符串,矩形为Rect,三角形为Triangle,圆形为Circle(请注意大小写)。
其余为相应形状的几何数据数字,之间用空格分隔(每个点用x,y两个坐标表示,x坐标在前,y坐标在后),如
Rectx1y1x2y2
Circlexyr
Trianglex1y1x2y2x3y3
有多行结果,每行为对应几何形状的面积和周长(PI=3.14159,保留到小数点后5位),两个数字之间用一个空格分隔.
3
Rect0024
Circle003
Triangle002220
8.0000012.00000
28.2743118.84954
2.000006.82843
11.简单高精度计算
整型是经常使用的数据类型,常用的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位十进制整数10。
请你编写程序(不考虑负数):
i.定义一个非负整数类BigInteger,在类中使用动态分配存储空间来存放整数的各个数位,并实现非负大整数的
1.初始化、复制、赋值、输入、显示;
2.关系运算
3.加法、减法(求两个操作数之差的绝对值,结果非负)、乘法运算;
ii.编写主程序利用非负整数类BigInteger完成各类运算,并输出结果
输入有多组样例,每组样例由三行组成,第一行为操作数a,第二行为运算符op,第三行为操作数b。
其中a,b均为位数少于1000位的非负整数,op为下列运算之一:
+、-、*、==、!
=、>
、>
=、<
、<
=(其中减法定义为求两个操作数之差的绝对值)
计算aopb的结果(算术运算的结果少于1000位),针对每组输入样例输出一行。
输出的算术运算结果要符合一般的数学表示习惯(例如,最高有效位的左边不能有前导的’0’),输出的关系运算结果以1表示真,0表示假。
64550
+
71
8742
-
787310
1
*
24
47824
==
326
7682
!
=
5926221
45561173
828739
74
62
590492
315307
43221
178568
44
四、实验结果与数据处理
第一题
//文件名:
hp
//功能:
设计员工类Employee(静态数据成员)
//完成时间:
2012-12-13
#include<
iostream>
string>
usingnamespacestd;
classEmployee
protected:
intnum,wage;
staticintcount;
staticinttotalWage;
charname[18],sex[3];
Employee(intnu,char*nm,char*sx,intwg);
Employee(){};
~Employee();
ShowBase();
staticintShowStatic();
Employee:
:
ShowBase()
"
\n个人基本信息:
\n编号:
num;
\n:
name;
\n性别:
sex;
\n工资"
wage<
}
ShowStatic()
\n人数:
count<
总工资:
totalWage<
元"
returntotalWage;
intEmployee:
count=0;
totalWage=0;
Employee(intnu,char*nm,char*sx,intwg)
num=nu;
wage=wg;
strcpy(name,nm);
strcpy(sex,sx);
++count;
totalWage+=wg;
~Employee(){}
intn;
n;
Employee*m=newEmployee[n];
intnu,wg;
charnm[18],sx[3];
for(inti=0;
i<
i++)
{
cin>
nu>
nm>
sx>
wg;
m[i]=Employee(nu,nm,sx,wg);
}
Employee:
ShowStatic();
for(i=0;
m[i].ShowBase();
delete[]m;
第二题
cc
日期类Date的设计(构造函数)
iomanip>
classdate
inty,m,d;
staticintx;
date(inty,intm,intd);
date(){};
~date(){};
voiddisplay(inty,intm,intd);
staticintgetx();
intdate:
x=1;
getx()
returnx;
voiddate:
display(inty,intm,intd)
y<
-"
setw
(2)<
setfill('
0'
)<
m<
d<
date:
date(inty,intm,intd)
if(m>
12)
{cout<
ERRORDATE"
x=0;
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
if(d>
31)
{cout<
if(m==2)
if(y%4==0&
&
y%100!
=0||y%400==0)
{
if(d>
29)
{cout<
}
else
28)
if(m==4||m==6||m==9||m==11)
30)
intk;
y>
m>
d;
dateA;
date(y,m,d);
k=A.getx();
if(k)
A.display(y,m,d);
第三题
g4
复数类Imaginary(友元函数)
2012-12-14
classImaginary
private:
floata,b;
Imaginary(){a=0,b=0;
Imaginary(floati,floatj);
~Imaginary();
friendImaginaryAdd(Imaginary&
A,Imaginary&
B);
friendImaginarySub(Imaginary&
voidprint()
if(a==0)
if(b==0)
cout<
a<
else
b<
i"
if(a)
cout<
a;
if(b>
0)
+"
if(b==0)
else
cout<
ImaginaryAdd(Imaginary&
B)
floatm=A.a+B.a;
floatn=A.b+B.b;
ImaginaryC(m,n);
C.print();
returnC;
ImaginarySub(Imaginary&
floatm=A.a-B.a;
floatn=A.b-B.b;
ImaginaryD(m,n);
D.print();
returnD;
Imaginary:
Imaginary(floati,floatj)
a=i;
b=j;
~Imaginary(){}
第四题
二进制类
(1)——运算符重载
iostream.h>
string.h>
classbinary
{//定义二进制类
friendbinaryoperator+(binary&
binary&
);
//重载"
friendbinaryoperator-(binary&
binary&
);
voidprint();
binary:
binary(char*a)
intm=strlen(a)-1;
intn=15;
while(m>
=0&
n>
=0)
bits[n--]=a[m--];
while(n>
bits[n--]='
binary(inta)
for(inti=15;
i>
=0;
i--)
bits[i]=a%2+'
a=a/2;
binaryoperator+(binary&
a,binary&
b)
binaryc("
00"
ints=0,n1=0,n2=0;
16;
n1=(a.bits[i]=='
?
0:
1)+n1*2;
n2=(b.