c++实验讲义.docx
- 文档编号:23288779
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:26
- 大小:38.05KB
c++实验讲义.docx
《c++实验讲义.docx》由会员分享,可在线阅读,更多相关《c++实验讲义.docx(26页珍藏版)》请在冰豆网上搜索。
c++实验讲义
C++程序设计实验讲义
软件学院C++教学团队
目录
实验1C++基础1
实验2类的定义与应用1
实验3this指针、常量和静态成员和友元函数的使用3
实验4运算符重载6
实验5派生与继承7
实验6多态性8
实验7模板10
实验8IO流10
实验9windows程序设计11
实验1C++基础
1.实验目的和要求
目的:
快速掌握C++语言编程的方法,了解C++的增强功能,主要内容有:
(1)输入流、输出流的使用;
(2)重载、默认参数;(3)引用;(4)new和delete运算符分配内存。
2.实验内容:
(1)编写一个用输入和输出流运算符进行的输入和输出的程序。
从键盘输入两个数,分别对两个数进行加,减,乘和除的运算。
并输出计算结果,如:
23+123=146。
(2)用new和delete运算符动态分配内存空间的方法编写程序。
从键盘输入33整型数组的数据,并计算出所有元素之和,打印出最大值和最小值。
输入输出要用流运算符实现。
(3)编写C++风格的程序,解决百钱问题:
将1元人民币兑换成1,2,5分的人民币,有多少种换法?
(4)在主函数中定义2个整型元素a,b,用引用作函数参数的方法,在函数voidswap(int&x,int&y)中实现将数据交换存放,并在主函数中打印出来。
(5)假设我们班有50名同学,每个同学都报出自己的生日,每个同学的生日都不相重的概率只有0.0296,如果有100个同学,不相重的概率为3.072510-7。
相重复的概率如此之大与我们主观想象不同。
写一个程序,输入同学的人数n计算出其生日不重复的概率。
然后在用彷真的方法,利用随机数产生每个同学的生日,计算出生日不重复的概率并与前面的结果进行比较。
[学生的生日可以用随机数产生,rand()产生0—32767之间的伪随机数,因为此需要一个种子,种子不同产生的随机数列不同,rand()产生的随机数也不同,可以调用srand(longint*)函数设置种子,比如我们可以获得计算机中的时间获得随机数种子,以上函数需要包含头文件stdlib.h]
3.思考题:
结合上机的体会,回答下列问题.
(1)C++引入了I/O流运算符,与C语言相比,它们好处是什么?
(2)引用是C++的很重要的功能,在函数定义中,如何使用引用?
(3)函数重载设计不当会产生二义性问题,二义性主要体现在参数隐式类型转换和默认参数两个方面,举例说明两个问题,你认为该如何解决。
(4)C++中define与const定义常量有什么区别?
实验2类的定义与应用
1、实验目的和要求:
掌握类定义的方法,理解类类型,实例的含义,体会面向对象程序设计中数据隐藏的概念。
理解构造函数和析构函数的作用和运行时间,掌握拷贝构造函数的作用。
并熟练掌握复杂对象类型的运用。
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&A);//减
RationalR_mul(Rational&A);//乘
RationalR_div(Rational&A);//除
voidprint();//以简分数形式显示,注意约分
private:
voidsimple();//约分
intm;//分母
intn;//分子
};
(5)定义一个类包含一个整型数的指针变量,在构造函数中用new分配10个整型数的内存空间,在析构函数中用delete释放内存空间,并编写给内存空间赋值和输出的成员函数。
(6)完成String类
classString
{
public:
String(constchar*str=NULL);//普通构造函数
String(constString&other);//拷贝构造函数
~String();//析构函数
private:
char*m_data;//用于保存字符串
};
完成String的3个成员函数,并编写一个主函数,在主函数中对所编写的成员函数进行测试。
(7)完成Array类
classArray
{
public:
Array();//所有数组元素初始化为0
int&getData(inti);//返回下标为i的数组元素的引用
voidprint();//打印出所有数组元素的值
voidinput();//对所有数组元素进行输入
private:
intm_data[10];
};
完成Array的成员函数,并编写一个主函数,在主函数中对所编写的成员函数进行测试。
(8)定义圆类(由圆心坐标点类和半径组成),利用友元函数判断两个圆的位置关系(圆间关系包括相交、相切、相离)。
(9)定义类Point.要求定义类对象时,可以有这样的定义语句:
Pointp1(1,2),p2(p1);
#include
classPoint
{
public:
Point(inta,intb)
{
x=a;y=b;
}
voidfun(Point&p);
voidfun(Point*p);
private:
intx,y;
};
voidfun(Point&p)
{
x=p.x;
y=p.y;
cout<<"Thefun(Point&p)"< } voidPoint: : fun(Point*p) { x=p->x; y=p->y; cout<<"Fun(Point*p)"< } Voidmain() { Pointp(1,2),q(3,4); p.fun(q); q.fun(&q); } 改正程序中小的错误,给出程序运行的结果,并对程序进行分析。 3、思考题: 结合编程实践回答下列的问题。 (1)结合第一个例子,说明什么是类? 什么是对象? 你是如何理解类和对象的? (2)面向对象的程序设计与结构化程序设计有何不同? (3)拷贝构造函数那些情况下会被调用,分别给出例子? (4)实验3this指针、常量和静态成员和友元函数的使用 1、实验目的和要求: (1)掌握显式使用this指针的方法 (2)掌握静态数据成员的意义及使用方法 (3)掌握常量数据成员和常量成员函数的意义和使用方法 (4)掌握友元函数和友元类的使用方法 2、实验内容: (1)有如下类的定义。 类成员函数copy用于实现两个对象的相互拷贝,请完成该函数的实现。 (有两种方法即不用this指针和用this指针) #include classMyclass {public: Myclass(inta,intb){x=a;y=b;} voidcopy(Myclass&my); voidprint() {cout<<“x=”< cout<<”y=”< } private: intx,y; }; voidmain() {Myclassmy(10,20),t(30,40); my.print(); my.copy(t); my.print(); } (2)设计一个类,实现两个复数的四则运算。 实现加减乘除功能的函数用友元函数实现。 (3)分析下面程序,给出横线部分的语句,写出程序的输出结果并分析m_count的功能。 #include usingnamespacestd; classA{ staticintm_counter; public: A(); ~A(); staticvoiddisplay(); } ——————————//将m_counter初始化为0; A: : A() { m_counter++; } A: : ~A() { m_counter--; } voidA: : display() { cout<<”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]; public: Intset(intx,inty,intz) {//添加初始化内容} voidprint() {//打印数据} }; classfloatset {private: floatnum[3]; public: floatset(floatx,floaty,floatz) { //添加初始化内容 } voidprint() {//打印数据 } }; (1)在Intset中再增加一个成员函数,将对象的整型数据拷贝的到floatset的对象中此成员函数的原型为: voidsettofloat(floatset&set);//形参为拷贝的目标对象 (2)定义一个友元函数来实现上述的功能。 请分别完成两个程序。 (7)分析以下程序的功能,把程序用三种方法(公有数据成员、友元、用成员函数访问私有数据成员)补充完整,实现对对象Animal的成员 #include classAnimal; voidSetValue(Animal&,int); voidSetValue(Animal&,int,int); classAnimal { public: Animal(): itsWeight(0),itsAge(0){} voidshow(){cout< protected: intitsWeight; intitsAge; }; voidSetValue(Animal&ta,inttw) { //设置itsWeight值 } voidSetValue(Animal&ta,inttw,inttn) { //设置itsWeight和itsAge值 } intmain() { Animalpeppy; SetValue(peppy,5); peppy.show(); SetValue(peppy,7,9); peppy.show(); return0; } (8)设计一个整数链表类,满足栈操作。 即,总在链表首插入结点,总在链表首取出(删除)结点。 类中需有记录结点个数的数据成员。 如果链表为空,而要做取出结点操作,则类必须给出错误信息。 编写应用程序,取100次随机数(范围10-200),每取到比前一个随机数大时,放入链表中,否则,略去。 然后逐个取出,求其和。 用堆分配方法逐个产生满足条件的结点,插入链表中。 每当从链表中取出一个结点时,要及时将结点删除。 求和工作不要在链表类中完成,以使该链表类具有通用性。 (9)设计合适的类结构,完成多项式加、减、乘运算。 3、思考题: 结合编程实践回答下列的问题。 (1)什么是this指针,它的主要作用是什么? (2)总结静态成员的特点。 (3)分别介绍const修饰数据成员、函数成员、对象的作用。 (4)用合适的数据结构(给出类声明)描述下面的问题: 一个老师可以有多个助教,每个助教可以辅导多名学生。 实验4运算符重载 1、实验目的和要求 (1)掌握运算符重载的语法要点,理解成员函数与友元函数重载运算符的区别。 (2)掌握各种运算符的重载方法,理解引用形式作为参数和返回值的特点。 2、实验内容 (1)定义描述平面点类Point,重载减号运算符计算两个点的距离,分别用成员函数与友元函数实现。 重载运算符<<输出点的坐标[x,y],给出类以及相关函数的定义。 #include #include usingnamespacestd; classPoint { public: Point(inta=0,intb=0): x(a),y(b){} voidsetPoint(inta,intb){x=a;y=b;} ...... private: intx,y;//平面坐标 }; intmain() { Pointp1(2,1),p2; doubled=p1-p2;//计算两点距离 cout< return0; } (2)描述有理数的Rational类如下,请补充类的其他成员使其能够执行各种运算。 ClassRational { longnumerator;//分子 longdenominator;//分母 ........ }; 1)重载算术运算符“+”、“-”、“*”、“/”,使之能够适用于有理数的四则运算。 2)重载比较运算符“>”、“<=”和“==”,使之能够比较两个有理数。 3)重载运算符“<<”,使其能以规范的方式输出分数,如1/2,-1/3,分母不能为0。 (3)定义一个集合类Set,最多存放100个不重复的整数,实现集合的如下操作: 1)增加某个整型元素时,保证集合中没有重复元素;删除指定的元素,查找该元素在集合中则从集合中删除该元素; 2)重载运算符“+”,实现两个集合对象的合并操作,重载运算符“*”,求两个集合对象的交集;例如Sets,s1,s2;s=s1+s2;s=s1*s2; 3)重载赋值运算符=和复合赋值运算符-=,实现两个集合对象的赋值操作与差集操作。 例如Sets1,s2;s1=s2;s1-=s2;集合S1中去掉S2中存在的元素。 (4)定义描述时间的Time类,包括数据成员小时hour、分钟minute和秒second,定义相关函数实现如下操作: 1)重载运算符“+”与“-”,能够实现时间对象与整数秒的加减操作。 2)重载运算符“<<”输出时间对象,能够按照“小时: 分钟: 秒”的方式显示时间。 3)重载运算符“++”与“--”,要求能够实现时间的合理自增自减功能(秒数的增减)。 (5)设计字符串类String,若有String类对象s1、s2和s3,重载运算符实现如下操作: 1)重载“+”实现字符串连接功能,使表达式s1=s2+s3成立; 2)重载“<”判断两个字符串的大小,如if(s1 3)重载“<<”与“>>”,实现字符串的输入与输出操作,如cin>>s2;cout< 4)重载运算符“()”,从字符串对象中返回一个子串。 如s1(2,4)表示返回从子串,即从s[2](s1第3个字符)开始的子串(包括s1[2]、s1[3]和s1[4]三个字符)。 (6)【选作】开发多项式类Polynomial,多项式的每一项用数组或结构体表示,每项包含一个系数和一个指数。 例如2x4的指数为4,系数为2。 请开发一个完整的Polynomial类,包括构造函数、析构函数以及get函数和set函数。 该类还要提供下述重载的运算符: 1)重载运算符“+”和“-”,将两个多项式相加或相减。 2)重载乘法运算符“*”,将两个多项式相乘。 3)重载赋值运算符“=”,将一个多项式赋给另外一个多项式。 实验5派生与继承 1、实验目的和要求: 此实验用两个单元的时间完成,是一个综合性的实验,要求编写的程序涉及到C++的许多知识点,如类的定义,动态分配内存,构造函数,派生,虚基类等。 实验内容给出的是一个完整的程序,4个题目实际是类等级。 同学也可以在此基础上发挥增加新的内容。 2、实验内容: 1.定义一个基类MyArray,基类中可以存放一组数组。 ClassMyarray {int*alist; intlength; public: Myarray(intleng); ~myarray(); voidinput(); voiddisplay(); }; 编写构造函数,析构函数及其它函数,实现动态分配内存,释放内存和数据输入输出等功能。 并进行调试。 2.定义一个类averarray继承自myarray,在类中求数组的平均值,并输出。 进行调试。 3.定义一个类revarray继承自myarray,使数组按反序存放,并输出。 进行调试。 4.定义一个类Nawarray继承自averarray和revarray。 在继承过程中声明为虚基类,体会虚基类在解决二义性中的问题中的作用。 调试中可以试一试不用虚基类出现的问题。 5.读程序,回答问题 #include usingnamespacestd; classA { public: voidf1(); A(){i1=10;j1=11;} protected: intj1; private: inti1; }; classB: privateA { public: voidf2(); B(){i2=20;j2=21;} protected: intj2; private: inti2; }; classC: publicB { public: voidf3(); C(){i3=30;j3=31;} protected: intj3; private: 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? 能否访问间接基类A中的成员f1()、j1和i1? 6.编写一个程序,实现字符串操作: 一个简单串类string,包含输入字符串、返回字符串长度及内容等功能; 另有一个具有编辑功能的串类edit_string,它继承string类,在其中设置一个光标,使其能支持在光标处的插入、替换和删除等编辑功能。 实验6多态性 1.实验目的和要求: (1)理解多态性、虚拟函数、抽象类和具体类、静态绑定和动态绑定等概念 (2)学会利用虚函数来实现多态性,以便更好地来扩展和维护系统 (3)理解C++如何实现虚拟函数和动态绑定(*) 2.实验内容: (1)以下是一个计算正方体、球体和圆柱体的面积和体积的程序。 试分析程序 并写出程序的运行结果,然后上机运行验证。 #include classcontainer { protected: doubleradius; public: container(doubleradius) { container: : radius=radius; } virtualdoublesurface_area()=0; virtualdoublevolume()=0; }; classcube: publiccontainer { public: cube(doubleradius): container(radius){}; doublesurface_area() { returnradius*radius*6; } doublevolume() { returnradius*radius*radius; } }; classsphere: publiccontainer { public: sphere(doubleradius): container(radius){}; doublesurface_area() { return4*3.1416*radius*radius; } doublevolume() { return3.1416*radius*radius*radius*4/3; } }; classcylinder: publiccontainer { doubleheight; public: cylinder(doubleradius,doubleheight): container(radius) { cylinder: : height=height; } doublesurface_area()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 实验 讲义