C++面向对象程序设计实验指导书

更新时间:2024-05-03 01:47:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《面向对象程序设计》

实验指导书

适用专业:计算机科学与技术 信息与计算科学

编写者:面向对象程序设计课程组

2016年3月

共21 页,第 1页

一、基本目的

面向对象程序设计是计算机学科的核心课程之一,C++语言程序设计是当前自20世纪80年代以来迅速推广和广泛使用的一种程序设计语言。

通过本课程实验,使学生掌握基本的面向对象的程序设计方法,熟练类与对象、继承与派生、多态性、模板、异常处理机制以及I/O流等程序设计能力,并利用C++语言进行实际问题的程序设计。 二、实验环境

建议使用Microsoft Visual C++ 6.0集成开发环境。 三、实验要求

1. 每人独立完成实验和实验报告。

2. 每个实验包括多个实验题目,要求每个实验在规定时间内设计、实现尽量多的题目。

3. 程序书写符合程序书写规范。 四、实验内容 序号 实 验 内 容 参考实验课时数 4 4 4 4 2 2 20 计划开设周次 10-11 12-13 14、16 17 17 17 实验1 C++程序设计基础练习 实验2 类与对象 实验3 派生类与继承 实验4 多态性 实验5 模板与异常处理 实验6 C++的流类库与输入输出 合计 五、实验报告

每人针对每个实验上交一份实验报告,不接受不完整的实验报告,或者说明与程序或结果不符合的实验报告。

实验报告主要包括四方面内容: ⑴ 实验设计

按照每个实验题目要求,设计相应的类以及函数的实现方法,并用适当的方式进行描述。 (2) 程序清单

共21 页,第 2页

实验实现的源程序,要求符合代码行首缩进、单句代码换行、标识符命名合理,并包括必要的注释。 (3)运行结果

原始数据,程序运行结果截图及说明。 (4) 实验总结

调试过程及调试中遇到的问题及解决办法;调试程序的收获心得与体会,分析不足之处。

共21 页,第 3页

实验一 C++程序设计基础练习

一、实验目的

1、学习编写简单的C++程序,并掌握C++程序的基本格式与规范。 2、理解C++程序结构的特点。

3、学习C++程序基本的输入输出操作。 4、学习数据类型常量和变量以及修饰符的使用。 5、学习基本的函数定义与调用方法。

6、学习作用域运算符的功能与基本使用方法。 7、学习内存的动态分配与释放方法。

8、学习引用的概念,掌握引用的基本使用方法。 二、试验内容

(一)程序填空

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

参考程序1

#include int add(int a,int b); int main() {

int x,y,sum;

cout<<\:\

//在下画线处填上语句,完成用cin读入x和y _______________ _______________ sum=add(x,y);

cout<<\return 0; }

int add(int a,int b) {

//在下画线处填上语句,完成计算a与b的和并返回之 _________________ _________________ _________________

共21 页,第 4页

}

2、调试和运行参考程序2和参考程序3,掌握输入输出及其格式控制的基本使用方法。

参考程序2

#include int main() {

char name[20];

cout<<”Hello,your name:”;

//在下画线处填上语句,完成将字符串输入到数组name中 ____________

//在下画线处填上语句,完成将name数组用cout输出 ____________ return 0; }

参考程序3

# include void main() {

int x=25;

//在画线处填上语句,将变量x的值分别以十六进制、十进制、八进制输出 ___________________________________________________ }

3、调试和运行参考程序4和参考程序5,理解内置函数与函数重载的概念与基本使用方法。

参考程序4

#include inline int doub(int x) {

//在下画线处填上语句,用于返回x的2倍 _____________ } int main() {

for(int i=1; i<3;i++)

cout<

共21 页,第 5页

}

参考程序5

#include

int mul(int x,int y) //mul函数1 { return x*y; }

int mul(int x,int y,int z) //mul函数2 { return x*y*z; } void main() {

int a=3,b=4,c=5;

//在下画线处填上语句,用于调用mul函数1 cout<

