面向对象上机实验.docx

上传人:b****6 文档编号:6786553 上传时间:2023-01-10 格式:DOCX 页数:22 大小:23.64KB
下载 相关 举报
面向对象上机实验.docx_第1页
第1页 / 共22页
面向对象上机实验.docx_第2页
第2页 / 共22页
面向对象上机实验.docx_第3页
第3页 / 共22页
面向对象上机实验.docx_第4页
第4页 / 共22页
面向对象上机实验.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

面向对象上机实验.docx

《面向对象上机实验.docx》由会员分享,可在线阅读,更多相关《面向对象上机实验.docx(22页珍藏版)》请在冰豆网上搜索。

面向对象上机实验.docx

面向对象上机实验

第1页

《面向对象程序设计》

(C++版)

实验指导书

西南交通大学信息科学与技术学院

2009年

《面向对象程序设计》实验指导书

第I页

前言

为了进一步加强和规范信息科学与技术学院本科学生《面向对象程序设计》的实践环节,

特编写该实验指导书。

该指导书配合《面向对象理论与实践》(文登敏,西南交通大学出版社,2005年6月第一

版)教材使用,以C++语言作为背景,以VC++6.0作为实践环境。

实验共分10次,约需实践(上机)时间20-24小时。

前9次平均时间2小时,实验10

需要4-6小时。

在10个实验中,实验1为环境熟悉——结合环境编写和改写基于控制台的程序,并实现

一个windows基于对话框的示例。

实验2为C++基础,主要涉及到new/delete、函数重载和

引用数据类型方面。

实验3到实验7是面向对象的核心部分,关系到封装、继承和多态三大

机制和组合机制。

实验8与运算符重载相关,通过该实验能够使学生深入领会C++中运算符

重载的精髓,以及通过结果分析进一步理解函数调用过程、对象运算过程以及临时对象的创

建和撤销的内部实现机制。

实验9是一个DLL组件封装的例子,可以为今后实现类封装奠定

基础。

实验10是一个综合性实验,结合一个人事管理系统的逐步设计和实现,使学生能够认

识到如何采用面向对象程序设计方法编写一个能够快速适应需求变化的软件。

为了使学生能够充分理解面向对象的精髓,本指导书并未要求编写的程序是基于控制台

的还是基于windows的,甚至是建议采用控制台程序设计,以避免过多地引入其它环境方面

的内容从而影响实验的效果。

每个实验都给出了实验报告的大致需求,通常都要求给出相应的源代码、运行结果及其

对应关系。

如果可能的话,建议在实验报告中给出实现的过程以及实验的感受。

本指导书是在往届课内实验的基础上总结而成。

随着时间的推移和技术的进步,相信还

会在此基础上增减内容。

《面向对象程序设计》实验指导书

第II页

《面向对象程序设计》实验指导书

第1页

实验1熟悉环境

1.1目的和要求

.熟悉VC++6.0集成开发环境

.能够编写简单控制台程序并运行产生相应结果

.能够编写基于对话框的简单windows程序并运行产生结果

1.2实验内容及参考过程

1.2.1创建控制台工程

.运行VC++6.0运行环境

.创建基于控制台的应用程序工程

.选择“HelloWorld!

”程序

.直接运行,产生结果

.退出运行环境。

1.2.2修改控制台程序

.打开运行环境

.打开上次创建的工程

.找出源文件

.加入头文件iostream.h

