《C++程序设计》实验指导书1.docx

上传人:b****6 文档编号:5894564 上传时间:2023-01-02 格式:DOCX 页数:11 大小:21.81KB
下载 相关 举报
《C++程序设计》实验指导书1.docx_第1页
第1页 / 共11页
《C++程序设计》实验指导书1.docx_第2页
第2页 / 共11页
《C++程序设计》实验指导书1.docx_第3页
第3页 / 共11页
《C++程序设计》实验指导书1.docx_第4页
第4页 / 共11页
《C++程序设计》实验指导书1.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

《C++程序设计》实验指导书1.docx

《《C++程序设计》实验指导书1.docx》由会员分享,可在线阅读,更多相关《《C++程序设计》实验指导书1.docx(11页珍藏版)》请在冰豆网上搜索。

《C++程序设计》实验指导书1.docx

《C++程序设计》实验指导书1

C++程序设计

实验指导书

东北大学软件学院

2013年9月

实验要求

《C++程序设计》课程实验的目的是为了使学生在课堂学习的同时,通过一系列的实验,使学生加深了解和更好地掌握《C++程序设计》课程教学大纲要求的内容。

在《C++程序设计》的课程实验过程中,要求学生做到:

(1)预习实验指导书有关部分,认真做好实验内容的准备,就实验可能出现的情况提前作出思考和分析。

(2)仔细观察程序调试过程中出现的各种问题,记录主要问题,作出必要说明和分析。

(3)认真书写实验报告。

(4)遵守机房纪律,服从辅导教师指挥,爱护实验设备。

(5)实验课程不迟到。

如有事不能出席,所缺实验一般不补。

(6)本实验采用的开发环境为MicrosoftVisualC++6.0,同学在做实验之前要求熟悉该集成开发环境。

实验的验收将分为两个部分。

第一部分是上机操作,包括检查程序运行和即时提问。

第二部分是提交书面的实验报告。

实验1C++程序设计基础(4学时)

1.实验目的

1)学习编写简单的C++程序,并掌握C++程序的基本格式与规范。

2)理解C++程序结构的特点。

3)掌握函数的定义和调用方法。

4)练习重载函数的使用。

5)掌握指针的使用方法。

6)练习通过动态内存分配实现动态数组,并体会指针在其中的作用。

7)熟悉流类库中常用的类及其成员函数的用法。

8)学习标准输人输出及格式控制。

9)学习对文件的应用方法(二进制文件、文本文件)。

10)学习使用VC++的debug调试功能,使用stepinto追踪到函数内部。

2.实验类型

验证型和设计型。

3.实验基本要求

1)输人并运行所给的参考程序1,并将程序中的注释部分也输人计算机,体会和理解程序的基本格式规范。

2)编写重载函数Maxl可分别求取两个整数,三个整数,两个双精度数,三个双精度数的最大值。

3)编写并测试3X3矩阵转置函数,使用数组保存3X3矩阵。

4)使用动态内存分配生成动态数组来重新完成上题,使用指针实现函数的功能。

5)编写程序,用二进制方式读写指定的文件a.bin,在每一行前加行号,写入另一个二进制文件b.bin中,从b.bin中读取数据输出到屏幕。

4.实验基本步骤

1)建立一个控制台应用程序项目baseforml,向其中添加一个源程序文件sum.cpp。

按照所给的程序代码输人到计算机中,检查和调试程序,在确认没有发现错误之后,选择[Build]--[Buildsum.exe]编译源程序,再选择[Build]-[Executesum.exe]运行程序,并观察输出结果。

若有问题,则需要重新检查程序。

说明:

在C++程序中如果使用了系统提供的一些功能(如cin和cout),就必须在程序的首部首先声明相关的包含这些功能的头文件(如iostream.h),否则,系统无法找到实现这些功能的代码。

//参考程序1

//sum.cpp

#include

intadd(inta,intb);

intmain()

intx,y,sum;

cout<<"Entertwonumbers:

\n";