4、调试和运行参考程序6和参考程序7,并观察输出结果,体会和理解作用域运算符的概念与基本使用方法。

参考程序6

#include int avar=10; main() {

//在下画线处填上语句,定义局部变量avar并赋予初始值25 ______________ _____________

cout<<\return 0; }

参考程序7

#include int avar; main() {

int avar;

//在下画线处填上语句,将局部变量avar赋值25 _______________

//在下画线处填上语句,将全局变量avar赋值10 ________________

共21 页,第 6页

//在下画线处填上语句,输出局部变量avar的值 cout<<\

//在下画线处填上语句,输出全局变量avar的值 cout<<\return 0; }

5、调试和运行参考程序8和参考程序9,并观察输出结果,体会和理解内存动态分配的概念与new、delete运算符的基本使用方法。

参考程序8

#include main() {

int *p; //声明一个整型指针变量p

//在下画线处,用new关键字动态分配一个int型存储区,并将首地址赋给p ______________ *p = 10;

cout<<*p; //在下画线处填上语句,用于撤销指针p,释放p指向的存储空间 ________________ return 0; }

参考程序9

#include main() {

int *p;

//在画线处填上语句,用new关键字动态分配一个int型存储区,并将首地址赋给p _____________________ if (!p) {

cout<<\return 1; }

//在下画线处填上语句,将p所指向的存储区赋值20 ________________ cout<<*p;

//在下画线处填上语句,用于撤销指针p,释放p指向的存储空间 ________________ return 0;

共21 页,第 7页

}

(二)程序设计题

1、从键盘上读入两数,比较两个数的大小,并按从小到大的次序输出。(要求使用变量引用)

2、 输出1到100的偶数,一行5个。

3、给出一个百分制的成绩,要求输出成绩等级‘A’,‘B’,‘C’,‘D’,‘E’。90分以上为A,80~89分为B,70~79分为C,60~69分为D,60分以下为E。

4、一个10个整数的数组(34,91,83,56,29,93,56,12,88,72),找出最小数和其下标,并在主函数中打印最小数和下标。

5、编写一个C++风格的程序,解决百元问题:将一元人民币兑换成1、2、5分的硬币,有多少种换法?

6、编写一个程序,建立一个上sroot()的函数,返回其参数的二次方根。要求使用重载函数,重载3次,让其返回整数、长整数与双精度数的二次方根。

7、写C++风格的程序,用二分法求解f(x)=0的根。

8、编写一个程序,用动态分配空间的方法计算 Fibonacci数列的前20项并存储到动态分配的空间中。

共21 页,第 8页

实验二 类与对象

一、实验目的

1、学习类与对象的定义,掌握类与对象的使用方法。

2、学习数据成员与成员函数的访问方式,理解构造函数和析构函数的定义与执行过程,学会构造函数的重载方法。

3、掌握数组与指针的定义与使用方法,理解数组与指针的存储分配与表示。 4、掌握用指针和引用向函数传递参数。 5、掌握静态数据成员和静态成员函数的使用。 6、理解友元与友元函数的作用与使用方法。 二、实验内容

1、下面是一个计算器类的定义,请完成该类成员函数的实现。 class Counter { public:

Counter(int number);

void increment(); //给原值加1 void decrement(); //给原值减1 int getValue(); //取得计数器值 int print(); //显示计数

private: };

2、根据注释语句的提示,实现类Date的成员函数。 class Date { public:

void printDate();//显示日期 void setDay(int d);//设置日的值 void setMonth(int m);//设置月的值

共21 页,第 9页

int value;

void setYear(int y);//设置年的值

private: }; int main() { }

3、考课本例子,建立一个源程序文件,在此文件中建立一个新的类,将新建的类命名为Rect。 class Rect { public: int Area_int(); double Area_double();

Rect(double length,double width); Rect(int length,int width); virtual ~Rect(); private: int nLength; int nWidth; double dLength; double dWidth; };

Date testDay; testDay.setDay(5); testDay.setMonth(10); testDay.setYear(2014); testDay.printDate(); return 0;

int day,month,year;

共21 页,第 10页

【要求】