.将程序中的printf("HelloWorld!

\n");修改成cout<<”Hello你自己的名字!

”<

.运行并产生结果。

.关闭当前工作空间

1.2.3创建windows工程

.新建一个MFCAppWizard(EXE)工程。

.创建的应用程序类型选择基本对话框(BaseDialog)

.完成之后,双击窗口上的“确定”(OK)按钮,进入源程序

.将OnOK函数修改成以下代码段(屏蔽CDialog:

:

OnOK();语句):

MessageBox(”Hello你的名字!

”,“实验1”);

.运行,单击确定(OK)按钮,观察结果。

.单击取消按钮(Cancel),退出运行。

.在界面上增加感兴趣的控件,并编程实现之(选)。

《面向对象程序设计》实验指导书

第2页

1.3实验报告

.HelloWorld程序的源代码和运行结果

.修改后的控制台程序源代码和运行结果

.Windows程序OnOK函数源代码及运行结果界面截图

.其它的程序修改和运行结果(选)

.结果分析及实验感受

《面向对象程序设计》实验指导书

第3页

实验2C++基础

2.1目的和要求

.掌握C++函数重载及缺省参数的使用

.掌握new和delete的用法

.掌握引用数据类型及其用法

2.2实验内容及参考过程

2.2.1函数

.打开控制台工程(或创建新的控制台工程)

.确保头文件中包含了iostream.h

.编写以下四个函数:

voidMyFunc(){cout<<”无参数函数调用”<

voidMyFunc(inta){cout<<”1个整型参数函数调用”<

voidMyFunc(inta,intb){cout<<”2个整型参数函数调用”<

longMyCaculate(longa=10,longb=20){cout<

.在主函数main中加入以下调用语句:

MyFunc();

MyFunc(10);

MyFunc(10,20);

cout<

cout<

(1)<

cout<

.运行并产生结果。

分析结果。

2.2.2new/delete

.再增加一个函数:

voidTestNew(){

int*p;

p=newint[2000];

if(p){

for(inti=0;i<1000;++i)p[i]=i;

deletep;

}

}

《面向对象程序设计》实验指导书

第4页

.在主函数的最后增加以下循环语句:

for(inti=0;i<100000;++i)TestNew();

.运行,观察机器内存和CPU占用率变化情况(在任务管理器中查看)。

.退出运行,屏蔽TestNew函数中的deletep;语句。

.再次运行程序,观察机器内存和CPU占用率变化情况。

.退出运行。

.对比有无deletep语句的机器资源占用情况,分析。

2.2.3引用

.再增加一个结构和函数定义:

structS_Big{

inta[20000];

charc[80000];

};

voidTestRef(S_Bigx){}

.将主函数修改成以下内容(原有内容屏蔽,但不要删除):

S_Biga;

for(inti=0;i<200000;++i)TestRef(a);

.运行(注意记录大致运行时间)。

.将TestRef函数的形式参数x修改成&x

.再次运行程序,记录运行时间。

.退出程序,分析两者时间差。

2.3实验报告

.函数实验的源代码和运行结果分析

.new/delete实验的源代码和运行结果对比分析

.引用实验的源代码和运行结果对比分析

《面向对象程序设计》实验指导书

第5页

实验3类封装

3.1目的和要求

.掌握类定义方法,包括数据成员和函数成员的定义方法

.掌握对象的创建及其使用

.掌握构造函数和析构函数的定义与使用

.掌握this指针、static成员和友元的定义与使用

.简单的运算符重载函数定义与使用

3.2实验内容

3.2.1基础定义及函数

定义一个PERSON类,包括:

私有数据成员:

姓名指针,年龄,身高,性别,人数(static),外部函数友元

一般函数成员:

修改与获取数据成员的函数

赋值运算符重载成员函数:

实现对象赋值

构造函数与析构函数:

缺省构造函数、一般构造函数、拷贝构造函数、析构函数

外部函数:

PERSON对象加法运算符重载函数

3.2.2定义要求

姓名成员为指针类型。

在构造函数中分配相应的空间,在析构函数中释放该空间。

采用两种方式定义成员函数(内联方式和非内联方式)

加法运算符重载函数为对象和整数相加,更新年龄。

赋值运算符成员函数返回当前对象。

每个成员函数和加法运算符重载函数均需要输出相应的信息,以确定其调用情况。

3.2.3主函数

确保每个函数(包括构造函数、析构函数和外部函数)都至少被调用一次。

采用不同方式创建对象(静态有名对象和动态无名对象)。

每次创建或释放对象之后都应及时输出当前已创建的PERSON对象的个数。

《面向对象程序设计》实验指导书

第6页

3.2.4运行程序分析结果

给出完整的程序代码、运行结果。

每个输出结果产生的原因(代码段)。

3.3实验报告

.检查以下要求完整性:

.类定义

.私有成员的数量和要求

.函数成员的数量和要求

.类内定义成员函数(内联)

.类外定义成员函数(非内联)

.static成员

.友元

.this指针

.外部加法运算符重载函数

.创建静态有名对象(调用不同的构造函数)

.创建动态无名对象(调用不同的构造函数)

.释放动态无名对象

.每个函数的输出

.构造函数中的动态存储分配和static成员的处理

.析构函数中的动态存储释放和static成员的处理

.完整的源程序代码和运行结果

.每个运行结果与源程序代码的对应关系

.访问对象私有成员所产生的错误信息

.创建对象时提供的参数与构造函数不匹配时所产生的错误信息

.实验结果分析报告

3.4代码样例

.下面给出实验3的代码样例,以供参考。

#include"stdafx.h"

#include"iostream.h"

#include"string.h"

classPERSON{

char*name;

intage;

intheight;

boolgender;

《面向对象程序设计》实验指导书

第7页

staticintcounter;

public:

friendPERSONoperator+(constPERSON&a,intb);

PERSON(){name=0;age=0;height=0;counter++;cout<<"PERSON()"<

PERSON(char*n,inta,inth,boolg);

PERSON(constPERSON&p);

PERSONoperator=(constPERSON&p);

~PERSON(){

cout<<"~PERSON"<

if(name)deletename;

if(counter)counter--;

}

voidsetname(char*n){

cout<<"setname"<

if(name)deletename;

name=newchar[strlen(n)+1];

if(name){

strcpy(name,n);

name[strlen(n)]=0;

}

}

voidsetage(inta){cout<<"setage"<

voidsetgender(boolg){cout<<"setgender"<

voidsetheight(inth){cout<<"setheight"<

char*getname(){

cout<<"getname"<

if(name)

returnname;

else

return"NONAME";

}

intgetage(){cout<<"getage"<

intgetheight(){cout<<"getheight"<

boolgetgender(){cout<<"getgender"<

staticintgetcounter(){cout<<"getcounter"<

};

PERSON:

:

PERSON(char*n,inta,inth,boolg){

cout<<"PERSON(char*n,inta,inth,boolg)"<

name=newchar[strlen(n)+1];

if(name){

strcpy(name,n);

name[strlen(n)]=0;

}

《面向对象程序设计》实验指导书

第8页

age=a;

height=h;

gender=g;

counter++;

}

PERSON:

:

PERSON(constPERSON&p){

cout<<"PERSON(constPERSON&p)"<

if(p.name){

name=newchar[strlen(p.name)+1];

if(name){

strcpy(name,p.name);

name[strlen(p.name)]=0;

}

}elsename=0;

age=p.age;

height=p.height;

gender=p.gender;

counter++;

}

PERSONPERSON:

:

operator=(constPERSON&p){

cout<<"operator="<

if(name)deletename;

if(p.name){

name=newchar[strlen(p.name)+1];

if(name){

strcpy(name,p.name);

name[strlen(p.name)]=0;

}

}elsename=0;

age=p.age;

height=p.height;

gender=p.gender;

return*this;

}

PERSONoperator+(constPERSON&a,intb){

cout<<"operator+"<

PERSONresult;

result.age=a.age+b;

returnresult;

}

《面向对象程序设计》实验指导书

第9页

intPERSON:

:

counter=0;

voidmain(){

cout<<"counter:

"<

:

getcounter()<

PERSONa1;

cout<<"counter:

"<

:

getcounter()<

PERSONa2("zhangsan",18,175,true);

cout<<"counter:

"<

:

getcounter()<

PERSONa3=a2;

cout<<"counter:

"<

:

getcounter()<

PERSONa4(a2);

cout<<"counter:

"<

:

getcounter()<

PERSON*p1,*p2,*p3;

a1=a2;

a1.setname("zhangsi");

a1.setage(19);

a3.setgender(false);

a4.setheight(182);

p1=newPERSON;

cout<<"counter:

"<

:

getcounter()<

p2=newPERSON("Lisi",20,150,false);

cout<<"counter:

"<

:

getcounter()<

p3=newPERSON(*p2);

cout<<"counter:

"<

:

getcounter()<

*p3=*p3+2;

*p2=*p1+1;

cout<

cout<

cout<

if(p1->getgender())

cout<<"Male"<

else

cout<<"Female"<

deletep1;

cout<<"counter:

"<

:

getcounter()<

deletep2;

cout<<"counter:

"<

:

getcounter()<

deletep3;

cout<<"counter:

"<

:

getcounter()<

}

《面向对象程序设计》实验指导书

第10页

实验4单继承

4.1目的和要求

.掌握继承类别和继承方式

.掌握单继承中的成员属性变化及使用方法

.掌握继承中的同名问题处理、函数覆盖

4.2实验内容

4.2.1创建子类

.在实验3的基础上生成EMPLOYEE子类,增加角色ROLE描述。

.子类缺省构造函数、子类一般构造函数、子类析构函数定义。

.子类赋值运算符重载函数定义。

.角色的修改和获取函数。

.覆盖父类的一般成员函数。

4.2.2定义要求

.子类成员函数的信息输出。

4.2.3主函数

.创建及使用子类对象

.通过子类对象访问父类的同名成员

4.2.4运行程序分析结果

.给出子类及主函数完整的程序代码、运行结果。

.每个输出结果产生的原因(代码段)。

4.3实验报告

.子类定义完整代码

.主函数完整代码

.运行结果及结果分析(信息输出与源代码的对应关系)

《面向对象程序设计》实验指导书

第11页

实验5多继承

5.1目的和要求

.掌握多继承与单继承的异同

.掌握重复继承和虚继承的概念和使用方法

5.2实验内容

5.2.1创建子类

.在实验3的基础上生成STUDENT子类,增加年级GRADE描述。

.STUDENT子类缺省构造函数、子类一般构造函数、子类析构函数定义。

.用STUDENT类和实验4生成的EPMLOYEE联合派生子类GRADEROLE,增加系

别DEPARTMENT和专业SPECIALTY属性。

.建立相应的构造函数、析构函数和新增数据成员的成员函数。

5.2.2定义要求

.STUDENT子类成员函数的信息输出。

.GRADEROLE子类成员函数的信息输出。

5.2.3主函数

.创建及使用GRADEROLE对象

.通过子类对象访问父类的同名成员

5.2.4运行程序分析结果

.子类STUDENT、GRADEROLE及主函数完整的程序代码

.程序运行结果。

.每个输出结果产生的原因(代码段)。

5.2.5虚继承

.将PERSON类设置为EMPLOYEE和STUDENT子类的虚基类

.相应修改子类GRADEROLE构造函数定义

《面向对象程序设计》实验指导书

第12页

5.3实验报告

.子类STUDENT、GRADEROLE及主函数完整的程序代码

.程序运行结果。

.每个输出结果产生的原因(代码段)。

.虚继承情况下的子类EMPLOYEE、STUDENT和GRADEROLE定义

.虚继承情况下的程序运行结果及其分析。

《面向对象程序设计》实验指导书

第13页

实验6组合

6.1目的和要求

.掌握组合机制

.掌握整体类的定义

.掌握通过整体类对象访问部分类对象成员的方法

6.2实验内容

6.2.1创建部分类和整体类

.创建一个具有三维坐标和颜色特征的POINT类,包括相应的成员函数。

.创建一个画任意折线的整体类,其中的数据成员是一个POINT对象数组(以100

个点为界),同时记录有效点数(说明:

如果只有一个点有效,则为点。

如果只有两

个点有效,则为一条直线,以此类推。

两两相邻点互连)。

.创建整体类的DRAW函数(以文字形式输出起点坐标、终点坐标和颜色值)。

.创建整体类的有效点设置方法(缺省构造函数为清空有效点),包括增加点、减少点

和插入点。

.创建能够获取有效点坐标和颜色值的整体类方法。

6.2.2主函数

.创建整体类。

.循环增加有效点。

.输出折线表示。

.反复修改有效点数并输出折线表示。

6.3实验报告

.部分类定义源代码

.整体类定义源代码

.主程序源代码

.历次有效点数及其输出的折线表示结果。

《面向对象程序设计》实验指导书

第14页

实验7多态与虚函数

7.1目的和要求

.掌握父类指针和子类对象的关系

.认识静态联编和动态联编的区别

.掌握虚函数的定义及使用

.掌握多态的机制使用

.抽象类的概念及其使用

7.2实验内容

7.2.1定义父类和子类

.定义一个SHAPE类,其中只有一个公有成员函数DRAW,函数体输出个性化信息。

.通过SHAPE派生子类POINT,其中包括三维坐标数据和颜色数据,同时还有函数

DRAW,输出相应的结果。

.通过SHAPE派生子类LINE,其中包括两个POINT对象和一个DRAW函数。

.SHAPE、POINT和LINE类中的DRAW函数具有相同的原型,但定义和输出的个

性化信息不同。

.除了SHAPE类之外的POINT类和LINE类都需要有相应的构造函数。

7.2.2主函数

.创建SHAPE对象和SHAPE指针。

.创建POINT对象和LINE对象。

.分别用SHAPE对象、POINT对象和LINE对象调用DRAW方法,记录结果。

.分别用SHAPE指针指向SHAPE对象、POINT对象和LINE对象,以指针形式调用

DRAW方法,记录结果。

.将SHAPE类中的DRAW函数修改成虚函数。

再次用SHAPE指针指向SHAPE对象、

POINT对象和LINE对象,以指针形式调用DRAW方法,记录结果。

.将SHAPE类中的DRAW函数修改成纯虚函数。

重新运行,记录出现的问题。

.修改问题,重新运行。

7.3实验报告

.按照实验内容所进行的每次修改后的源代码及其运行结果。

.实验过程中遇到的问题及其解决方法。

《面向对象程序设计》实验指导书

第15页

实验8运算符重载

8.1目的和要求

.深度掌握运算符重载的各种用法。

.以教材上的MyComplex类为原形进行本实验。

8.2实验内容

.完整输入教材上的MyComplex类定义及其主函数。

.成功调试运行并产生一致的结果。

.分析结果。

8.3实验报告

.每条输出结果与源代码之间的对应关系

.从中分析函数调用、参数传递、实参创建和释放等相关问题的运行机理。

《面向对象程序设计》实验指导书

第16页

实验9DLL组件

9.1目的和要求

.掌握C++创建DLL组件的过程

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1