c++实验题教学内容Word格式文档下载.docx
《c++实验题教学内容Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《c++实验题教学内容Word格式文档下载.docx(42页珍藏版)》请在冰点文库上搜索。
![c++实验题教学内容Word格式文档下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/2/e9cd43ef-4e00-43bb-919e-71b025a64dd6/e9cd43ef-4e00-43bb-919e-71b025a64dd61.gif)
一、实验目的
1、了解内联函数、重载函数、带默认参数函数的定义及使用方法。
2、掌握作用域的概念、变量的存储类型及它们之间的差别。
3、掌握程序的多文件组织。
二、实验内容
1、重载函数允许不同的函数使用相同的名字,这使得完成类似的任务时可以使用相同的函数名。
编写几个计算面积的函数,分别计算圆、矩形、梯形和三角形的面积,计算边长为1的正方形及其内切圆、内接等腰三角形和等腰梯形面积。
函数原型如下:
doublearea(doubleradius=0);
//圆面积,参数为半径,默认参数为0,表示点面积doublearea(doublea,doubleb);
//计算矩形面积,参数为长和宽doublearea(doublea,doubleb,doubleh);
//计算梯形面积,参数为两底和高doublearea(doublea,doubleb,doublec,int);
//计算三角形面积,参数为三边长,int型参数起标示作用,以区别于梯形,不参加计算。
【要求】
(1)编译运行程序,并记录运行结果,注意函数调用时,实参与形参之间的关系(包括类型、个数)。
(2)若将计算矩形面积的函数原型改为doublearea(doublea=0,doubleb=0);
重新编译运行情况会怎样?
为什么?
(3)若将计算三角形面积的函数原型改为doublearea(doublea,doubleb,doublec);
程序还能正确运行吗?
(4)若将计算三角形面积的函数原型改为doublearea(doublea,doubleb,doublec=0,int);
程序还能正确运行吗?
2、编程:
将上题以多文件方式组织,在area.h中声明各个area()函数原型,在area.cpp中定义函数,然后在Exp9_2.cpp中包含area.h,并定义main()函数并执行。
【注意:
】VC++6.0中以c开头的头文件,如不在标准名字空间中,所以area.cpp中不可以加usingnamespacestd;
3、范例:
全局变量、局部变量和静态局部变量的应用示例。
【要求】
(1)分析并写出下列程序的执行结果,然后输入计算机执行,比较分析结果与执行结果。
如果两结果不相同请分析原因。
4、设计两个重载函数,分别求两个整数相除的余数和两个实数相除的余数。
两个实数求余定义为实数四舍五入取整后相除的余数。
实验十类与对象的基本概念
类是C++扩展数据类型,可以封装不同类型的数据成员和函数成员。
类是面向对象程序设计的基础。
本次实验内容包括面向对象的基本概念、构造函数与析构函数,从实际问题抽象出类等,通过实验要求掌握以下内容:
1、掌握面向对象的基本概念和类的定义方法。
2、掌握类成员的访问权限以及访问类成员的方法。
3、掌握内联函数和默认函数。
4、掌握构造函数和析构函数的意义及使用方法。
1、范例:
设计并测试一个矩形类(Rectangle)。
属性为矩形的左下角与右上角的坐标,矩形水平放置。
操作为计算矩形的周长和面积。
程序】
(1)将Rectangle(doublel=0,doublet=0,doubler=0,doubleb=0);
改为Rectangle(doublel,doublet,doubler,doubleb);
程序仍能正确运行吗?
(2)注意成员函数voidShow()、doubleArea()、doublePerimeter()的使用,因为在第三章如果需编写类似功能的一般函数是需要带参数(形参)的。
而在此处作为类的成员函数又不需要带参数。
思考为什么?
(3)理解voidAssign(doublel,doublet,doubler,doubleb);
函数的作用。
将Rectangle(doublel=0,doublet=0,doubler=0,doubleb=0);
改为Rectangle(doublel,doublet,doubler,doubleb);
这时,有人认为Rectangle(doublel,doublet,doubler,doubleb)和voidAssign(doublel,doublet,
doubler,doubleb)的功能相同,那么Assign函数能否去掉呢?
请试一试,结果会怎样?
2、定义一个圆类(Circle),要求用两种方法定义:
方法一:
要求属性为半径,操作为计算圆的周长和面积。
方法二:
要求属性为半径(radius)、圆周长和面积,操作为输入半径,并计算周长、面积,输出半径、周长和面积。
要求定义构造函数(以半径为参数,缺省值为0,周长和面积在构造函数中生成)和拷贝构造函数。
3、设计一个学校在册人员类(Person)。
数据成员包括:
身份证号(IdPerson),姓名(Name),性别(Sex),生日(Birthday)和家庭住址(HomeAddress)。
成员函数包括人员信息的录入和显示等。
★选做题4、编程建立一个分数类。
分数类的数据成员包括分子和分母,操作包括约分、通分、加、减、乘、除、求倒数、比较、显示和输入。
分数类的定义如下:
【要求】完成上述所有成员函数并进行检验。
★选做题5、集合是具有同一属性(共性)而又能互相区别(个性)的多个成员汇集起来的整体,构成集合的每个成员称为集合的元素,元素间没有顺序关系。
例如,所有的大写英文字母是一个集合,它包括26个元素:
A、B、…、Z。
不包含任何元素的集合称为空集合。
【实验要求]】
自定义一个集合类set,采用数组存放集合的元素。
自定义集合运算包括:
1)判断元素elem是否为集合set的元素。
2)为集合添加一个元素elem。
3)从集合中删除一个元素elem。
4)复制一个集合,其元素与原集合完全一样。
5)显示集合中的所有元素。
6)求两个集合中相同的元素,即求两个集合的交集。
7)求两个集合中所有的元素,即求两个集合的并集。
8)判断两集合包含的元素是否完全相同。
9)判断一个集合是否被包含在另一个集合之中,即是否为另一个集合的子集。
*/
【程序】
cout<
<
"
删除部分元素后:
endl;
s"
;
s.print();
s1"
s1.print();
s2"
s2.print();
return0;
}
实验十一引用与复制构造函数
一.实验目的
1、掌握引用的概念及应用,掌握引用作为函数参数的方法。
2、学会编写与应用复制构造函数。
二.实验内容
1、范例:
编写一个函数,其原型为:
voidIndex(inta[],intn,int&
sub),其功能是,在大小为n的数组a中,查找某个数sub,
若找到,将其下标存放在sub中,若没找到,将-1存放在sub中,在主调函数中通过判断值来判断数组中是否有该数。
在这里,sub是引用类型的参数,但起返回值的作用。
(1)修改主程序连续查找数字的循环语句,使程序能在输入特定数字后退出循环。
(2)将voidIndex(inta[],intn,int&
sub);
改为voidIndex(inta[],intn,intsub);
程序还能正确执行吗?
试分析其结果并解释。
(3)在上述修改的基础上如果结果不正确,怎样修改可以同样得到正确的结果。
2、一个声明为返回引用的函数,既可以作为右值出现在赋值号的右边,也可以作为左值出现在赋值号的左边。
下面是一个函数调用本身作为左值的例子。
修改程序使用非返回引用的函数实现上述功能。
试分析两者之间的区别。
3、为矩形类定义复制构造函数。
矩形类见主教材的例4.2.
在rect.h头文件中的类rect定义中加入以下代码:
Rectangle(Rectangle&
rec);
在rect.cpp文件中添加以下代码:
Rectangle:
:
rec){
left=rec.left;
top=rec.top;
right=rec.right;
bottom=rec.bottom;
}//复制构造函数
在main()函数中添加以下代码:
Rectanglerect2(rect1);
cout<
<
”由复制构造函数生成的rect2:
”<
rect2.Show();
这里的复制构造函数是默认的按成员语义定义的,可以不写,系统会自动提供。
★选作题4、编程:
将实验十中的分数类的分数类型参数改为引用,并添加复制构造函数。
实验十二运算符重载
1、掌握运算符重载为成员函数的方法
2、理解友元函数和友元类。
3、掌握运算符重载为友元函数的方法。
4、使用静态数据成员。
1、为主教材中例4.2的Rectangle类增加加减复合赋值和加减运算符重载函数。
加减复合赋值语义定义为固定长方形的左上角,
对右下角的坐标进行加减运算,使新矩形的长宽为原两矩形长宽之和或差,对加和减复合赋值定义为成员函数。
两个矩形加减运算定义为友元函数。
【要求】
(1)主程序如下,请完成类的定义及相关成员函数和友元函数的实现,并分别保存为rect.h文件和rect.cpp文件。
rect2.Show();
2、编程:
修改上题,要求如下:
(1)将加、减运算重载为成员函数。
(2)为矩形类在增加一个静态数据成员Counter,并统计共产生了多少个矩形对象。
为Counter添加定义、赋初值以及随程序运行而变化的代码,并在main()函数中将其输出。
注意静态数据成员应该有定义性说明。
3、为复数类(Complex)增加重载的运算-、-=、*=和/=。
分别使用成员函数和友元函数各做一遍。
并测试。
实验十三数组与多维数组
1、熟练应用数组与多维数组
2、掌握数组作为函数参数的函数定义及调用方法。
1.范例:
求一个3×
4矩阵中的最大元素,将求矩阵中的最大元素的过程定义为一个函数。
函数的第一个参数是矩阵本身,第二个参数是第一维的大小。
这种方法的优点是使函数具有通用性,即无论一个矩阵的第一维是多大,只要该矩阵的第二维是4个元素,都可用该函数求最大元素;
也可用该函数求一个矩阵开始几行中的最大元素。
修改上述程序使其不仅求矩阵中的最大元素而且还能求最大元素的行列值。
2.打印杨辉三角形(10行)。
使用二维数组并利用每个系数等于其上两系数之和。
3.分别编写实现下列字符数组处理的函数,用数组作为参数:
(1)voidtrim(chars[])//删除字符串s的尾部空格。
(2)voidlefstring(chars1[],chars2[],intn)//得到指定字符串s1中前n个字符的子串s2.
(3)intindex(chars1[],chars2[])
//检查字符串s2是否为字符串s1的子串,根据查找结果返回s2在s1中的开始位置,如果s2不是s1的子串,则返回-1
主程序如下,请编写相应函数。
4.编程:
编写函数itoa0(intn,chars[],intb),将十进制整数n转换为以十六进制为基数的数字字符数组。
实验十四指针与数组
数组在处理同类型的多个数据问题时非常有效,是C++的重要数据类型。
指针是C++中最灵活、最有特色的部分,没有熟练掌握指针,则不能说学会了C++。
指针的教学重点应放在数组与指针之间的密切关系上。
通过本实验要求掌握以下内容:
1.指针的定义和使用方法
2.指针与数组的相互关系
3.指针或数组作为函数参数的函数定义及调用方法。
4.C字符串及其运算
5.标准字符串
1.范例:
判断用户输入的C字符串是否为"
回文"
,所谓"
是指顺读和反读都一样的串,例如串12321、madam。
(1)重新定义回文为:
滤去所有非字母字符(包括空格)后,不考虑字母的大小写,从左向右和从右向左读都相同的词或短语。
如,”Madam,I’madam”和“Golf,NoSir,preferprisonflog!
”
(2)编写一个判断输入字符串是否为回文的函数,并使用指针形式访问数组元素。
2.范例:
按一定的规则可以将一个字符串经加密转换为一个新的串,例如加密的简单方法是当为'
a'
~'
y'
的小写字母时用后一个字母代替前一个字母,
其中'
z'
变换为'
,其他字符时不变。
例如:
原串为Thisisasecretcode!
加密后的串为Tijtjtbtfdsfudpef!
编写一个程序对输入串加密,输出加密前和加密后的串,再将加密后的字符串解密输出。
主函数如下,请编写加密函数和解密函数。
intmain()
{charst[]="
Thisisasecretcode!
st<
secret(st);
desecret(st);
}
(1)阅读程序,如果将两个函数中elseif(*s==122)*s='
和elseif(*s==97)*s='
处的else去掉,对程序有何影响?
使用数据”Iamaboy!
”重新测试看看。
(2)仿造上例编写程序:
设计一个带密钥的加密算法,例如密钥可以是一个常数,字符串加密的方法是将每个字符的ASCII码值加上该常数,然后对128求模。
要求以密钥将加密的字符串加密输出,再以相同的密钥将加密字符串解密输出。
3.编程:
重新编写实验十三中题3的字符串处理函数,用指针作为参数。
实验十五动态内存分配与深复制
1.理解运行时内存分配的概念,掌握自由存储区内存动态分配的方法。
2.理解内部包含为指针动态分配内存的类对象复制时的浅复制和深复制的概念,会编写深复制构造函数和赋值复制运算符。
二、实验内容
1.编程:
仿照标准字符串类string,采用动态字符数组来改造主教材5.6.3节中的自定义字符串类,要求可自动适应不同的串长度。
【提示】新的自定义字符串类mysring如下:
classmystring
{char*str;
intmaxsize;
intlast;
public:
mystring();
mystring(char*s);
mystring(mystring&
st);
~mystring();
voidshow();
char&
operator[](inti);
mystring&
operator=(mystring&
);
operator=(char*);
//这里重载的=是把C风格字符串赋给mystring
mystringoperator+(mystring&
mystringoperator+=(mystring&
booloperator<
(mystring&
booloperator==(mystring&
};
请读者完成各函数的定义,并测试。
【分析】
本题的难点是判断串长是否超出串的最大允许长度,以及怎样重新分配字符数组,并保留原来的字符数组。
2.为使用本实验第1题所定义的自定义字符串类的学生类和使用动态C风格字符串的学生类编写复制构造函数。
对比两者的差别,主要是复制构造函数student(student&
std)和复制构造函数dstudent(dstudent&
std)的实现。
请按提示要求完成两复制构造函数,其余代码已给出。
实验十六继承和派生的基本概念
继承与派生是面向对象的特性,是面向对象程序设计模拟客观世界的手段之一,本实验的内容包括介绍MFC基础类的派生关系,通过实验要求掌握以下内容。
1.掌握类继承与派生关系以及实现方法,理解类的层次结构。
2.掌握派生类构造函数初始化基类成员和对象成员的方法。
3.掌握赋值兼容原则,掌握派生类的复制构造函数和赋值运算符的定义。
定义一个继承与派生关系的类体系,在派生类中访问基类成员。
先定义一个点类,包含x,y坐标数据成员,显示函数和计算面积的函数成员;
以点为基类派生一个圆类,
增加表示半径的数据成员,重载显示和计算面积的函数;
定义一个线段类,以两个点类对象作数据成员,定义显示、求面积及长度函数,线段类采用聚合方式,因为有两个端点,
不能用派生方式。
编程测试所定义的类体系。
cl3=cl1;
cl3圆面积:
cl3.Area()<
cl3.Show();
线面积:
ln1.Area()<
'
\t'
线长度:
ln1.GetLength()<
ln1.Show();
ln2.Show();
在Point类中,将Line类定义为友元,便于在Line类中访问;
Point类的x和y定义为Protected访问权限,便于派生类访问。
注意派生类的构造函数中对基类数据成员的初始化方法(即Circle(doublexv,doubleyv,doublevv):
Point(xv,yv)),
以及构造函数中对对象成员的初始化方法(即Line(doublexv1,doubleyv1,doublexv2,doubleyv2):
start(xv1,yv1),end(xv2,yv2){})
(1)建立工程,录入上述程序,改变数据实验之。
(2)修改Point类的数据成员x,y的访问权限为private,再运行,结果如何?
(3)如果不将Line类设为Point类的友元,应采取什么措施?
为哪个类增加数据或函数成员?
2.编程:
多层派生练习,由上题Point类和Circle类继续派生出Cylinder类。
要求计算圆柱体的底面积、侧面积、全面积和体积
实验十七多重继承与虚基类
1.理解多重继承的概念
2.理解为了避免同一基类出现多个重复的副本而采用的虚基类概念和虚拟继承。
1.编程:
已知时间类TimeType和日期类DateType,先通过多重继承定义日期时间类DateTimeType1,
然后使用聚合方式定义功能完全一样的日期时间类DateTimeType2。
时间类的定义如下:
year=y;
voiddisplay()
{
month<
/"
day<
year<
voidSetDate(intmo,intd,inty)
{
month=mo;
day=d;
year=y;
}
【要求】请使用两种方法定义日期时间类,并测试之。
2.由汽车类派生出轿车类和卡车类,再由轿车类和卡车类多重派生出皮卡类。
所谓皮卡指的是将轿车的后备箱改为卡车似的后厢,可以兼运少量货物。
汽车类可以说明为虚基类以避免在皮卡类中出现两组汽车类的数据。
请编写程序实现上述各类,并测试之。
(1)修改上述程序不使用虚基类实现,应采取什么措施?
结果会有何不同?
实验十八虚函数与多态、纯虚函数
1.在掌握继承与派生关系的基础上,进一步理解虚函数与多态性的关系,实现运行时的多态。
2.学会定义和使用纯虚函数
了解"
单界面,多方法"
的概念。
现有称为figure的基类,存放了各二维对象(三角形、矩形和圆形三个类)的各维数据,set_dim()设置数据,是标准成员函数。
show_area()为虚函数,因为计算各对象的面积的方法是不同的。
#include<
iostream>
usingnamespacestd;
classfigure{
protected:
doublex,y;
voidset_dim(doublei,doublej=0)
{x=i;
y=j;
}
virtualvoidshow_area()
{cout<
Noareacomputationdefinedforthisclass.\n"
classtriangle:
publicfigure{
voidshow_area()
Trianglewithhe