(1)向Rect类中添加数据成员及成员函数,并完善成员函数的功能。如设计一个Area_int()函数,计算边长为整型的长方形的面积;设计一个Area_double()函数,计算边长为double型的长方形的面积。

(2)重载构造函数。一种构造函数用整型变量记录长方形的长和宽,另一种构造函数用double型记录。

(3)体现对象的构造和析构过程。例如,在构造函数中用cout<<”I am the constructor!”<

(4)在main()函数中定义两个Rect类的对象,一个对象用实例实现(就像定义普通的变量一样),另一个对象用指针实现(利用关键字new,给指针分配内存空间)。并用不同的参数,以调用不同的构造函数体现构造函数的重载。

4、声明一个Student类,在该类中包括一个数据成员score(分数)、两个静态数据成员total_score(总分)和count(学生人数);还包括一个成员函数account()用于设置分数、累计学生的成绩之和、累计学生人数,一个静态成员函数sum()用于返回学生的成绩之和,另一个静态成员函数average()用于求全班成绩的平均值。在main()函数中,输入某班学生的成绩,并调用上述函数求出全班学生的成绩之和和平均分。

5、依据下面的描述设计并实现一个时间类Time,并在main函数中定义所需要的对象验证所实现代码的正确性。

(1) 私有数据成员包含小时(Hour)、分钟(Minute)和秒(Second); (2) 三个重载构造函数:

a)一个是无参数的构造函数;

b)一个是带参数的构造函数,实现对数据成员的初始化; c)一个是copy构造函数,实现用一个对象初始化本对象;

(3) 成员函数实现时间对象相加、减运算:

a) Time Add(Time&); b) Time Sub(Time&);

(4) 友元函数实现时间对象相加、减的运算符重载:

a) friend Time operator + (Time&, Time&);

共21 页,第 11页

b) friend Time operator ? (Time&, Time&);

(5) 公有成员函数void Display();输出对象的数据成员;

6、依据下面的描述定义并实现一个向量类Vector,并在main函数中定义所需要的对象验证所实现代码的正确性

1) 私有数据成员int dimension; double* data; 表示向量的维数与向量元

素存储空间的首地址

2) 无参构造函数,实现把向量所有元素初始化为0 3) 有参构造函数,实现用一个n维数组初始化n维向量 4) 拷贝构造函数 5) 析构函数

6) 输出数据成员函数 void display( );

7) 成员函数int GetDimension();获取向量对象的维数

8) 成员函数 double SetAt(double newdata,int index);实现给向量的第

index+1个元素赋值

9) 成员函数 double GetAt(int index);实现读取向量的第index+1个元素

的值

10)实现向量加、减、乘运算的成员函数 Vector Add(const Vector &ob2 ); Vector Sub(const Vector &ob2 ); int Mult(const Vector &ob2 );

共21 页,第 12页

实验三 派生类与继承

一、实验目的

1、学习类的继承,能够定义和使用类的继承关系。 2、学习派生类的声明与定义方法。 3、掌握类的定义和对象的声明。

4、熟悉公有派生和私有派生的访问特性。 5、掌握派生类构造函数和析构函数的执行顺序。

6、掌握利用访问声明调整基类成员在派生类中的访问属性。 二、试验内容

1、已有类Time和Date,要求设计一个派生类Birthtime,它继承类Time和Date,并且增加一个数据成员Childname用于表示小孩的名字,同时设计主程序显示一个小孩的出生时间和名字。

class Time {

public: Time(int h,int m, int s) { hours=h; minutes=m; seconds=s; } void display() { cout<<\出生时间:\时\分\秒\ } protected: int hours,minutes,seconds; };

class Date {

public:

Date(int m,int d,int y) {

month=m; day=d; year=y; }

共21 页,第 13页

void display() {

cout<<\出生年月:\年\月\日\ }

protected:

int month,day,year; };

2、编写一个学生和教师的数据输入和显示程序。学生数据有编号、姓名、性别、年龄、系别和成绩,教师数据有编号、姓名、性别、年龄、职称和部门。要求将编号、姓名、性别、年龄的输入和显示设计成一个类Person,并作为学生类Student和教师类Teacher的基类。

