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

上传人:jkl****17 文档编号:178682932 上传时间:2022-12-29 格式:DOC 页数:23 大小:162KB
收藏 版权申诉 举报 下载
面向对象程序设计实验指导书_第1页
第1页 / 共23页
面向对象程序设计实验指导书_第2页
第2页 / 共23页
面向对象程序设计实验指导书_第3页
第3页 / 共23页
资源描述:

《面向对象程序设计实验指导书》由会员分享,可在线阅读,更多相关《面向对象程序设计实验指导书(23页珍藏版)》请在装配图网上搜索。

1、面向对象程序设计(C+版)实验指导书西南交通大学信息科学与技术学院2009年第19页面向对象程序设计实验指导书前 言为了进一步加强和规范信息科学与技术学院本科学生面向对象程序设计的实践环节,特编写该实验指导书。该指导书配合面向对象理论与实践(文登敏,西南交通大学出版社,2005年6月第一版)教材使用,以C+语言作为背景,以VC+6.0作为实践环境。实验共分10次,约需实践(上机)时间20-24小时。前9次平均时间2小时,实验10需要4-6小时。在10个实验中,实验1为环境熟悉结合环境编写和改写基于控制台的程序,并实现一个windows基于对话框的示例。实验2为C+基础,主要涉及到new/del

2、ete、函数重载和引用数据类型方面。实验3到实验7是面向对象的核心部分,关系到封装、继承和多态三大机制和组合机制。实验8与运算符重载相关,通过该实验能够使学生深入领会C+中运算符重载的精髓,以及通过结果分析进一步理解函数调用过程、对象运算过程以及临时对象的创建和撤销的内部实现机制。实验9是一个DLL组件封装的例子,可以为今后实现类封装奠定基础。实验10是一个综合性实验,结合一个人事管理系统的逐步设计和实现,使学生能够认识到如何采用面向对象程序设计方法编写一个能够快速适应需求变化的软件。为了使学生能够充分理解面向对象的精髓,本指导书并未要求编写的程序是基于控制台的还是基于windows的,甚至是

3、建议采用控制台程序设计,以避免过多地引入其它环境方面的内容从而影响实验的效果。每个实验都给出了实验报告的大致需求,通常都要求给出相应的源代码、运行结果及其对应关系。如果可能的话,建议在实验报告中给出实现的过程以及实验的感受。本指导书是在往届课内实验的基础上总结而成。随着时间的推移和技术的进步,相信还会在此基础上增减内容。目 录前 言I实验1熟悉环境11.1 目的和要求11.2 实验内容及参考过程11.2.1 创建控制台工程11.2.2 修改控制台程序11.2.3 创建windows工程11.3 实验报告2实验2C+基础32.1 目的和要求32.2 实验内容及参考过程32.2.1 函数32.2.

4、2 new/delete32.2.3 引用42.3 实验报告4实验3类封装53.1 目的和要求53.2 实验内容53.2.1 基础定义及函数53.2.2 定义要求53.2.3 主函数53.2.4 运行程序分析结果63.3 实验报告6实验4单继承74.1 目的和要求74.2 实验内容74.2.1 创建子类74.2.2 定义要求74.2.3 主函数74.2.4 运行程序分析结果74.3 实验报告7实验5多继承85.1 目的和要求85.2 实验内容85.2.1 创建子类85.2.2 定义要求85.2.3 主函数85.2.4 运行程序分析结果85.2.5 虚继承85.3 实验报告9实验6组合106.1

5、 目的和要求106.2 实验内容106.2.1 创建部分类和整体类106.2.2 主函数106.3 实验报告10实验7多态与虚函数117.1 目的和要求117.2 实验内容117.2.1 定义父类和子类117.2.2 主函数117.3 实验报告11实验8运算符重载128.1 目的和要求128.2 实验内容128.3 实验报告12实验9DLL组件139.1 目的和要求139.2 实验内容139.2.1 创建DLL工程139.2.2 创建界面139.2.3 创建调用DLL的程序139.3 实验报告13实验10综合应用1410.1 目的和要求1410.2 实验内容1410.3 实验过程1410.3.

