《面向对象程序设计 C++》实验报告 下载本文

《面向对象程序设计》实验教学大纲

实验学时: 32

课程性质: 专业必修课 教材及参考书:

1. 《C++语言程序设计习题与实验指导》,郑莉、傅仕星编著,北京:清华大学出版社,2004 2. 《C++语言程序设计(第三版)》,郑莉、董渊编著,北京:清华大学出版社,2005 大纲执笔人: 李晓宁 大纲审定人: 刘芳、苟仕蓉、左友东

实验个数: 13 适用专业: 软件工程

实验学分: 1

一、实验课的性质与任务

本课程实验大纲是面向计算机专业学生开设的《C++程序设计》实验课计划指导大纲,是依据《面向对象程序设计》课程教学计划指导大纲编制。本课程主要讲述了利用C++进行程序设计的思想和方法,既有面向过程和面向对象的程序设计的理论知识,又包括极强的实践应用能力的培养。本实验大纲力求结合该课程教学计划大纲的相应内容,由浅入深的指导学生了解和掌握如何利用C++程序设计语言进行程序设计,提高学生的动手能力,做到理论和实践相结合,培养学生理解,分析程序,编写,调试程序的能力,使之能把程序设计应用到今后的专业学习中。

二、实验课程目的与要求

1. 实验目的:

通过本课程的学习,使学生掌握面向过程的程序设计思想和编程思路,初步掌握面向对象的程序设计思想,学会调试程序,能独立编写实用的小型程序。 2. 实验要求:

1) 学生应该自始至终贯彻课程中所介绍的程序设计风格,养成良好的编程习惯; 2) 应独立完成所布置习题。为保证尽量在统一安排的上机时间内编译运行通过程序,学生应事先设计好程序。

三、实验项目及内容提要

面向对象程序设计实验课程 序号实验项目编号实验类型 实验名称 学时必做选做学分数基本操作验证综合设计内容提要 面向对象程序设计实验课程 序号实验项目编号实验类型 实验名称 学时必做选做学分数基本操作 验证综合设计内容提要 10 十 11 12 13 四、实验内容安排:

实验一 Visual C++6.0开发环境应用入门

( 验证性实验 2学时)

1. 目的要求:

了解Visual C++6.0的特点,熟悉了解Visual C++6.0的开发环境,学习使用Visual C++6.0编写标准的C++控制台应用程序。 2. 实验内容:

1 2 3 4 5 6 7 8 9 一 二 三 函数的应用 四 类与对象 五 C++程序的结构 六 数组、指针与字符串 七 继承与派生 八 多态性 九 群体类和群体数据的组织 泛型程序设计与C++标准模板库 十流内库与输入、输一 出 十异常处理 二 十Windows应用程三 序框架 Visual C++开发环境入门 C++简单程序设计 2 4 2 6 2 4 6 2 4 2 2 2 2 √ √ √ √ √ √ √ √ √ √ √ √ √ √ √ √ 熟悉VC++开发环境 基本算法结构 √ 函数设计、模板函数 √ 类的设计与使用 √ √ 作用域与生存期,静态成员 三种常见编程元素的使用 √ 派生类的设计与使用 √ 运算符重载、动态多态 √ 群体类的设计 √ STL库的使用 √ 常用输入输出方法 √ 异常处理机制的设计 VC开发Windows程序方法 使用Visual C++来建立一个非图形化的标准C++程序,编译、运行教材中的例3-3,用公式法求解PI的数值,并尝试利用其他方法求解并获得相同的结果。

π=16arctan(1/5)-4arctan(1/239)

arctan(x)=x-x3/3+x5/5-x7/7+?求π=?

#include using namespace std; int main() {

double a,b;

double arctan(double x); a=16.0*arctan(1/5.0); b=4.o*aarctan(1/239.0); cout<<”PI=”<

double arctan(double x) {

int i;

double r,e f,sqr; sqr=x*x; r=0; e=x; i=1;

while(e/i>1e-15) {

f=e/I;

r=(i%4==1)?r+f:r-f; e=e*sqr; I+=2; }

return r; }

#include #include main() { int s=1;

float n=1,t=1,pi=0; while(fabs(t)1e-4) {

pi=pi+t; n=n+2; s=-s; t=s/n; } pi=pi*4;