3、给出下面的基类: class area {

protected:

double height; double width; public:

area(double h,double w) { height=h; width=w; }

virtual double getarea()=0; };

【要求】

(1)建立基类area的俩个派生类rectangle与isosceles,让每一个派生类都包含一个函数getarea(),分别用来返回矩形与三角形的面积。用构造函数对height与width进行初始化。

(2)写出主程序,用来求height与width分别为10.0与5.0的矩形面积,以及求height与width分别为4.0与6.0的三角形面积。

(3)要求通过使用基类指针访问虚函数的方法(即运行时的多态性)分别

求出矩形和三角形面积。

共21 页,第 14页

实验四 多态性

一、实验目的

1、掌握运算符重载的基本方法。

2、掌握友元运算符函数和成员运算符函数的使用方法及两者之间的不同。 3、学习虚函数的定义与使用方法。 4、了解静态多态性和动态多态性。

5、学习使用虚函数和继承实现动态多态性。 二、试验内容

1、编写一个程序,要求:

(1)生明一个类Complex(复数类),定义类Complex的两个对象c1和c2,对象c1通过构造函数直接指定复数的实部和虚部(类私有数据成员为double类型:real和imag)为2.5及3.7,对象c2通过构造函数直接指定复数的实部和虚部为4.2及6.5;

(2)定义友元运算符重载函数,它以c1、c2对象为参数,调用该函数时能返回两个复数对象相加操作;

(3)定义成员函数print,调用该函数时,以格式“real+imag i”输出当前对象的实部和虚部,例如:对象的实部和虚部分别是4.2和6.5,则调用print函数输出格式为:4.2+6.5 i;

(4)编写主程序,计算出复数对象c1和c2相加结果,并将其结果输出。 2、编写一个程序,其中设计一个时间类Time,用来保存时、分、秒等私有数据成员,通过重载操作符“+”实现两个时间的相加。要求将小时范围限制在大于等于0,分钟范围限制在0~59分,秒钟范围限制在0~59秒。

提示:时间类Time的参考框架如下: class Time { public:

Time(int h=0,int m=0,int s=0);//构造函数

Time operator+(Time &);//运算符重载函数,实现两个时间的相加

Time operator+();//运算符重载函数,实现两个时间的相加

共21 页,第 15页

void disptime();//显示时间函数 private:

int hours,minutes,seconds; };

3、写一个程序,定义抽象类Container: class Container {

protected: double radius; public:

Container(double r);//抽象类Container的构造函数 virtual double surface_area()=0;//纯虚函数surface_area virtual double volume()=0;//纯虚函数volume };

【要求】

建立3个继承Container的派生类:Sphere(球体)、Cylinder(圆柱体)、Cube(正方体),让每一个派生类都包含虚函数surface_area()和volume(),分别用来球体、圆柱体和正方体的表面积和体积。要求写出主程序,应用C++的多态性,分别计算边长为6.0的正方体、半径为5.0的球体,以及半径为5.0和高为6.0的圆柱体的表面积和体积。

4、设计一个点类Point,其结构如下:

(1) Point类表示二维平面点的集合,数据成员由点的坐标值表示,类型为int; (2) 三个重载构造函数:

a) 一个是无参数的构造函数;

b) 一个是带坐标值参数的构造函数,实现对数据成员的初始化; c) 一个是copy构造函数,实现用一个对象初始化本对象; (3) 两个重载成员函数:

a) void offert(int , int ); 实现点的偏移,参数是偏移量;

b) void offert(Point &); 实现点的偏移,参数Point类对象是偏移量;

共21 页,第 16页

(4) 6个运算符重载函数:

a) bool operator = = (Point &);判断两个点对象是否相等; b) void operator + =(Point &);将两个点对象相加; c) void operator ++();将当前对象自增1(前缀); d) void operator ++(int );将当前对象自增1(后缀);

