《C++程序设计》实验指导书.docx
C+程序设计试验指导书东北大学软件学院2023 年 9 月试验要求C+程序设计课程试验的目的是为了使学生在课堂学习的同时,通过一系列的试验,使学生加深了解和更好地把握C+程序设计课程教学大纲要求的内容。在C+程序设计的课程试验过程中,要求学生做到:(1) 预习试验指导书有关局部,认真做好试验内容的预备,就试验可能消灭的状况提前作出思考和分析。(2) 认真观看程序调试过程中消灭的各种问题,记录主要问题,作出必要说明和分析。(3) 认真书写试验报告。(4) 遵守机房纪律,听从辅导教师指挥,疼惜试验设备。(5) 试验课程不迟到。如有事不能出席,所缺试验一般不补。(6) 本试验承受的开发环境为Microsoft Visual C+ 6.0,同学在做试验之前要求生疏该集成开发环境。试验的验收将分为两个局部。第一局部是上机操作,包括检查程序运行和即时提问。其次局部是提交书面的试验报告。试验 1 C+程序设计根底4 学时1. 试验目的1) 学习编写简洁的C+程序,并把握C+程序的根本格式与标准。2) 理解 C程序构造的特点。3) 把握函数的定义和调用方法。4) 练习重载函数的使用。5) 把握指针的使用方法。6) 练习通过动态内存安排实现动态数组,并体会指针在其中的作用。7) 生疏流类库中常用的类及其成员函数的用法。8) 学习标准输人输出及格式把握。9) 学习对文件的应用方法二进制文件、文本文件。10) 学习使用VC +的 debug 调试功能,使用step into 追踪到函数内部。2. 试验类型验证型和设计型。3. 试验根本要求1) 输人并运行所给的参考程序 1,并将程序中的注释局部也输人计算机,体会和理解程序的根本格式标准。2) 编写重载函数Maxl 可分别求取两个整数,三个整数,两个双精度数,三个双精度数的最大值。3) 编写并测试 3X3 矩阵转置函数,使用数组保存 3X3 矩阵。4) 使用动态内存安排生成动态数组来重完成上题,使用指针实现函数的功能。5) 编写程序,用二进制方式读写指定的文件 a.bin,在每一行前加行号,写入另一个二进制文件b.bin 中,从b.bin 中读取数据输出到屏幕。4. 试验根本步骤1) 建立一个把握台应用程序工程baseforml,向其中添加一个源程序文件 sum.cpp。依据所给的程序代码输人到计算机中,检查和调试程序,在确认没有觉察错误之后,选择Build-Build sum.exe编译源程序,再选择Build-Execute sum.exe运行程序,并观看输出结果。假设有问题,则需要重检查程序。说明:在 C+程序中假设使用了系统供给的一些功能如cin 和 cout,就必需在程序的首部首先声明相关的包含这些功能的头文件如iostream.h),否则,系统无法找到实现这些功能的代码。/参考程序 1/sum. cppinclude <iostream.h> int add(int a,int b); int mainint x,y,sum;cout<<“Enter two numbers:n“; cin>>x;cin>>y; sumaddx,y;cout<<“The sum is:“<<sum<<endl; return 0;int addint a,int b)int c; ca+b; return c;2) 分别编写四个同名函数maxl,实现函数重载,在 main函数中测试函数功能。程序名:lab1_2.cpp。3) 编写矩阵转置函数,输人参数为 3X3 整型数组,使用循环语句实现矩阵元素的行列 对调,留意在循环语句中到底需要对哪些元素进展操作,编写 main ( )函数实现输入、输出。程序名:lab1_3.cpp。4) 改写矩阵转置函数,参数为整型指针,使用指针对数组元素进展操作,在main ( )函数中使用 new 操作符安排内存生成动态数组。通过 debug 观看指针的内容及其所指的对象中的内容。程序名:lab1_4.cpp。5) 编写程序lab1_5.cpp,使用void main(int argc, charargv)函数中的参数传递操作的文件名,定义 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) 下面是“平面上点”类的定义:class CPointprivate:int x,y;static int nCount;/ nCount 用于保存点的个数public:CPoint(int px=0, int py=0); CPoint(CPoint&);CPoint; int GetX; int GetY;void SetX(int); void SetY(int); void ShowPoint;请完成该类中各成员函数的定义。2) 下面是“平面上线段”类的定义:class CLineprivate:CPoint pt1, pt2;/pt1 和 pt2 分别代表该线段的起点和终点public:CLine;CLine(int x1,int y1,int x2,int y2); CLine(CPoint p1,CPoint p2);double Distance;/计算该线段长度的成员函数void ShowLine;请完成该类中各成员函数的定义。并利用 VC 调试工具观看含有组合关系类的构造函数和析构函数的执行状况。3) 以成员函数的方式,重载题目 1 中的 CPoint 类的“+”运算符,返回的CPoint 类对象的横纵坐标值分别等于原两点的横纵坐标值之和;以全局函数的方式重载 CPoint 类的“-” 运算符,返回的CPoint 类对象的横纵坐标值分别等于原两点的横纵坐标值之差。4) 对于题目 1 中的CPoint 类,重载“>>”运算符使得像 cin 等输入流对象能够写CPoint类对象,再重载“<<”运算符使得像cout 等输出流对象能够输出CPoint 类对象。4. 试验根本步骤1) 该类是一个根本的类。在编写该类时,要留意对静态成员nCount 的操作,使其能够正确表示程序中点的个数。编完该类后,要在 main函数中进展测试,分别定义 CPoint 类的对象、指针、引用,对各成员函数进展调用。分析对静态成员的调用和一般成员的调用方式有什么不同。2) 要思考如何对类中3 个构造函数CLine,CLine(int x1,int y1,int x2,int y2)和CLine(CPoint p1,CPoint p2);的编写,分析什么是初始化列表。完成后要在main中进展测试。3) 以成员函数方式重载的“+”操作符的原型为:CPoint CPoint:operator+ (CPoint pt); 以全局函数方式重载的“-”操作符的原型为:CPoint operator- (CPoint pt1, CPoint pt2); 分析以成员函数方式和全局函数方式重载运行符的异同点。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 类,定义 “空间中点”类如下:class CThreePoint:public CPointprivate:int z; public:CThreePoint; CThreePoint(int, int, int); int GetZ;void SetZ(int pz);virtual void ShowPoint;请完成该类中各成员函数的定义。并利用 VC 调试工具观看含有继承关系类的构造函数和析构函数的执行状况。分析为什么要把 ShowPoint函数设置为虚函数?有什么作用?请在 main函数中做测试。2) 下面是一个“Shape”基类的定义:enum ColorTypeWhite, Black, Red, Green, Blue, Yellow, Magenta, Cyan;/为图形外形定义Shape 基类class Shapeprotected:ColorType color;public:Shape(ColorType c); virtual void draw;使用 Shape 类和CPoint 类设计一个可在屏幕上作图的简洁实例,要求是不必真正在屏幕上实现作图,只是有一个示意即可。例如:画一个矩形,不必真正画出矩形,只需输出一句话:“This is a rectangle!”即可。要求可画线段、矩形和圆形。要用到继承,虚函数,多态,数据的封装,构造函数的实现等等各种面对对象程序设计的特性。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 模板与 STL4 学时1. 试验目的1) 理解什么是通用编程技术。2) 加强对模板相关概念的理解,生疏模板编程的语法。3) 学习编写简洁的函数模板和类模板。4) 理解 STL 中容器、算法、迭代器的等概念,明确它们之间的关系。5) 把握 STL 中 Vector容器的使用方法。6) 练习使用STL 进展编程,加强是通用编程技术的理解。2. 试验类型设计型3. 试验根本要求1) 编写一个函数模板,要求它返回两个值中的最小者。但同时要确保正确处理字符串。2) 以下是一个整数栈类的定义:const int SIZE = 100; class Stackpublic:Stack;Stack;void Push(int n); int Pop;private:int stackSIZE; int tos;编写一个栈的类模板包括其成员函数定义,以便为任何类型的对象供给栈构造数据操作。并在应用程序中创立整数栈、字符栈和浮点数栈,供给一些数据进展进栈、退栈和打印操作的测试。3) 编写一程序,让用户自由地从键盘上输入整数,直到输入数字 0 时完毕。把用户输入的数据保存在模板类Vector<int>定义的对象中,并对用户输入的全部数进展排序输出。在向显示器进展输出时,要求用一下 3 种方式实现:a) 仅使用Vector<int>的相关成员函数,不使用迭代器进展输出;b) 使用迭代器自己编程输出;c) 使用 STL 供给的通用算法for_each 进展输出。4) 以下是一个List 类模板的定义: template<class T> class List public:List;/构造函数void Add(T&);/在 Link 表头添加结点void Remove(T&);/在 Link 中删除含有特定值的元素T* Find(T&);/查找含有特定值的结点void PrintList;/ 打印输出整个链表List; protected:struct Node Node* pNext; T* pT;Node *pFirst;/链首结点指针;完成对上述List 类模板含有的各成员函数的定义。然后定义一个简洁的Student 类,并利用编写的List 类模板对一个班级的学生进展动态治理。依据自己的力气选做。4. 试验根本步骤1) 函数模板的原型可定义为:template<class T> T min(T&, T&),为了同时要确保正确处理字符串,而字符串不能用“<”来比较,所以还需要特别定义函数:char* min(char* a, char* b)。另外,要在main 函数中对自己编写的模板进展测试。2) 依据整数栈的定义,可抽象出的栈类模板为:template<class T> class Stack public:Stack;Stack;void Push(T& n);T Pop;private:static const int SIZE; T* stack;int tos;这里需要将该模板中的各成员函数进展定义即可。tos 是栈顶位置,Push为压栈操作, Pop为弹栈操作,要在这两个操作中分别考虑栈的长度和栈是否为空。最终,要在 main 函数中对编写的栈类模板进展测试。3) 实现该题目时,首先定义模板类 Vector<int>的一个对象,利用该对象进展对用户输入数据的操作。在进展数据输出时,第一种方式考虑承受类似于数组的随机访问方法,其次种方式利用 Vector<int>的迭代器进展输出,其次种方式则利用 STL 通用算法 for_each 进展实现,也可以才用copy 函数进展实现。4) 要编写出这个程序,要理解Link 类模板中各数据成员的含义。pFirst 代表链表首指针, Node 代表链表的一个结点,pT 为指向该结点对应数据的指针,理解这点格外重要。5. 试验思考题1) 谈谈使用模版进展编程的优点?2) 什么是函数模板和模板函数?两者之间是什么关系?3) 什么是类模板和模板类?两者之间有什么关系?4) STL 中容器、迭代器和算法三者之间的关系?5) STL 中为什么要供给通用算法?它和类模板的成员函数相比,有什么特征?