6、1 创建工程1410.3.2 设计思路1410.3.3 代码封装及移植1510.3.4 需求第一步1610.3.5 需求第二步1610.3.6 需求第三步1610.3.7 需求第四步1610.4 实验报告16面向对象程序设计实验指导书实验1 熟悉环境1.1 目的和要求l 熟悉VC+6.0集成开发环境l 能够编写简单控制台程序并运行产生相应结果l 能够编写基于对话框的简单windows程序并运行产生结果1.2 实验内容及参考过程1.2.1 创建控制台工程l 运行VC+6.0运行环境l 创建基于控制台的应用程序工程l 选择“Hello World!”程序l 直接运行,产生结果l 退出运行环境。1.

7、2.2 修改控制台程序l 打开运行环境l 打开上次创建的工程l 找出源文件l 加入头文件iostream.hl 将程序中的printf(Hello World!n);修改成cout”Hello 你自己的名字!”endl;l 运行并产生结果。l 关闭当前工作空间1.2.3 创建windows工程l 新建一个MFC AppWizard(EXE)工程。l 创建的应用程序类型选择基本对话框(Base Dialog)l 完成之后,双击窗口上的“确定”(OK)按钮,进入源程序l 将OnOK函数修改成以下代码段(屏蔽CDialog:OnOK();语句):MessageBox(”Hello 你的名字!”, “

8、实验1”);l 运行,单击确定(OK)按钮,观察结果。l 单击取消按钮(Cancel),退出运行。l 在界面上增加感兴趣的控件,并编程实现之(选)。1.3 实验报告l Hello World程序的源代码和运行结果l 修改后的控制台程序源代码和运行结果l Windows程序OnOK函数源代码及运行结果界面截图l 其它的程序修改和运行结果(选)l 结果分析及实验感受实验2 C+基础2.1 目的和要求l 掌握C+函数重载及缺省参数的使用l 掌握new和delete的用法l 掌握引用数据类型及其用法2.2 实验内容及参考过程2.2.1 函数l 打开控制台工程(或创建新的控制台工程)l 确保头文件中包含

9、了iostream.hl 编写以下四个函数:void MyFunc( ) cout”无参数函数调用”endl;void MyFunc( int a) cout”1个整型参数函数调用”aendl;void MyFunc( int a, int b) cout”2个整型参数函数调用”a”,”bendl;long MyCaculate(long a=10,long b=20)couta”,”bendl; return a*a+b*b;l 在主函数main中加入以下调用语句:MyFunc( );MyFunc( 10 );MyFunc( 10, 20 );coutMyCaculate( )endl;co

10、utMyCaculate( 1 )endl;coutMyCaculate( 1, 2 )endl;l 运行并产生结果。分析结果。2.2.2 new/deletel 再增加一个函数:void TestNew( )int *p;p=new int2000;if(p) for(int i=0;i1000;+i) pi=i;delete p;l 在主函数的最后增加以下循环语句:for (int i=0;i100000;+i) TestNew();l 运行,观察机器内存和CPU占用率变化情况(在任务管理器中查看)。l 退出运行,屏蔽TestNew函数中的delete p;语句。l 再次运行程序,观察机器

11、内存和CPU占用率变化情况。l 退出运行。l 对比有无delete p语句的机器资源占用情况,分析。2.2.3 引用l 再增加一个结构和函数定义:struct S_Bigint a20000;char c80000;void TestRef(S_Big x)l 将主函数修改成以下内容(原有内容屏蔽,但不要删除):S_Big a;for (int i=0;i200000;+i) TestRef(a);l 运行(注意记录大致运行时间)。l 将TestRef函数的形式参数x修改成&xl 再次运行程序,记录运行时间。l 退出程序,分析两者时间差。2.3 实验报告l 函数实验的源代码和运行结果分析l n

12、ew/delete实验的源代码和运行结果对比分析l 引用实验的源代码和运行结果对比分析实验3 类封装3.1 目的和要求l 掌握类定义方法,包括数据成员和函数成员的定义方法l 掌握对象的创建及其使用l 掌握构造函数和析构函数的定义与使用l 掌握this指针、static成员和友元的定义与使用l 简单的运算符重载函数定义与使用3.2 实验内容3.2.1 基础定义及函数定义一个PERSON类,包括:私有数据成员:姓名指针,年龄,身高,性别,人数(static),外部函数友元一般函数成员:修改与获取数据成员的函数赋值运算符重载成员函数:实现对象赋值构造函数与析构函数:缺省构造函数、一般构造函数、拷贝构

