实验指导书 下载本文

实验1

一、 实验目的

类与对象

1. 掌握类的定义和使用。

2. 掌握类的定义和对象的声明。

3. 复习具有不同访问属性的成员的访问方式。 4. 观察构造函数和析构函数的执行过程。 5. 学习类的聚集使用方法。

6. 使用VC++的debug调试功能观察程序流程,跟踪观察类的构造函数、析构函数、成员函数的执行顺序。

二、 实验任务

1. 定义一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,有两个公有成员函数run、stop。其中,rank为枚举类型CPU_Rank,定义为enum CPU_Rank {P1=1,P2,P3,P4,P5,P6,P7},frequency为单位是MHz的整型数,voltage为浮点型的电压值。观察构造函数和析构函数的调用顺序。 2. 定义一个简单的Computer类,有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,有两个公有成员函数run、stop。cpu为CPU类的一个对象,ram为RAM类的一个对象,cdrom为CDROM类的一个对象,定义并实现这个类。

3. (选做)设计一个用于人事管理的People(人员)类。考虑到通用性,这里只抽象出所有类型人员都具有的属性:number(编号)、sex(性别)、birthday(出生日期)、id(身份证号)等等。其中“出生日期”定义为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数、聚集。

三、 实验步骤

1. 首先定义枚举类型CPU_Rank,例如enum CPU_Rank {P1=1,P2,P3,P4,P5,P6,P7},再定义CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等私有数据成员,定义成员函数run、stop,用来输出提示信息,在构造函数和析构函数中也可以输出提示信息。在主程序中定义一个CPU的对象,调用其成员函数,观察类对象的构造与析构顺序,以及成员函数的调用。程序名:lab4_1.cpp。

2. 使用debug调试功能观察程序ab4_1.cpp的运行流程,跟踪观察类的构造函数、析构函数、成员函数的执行顺序。参考程序如下: //lab4_1.cpp

#include