cin>>x;

cin>>y;

sum=add(x,y);

cout<<"Thesumis:

"<

return0;

intadd(inta,intb)

intc;

c=a+b;

returnc;

2)分别编写四个同名函数maxl,实现函数重载,在main()函数中测试函数功能。

程序名:

lab1_2.cpp。

3)编写矩阵转置函数,输人参数为3X3整型数组,使用循环语句实现矩阵元素的行列对调,注意在循环语句中究竟需要对哪些元素进行操作,编写main()函数实现输入、输出。

程序名:

lab1_3.cpp。

4)改写矩阵转置函数,参数为整型指针,使用指针对数组元素进行操作,在main()函数中使用new操作符分配内存生成动态数组。

通过debug观察指针的内容及其所指的对象中的内容。

程序名:

lab1_4.cpp。

5)编写程序lab1_5.cpp,使用voidmain(intargc,char*argv[])函数中的参数传递操作的文件名,定义ofstream的对象对文件进行操作,使用read()和write()成员函数读入数据,使用输出流对象输出数据到文件和屏幕。

6)使用debug中的StepInto追踪到函数内部,观察函数的调用过程。

5.实验思考题

1)重载函数是通过什么来区分?

2)new和delete操作符与C语言中的malloc()和free()函数有何异同点?

3)C++提供的输入输出操作与C语言的输入输出操作的异同点?

4)什么是流?

使用流有那些好处?

5)C++与定义了那些流?

他们分别与什么设备相连?

 

实验2类和对象(4学时)

1.实验目的

1)学习类与对象的定义。

2)掌握类与对象的使用方法。

3)学习类和对象的声明。

4)学习具有不同属性的数据成员与成员函数的访问方式。

5)理解构造函数和析构函数的定义与执行过程。

6)学会类的聚集使用方法。

7)理解静态数据成员和静态成员函数的含义。

8)理解什么是运算符重载,掌握运算符重载的方法。

2.实验类型

设计型。

3.实验基本要求

1)下面是“平面上点”类的定义:

classCPoint

{

private:

intx,y;

staticintnCount;//nCount用于保存点的个数

public:

CPoint(intpx=0,intpy=0);

CPoint(CPoint&);

~CPoint();

intGetX();

intGetY();

voidSetX(int);

voidSetY(int);

voidShowPoint();

};

请完成该类中各成员函数的定义。

2)下面是“平面上线段”类的定义:

classCLine

{

private:

CPointpt1,pt2;//pt1和pt2分别代表该线段的起点和终点

public:

CLine();

CLine(intx1,inty1,intx2,inty2);

CLine(CPointp1,CPointp2);

doubleDistance();//计算该线段长度的成员函数

voidShowLine();

};

请完成该类中各成员函数的定义。

并利用VC调试工具观察含有组合关系类的构造函数和析构函数的执行情况。

3)以成员函数的方式,重载题目1中的CPoint类的“+”运算符,返回的CPoint类对象的横纵坐标值分别等于原两点的横纵坐标值之和;以全局函数的方式重载CPoint类的“-”运算符,返回的CPoint类对象的横纵坐标值分别等于原两点的横纵坐标值之差。

4)对于题目1中的CPoint类,重载“>>”运算符使得像cin等输入流对象能够写CPoint类对象,再重载“<<”运算符使得像cout等输出流对象能够输出CPoint类对象。

4.实验基本步骤

1)该类是一个基本的类。

在编写该类时,要注意对静态成员nCount的操作,使其能够正确表示程序中点的个数。

编完该类后,要在main()函数中进行测试,分别定义CPoint类的对象、指针、引用,对各成员函数进行调用。

分析对静态成员的调用和一般成员的调用方式有什么不同。

2)要思考如何对类中3个构造函数CLine(),CLine(intx1,inty1,intx2,inty2)和CLine(CPointp1,CPointp2);的编写,分析什么是初始化列表。

完成后要在main()中进行测试。

3)以成员函数方式重载的“+”操作符的原型为:

CPointCPoint:

:

operator+(CPointpt);以全局函数方式重载的“-”操作符的原型为:

CPointoperator-(CPointpt1,CPointpt2);分析以成员函数方式和全局函数方式重载运行符的异同点。

4)重载的“>>”操作符的原型为:

istream&operator>>(istream&,CPoint&);重载的“<<”操作符的原型为:

ostream&operator>>(ostream&,CPoint);思考一下,重载的“>>”操作符和“<<”操作符能否作为CPoint类的成员函数来实现。

5.实验思考题

1)类和结构体的区别是什么?

2)类的成员函数与普通的函数有何区别?

3)构造函数和析构函数的作用是什么?

4)类的访问控制权限有何意义?

5)什么是封装?

类是如何进行封装的?

6)类的静态成员函数和普通成员函数有什么不同?

7)根据自己的理解叙述运算符重载的作用?

 

实验3继承与多态(4学时)

1.实验目的

1)学习定义和使用类的继承关系,定义派生类。

2)熟悉不同继承方式下对基类成员的访问控制。

3)学习使用虚函数实现动态多态性。

4)学习利用虚基类解决二义性问题。

2.实验类型

设计型。

3.实验基本要求

1)使用实验2中的CPoint类,定义“空间中点”类如下:

classCThreePoint:

publicCPoint

{

private:

intz;

public:

CThreePoint();

CThreePoint(int,int,int);

intGetZ();

voidSetZ(intpz);

virtualvoidShowPoint();

};

请完成该类中各成员函数的定义。

并利用VC调试工具观察含有继承关系类的构造函数和析构函数的执行情况。

分析为什么要把ShowPoint()函数设置为虚函数?

有什么作用?

请在main()函数中做测试。

2)下面是一个“Shape”基类的定义:

enumColorType{White,Black,Red,Green,Blue,Yellow,Magenta,Cyan};

//为图形形状定义Shape基类

class Shape

{

protected:

ColorType color;

public:

Shape(ColorTypec);

virtualvoiddraw();

};

使用Shape类和CPoint类设计一个可在屏幕上作图的简单实例,要求是不必真正在屏幕上实现作图,只是有一个示意即可。

例如:

画一个矩形,不必真正画出矩形,只需输出一句话:

“Thisisarectangle!

”即可。

要求可画线段、矩形和圆形。

要用到继承,虚函数,多态,数据的封装,构造函数的实现等等各种面向对象程序设计的特性。

3)定义一个车(vehicle)基类,具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。

自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。

从bicycle和motorcar派生出摩托车(motorcycle)类,它们都有Run、Stop等成员函数。

观察虚函数的作用。

在继承过程中,注意把vehicle设置为虚基类。

如果不把vehicle设置为虚基类,会有什么问题?

编程试试看。

4.实验基本步骤

1)编程时重点分析CThreePoint类的构造函数如何编写,并通过调试运行查看在继承关系中构造函数的执行顺序。

2)可以使用CPoint类,指明屏幕上特定点的位置,其他的各个类都可以使用它。

再使用基类Shape类,然后在Shpae类的基础上派生出各种类,如直线类Cline(可简单修改一下实验2中的Cline类),矩形类CRectangle,圆类CCircle。

注意要把每个类的特征用最简单的方式表示出来。

3)编写程序定义一个车(vehicle)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle),汽车(motorcar),从bicycle和motorcar派生出摩托车(motorcycle),它们都有Run、Stop等成员函数。

在main()函数中定义vehicle,bicycle,motorcar,motorcycle的对象,调用其Run()、Stop()函数,观察其执行情况。

再分别用vehicle类型的指针来调用这几个对象的成员函数,看看能否成功;把Run、Stop定义为虚函数,再试试看。

5.实验思考题

1)C++中有哪几种派生方式?

每种方式的派生类对基类成员的继承和访问控制属性是什么样的?

2)派生类对象和基类对象是什么样的关系?

派生类对象的构造函数和析构函数的执行顺序是怎样的?