13、造函数、析构函数外部函数:PERSON对象加法运算符重载函数3.2.2 定义要求姓名成员为指针类型。在构造函数中分配相应的空间,在析构函数中释放该空间。采用两种方式定义成员函数(内联方式和非内联方式)加法运算符重载函数为对象和整数相加,更新年龄。赋值运算符成员函数返回当前对象。每个成员函数和加法运算符重载函数均需要输出相应的信息,以确定其调用情况。3.2.3 主函数确保每个函数(包括构造函数、析构函数和外部函数)都至少被调用一次。采用不同方式创建对象(静态有名对象和动态无名对象)。每次创建或释放对象之后都应及时输出当前已创建的PERSON对象的个数。3.2.4 运行程序分析结果给出完整的程序代

14、码、运行结果。每个输出结果产生的原因(代码段)。3.3 实验报告l 检查以下要求完整性:n 类定义n 私有成员的数量和要求n 函数成员的数量和要求n 类内定义成员函数(内联)n 类外定义成员函数(非内联)n static成员n 友元n this指针n 外部加法运算符重载函数n 创建静态有名对象(调用不同的构造函数)n 创建动态无名对象(调用不同的构造函数)n 释放动态无名对象n 每个函数的输出n 构造函数中的动态存储分配和static成员的处理n 析构函数中的动态存储释放和static成员的处理l 完整的源程序代码和运行结果l 每个运行结果与源程序代码的对应关系l 访问对象私有成员所产生的错误

15、信息l 创建对象时提供的参数与构造函数不匹配时所产生的错误信息l 实验结果分析报告3.4 代码样例l 下面给出实验3的代码样例,以供参考。#include stdafx.h#include iostream.h#include string.hclass PERSONchar *name;int age;int height;bool gender;static int counter;public:friend PERSON operator+(const PERSON &a,int b);PERSON()name=0;age=0;height=0;counter+; coutPERSON(

16、)endl;PERSON(char *n,int a,int h,bool g);PERSON(const PERSON &p);PERSON operator=(const PERSON &p);PERSON()coutPERSONendl;if(name) delete name;if(counter) counter-;void setname(char *n)coutsetnameendl;if(name) delete name;name=new charstrlen(n)+1;if(name)strcpy(name,n);namestrlen(n)=0;void setage(in

17、t a)coutsetageendl;age=a;void setgender(bool g)coutsetgenderendl;gender=g;void setheight(int h)coutsetheightendl;height=h;char *getname()coutgetnameendl;if(name)return name;elsereturn NONAME;int getage()coutgetageendl;return age;int getheight()coutgetheightendl;return height;bool getgender()coutgetg

18、enderendl;return gender;static int getcounter()coutgetcounterendl;return counter;PERSON:PERSON(char *n,int a,int h,bool g)coutPERSON(char *n,int a,int h,bool g)endl;name=new charstrlen(n)+1;if(name)strcpy(name,n);namestrlen(n)=0;age=a;height=h;gender=g;counter+;PERSON:PERSON(const PERSON &p)coutPERS

19、ON(const PERSON &p)endl;if(p.name)name=new charstrlen(p.name)+1;if(name)strcpy(name,p.name);namestrlen(p.name)=0; else name=0;age=p.age;height=p.height;gender=p.gender;counter+;PERSON PERSON:operator=(const PERSON &p)coutoperator=endl;if(name) delete name;if(p.name)name=new charstrlen(p.name)+1;if(n

20、ame)strcpy(name,p.name);namestrlen(p.name)=0;else name=0;age=p.age;height=p.height;gender=p.gender;return *this;PERSON operator+(const PERSON &a,int b)coutoperator+endl;PERSON result;result.age=a.age+b;return result;int PERSON:counter=0;void main()coutcounter:PERSON:getcounter()endl;PERSON a1;coutco

