大工软院 c++实验讲义Word格式.docx
《大工软院 c++实验讲义Word格式.docx》由会员分享,可在线阅读,更多相关《大工软院 c++实验讲义Word格式.docx(26页珍藏版)》请在冰点文库上搜索。
![大工软院 c++实验讲义Word格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/1/aedf9b70-627e-465a-b754-2c88927b74ae/aedf9b70-627e-465a-b754-2c88927b74ae1.gif)
掌握类定义的方法,理解类类型,实例的含义,体会面向对象程序设计中数据隐藏的概念。
理解构造函数和析构函数的作用和运行实际,掌握拷贝构造函数的作用。
并熟练掌握复杂对象类型的运用。
2、实验内容:
(1)定义一个时间类Time,它能提供由时分秒组成的时间。
要求能够修改时间和打印出时间。
(2)编写一个计数器类,定义一个私有数据成员,通过两个成员函数,分别使其完成加1和减1操作。
用构造函数数据成员初始化为0,输出函数可以输出数据成员函数的值。
(3)设计一个时间类,要求包含以下功能:
数据成员:
时、分、秒
成员函数:
各种构造函数
析构函数
可以通过函数分别设置时间的各个组成部分
也可以整体设置时间
有一个tick函数,负责给当前时间加1秒钟,然后输出新的时间
(4)定义一个分数类如下,要求实现各个成员函数,并在主函数中测试两个分数的加减乘除等运算。
classRational{
public:
Rational(intnn=1,intmm=1);
//构造
RationalR_add(Rational&
A);
//加
RationalR_sub(Rational&
//减
voidR_mul(Rational&
//乘
voidR_div(Rational&
A,Rational&
B);
//除
voidsimple();
//约分
voidprint();
//以分数形式显示,注意约分
private:
intm;
//分母
intn;
//分子
};
(5)定义一个类包含一个整型数的指针变量,在构造函数中用new分配10各整型数的内存空间,在析构函数中用delete释放内存空间,并编写给内存空间赋值和输出函数。
(6)编写类String的构造函数、析构函数
已知类String的原型为:
classString
{
public:
String(constchar*str=NULL);
//普通构造函数
String(constString&
other);
//拷贝构造函数
~String(void);
//析构函数
private:
char*m_data;
//用于保存字符串
请编写String的上述3个函数。
并编写一个主函数,在主函数中对所编写的成员函数进行测试。
(7)定义和实现类Array。
数据成员有包含了10个元素的数组,成员函数GetData,有一个整形数参数i,函数返回下标为i的元素值,对一个数组元素的引用,成员函数Print打印出数组的值。
构造函数将数据成员的所有数组元素初始化为0。
还有一个input成员函数为数组赋值。
(8)定义类Point.要求定义类对象时,可以有这样的定义语句:
Pointp1(1,2),p2(p1);
#include<
iostream.h>
classPoint
{
Point(inta,intb)
x=a;
y=b;
}
voidfun(Point&
p);
voidfun(Point*p);
private:
intx,y;
};
p)
x=p.x;
y=p.y;
cout<
<
"
Thefun(Point&
p)"
endl;
voidPoint:
:
fun(Point*p)
x=p->
x;
y=p->
y;
Fun(Point*p)"
Voidmain()
Pointp(1,2),q(3,4);
p.fun(q);
q.fun(&
q);
改正程序中小的错误,给出程序运行的结果,并对程序进行分析。
3、思考题:
结合编程实践回答下列的问题。
(1)结合第一个例子,说明什么是类?
什么是对象?
你是如何理解类和对象的?
(2)面向对象的程序设计与结构化程序设计有何不同?
(3)拷贝构造函数那些情况下会被调用,分别给出例子?
实验3this指针、常量和静态成员和友元函数的使用
1、实验目的和要求:
(1)掌握显式使用this指针的方法
(2)掌握静态数据成员的意义及使用方法
(3)掌握常量数据成员和常量成员函数的意义和使用方法
(4)掌握友元函数和友元类的使用方法
2、实验内容:
(1)有如下类的定义。
类成员函数copy用于实现两个对象的相互拷贝,请完成该函数的实现。
(有两种方法即不用this指针和用this指针)
#include<
classMyclass
{public:
Myclass(inta,intb){x=a;
Voidcopy(Myclass&
my);
voidprint()
{cout<
“x=”<
x<
endl;
cout<
”y=”<
y<
}
intx,y;
voidmain()
{Myclassmy(10,20),t(30,40);
my.print();
my.Copy(t);
my.print();
(2)设计一个类,实现两个复数的四则运算。
实现加减乘除功能的函数用友元函数实现。
(3)分析下面程序,给出横线部分的语句,并分析程序的输出,和m_count的功能。
#include<
iostream>
usingnamespacestd;
classA{
staticintm_counter;
A();
~A();
staticvoiddisplay();
——————————//将m_counter初始化为0;
A:
:
A()
m_counter++;
A:
~A()
m_counter--;
voidA:
display()
”Thereare:
”<
m_counter<
”objectsofclassA.\n”;
intmain()
Aa1;
Aa2;
Aa3;
A:
display();
a1.display();
(4)商店经销一种货物,货物成箱购进,成箱卖出,购进和卖出时以重量为单位,各箱的重量不一样,单价不一样,因此商店需要记录下目前库存的货物的总重量和总价值。
编写一个程序,通过定义类Carlo来模拟商店货物购进和卖出的情况。
(本题目主要练习静态数据成员的使用,定义私有变量存每件货物的价格和重量,用静态数据成员存货物的总重量和总价钱,定义构造函数和析构函数,当定义新的对象完成初始化的功能和删除对象时,从总重量和总价钱中减去对象的重量和价格)
(5)静态成员练习
1)。
编写一个类Node,声明一个数据成员member和已经静态成员count,另构造函数初始化数据成员,并把静态数据成员加1,另析构函数把静态数据成员减1。
2)。
在1)的基础上编写应用程序,创建3个对象,然后显示他们的数据成员和静态成员,再析构每个对象,并显示他们对静态数据成员的影响。
3)。
修改2),让静态成员函数访问静态数据成员,并让静态数据成员是私有的。
(6)个类分别为整型数集合类和实型数集合数类。
将缺少的内容补齐。
并完成要求的其它内容。
如:
classIntset
{private:
intnum[3];
Intset(intx,inty,intz)
{//添加初始化内容}
{//打印数据}
};
classfloatset
floatnum[3];
floatset(floatx,floaty,floatz)
//添加初始化内容
{//打印数据
(1)在Intset中再增加一个成员函数,将对象的整型数据拷贝的到floatset的对象中此成员函数的原型为:
voidsettofloat(floatset&
set);
//形参为拷贝的目标对象
(2)办法需要调用函数,程序的开销较大,可以定义一个友元函数来实现上述的功能。
请分别完成两个程序。
(7)分析以下程序的功能,把程序用三种方法(公有数据成员、友元、用成员函数访问私有数据成员)补充完整,实现对对象peppy的成员
classAnimal;
voidSetValue(Animal&
int);
int,int);
classAnimal
Animal():
itsWeight(0),itsAge(0){}
voidshow(){cout<
itsWeight<
endl<
itsAge<
protected:
intitsWeight;
intitsAge;
ta,inttw)
//设置itsWeight值
ta,inttw,inttn)
//设置itsWeight和itsAge值
Animalpeppy;
SetValue(peppy,5);
peppy.show();
SetValue(peppy,7,9);
return0;
(8)设计一个整数链表类,满足栈操作。
即,总在链表首插入结点,总在链表首取出(删除)结点。
类中需有记录结点个数的数据成员。
如果链表为空,而要做取出结点操作,则类必须给出错误信息。
编写应用程序,取100次随机数(范围10-200),每取到比前一个随机数大时,放入链表中,否则,略去。
然后逐个取出,求其和。
用堆分配方法逐个产生满足条件的结点,插入链表中。
每当从链表中取出一个结点时,要及时将结点删除。
求和工作不要在链表类中完成,以使该链表类具有通用性。
(1)什么是this指针,它的主要作用是什么?
(2)总结静态成员的特点。
实验4派生与继承
此实验用两个单元的时间完成,是一个综合性的实验,要求编写的程序涉及到C++的许多知识点,如类的定义,动态分配内存,构造函数,派生,虚基类等。
实验内容给出的是一个完整的程序,4个题目实际是类等级。
同学也可以在此基础上发挥增加新的内容。
1.定义一个基类MyArray,基类中可以存放一组数组。
ClassMyarray
{int*alist;
intlength;
Myarray(intleng);
~myarray();
voidinput();
voiddisplay();
编写构造函数,析构函数及其它函数,实现动态分配内存,释放内存和数据输入输出等功能。
并进行调试。
2.定义一个类averarray继承自myarray,在类中求数组的平均值,并输出。
进行调试。
3.定义一个类revarray继承自myarray,使数组按反序存放,并输出。
4.定义一个类Nawarray继承自averarray和revarray。
在继承过程中声明为虚基类,体会虚基类在解决二义性中的问题中的作用。
调试中可以试一试不用虚基类出现的问题。
5.读程序,回答问题
usingnamespacestd;
classA
voidf1();
A(){i1=10;
j1=11;
intj1;
inti1;
classB:
privateA
voidf2();
B(){i2=20;
j2=21;
intj2;
inti2;
classC:
publicB
voidf3();
C(){i3=30;
j3=31;
intj3;
inti3;
回答下列问题:
(1)派生类B中成员函数f2()能否访问基类A中的成员f1()、i1和j1?
(2)派生类B的对象b能否访问基类A中的成员f1()、i1和j1?
(3)派生类C中成员函数f3()能否访问直接基类B中的成员f2()、i2和j2?
能否访问间接基类A中的成员f1()、j1和i1?
(4)派生类C的对象c能否访问直接基类B中的成员f2()、i2和j2?
6.编写一个程序,实现字符串操作:
一个简单串类string,包含输入字符串、返回字符串长度及内容等功能;
另有一个具有编辑功能的串类edit_string,它继承string类,在其中设置一个光标,使其能支持在光标处的插入、替换和删除等编辑功能。
实验5多态性
1.实验目的和要求:
(1)理解多态性、虚拟函数、抽象类和具体类、静态绑定和动态绑定等概念
(2)学会利用虚函数来实现多态性,以便更好地来扩展和维护系统
(3)理解C++如何实现虚拟函数和动态绑定(*)
2.实验内容:
(1)以下是一个计算正方体、球体和圆柱体的面积和体积的程序。
试分析程序
并写出程序的运行结果,然后上机运行验证。
#include<
classcontainer
doubleradius;
container(doubleradius)
container:
radius=radius;
virtualdoublesurface_area()=0;
virtualdoublevolume()=0;
classcube:
publiccontainer
cube(doubleradius):
container(radius){};
doublesurface_area()
returnradius*radius*6;
doublevolume()
returnradius*radius*radius;
classsphere:
sphere(doubleradius):
return4*3.1416*radius*radius;
return3.1416*radius*radius*radius*4/3;
classcylinder:
doubleheight;
cylinder(doubleradius,doubleheight):
container(radius)
cylinder:
height=height;
return2*3.1416*radius*(height+radius);
return3.1416*radius*radius*height;
voidmain()
container*p;
cubeobj1(10);
sphereobj2(6);
cylinderobj3(4,5);
p=&
obj1;
"
输出结果:
正方体表面积:
p->
surface_area()<
正方体体积:
volume()<
obj2;
球体表面积:
球体体积:
obj3;
圆柱体表面积:
圆柱体体积:
(2)实现下图中的Shape层次结构。
每个TwoDimensionalShape类应包括成员函数getArea,以计算二维图形的面积。
每个ThreeDimensionalShape类包含成员函数getArea和getVolume,分别计算三维图形的表面积和体积。
编写一个程序,使用层次结构中每个具体类的对象的Shape向量指针。
程序要打印出向量元素所指的对象。
同样,再将所有形状存入向量的循环中,要能判断每个图形到底属于TwoDimensionalShape还是属于ThreeDimenionalShape。
如果某个图形是TwoDimensionalShape就显示其面积,如果某个图形是ThreeDimenionalShape,则显示其面积和体积。
(3)编写一个程序,先设计一个链表List类,再从链表类派生出一个集合类Set类,再集合类中添加一个记录元素个数的数据项。
要求可以实现对集合的插入、删除、查找和显示。
3.结合上机体会,回答下列问题
(1)多态性是如何让程序“普遍化”而非“特殊化”的?
试说明程序“普遍化”的主要好处。
(2)什么是虚拟函数?
请说明虚拟函数适用的环境。
(3)多态性是如何提高可扩展性的?
(4)说出静态绑定和动态绑定的区别,并试解释说明动态绑定究竟是如何实现的?
实验6IO流上机实验
1.实验目的和要求
(1)理解I/O流与标准流对象的意义
(2)掌握常用的IO成员函数:
(3)掌握文件的基本操作
(4)理解二进制文件与文本文件的区别
(5)熟练掌握文件的顺序读写方法
(6)熟练掌握文件的随机读写方法
2.实验内容:
(1)由希腊著名数学家埃拉托色尼提出求解素数的“筛选法”,
1)阅读程序改正其中的错误,使其能输出100以内的所有素数。
2)改写该程序,将1~Num以内的所有素数按清晰的格式写入文件中。
3)从文件中读出n~m(1<
n<
m<
Num)中的所有素数并统计该区间内素数的个数。
cmath>
constintMAX=100;
boolisPrime[MAX];
for(inti=0;
i<
MAX+1;
i++)
isPrime[i]=true;
isPrime[0]=isPrime[1]=false;
//1和0不是素数
intn=sqrt(MAX)+1;
for(i=2;
n;
{
//素数的整数倍不是素数,从而筛选掉所有不是素数的数
if(isPrime[i])
{
for(intj=2*i;
j<
MAX+1;
j=j+i)
isPrime[j]=false;
}
}
for(i=2;
if(isPrime[i])
cout<
i<
(2)课程管理程序
设计程序对学生选修课程情况进行记录和管理。
一名学生可选修多门课程,每条课程记录包括课程名,学分,选修学期和成绩等信息。
要求进行如下操作:
1)输入多个学生的选修课程信息,以清晰的格式写到文件中;
2)修改某个学生的选课记录,增加新选修的课程;
3)在文件中查找某个学生的信息,输出所有选修的课程;
4)删除某个学生的所有选课