printf(\}

1

3. 主要仪器设备及软件:PC + Windows 2000 + VC 6.0

实验二 C++简单程序设计实验 ( 验证性实验 4学时)

1. 目的要求:

会编写简单的C++程序;复习基本数据类型变量和常量的应用;复习运算符与表达式的应用;复习结构化程序设计基本控制结构的应用;复习自定义数据类型的应用;练习使用简单的输入输出;观察头文件的作用;学会使用VC6.0开发环境中的debug调试功能;熟练程序设计中的技巧; 2. 实验内容:

1) 给定一个字符变量输出其二进制形式。例如char a=’a’; 其二进制为00100001。 #include using namespace std;

int main() {

char ch;

int j,k[8]={0};

cout<<\请输入一个字符:\ cin>>ch;

for(j=0;j<=7;j++) { if(ch) { if(ch%2==0) k[j]=0; else k[j]=1; ch=(ch-(ch%2))/2;

} }

for(j=7;j>=0;j--) { cout<

cout<

2) 给定一个字符变量输出其二进制反转形式。例如char a=’a’; 其二进制为00100001,反转形式为10000100。(提示:使用位运算) #include using namespace std;

int main() { char ch; int j,k[8]={0}; cout<<\请输入一个字符:\ cin>>ch; for(j=0;j<=7;j++) { if(ch) { if(ch%2==0) k[j]=0; else k[j]=1; ch=(ch-(ch%2))/2; } } cout<=0;j--) { cout<

}

k[j]=k[j]^1; }

cout<<\二进制反码是:\for(j=7;j>=0;j--) { cout<

cout<

3) 袋子里有红,黄,蓝,绿,黑五种不同颜色的球若干个,从中取出三个不同颜色的球,编程输出每种取法及统计不同取法的总数(提示:使用枚举)

#include

enum color {red=0,yellow,blue,green,black}; bool isNum(int i) {

int j=0;

for(int k=0;k<6;k++)if(i>>k&1==1)j++; return j==3?true:false; }

void printResult(int i) {

for(int k=0;k<5;k++) {

if(i>>k&1==1) switch(k) {

case red: printf(\break;

case yellow: printf(\break; case blue: printf(\break; case green: printf(\break; case black: printf(\break; default:

printf(\break; } }

printf(\}

void main() {

int j=0;

printf(\可能的方案有:\\n\for(int i=0;i<=32;i++) {

if(isNum(i)) {

printResult(i); j++; } }

4) (选做)给定一个整型变量输出其二进制形式。 3. 主要仪器设备及软件:PC + Windows 2000 + VC 6.0

实验三 函数的应用实验 ( 设计性实验 2学时)

1. 目的要求:

掌握函数的定义和调用方法;练习重载函数的使用;练习使用系统函数;学习使用VC++的debug调试功能,使用step into追踪到函数内部。 2. 实验内容:

1) 用递归的方法编写函数求Fibonacci级数,观察递归调用的过程。 #include using namespace std;

int Fibonacci(int i) {

if(i==1) return 0; else { if(i==2) return 1;

else return Fibonacci(i-1)+Fibonacci(i-2); } }

int main() { int n,j,i; cin>>n;

for(i=1;i<=n;i++) { j=Fibonacci(i); cout<

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

#include using namespace std; int MAX1(int a,int b) {

if(a>=b) return a; else return b; }

int MAX1(int a,int b,int c) {

if(a>=b) { if(a<=c) return c; else return a; } else { if(b<=c) return c; else return b;

} }

double MAX1(double a,double b) {

if(a>=b) return a; else return b; }

double MAX1(double a,double b,double c) {

if(a>=b) { if(a<=c) return c; else return a; } else { if(b<=c) return c; else return b; } }

int main() {

int a,b,c; double i,j,k;

cout<<\请输入两个整数\ cin>>a>>b;

cout<<\最大的数\

cout<<\请输入三个整数\ cin>>a>>b>>c;

cout<<\最大的数是\

cout<<\请输入两个小数\ cin>>i>>j;

cout<<\最大的数是\

cout<<\请输入三个小数\ cin>>i>>j>>k;

cout<<\最大的数是\ }

3) 写一个函数,能够接收身高、体重等数据,能够根据身高、体重检测身体状况,胖,瘦等。

#include using namespace std;

void SHENGC(double i,double j) {

if(i

{ if(i=j*32) cout<<\这个人适中\ else cout<<\这个人偏瘦\ } }

int main() {

double i,j;

cout<<\请输入身高(cm)和体重(kg)\ cin>>i>>j; SHENGC( i, j); }

3. 主要仪器设备及软件:PC + Windows 2000 + VC 6.0

实验四 类与对象实验 ( 设计性实验 4学时)

1. 目的要求:

掌握类的定义和使用;掌握类对象的声明;复习具有不同访问属性的成员的访问方式;观察构造函数和析构函数的执行过程;学习类组合使用方法;使用VC++的debug调试功能

观察程序流程,跟踪观察类的构造函数、析构函数、成员函数的执行顺序。 2. 实验内容:

1) 定义一个CPU类,包含等级(Rank)、频率(frequency)、电压(voltage)等属性,有两个公有成员函数run、stop。其中,rank为枚举类型CPU__Rank,定义为enum CPU_Rank{P1=1,P2,P3,P4,P5,P6,P7},frequency为单位是MHz的整型数,voltage为浮点型的电压值。观察构造函数和析构函数的调用顺序。

#include using namespace std;

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

public: CPU(); ~CPU(); void run(enum CPU_Rank r,int f,double v); void stop(); private: enum CPU_Rank Rank; int frequency; double voltage; };

CPU::CPU() {

cout<<\调用构造函数\}

CPU::~CPU() {

cout<<\调研析构函数\}

void CPU::run(enum CPU_Rank r,int f,double v) {

Rank=r; frequency=f; voltage=v; }

void CPU::stop() {

cout<

int main() {

enum CPU_Rank t=P1; CPU c;

c.run(t,2,4.865); c.stop(); }

2) 定义一个简单的Computer类,有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,有两个公有成员函数run、stop。cpu为CPU类的一个对象,ram为RAM类的一个对象,cdrom为CDROM类的一个对象,定义并实现这个类,观察这些类的构造函数和析构函数的调用顺序。

#include using namespace std;

class CPU { public: CPU() { cout<<\构造函数被调用\ } ~CPU() { cout<<\析构函数被调用\ } };

class RAM {

public: RAM() { cout<<\构造函数被调用”<

~RAM() { cout<<\析构函数被调用\ } };

class CDROM {

public: CDROM() { cout<<\构造函数被调用\ } ~CDROM() { cout<<\析构函数被调用\ } };

class Computer {

private: CPU cpu; RAM ram; CDROM cdrom; public: Computer() { cout<<\构造函数被调用\ } ~Computer() { cout<<\析构函数被调用\ } void run(); void stop(); };

int main() {

Computer C; }

3) 定义一个Body类,拥有身高、体重等数据,能够根据身高、体重检测身体状况,要求设计相应的函数成员和构造函数。

#include using namespace std; class body {

public: body() { cout<<\构造函数被调用\ } ~body() { cout<<\析构函数被调用\ } void set(double h,double w) { HIGH=h; WEIGHT=w; }

void show() { cout<<\ cout<<\ } private: double HIGH; double WEIGHT; };

int main() {

double i,j; body a;

cout<<\请输入身高(cm)和体重(kg)\ cin>>i>>j; a.set(i,j); a.show(); }

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

3. 主要仪器设备及软件:PC+Windows 2000+VC 6.0

实验五 C++程序的结构实验 ( 设计性实验 2学时)

1. 目的要求:

观察程序运行中变量的作用域、生存期和可见性;学习类的静态成员的使用;学习多文件结构在C++程序中的使用。 2. 实验内容:

1) 运行下面的程序,观察变量X、Y的值。(删除)

//lab5_1.cpp #include void fnl(); int x=1,y=2; int main() { cout<<”Begin…”<

2) 实现客户机(CLIENT)类。定义字符型静态数据成员ServerName,保存其服务器名称;整型静态数据成员ClientNum,记录已定义的客户数量;定义静态函数ChangeServerName()改变服务器名称。在头文件client.h中定义类,在文件client.cpp中实现,在文件test.cpp 中测试这个类,观察相应的成员变量取值的变化情况。(需要给出main函数代码和运行结果)

//cilent.h

#include using namespace std;

class Client {

private:

static char SeverName[10]; static int Clientnum; public: Client() { cout<<\构造函数被调用\ Clientnum++; } ~Client() { cout<<\析构函数被调用\ Clientnum--; } static void ChangeServername() { int i; cout<<\请输入服务器的名字:\ cin>>SeverName; } void show(); };

int Client::Clientnum=0;

char Client::SeverName[10]=\//Client.cpp

void Client::show() {

cout<<\该用户机的服务器端名字是:\ cout<

cout<<\用户数量有: \ cout<

//Client.exe

void main() {

Client::ChangeServername(); Client a; a.show(); Client b; b.show();

}

3) 完善Body类,将检测胖瘦的标准定义为静态数据成员并设计相应的静态成员函数。(最好给出main函数代码和运行结果)

#include using namespace std;

class body {

public: body() { cout<<\构造函数被调用\ } ~body() { cout<<\析构函数被调用\ } void set(double i,double j); void show(); static void set() { cout<<\请输入判断胖瘦的标准:\ cin>>body::i; cout<<\检测胖瘦的标准是:\ cout<

double body::i=3.2;

void body::set(double i,double j) { heigh=i; weight=j; }

void body::show ()

{ cout<<\这个人偏\ if(heigh/weight>body::i) cout<<\瘦\ else { if(heigh/weight==body::i) cout<<\正常\ else cout<<\胖\ } }

int main() { double i,j; body a; body::set(); cout<<\请输入身高(cm)和体重(kg):\ cin>>i>>j; a.set(i,j); a.show(); }

4) 定义Boat;和Car两个类,二者都有weight属性,定义二者的一个友元函数totalWeight(),计算二者的和。

#include using namespace std;

class Boat {

public: Boat() { cout<<\构造函数被调用\ }

~Boat() { cout<<\析构函数被调用\ }

void set(double i);

friend double Totalweight(class Boat& j,class Car& k); private:

double weight; };

class Car {

public: Car() { cout<<\构造函数被调用\ }

~Car() { cout<<\析构函数被调用\ }

void set(double i);

friend double Totalweight(class Boat& j,class Car& k); private:

double weight; };

void Boat::set(double i) {

this->weight=i; }

void Car::set(double i) {

this->weight=i; }

double Totalweight(class Boat& j,class Car& k) {

double m;

m=j.weight+k.weight;

return m; }

int main() {

double j; Boat b; Car c;

cout<<\请输入Boat类的重量\ cin>>j; b.set(j);

cout<<\请输入Cart类的重量\ cin>>j; c.set(j);

cout<<\两者重量总和是\ cout<

5) (选做)在函数fn1()中定义一个静态变量n,fn1()中对n的值加1,在主函数中,调用fn1()十次,显示n的值。

6) (选做) 在一个文件中定义一个全局变量n,主函数main(),在另外一个文件中定义函数fn1(),在main()中对n赋值,再调用fn1(),在fn1()中也对赋值,显示n最后的值。

3. 主要仪器设备及软件:Windows 2000+VC 6.0

实验六 数组、指针与字符串实验

(设计性实验 4学时)

1. 目的要求:

学习使用数组;学习字符串数据的组织和处理;学习标准C++库的使用;掌握指针的使用方法;练习通过debug观察指针的内容及其所指的对象的内容;练习通过动态内存分配实现动态数组,并体会指针在其中的作用;分别使用字符数组和标准C++库练习处理字符串的方法。 2. 实验内容:

1) 编写一个用于3×3数组保存矩阵的类,具有矩阵显示和矩阵转置函数。

#include

using namespace std;

class point {

public: point() { cout<<\构造函数被调用\ }

~point()

{ cout<<\析构函数被调用\ }

void set(); void zhanz(); void show(); private: int p[3][3]; };

void point::set() { int i,j;

for(i=0;i<=2;i++) { for(j=0;j<=2;j++) cin>>p[i][j]; } }

void point::show() { int i,j;

for(i=0;i<=2;i++) { for(j=0;j<=2;j++) cout<

void point::zhanz() {

int i,j,k=0; int t[9];

for(i=0;i<=2;i++) { for(j=0;j<=2;j++) t[k++]=p[j][i]; }

for(k=0;k<=8;k++) { cout<

\ if(!((k+1)%3)) cout<

int main() {

point juzhen;

cout<<\请输入3*3矩阵的数据\

juzhen.set();

cout<<\矩阵是:\ juzhen.show();

cout<<\转置后矩阵是:\ juzhen.zhanz(); }

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

#include using namespace std;

class zhuz {

public: zhuz() { cout<<\构造函数被调用\ p=new int[3][3]; }

~zhuz() { cout<<\析构函数被调用\ delete[] p; }

void set() { int i,j;

cout<<\请输入3*3矩阵数据\ for(i=0;i<=2;i++) { for(j=0;j<=2;j++) cin>>p[i][j]; } }

void show() { int i,j; for(i=0;i<=2;i++) { for(j=0;j<=2;j++) { cout<

void zhuanz() { int i,j,k; for(i=0;i<=2;i++) { for(j=0;j<=i;j++) { k=p[j][i]; p[j][i]=p[i][j]; p[i][j]=k; } } for(i=0;i<=2;i++) { for(j=0;j<=2;j++) { cout<

\\ private: int (*p)[3]; };

int main() {

zhuz a;

a.set ();

cout<<\矩阵是:\ a.show();

cout<<\转置后矩阵是:\ a.zhuanz (); }

3) 拷贝构造2)题中的矩阵类对象,运行程序看看是否存在问题,应该如何改进。(提示:深浅拷贝)

#include using namespace std;

class zhuz {

public: zhuz() { cout<<\构造函数被调用\ }

~zhuz() { cout<<\析构函数被调用\ delete[] p; }

zhuz(zhuz & q)//浅拷贝′ { p=q.p; }

/*zhuz(zhuz& q)//深拷贝 { int i,j; p=new int[3][3]; for(i=0;i<=2;i++) { for(j=0;j<=2;j++) p[i][j]=q.p[i][j]; } }*/

void set() { int i,j; cout<<\请输入3*3矩阵数据\ p=new int[3][3]; for(i=0;i<=2;i++) { for(j=0;j<=2;j++) cin>>p[i][j]; } }

void show() { int i,j; for(i=0;i<=2;i++) { for(j=0;j<=2;j++) cout<

void zhuanz() { int i,j,t; for(i=0;i<=2;i++) { for(j=0;j<=i;j++) { t=p[j][i];

p[j][i]=p[i][j]; p[i][j]=t; } } for(i=0;i<=2;i++) { for(j=0;j<=2;j++) cout<

private: int (*p)[3]; };

void main() {

zhuz a;

a.set ();

cout<<\矩阵是:\ a.show(); cout<

cout<<\转置后矩阵是:\ a.zhuanz ();

cout<<\第二个矩阵是:\ zhuz b(a); b.show(); }

4) 编程实现两字符串的连接。要求使用字符数组保存字符串,不要使用系统函数。

#include using namespace std;

void String(char *a,char* b) {

char *p; p=a;

while(*p!=NULL) p++;

while(*b!=NULL) { *p=*b; p++; b++; }

*p=*b; }

int main() {

char shuz1[20]; char shuz2[20];

cout<<\请输入第一个字符串\ cin>>shuz1;

cout<<\请输入第二个字符串\ cin>>shuz2;

String(shuz1,shuz2);

cout<<\组合后的字符串是:\ cout<

5) 使用string类定义字符串对象,重新实现上一小题。· #include #include using namespace std;

int main() {

string shuz1=\

cout<<\请输入第一个字符串\ cin>>shuz1;

cout<<\请输入第二个字符串\ cin>>shuz2; shuz1+=shuz2;

cout<<\组合后字符串是:\ cout<

6) 定义Body类的数组,评测班级每个同学的身体状况。

#include

using namespace std;

class Body {

public: Body() { cout<<\构造函数被调用\ }

~Body() { cout<<\析构函数被调用 \ }

void Getweight(double W) { Weight=W; }

void Gethigh(double H) { High=H; }

void showWei() { cout<<\该同学体重是:\ }

void showH() { cout<<\该同学身高是:\ }

double show() { return High/Weight; }

private:

double Weight; double High; };

void main() {

int i,k;

double a,b,n,j=3.2;

cout<<\请输入要测试的同学的个数\ cin>>k;

Body *people=new Body[k]; for(i=0;i<=k-1;i++) { cout<<\请输入第\个同学的身高\ cin>>a; people[i].Gethigh(a); cout<<\体重\ cin>>b; people[i].Getweight(b); }

cout<

for(i=0;i<=k-1;i++) { n=people[i].show() ; if(n

}delete [] people; }

7) (选做)定义电子秤类和学生类数组,用电子秤类评测班级每个同学的身体状况。 8) (选做)定义一个Employee类,其中包括姓名、街道地址、城市和邮编等属性,以及change_name()和display()等函数。Display()显示姓名、街道地址、城市和邮编等属性,change_name()改变对象的姓名属性。实现并测试这个类。

9) (选做)定义包含5个元素的对象数组,每个元素都是Employee类型的对象。

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

3. 主要仪器设备及软件:Windows 2000+VC 6.0

实验七 继承与派生实验

(验证性实验 4学时)

1. 目的要求:

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

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

#include using namespace std;

class Animal {

public: Animal() { cout<<\构造函数被调用\ } ~Animal() { cout<<\析构函数被调用\ } //private: //protected: int age; };

class dog:public Animal {

public: dog() { cout<<\构造函数被调用\ } ~dog() { cout<<\析构函数被调用\ } void SetAge(int n); void show() { cout<<\年龄是:\ cout<

void dog::SetAge (int n) { n=3; age=n; }

int main() { int t; dog b; b.SetAge(t); b.show(); }

2) 定义一个基类BasClass,有整型成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况和执行顺序。 #include using namespace std;

class BasClass {

public: BasClass() {

cout<<\构造函数被调用\ } ~BasClass() { cout<<\析构函数被调用\ } };

class DerivedClass:public BasClass {

public: DerivedClass() { cout<<\构造函数被调用\ } ~DerivedClass() { cout<<\析构函数被调用\ } private: };

int main() { DerivedClass a; }

3) 定义一个车(vehicle)基类,具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类,汽车(motorcar)类。自行车(bicycle)类有高度(Height)等属性,汽车(motorcycle)类有座位数(SeatNum)等属性。从bicycle和Motorcar派生出摩托车(motorcycle)类,在继承过程中,注意把vehicle设置为虚基类。如果不把vehicle 设置为虚基类,会有什么问?编程试试看。 #include using namespace std; class vehicle {

public: vehicle() { cout<<\构造函数被调用\

} ~vehicle() { cout<<\析构函数被调用\ } void Run() { int i,j; cout<<\请输入最大重量和最大速度:\ cin>>i>>j; MaxSpeed=i; Weight=j; } void Stop() { cout<<\ cout<<\ } private: double MaxSpeed,Weight; };

class bicycle: virtual public vehicle {

public: bicycle() { cout<<\构造函数被调用\ } ~bicycle() { cout<<\析构函数被调用\ } private: double Height; };

class motorcar:virtual public vehicle {

public: motorcar() { cout<<\构造函数被调用\

} ~motorcar() { cout<<\析构函数被调用\ } private: int SeatNum; };

class motorcycle: public motorcar, public bicycle {

public: motorcycle() { cout<<\构造函数被调用\ } ~motorcycle() { cout<<\析构函数被调用\ } };

int main() { motorcycle a; a.bicycle::Run(); a.bicycle::Stop(); a.motorcar::Run(); a.motorcar::Stop(); }

4) (选做)从实验6中的people (人员)类派生出student(学生)类,添加属性:职务char principalship[11]、部门char department[21]。从student类中派生出graduate(研究生)类,添加属性:专业char subject[21]、导师teacher adviser;从graduate 类派生出其TA(助教)类,注意虚基类的使用。重载相应的成员函数,测试这些类并观察构造函数和析构函数的调用顺序。

人员姓名编号性别出生日期身份证号函数日期年月日函数学生班号函数教师职务部门函数研究生专业导师函数助教生

图7-1 实验任务4的类图

3. 主要仪器设备及软件:PC+Windows 2000+VC 6.0

实验八 多态性实验 ( 设计性实验 2学时)

1. 目的要求:

掌握运算符重载的方法;学习使用虚函数实现动态多态性。 2. 实验内容:

1) 定义Point类,有坐标_x,_y两个成员变量;对Point类重载“++”(自增)、“--”(自减)运算符,实现对坐标的改变。(提示: 注意前++和后++)

#include using namespace std; class point {

public: point() {

cout<<\构造函数被调用\ } ~point() { cout<<\析构函数被调用\ } void set(int i=1,int j=3) { x=i; y=j; } void show() { cout<<\坐标是:\ cout<

point point::operator ++() { x++; y++; return *this; }

point point::operator --() { x--; y--; return *this; }

point point::operator ++(int) { ++x; ++y; return *this; }

point point::operator --(int) {

--x; --y; return *this; }

int main() { int i,j; point a; cout<<\请输入坐标:\ cin>>i>>j; a.set (i,j); a.show(); ++a; a.show (); --a; a.show(); a++; a.show(); a--; a.show(); }

2) 定义一个车(vehicle)基类,有Run、Stop等虚成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类,从bicycle到motorcar派生出摩托车(motorcycle)类,它们都有Run、Stop等成员函数,利用基类指针或引用虚函数,观察虚函数的作用,说说多态的含义,如果不采用虚函数会是什么样的结果? #include using namespace std; class vehicle {

public: vehicle() { cout<<\构造函数被调用\ } ~vehicle() { cout<<\析构函数被调用\ } virtual void Run() { cout<<\设置vehicle最大速度和重量\

} virtual void Stop() { cout<<\显示vehicle最大速度和重量\ } private: double MaxSpeed,Weight; };

class bicycle:public vehicle {

public: bicycle() { cout<<\构造函数被调用\ } ~bicycle() { cout<<\析构函数被调用\ } void Run() { cout<<\设置bicycle最大速度和重量\ } void Stop() { cout<<\显示bicycle最大速度和重量\ } private: double Height; };

class motorcar:public vehicle {

public: motorcar() { cout<<\构造函数被调用\ } ~motorcar() { cout<<\析构函数被调用\

} void Run() { cout<<\设置motorcar最大速度和重量\ } void Stop() { cout<<\显示motorcar最大速度和重量\ } private: int SeatNum; };

class motorcycle:public motorcar, public bicycle {

public: motorcycle() { cout<<\构造函数被调用\ } ~motorcycle() { cout<<\析构函数被调用\ } void Run() { cout<<\设置motorcycle最大速度和重量\ } void Stop() { cout<<\显示motorcycle最大速度和重量\ } };

void fun(vehicle *p) { p->Run(); p->Stop(); }

int main() { vehicle a0,*p; bicycle a1; motorcar a2;

}

motorcycle a3; cout<

3) (选做)对实验六中的people类重载“= =”运算符和“=”运算符,“= =”运算符判断两个people类对象的id属性是否相等;“=”运算符实现people类对象的赋值操作。 3. 主要仪器设备及软件:PC+Windows 2000+VC 6.0

实验九 群体类和群体数据组织实验(选做)

(设计性实验 4学时)

1. 目的要求:

1) 了解链表类的定义与实现,学习其使用方法;了解栈类定义与实现,学习其使用方法;

2) 了解队列类的定义与实现,学习其使用方法;了解C++标准模板库STL的使用方法。 2. 实验内容:

1) 使用重载函数模板重新实现实验三中2小题中的函数Max1。(必做)

2) 编写程序link.h,实现教材中例9-6的链表类。在测试lab9_1.cpp中定义两个整型链表A和B,分别插入5个元素,然后把B中的元素加入A的尾部。

3) 编写程序queue.h,用链表实现队列(或栈)类。在测试程序lab9_1.cpp中定义一个整型队列(或栈)对象,插入5个整数,压入队列(或栈),再依次取出并显示出来。 4) (选做)将直接插入排序、直接选择程序、冒泡排序、顺序查找函数封装到教材中第9章的数组类模板中,作为成员函数。实现并测试这个类。

5) (选做)定义一个对people类对象数组按编号排序的函数,一个按编号查找people对象的函数。在测试程序中使用前面实验得到的结果定义教师数组和学生数组,分别对教师数组和学生数组进行排序和查找。

6) (选做)定义course(课程)类,有属性:课程名char name[21]、成绩short score;在实验7中的student类中增加属性:所修课程courses,为课程类对象。在测试程序测试这个类。学生类之间的关系如图9-1所示。

学生班号所修课程函数课程链表课程后续节点指针函数课程课程名成绩函数

图9-1 实验任务4的类图

3. 主要仪器设备及软件:PC+Windows 2000+VC 6.0

实验十 泛型程序设计与C++标准模板库实验(选做)

( 设计性实验 2学时)

1. 目的要求:

掌握对数组元素排序的方法;掌握对数组元素查找的方法;应用标准C++库(STL)实现查找与排序。 2. 实验内容:

1) 在C++标准模板库中,队列类(queue)的成员函数queue::push()在队列的一端添加元素,queue::pop()从非空的队列 中删除最后一个元素,queue::empty()判断队列是否为空,queue::back()返回非空队列的最后一个元素,queue::front()返回非空队列的第一个元素,queue::size()返回队列中元素的个数,请构造一个int类型的队列,对这个队列应用上述几个函数,体会队列这种数据结构的特点和其成员函数的用法。

2) 对于一个包含特定个数整型数据的数组A,对于从键盘输入的任意数,使用C++标准模板库中的find()查找在A 中的位置,使用sort()来对数组进行升序或降序排列,排序前和排序后的结果使用copy()输出。 3. 主要仪器设备及软件:PC + Windows 2000+VC 6.0