3)什么是多态?

在C++语言中,是如何实现多态的?

4)虚析构函数的作用是什么?

如何发挥作用?

5)引入虚基类后,基类和派生类的构造函数和析构函数的执行顺序要如何变化?

实验4模板与STL(4学时)

1.实验目的

1)理解什么是通用编程技术。

2)加强对模板相关概念的理解,熟悉模板编程的语法。

3)学习编写简单的函数模板和类模板。

4)理解STL中容器、算法、迭代器的等概念,明确它们之间的关系。

5)掌握STL中Vector容器的使用方法。

6)练习使用STL进行编程,加强是通用编程技术的理解。

2.实验类型

设计型

3.实验基本要求

1)编写一个函数模板,要求它返回两个值中的最小者。

但同时要确保正确处理字符串。

2)以下是一个整数栈类的定义:

constintSIZE=100;

classStack

{

public:

Stack();

~Stack();

voidPush(intn);

intPop();

private:

intstack[SIZE];

inttos;

};

编写一个栈的类模板(包括其成员函数定义),以便为任何类型的对象提供栈结构数据操作。

并在应用程序中创建整数栈、字符栈和浮点数栈,提供一些数据进行进栈、退栈和打印操作的测试。

3)编写一程序,让用户自由地从键盘上输入整数,直到输入数字0时结束。

把用户输入的数据保存在模板类Vector定义的对象中,并对用户输入的所有数进行排序输出。

在向显示器进行输出时,要求用一下3种方式实现:

a)仅使用Vector的相关成员函数,不使用迭代器进行输出;

b)使用迭代器自己编程输出;

c)使用STL提供的通用算法for_each进行输出。

4)以下是一个List类模板的定义:

templateclassList{

public:

List();//构造函数

voidAdd(T&);//在Link表头添加新结点

voidRemove(T&);//在Link中删除含有特定值的元素

T*Find(T&);//查找含有特定值的结点

voidPrintList();//打印输出整个链表

~List();

protected:

structNode{

Node*pNext;

T*pT;

};

Node*pFirst;//链首结点指针

};

完成对上述List类模板含有的各成员函数的定义。

然后定义一个简单的Student类,并利用编写的List类模板对一个班级的学生进行动态管理。

(根据自己的能力选做)。

4.实验基本步骤

1)函数模板的原型可定义为:

templateTmin(T&,T&),为了同时要确保正确处理字符串,而字符串不能用“<”来比较,所以还需要特别定义函数:

char*min(char*a,char*b)。

另外,要在main函数中对自己编写的模板进行测试。

2)根据整数栈的定义,可抽象出的栈类模板为:

template

classStack{

public:

Stack();

~Stack();

voidPush(T&n);

TPop();

private:

staticconstintSIZE;

T*stack;

inttos;

};

这里需要将该模板中的各成员函数进行定义即可。

tos是栈顶位置,Push()为压栈操作,Pop()为弹栈操作,要在这两个操作中分别考虑栈的长度和栈是否为空。

最后,要在main函数中对编写的栈类模板进行测试。

3)实现该题目时,首先定义模板类Vector的一个对象,利用该对象进行对用户输入数据的操作。

在进行数据输出时,第一种方式考虑采用类似于数组的随机访问方法,第二种方式利用Vector的迭代器进行输出,第二种方式则利用STL通用算法for_each进行实现,也可以才用copy函数进行实现。

4)要编写出这个程序,要理解Link类模板中各数据成员的含义。

pFirst代表链表首指针,Node代表链表的一个结点,pT为指向该结点对应数据的指针,理解这点非常重要。

5.实验思考题

1)谈谈使用模版进行编程的优点?

2)什么是函数模板和模板函数?

两者之间是什么关系?

3)什么是类模板和模板类?

两者之间有什么关系?

4)STL中容器、迭代器和算法三者之间的关系?

5)STL中为什么要提供通用算法?

它和类模板的成员函数相比,有什么特征?

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1