enum CPU_Rank {P1=1,P2,P3,P4,P5,P6,P7}; class CPU {

private:

CPU_Rank rank; int frequency; float voltage; public:

CPU (CPU_Rank r, int f, float v) {

rank = r;

frequency = f;

voltage = v;

cout << \构造了一个CPU!\ }

~CPU () { cout << \析构了一个CPU!\

CPU_Rank GetRank() const { return rank; }

int GetFrequency() const { return frequency; } float GetVoltage() const { return voltage; }

void SetRank(CPU_Rank r) { rank = r; }

void SetFrequency(int f) { frequency = f; } void SetVoltage(float v) { voltage = v; }

void Run() {cout << \开始运行!\ void Stop() {cout << \停止运行!\ };

void main() {

CPU a(P6,300,2.8); a.Run(); a.Stop(); }

3. 调试操作步骤如下:

? 单击Build | Start Debug | Step Into命令,或按下快捷键F11,系统进入单步执行状态,程序开始

运行,一个DOS窗口出现,此时Visual Studio中光标停在main()函数的入口处;

? 从Debug菜单或Debug工具栏中单击Step Over,此时,光标下移,程序准备执行CPU对象的初始化; ? 单击Step Into,程序准备执行CPU类的构造函数;

? 连续单击Step Over,观察构造函数的执行情况,直到执行完构造函数,程序回到主函数;

? 此时程序准备执行CPU对象的run()方法,单击Step Into,程序进入run()成员函数,连续单击Step

Over,直到回到main()函数;

? 继续执行程序,参照上述的方法,观察程序的执行顺序,加深对类的构造函数、析构函数、成员函数的

执行顺序的认识;

? 再试试Debug菜单栏中别的菜单项,熟悉Debug的各种方法。 4. 首先定义CPU类(可使用第二题中的CPU类)、RAM类、CDROM类。再定义Computer类:定义私有数据成员cpu、ram、cdrom,定义公有成员函数run、stop,可在其中输出提示信息。在主程序中定义一个Computer的对象,调用其成员函数,观察类对象及其成员变量的构造与析构顺序,以及成员函数的调用。程序名:lab4_2.cpp。

5. 使用debug调试功能观察lab4_2.cpp程序的运行流程,跟踪观察类的构造函数、析构函数、成员函数的执行顺序,特别注意观察成员变量的构造与析构顺序。

实验2

一、 实验目的

数组、指针与字符串

1. 学习使用数组数据对象;

2. 学习字符串数据的组织和处理; 3. 学习标准C++库的使用; 4. 掌握指针的使用方法;

5. 练习通过debug观察指针的内容及其所指的对象的内容;

6. 练习通过动态内存分配实现动态数组,并体会指针在其中的作用; 7. 分别使用字符数组和标准C++库练习处理字符串的方法。

二、 实验任务

1. 编写并测试3×3矩阵转置函数,使用数组保存3×3矩阵。

2. 使用动态内存分配生成动态数组来重新完成上题,使用指针实现函数的功能。 3. 编程实现两字符串的连接。要求使用字符数组保存字符串,不要使用系统函数。 4. 使用string类定义字符串对象,重新实现上一小题。 5. 定义一个Employee类,其中包括姓名、街道地址、城市和邮编等属性,以及change_name()和display()等函数。display()显示姓名、街道地址、城市和邮编等属性,change_name()改变对象的姓名属性,实现并测试这个类。

6. 定义包含5个元素的对象数组,每个元素都是Employee类型的对象。

7. (选做)修改实验四中的选做实验中的people(人员)类。具有的属性如下:姓名char name[11]、编号char number[7]、性别char sex[3]、生日birthday、身份证号char id[16]。其中“出生日期”定义为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数、聚集。在测试程序中定义people类的对象数组,录入数据并显示。

三、 实验步骤

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

2. 改写矩阵转置函数,参数为整型指针,使用指针对数组元素进行操作,在main()函数中使用new操作符分配内存生成动态数组。通过debug观察指针的内容及其所指的对象中的内容。程序名:lab6_2.cpp。 3. 编程实现两字符串的连接。定义字符数组保存字符串,在程序中提示用户输入两个字符串,实现两个字符串的连接,最后用cout语句显示输出。程序名:lab6_3.cpp。用cin实现输入,注意,字符串的结束标志是ASCII码0,使用循环语句进行字符串间的字符拷贝。

4. 使用string类定义字符串对象,编程实现两字符串的连接。在string类中已重载了运算符“+=”实现字符串的连接,可以使用这个功能。程序名:lab6_4.cpp。 5. 在employee.h文件中定义Employee类。Employee类具有姓名、街道地址、城市和邮编等私有数据成员,都可以用字符型数组来表示,在成员函数中,构造函数用来初始化所有成员数组,对字符数组的赋值可以使用字符串拷贝函数strcpy(char *, char *name);display()中使用cout显示姓名、街道地址、城市和邮编等属性,change_name()改变类中表示姓名属性的字符数组类型的数据成员。在主程序中定义这个类的对象并对其进行操作。程序名:lab6_5.cpp。

6. 使用上一小题中定义的Employee类定义对象数组emp[5],使用循环语句把数据显示出来。程序名:lab6_6.cpp。

实验3

一、 实验目的

1. 掌握运算符重载的方法; 2. 掌握运算法重载的规则; 3. 学习类型转换运算符。

运算符重载

二、 实验任务

1. 定义一个复数complex类型,虚部和实部为私有数据类型; 2. 重载加法运算符,减法运算符,+=运算符。 3. 重载一元负号和一元正号。 4. 重载输入、输出运算符。

5. 定义类型转换运算符函数,将复数类型转换成double类型。

三、 实验步骤

1. 参考教材。 Class complex{ Double re, im; Public:

Complex(double r=0, double I=0): re(r),im(i){}; Double real() const {return re;} Double imag() const {return im;}

Complex& operator+=(complex); Complex& operator+=(double); }

complex operator+(complex,complex); complex operator+(complex,double); complex operator+(double,complex); complex operator- (complex,complex); complex operator- (complex,double); complex operator- (double,complex);

complex operator+(complex); complex operator- (complex);

istream& operator>>(istream&, complex&); ostream& operator>>(ostream&, complex&); 2. 编写main函数,测试复数类型。

实验4

一、 实验目的

1. 学习定义和使用类的继承关系,定义派生类; 2. 熟悉不同继承方式下对基类成员的访问控制; 3. 学习利用虚基类解决二义性问题。

继承与派生

二、 实验任务

1. 定义一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。

2. 定义一个基类BaseClass,有整型成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。

3. 定义一个车(vehicle)基类,具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。从bicycle和motorcar派生出摩托车(motorcycle)类,在继承过程中,注意把vehicle设置为虚基类。如果不把vehicle设置为虚基类,会有什么问题?编程试试看。 4. (选做)从实验6中的people(人员)类派生出student(学生)类,添加属性:班号char classNO[7];从people类派生出teacher(教师)类,添加属性:职务char principalship[11]、部门char department[21]。从student类中派生出graduate(研究生)类,添加属性:专业char subject[21]、导师teacher adviser;从graduate类和teacher类派生出TA(助教生)类,注意虚基类的使用。重载相应的成员函数,测试这些类。类之间的关系如下图所示: