《C++程序设计》实验指导书1.docx
- 文档编号:5894564
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:11
- 大小:21.81KB
《C++程序设计》实验指导书1.docx
《《C++程序设计》实验指导书1.docx》由会员分享,可在线阅读,更多相关《《C++程序设计》实验指导书1.docx(11页珍藏版)》请在冰豆网上搜索。
《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类模板的定义: template 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)函数模板的原型可定义为: template 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 4)要编写出这个程序,要理解Link类模板中各数据成员的含义。 pFirst代表链表首指针,Node代表链表的一个结点,pT为指向该结点对应数据的指针,理解这点非常重要。 5.实验思考题 1)谈谈使用模版进行编程的优点? 2)什么是函数模板和模板函数? 两者之间是什么关系? 3)什么是类模板和模板类? 两者之间有什么关系? 4)STL中容器、迭代器和算法三者之间的关系? 5)STL中为什么要提供通用算法? 它和类模板的成员函数相比,有什么特征?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+程序设计 C+ 程序设计 实验 指导书
![提示](https://static.bdocx.com/images/bang_tan.gif)