C++综合实验四.docx
- 文档编号:4641042
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:45
- 大小:157.06KB
C++综合实验四.docx
《C++综合实验四.docx》由会员分享,可在线阅读,更多相关《C++综合实验四.docx(45页珍藏版)》请在冰豆网上搜索。
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)样例输出 01011 11010 00100 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)样例输出 01011 11010 00100 01010 11011 10100 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位十进制整数10。 请你编写程序(不考虑负数): i.定义一个非负整数类BigInteger,在类中使用动态分配存储空间来存放整数的各个数位,并实现非负大整数的 1.初始化、复制、赋值、输入、显示; 2.关系运算 3.加法、减法(求两个操作数之差的绝对值,结果非负)、乘法运算; ii.编写主程序利用非负整数类BigInteger完成各类运算,并输出结果 b)输入描述 输入有多组样例,每组样例由三行组成,第一行为操作数a,第二行为运算符op,第三行为操作数b。 其中a,b均为位数少于1000位的非负整数,op为下列运算之一: +、-、*、==、! =、>、>=、<、<=(其中减法定义为求两个操作数之差的绝对值) c)输出描述 计算aopb的结果(算术运算的结果少于1000位),针对每组输入样例输出一行。 输出的算术运算结果要符合一般的数学表示习惯(例如,最高有效位的左边不能有前导的’0’),输出的关系运算结果以1表示真,0表示假。 d)样例输入 64550 + 71 8742 - 787310 1 * 24 47824 == 326 7682 ! = 5926221 9 > 45561173 828739 >= 74 62 < 590492 315307 <= e)样例输出 43221 178568 44 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;i m[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) {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 综合 实验