e) friend Point& operator + (Point &, Point &);将两个点对象相加; f) friend Point &operator ? (Point &, Point &);将两个点对象相减; (5) 两个成员函数提供实例对象对私有数据的访问:

a) int GetX(); b) int GetY();

(6)公有成员函数void Display();输出对象的数据成员;

共21 页,第 17页

实验五 模板与异常处理

一、实验目的

1、正确理解模板的概念。

2、掌握函数模板与类模板的声明和使用方法。 3、学习简单的异常处理方法。 二、实验内容

1、已知下列主函数: int main() {

cout<

声明求3个数中最小者的函数模板,并写出调用此函数模板的完整程序。 2、编写一个求任意类型数组中最大元素和最小元素的程序,要求将求最大元素和最小元素的函数设计成函数模板,并写出调用此函数模板的完整程序,使得函数调用时,数组的类型可以是整型也可以是双精度类型。

3、编写一个函数模板,使用冒泡排序将数组内容由小到大排列并打印出来,并写出调用此函数模板的完整程序,使得函数调用时,数组的类型可以是整型也可以是双精度型。

4、编写一个程序,求输入数的平方根。设置异常处理,对输入负数的情况给出提示。

共21 页,第 18页

实验六 C++的流类库与输入输出

一、实验目的

1、掌握C++格式化的输入输出方法。 2、掌握重载运算符“<<”和“>>”的方法。 3、掌握磁盘文件的输入输出方法。 二、实验内容

1、下面给出的程序用于打印九九乘法表,但程序中存在错误。请上机调试,使得此程序运行后,能够输出如下所示的九九乘法表。

源程序:

#include #include int main() { int i,j; cout<<\ for(i=1;i<=9;i++) {

cout<

cout<

cout<

共21 页,第 19页

for(j=1;j<=i;j++) cout<

2、编写一程序,将从键盘读入的一个整数、一个双精度数据和一个字符串写到磁盘文件date.dat中。

3、将“a”至“z”的26个英文字母写入文件,而后从该文件中读出并显示出来。

4、编写一个程序,将两个文本文件连接成一个文件,然后将此文件中所有小写字母转换成大写字母,并打印出来。

5、MFC文件操作

建立工程类型为mfc appwizard(exe)的Dialog-based MFC文件操作工程,设计界面如下。

利用类向导,根据示例编辑框的ID,添加数据成员

m_File。利用类向导,根

据“打开”按钮对应的ID,添加消息映射OnOpen,在OnOpen函数中添加如下代码。

void CMFCFileExampleDlg::OnOpen() {

CFile file;

file.Open(_T(\),CFile::modeRead); int length = file.GetLength();

共21 页,第 20页

}

char* data = new char[length + 1]; file.Read(data,length); data[length] = '\\0'; m_File = data; file.Close(); delete[]data; UpdateData(false);

利用类向导,根据“保存”按钮对应的ID,添加消息映射OnSave,在OnSave成员函数中添加如下代码。

void CMFCFileExampleDlg::OnSave() { }

UpdateData(true);

CFile file(_T(\),CFile::modeWrite|CFile::modeCreate); int length = m_File.GetLength(); char* data = new char[length + 1]; for(int i = 0; i < length; i++)

data[i] = m_File[i]; data[length] = '\\0'; file.Write(data,length); file.Close(); delete[]data; UpdateData(false);

共21 页,第 21页

}

char* data = new char[length + 1]; file.Read(data,length); data[length] = '\\0'; m_File = data; file.Close(); delete[]data; UpdateData(false);

利用类向导,根据“保存”按钮对应的ID,添加消息映射OnSave,在OnSave成员函数中添加如下代码。

void CMFCFileExampleDlg::OnSave() { }

UpdateData(true);

CFile file(_T(\),CFile::modeWrite|CFile::modeCreate); int length = m_File.GetLength(); char* data = new char[length + 1]; for(int i = 0; i < length; i++)

data[i] = m_File[i]; data[length] = '\\0'; file.Write(data,length); file.Close(); delete[]data; UpdateData(false);

共21 页,第 21页

本文来源:https://www.bwwdw.com/article/ljmg.html

Top