21、unter:PERSON:getcounter()endl;PERSON a2(zhangsan,18,175,true);coutcounter:PERSON:getcounter()endl;PERSON a3=a2;coutcounter:PERSON:getcounter()endl;PERSON a4(a2);coutcounter:PERSON:getcounter()endl;PERSON *p1,*p2,*p3;a1=a2;a1.setname(zhangsi);a1.setage(19);a3.setgender(false);a4.setheight(182);p1=new

22、 PERSON;coutcounter:PERSON:getcounter()endl;p2=new PERSON(Lisi,20,150,false);coutcounter:PERSON:getcounter()endl;p3=new PERSON(*p2);coutcounter:PERSON:getcounter()endl;*p3=*p3+2;*p2=*p1+1;couta1.getname()endl;couta2.getage()endl;couta3.getheight()getgender()coutMaleendl;elsecoutFemaleendl;delete p1;

23、coutcounter:PERSON:getcounter()endl;delete p2;coutcounter:PERSON:getcounter()endl;delete p3;coutcounter:PERSON:getcounter()run( );CmyApp( ) delete p; ;l 主函数定义如下例。需要注意到,无论需求如何变化,主函数无需变化。int main(int argc, char* argv)CmyApp Myc;Myc.run( );return 0;l 作为例子,首先定义一个基本信息类CBase1,只包括姓名信息和年龄信息:class CBase1:pub

24、lic CBasechar name20;int age;public:CBase1(char *n,int a)strcpy(name,n);age=a;void run( ) coutname”,”ageendl; char *getname()return name;int getage()return age;l 将应用类中的XXX修改成CBase1(“zhangsan”,18),运行程序观察结果。l 随着需求的不断变化,人事管理系统中所需要的个人信息不断增多,此时,不需要修改CBase1类的结构,而只需要从CBase1类再派生一个新类如下:class CBase2:public CB

25、ase1int height;public:CBase2(char *n,int a,int h):CBase1(n,a)height=h;void run() coutgetname()”,”getage()”,”heightendl; int getheight()return height;l 再将应用类中的XXX修改成CBase2(“zhangsan”,18,175),而后运行观察结果。l 以此类推,该系统适应需求的变化,只需要在原来已有类的基础上派生出一个新类,重写相应的run( )方法,之后再将应用类中的XXX及其参数修改成新类的构造函数即可。l 而一旦需要需求回退,已有的类不必删

26、除,也只需要将XXX改回去即可。l 抽象类CBase和应用类CmyApp的存在,在很大程度上简化了为了适应需求的变化而需要进行的代码修改。l 实际上,各个类中的run方法只是一个接口方法而已。而在具体需求中,可能还会有多种多样的功能设计。这里的run方法及其应用形式的思路可以进一步延伸,包括可以设计成插入方法、更新方法、删除方法、查询方法等。但需要注意的原则是,主函数只与应用类相关,而与具体的派生类无关。主函数一旦设计完成,不应该与需求的变化产生依赖关系。可能产生的变化只有应用类CmyApp,另外就是在已有CBase类的基础上派生一个新类。10.3.3 代码封装及移植l 设计思路中描述的CBa

27、se类和CmyApp类是最基本的两个类,可以单独进行封装成一个头文件。l 主函数和派生类中的run方法定义,是根据控制台应用程序而设计的。如果需要修改成windows应用程序,需要进行相应的修改。l 主函数也只是作为一个例子而出现。如果将主函数设计成一个应用函数,则可以将该函数作为DLL的接口函数形式出现,其中DLL中包含了CBase类及其派生类和应用类的全集。一旦需求发生变化,则修改该DLL。10.3.4 需求第一步l 设计一个人事管理系统l 可以管理每个人的姓名、性别和年龄l 可插入新资料、删除已有资料l 可以根据姓名查询、性别查询和年龄查询l 可以根据性别和年龄统计现有人数10.3.5 需求第二步l 增加人事管理属性:职业和部门l 可插入、条件删除、条件更新l 根据指定条件统计10.3.6 需求第三步l 增加人事管理属性:身高、体重、健康状况(良好/一般/差)l 可插入、条件删除、条件更新l 根据指定条件统计10.3.7 需求第四步l 身高体重和健康状况管理属性被忽略l 回退到第二步的需求10.4 实验报告l 满足历次需求的程序源代码l 操作过程及其运行结果

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!