实验十一 流内库与输入、输出实验

( 设计性实验 2学时)

1. 目的要求:

熟悉流类库中常用的类及其成员函数的用法;学习标准输入输出及格式控制;学习对文件的应用方法(二进制文件、文本文件)。 2. 实验内容:

1) 观察以下程序的输出,注意对输出格式的控制方法。 //lab11_1.cpp #include Using namespace std; #define D(a)T<<#a<

2) 编写程序,用文本方式打开指定的一个文件,在每一行前加行号。 #include #include #include using namespace std;

void main() {

D(T.setf(ios::internal,ios::adjustfield);) D(T.windth(8);) T<

char e2[20],e[20],e3[20],e4[20];

ifstream mfile(\mfile.getline(e,10); mfile.getline(e2,10); mfile.getline(e3,10); mfile.getline(e4,10); mfile.close();

ofstream myfile(\myfile<<1<<\myfile<

myfile<<2<<\myfile<

myfile<<3<<\myfile<

myfile<<4<<\

myfile.close();

3) 使用实验10中的学生类数组,输入数据并显示出来,使用I/O流用二进制方式把此数组的内容写入磁盘文件,再显示出文件内容。 #include #include using namespace std;

class body {

public: void Set(int i); char name[15]; int age; double num; };

void body::Set(int i)

{ cout<<\的名字:\ cin>>name; cout<<\的年龄:\ cin>>age; cout<<\学号o\ cin>>num; cout<

void main() { int i,j; cout<<\请输入要记录的学生的个数:\ cin>>i; cout<

}

}

4) (选做)如果班级同学的身高、体重信息存放在一个文本文件中,编写程序实现从该文件中读取学生信息并计算每个学生的身体状况,然后将结果写入另外一个文本文件。

3. 主要仪器设备及软件:PC+Windows 2000+VC 6.0

实验十二 异常处理实验 ( 设计性实验 2学时)

1. 目的要求:

正确理解C++的异常处理机制;学习异常处理的定义和执行过程。2. 实验内容:

定义一个异常类CException,有成员函数Reason(),用来显示异常的类型。在字函数中触发异常,在主程序中处理异常,观察程序的执行过程。 3. 主要仪器设备及软件:PC+Windows 2000+VC 6.0

实验十三 Windows应用程序框架实验(选做)

( 基本操作实验 2学时)

1. 目的要求:简单了解Windows程序设计

2. 实验内容:练习使用VC++的AppWizard(应用程序向导)生成一个最简单的Windows应

用程序。

3. 主要仪器设备及软件:PC+Windows 2000+VC 6.0