《C++面向对象程序设计_实验指导书.doc》由会员分享,可在线阅读,更多相关《C++面向对象程序设计_实验指导书.doc(60页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+面向对象程序设计教程实 验 指 导 书吴芸、施华 编 写适用专业: 计算机类相关专业 厦门理工学院计算机科学与技术系(部)2013 年 02月前 言C+语言是在C语言基础上扩充了面向对象机制而形成的一种面向对象的程序设计语言,它除了继承C语言的全部优点和功能外,还支持面向对象程序设计。本课程共分7个章节。第1章概述了面向对象程序设计的基本概念。第2章介绍了C+对C语言在非面向对象方面的扩充。第3章至第7章详述了C+支持面向对象程序设计的基本方法,包括类和对象、派生类和继承、多态性、模板、流类库等。通过本课程的学习,学生需要掌握这些基本知识。为了使学生更好地理解和深刻地把握这些知识,并在此基
2、础上,掌握C+程序设计的基本技能和面向对象的概念与方法,并能编写出具有良好风格的程序,共设置了7个实验项目,与课程的7个章节分别对应。其中实验5为综合性、设计性实验,其余为验证性实验。本指导书主要针对选用的教材C+面向对象程序设计(第3版),陈维兴,林小茶 编著,清华大学出版社,2009.06,也可以作为其它C+教材的实验指导书的参考。该指导书适应于计算机相关专业。实验绪:对C语言编程的简单回顾实验学时:2实验类型:验证实验要求:选修一、实验目的通过本实验的学习,使学生熟悉Visual C+ 6.0集成开发环境的使用,通过C语言的回顾,了解C+对C语言语法的继承与发展。掌握C基本数据类型的基本
3、概念、基本属性。学会如何书写一个整型、字符型、实型常量。掌握C算术运算符的基本概念、基本属性、运算规则。二、实验内容1输入下列源程序,进行修改、编译、连接和运行。程序:main ( ) char c1,c2;c1=97;c2=98;printf(%c,%cn,c1,c2);printf(%d,%dn,c1,c2); 【运行结果是】: 【两行结果的不同是由什么引起的】:2输入下列源程序,进行修改、编译、连接和运行。分析+运算符。程序:main ( ) int i,j,m,n;i=8;j=10;m=+i;n=j+;printf(%d,%d,%d,%d n,i,j,m,n); 【运行结果是】: 【分
4、析前+和后+的不同】:3输入下列源程序,进行修改、编译、连接和运行。分析+和-运算符。程序:main ( ) int i,j;i=8;j=10;printf(%d,%d n, i,j);printf(%d,%d n,i+,j-);printf(%d,%d n, i,j);printf(%d,%d n, + i,- j); 【运行结果是】:【分析运行结果】:4输入并运行下面的程序:#includevoid main()char c1,c2,c3;c1=getchar();c2=getchar();c3=getchar();putchar(c1);putchar(c2);putchar(c3);观
5、察以下不同输入时的输出,分析不同输出的原因。( 表示回车)(1)123(2)12(3)1 2【运行结果是】:【分析运行结果】:5把以上程序改写如下,用于上面相同的输入运行,分析不同输出的原因。#includevoid main()char c1,c2,c3;c1=getchar();putchar(c1);c2=getchar();putchar(c2);c3=getchar();putchar(c3);【运行结果是】:【分析运行结果】:6输入并运行下面的程序,分析格式控制对输出的影响。#includevoid main()int a=-1,b=98;double x=152.;printf(
6、a=%d,%ld,%u,%o,%xn,a,a,a,a,a);printf(b=%d,%5d,%-5d,%c,%5c,%-5cn,b,b,b,b,b,b);printf(x=%f,%en,x,x);printf(x=%.2f,%15.2f,%-15.2f,%15.9f,%2fn,x,x,x,x,x);【运行结果截图】:【分析运行结果】:7输入并运行下面的程序:#includevoid main()int a,b;double x;float y;scanf(%d,%d,&a,&b);printf(a=%d,b=%dn,a,b);scanf(%d%d,&a,&b);printf(a=%d,b=%d
7、n,a,b); 观察以下不同输入时的输出,分析间隔符号对输入的影响。( 表示回车)(1)1,2 1,2(2)1 2 1 2(3)1 1 2【运行结果截图】:【分析运行结果】:8转义字符的使用。main() int a,b,c; a=5; b=6; c=7; printf(“ ab ctderfn”);printf(“hijktLbMn”);【运行结果截图】:9大小写转换main() char a,b; a=a; b=b; a=a-32; b=b-32; printf(%c,%cn%d,%dn,a,b,a,b);【运行结果截图】:10参考例题2-2完成题目:设圆半径r=1.5 圆柱高h=3求圆周
8、长、圆面积、圆球表面积、圆球体积、圆柱体积,输出结果要有文字说明,如The area is 7.06. (其中=3.,采用第二章例题2-2的#define来定义;圆周长2r、圆面积r2、圆球表面积4r2、圆球体积4/3r3、圆柱体积r2h)【测试结果】:rhcircleareasurfaceglobecolumn1.533.452.56三、实验原理、方法和手段总体思想:通过几个简单程序的设计,熟悉Microsoft Visual Studio 6.0集成开发环境;通过对C程序的回顾,了解C+对C程序语法的继承与发展。四、实验组织运行要求本实验采用“以集中授课,学生自主训练为主的开放模式组织教学
9、”。五、实验条件微型计算机;windows 操作系统;Microsoft Visual Studio 6.0集成开发环境;Microsoft Visual Studio 6.0集成开发环境的MSDN。六、实验步骤1、进入和退出Visual C+ 6.0集成开发环境。 启动并进入Visual C+ 6.0集成开发环境有三种方法:(1)在开始菜单上,选择程序,然后Microsoft Visual Studio 6.0组,再选择Microsoft Visual Studio 6.0。(2)在桌面上创建VC的某种工程的快捷方式,直接双击该图标;(3)如果已经创建了VC的某种工程,双击该工程的dsw(D
10、evelop Studio Workshop)文件图标,也可以进入集成开发环境,并打开该工程。(4)选择FileExit菜单,退出集成开发环境。2、菜单、工具栏和集成开发环境的使用方法,在附录的菜单介绍中有,可以查阅MSDN具体使用方法。3、参见C+面向对象程序设计教程(第3版)(陈维兴 林小茶 编著,清华大学出版社,2009.06)的第10.1.2的实验步骤。七、思考题1、思考问题:数据类型、运算符、表达式等在C语句中充当什么成分?什么是标识符?整型、实型、字符型常量的书写法是怎样的?整型、实型、字符型变量怎样创建?字符串怎样表示?如何求表达式的值?混合表达式的求值规则是怎样的?八、实验报告
11、1完成实验指导书C+面向对象程序设计教程(第3版)习题解答与上机指导的实验1;2做好实验记录;3按照实验报告格式(附件1)要求填写实验内容,并提交实验报告。九、其它说明每次实验前,实验指导书都会预先发放,请提前预习实验,特别是实验涉及的原理。实验要求及时完成并上交实验报告,鼓励提前完成必做实验,并尽量多做实验题目。遵守学生实验室管理的相关规定及安全事项。实验01:C+简单程序设计实验学时:6实验类型:验证实验要求:必修一、实验目的函数是C+程序的基本组成模块。通过本实验的学习,使学生:1、进一步熟悉Visual C+ 6.0的集成开发环境,为今后程序编程和调试奠定基础;2、了解C+在非面向对象
12、方面对C功能的扩充与增强。二、实验内容1、输入以下程序,进行编译,如果有错误、请修改程序,直到没有错误,然后进行链接和运行,并分析运行结果。#include using namespace std;int main() int a, b, c; cout a b; c = sum(a, b); cout sum is: c; return 0;sum(int a, int b) return a+b;【提示】本题重点在于实验结果的分析。【运行结果截图】:【运行结果分析】:程序在调用函数的时候,要先对函数进行声明,再进行调用。本程序调用了一个sum函数用来计算两个数的和。当输入5和6时,程序会自
13、动得出答案为11,。2、编写一个程序,用来分别求2个整数、3个整数、2个双精度数和3个双精度数的最大值。【要求】:使用重载函数来完成。采用C+输入输出流对象完成数据的输出。【运行结果截图】:3、编写一个程序,任意从键盘输入两个字符,能将它们按由大到小的顺序输出。【要求】:程序中有一个交换两个字符的函数,其形参是变量的引用。【运行结果截图】:4、编写一个程序,对一个整型数组的元素求和,结果使用全局变量sum存储,另外对数组元素中的奇数求和,结果使用局部变量sum存储,在主程序将两个结果输出。【要求】:体会和理解作用域运算符的概念与使用方法。【运行结果截图】:5、编写一个程序,声明一个双精度型指针
14、变量,使用运算符new动态分配一个double型存储区,将首地址赋给该指针变量,并输入一个数到该存储区中。计算该数为半径的圆的面积,并在屏幕上显示,最后使用运算符delete释放该空间。【要求】:体会和理解动态内存分配的作用和意义。【运行结果截图】:6、编写一个程序,完成二分法求解f(x)=0的根。【提示】:(1)请上网查找有关二分法用于查找“已排序数列”的代码或程序,理解二分法的主要涉及思想,并运用于本题的设计与编码。(2)为简化问题,假设 a*x*x + b*x +c; a, b, c是输入的任意实数。【要求】:采用C+编程风格。【运行结果截图】:三、实验原理、方法和手段1重载函数:a)
15、函数名称相同;b) 函数的形参个数不同;函数的形参类型不同;或两者兼有;c) 函数的返回值不构成判别标准。2了解“传址调用”与“传值调用”的区别;3“引用”不额外申请内存。四、实验组织运行要求本实验采用“以集中授课,学生自主训练为主的开放模式组织教学”。五、实验条件微型计算机;windows 操作系统;Microsoft Visual Studio 6.0集成开发环境;Microsoft Visual Studio 6.0集成开发环境的MSDN。六、实验步骤使用重载函数求最大值:2个整数:int max(int a, int b);3个整数:int max(int a, int b, int
16、c);2个双精度数:double max(double a, double b);3个双精度数:double max(double a, double b, double c);七、思考题 1、求组合数【提示】:求组合数要用到求阶乘,将求阶乘定义为一个函数,在求组合数的函数中嵌套调用阶乘函数。由于,求阶乘是一个典型的递归算法,在此递归方法实现。includelong com(int, int), fac(int); /原型声明void main() int m,n; cout”Please input two numbers m, n(mmn;if(m=n) cout”C(m,n)=”com(
17、m,n)endl;else cout”Input Errorn”;return;long com(int i, int j) long cmb; /att: A cmb=fac(j)/fac(i)*fac(j-i); /在com函数内嵌套调用fac函数 return cmb; long fac(int i) long fcl; if(i=0|i=1) fcl=1; else fac=i*fac(i-1); return fcl;* 这里因阶乘极易溢出,请考虑修改。可用:。2、编写几个计算面积的函数,分别计算圆、矩形、梯形和三角形的面积,计算边长为1的正方形及其内切圆、内接等腰三角形和等腰梯形面
18、积。【要求】:采用重载函数实现。【提示】:函数原型如下: double area(double radius=0); / 圆面积,参数为半径,缺省参数0,表示点面积double area(double a, double b);/ 计算矩形面积,参数为长和宽double area(double a, double b, double h);/ 计算梯形面积,参数为两底和高double area(double a, double b, double c, int);/ 三角形,参数为三边长,int型参数起表示作用,以区别于梯形,不参加计算。3、建立一个头文件area.h,在其中定义两个面积函数a
19、rea(),分别用来计算半径为r的圆的面积和边长为a和b的矩形面积。另外建立一个实现文件area.cpp,在其中定义主函数。通过包含area.h,输入数据并输出圆和矩形的面积。八、实验报告1复习教材C+面向对象程序设计教程(第3版)(陈维兴 林小茶 编著,清华大学出版社,2009.06)2完成实验指导书C+面向对象程序设计教程(第3版)习题解答与上机指导的实验2;3做好实验记录;4按照实验报告格式(附件1)要求填写实验内容,并提交实验报告。九、其它说明每次实验前,实验指导书都会预先发放,请提前预习实验,特别是实验涉及的原理。实验要求及时完成并上交实验报告,鼓励提前完成必做实验,并尽量多做实验题
20、目。遵守学生实验室管理的相关规定及安全事项。实验02:类与对象实验学时:6+(6)实验类型:验证实验要求:必修一、实验目的类是C+扩展数据类型,可以封装不同类型的数据成员和函数成员,类是面向对象程序设计的基础。本次实验内容包括面向对象的基本概念、构造函数与析构函数,从实际问题抽象出类等,通过实验要求:1、理解类和对象的概念;2、了解C+在非面向对象方面对C功能的扩充与增强。3、初步掌握使用类和对象编制C+程序。4、掌握对象数组、对象指针和string类的使用方法。5、掌握使用对象、对象指针和对象引用作为函数参数的方法。6、掌握类对象作为成员的使用方法。7、掌握静态数据成员和静态成员函数的使用方
21、法。8、理解友元的概念和掌握友元的使用方法。二、实验内容1、输入下列程序。#includeusing namespace std;class Coordinatepublic: Coordinate(int x1,int y1) x=x1; y=y1; Coordinate(Coordinate &p);Coordinate() coutDestructor is calledn;int getx() return x;int gety() return y;private:int x,y;Coordinate:Coordinate(Coordinate &p)x=p.x;y=p.y;cout
22、Copy-initialization Constructour is calledn;int main() Coordinate p1(3,4); Coordinate p2(p1); Coordinate p3=p2; coutp3=(p3.getx(),p3.gety()n; return 0;【运行结果截图】:将Coordinator类中带有两个参数的构造函数进行修改,在函数体内增添下列语句: cout”constructor is called.n”;【运行结果截图】:【运行结果分析】:按下列要求进行调试:在主函数体内,添加下列语句:Coordinator p4;Coordinato
23、r p5(2);调试程序时会出现什么错误?为什么?如何对已有的构造函数进行适当修改?【运行结果截图】:【解释】: 经过以上第(2)步和第(3)步的修改后,结合运行结果分析:创建不同的对象时会调用不同的构造函数。【运行结果分析】:p1是调用有两个参数的构造函数,p2和p3都是p1的拷贝,但他们调用的是使用对象引用作为函数参数的构造函数,p4和p5都是调用两个参数的构造函数,p4由于没有给出实参,所以使用默认参数。2、设计一个4*4魔方程序,让魔方的各行值的和等于各列值的和,并且等于两对角线的和,例如以下魔方,各行各列及两对角线值的和都是64.31 3 5 259 21 19 1517 13 11
24、 237 27 29 1【提示】:求4*4的魔方的一般步骤如下:设置初始魔方的起始值和相邻元素之间的差值。例如上述魔方的初始魔方的起始值(first)和相邻元素之间的差值(step)分别为:first=1; step=2;设置初始魔方元素的值,例如上述魔方的初始魔方为:1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31生成最终魔方。方法如下:求最大元素值与最小元素值的和sum,该实例的sum是:1+31=32用32减去初始魔方所有对角线上元素的值,然后将结果放在原来的位置,这样就可以求得最终魔方。本题的魔法类magic的参考框架如下:class magicpu
25、blic: void getdata(); void getfirstmagic(); void generatemagic(); void printmagic();private:int m44;int step;int first;int sum;【运行结果截图】:3、设计一个用来表示直角坐标系的Location类,在主程序中创建类Location的两个对象A和B,要求A的坐标点在第3象限,B的坐标点在第2象限,分别采用成员函数和友元函数计算给定两个坐标点之间的距离,要求按如下格式输出结果:A(x1,y1), B(x2,y2),Distance1=d1Distance2=d2其中:x1、
26、y1、x2、y2为指定坐标值,d1和d2为两个坐标点之间的距离。【提示】:类Location的参考框架如下:class Locationpublic:Location(double,double);/构造函数double getx();/成员函数,取x坐标值double gety();/成员函数,取y坐标值double distance(Location &);/成员函数,求给定两点之间的距离friend double distance(Location &,Location &);/友元函数,求给定两点之间的距离private:double x,y;【运行结果截图】:4、声明一个Studen
27、t类,在该类中包括一个数据成员score(分数)、两个静态数据成员total_score(总分)和count(学生人数);还包括一个成员函数account()用于设置分数、累计学生的成绩之和、累计学生人数,一个静态成员函数sum()用于返回学生的成绩之和,另一个静态成员函数average()用于求全部成绩的平均值。在main函数中,输入某班同学的成绩,并调用上述函数求出全班同学的成绩之和和平均分。【Student类的框架】:【运行结果截图】:5、使用C+的string类,将5个字符串按逆转后的顺序显示出来。例如,逆转前5个字符的字符串是: Germany Japan America Brita
28、in France按逆转后的顺序输出字符串是:France Britain America Japan Germany【运行结果截图】:6、定义一个圆类(Circle),属性为半径(radius)和圆周长、面积,操作为输入半径并计算周长、面积,输出半径、周长和面积。要求定义构造函数(以半径为参数,缺省值为0,周长和面积在构造函数中生成)和复制构造函数。【运行结果截图】:7、教材P134 习题3.33和3.34【运行结果截图】:三、实验原理、方法和手段设计思想:类和对象是面向对象程序设计的第一重要概念。因此,首先要掌握类和对象的定义格式;理解构造函数和析构函数的作用和系统调用机制;掌握友元函数、
29、普通成员函数和普通函数之间的区别。四、实验组织运行要求本实验采用“以集中授课,学生自主训练为主的开放模式组织教学”。五、实验条件微型计算机;windows 操作系统;Microsoft Visual Studio 6.0集成开发环境;Microsoft Visual Studio 6.0集成开发环境的MSDN。六、实验步骤参见C+面向对象程序设计教程(第3版)习题解答与上机指导的实验3的实验步骤。七、思考题1、基础题:(1)改善复数类,增加重载的运算符:-、-=、*=和/=,实现完整的复数的加减乘除运算,定义+为辐角不变而模加1,重载前后+(+对普通的复数表达方式a+ib 为:a+a/sqrt
30、(a*a+b*b),b+b/sqrt(a*a+b*b))。并定义main 函数检测之。要求分别重载为成员函数和友元函数。(2)在主调函数中,能否用:“对象名.私有成员名”这样的方式来访问对象的私有成员?为什么?在类的成员函数中可以吗?(3)在类的定义中是否须有构造函数?构造函数可以重载吗?(4)构造函数与析构函数是否需要一一对应?(5)拷贝函数与应用场合是什么?(6)在静态成员函数中是否可以直接引用静态变量?可以直接引用非静态变量吗?(7)在静态成员函数中,引用非静态成员时需要通过对象吗?通过成员限定可以吗?(8)在构造函数中是否可以对类中静态的数据成员进行初始化?初始化的静态数据成员是否可以
31、将该值保持到下一次被改变为止?2、 编写一个函数,其原型为:void Index(int a, int n, int & sub),其功能是,在大小为n的数组a中,查找某个数sub,若找到,将其下标存放在sub中,若没有找到,将-1存放在sub中,在主调函数中通过判断值来判断数组中是否有该数。【提示】:在这里,sub 是引用类型的参数,但起返回值的作用。3、一个声明为返回引用的函数,还可以用在赋值号的左边,即这种函数调用本身也是一个左值。#include int array = 2, 4, 6, 8, 10;int& index(int i);void main() index(3) = 16
32、;for(int i=0;i5;i+) cout index(i) ;return;int& index(int i) return arrayi;【注意】由于函数index()是返回引用的类型,所以该函数调用可以作为一个左值,程序的表达式index(3)=16 将16 赋给左边的函数调用,由于该函数调用返回对 array3 的引用,所以可以将array3赋新值。该程序运行的结果将使得整型数组array 中的各元素值变为:2,4,6,16,10。【要求】修改程序实现数组中数据的反转,成为:10,8,6,4,2。八、实验报告1复习教材C+面向对象程序设计教程(第3版)(陈维兴 林小茶 编著,清华
33、大学出版社,2009.06)2完成实验指导书C+面向对象程序设计教程(第3版)习题解答与上机指导的实验3;3做好实验记录;4按照实验报告格式(附件1)要求填写实验内容,并提交实验报告。九、其它说明每次实验前,实验指导书都会预先发放,请提前预习实验,特别是实验涉及的原理。实验要求及时完成并上交实验报告,鼓励提前完成必做实验,并尽量多做实验题目。遵守学生实验室管理的相关规定及安全事项。实验03:派生类和继承实验学时:6+(6)实验类型:验证实验要求:必修一、实验目的1、掌握派生类的声明方法和派生类构造函数的定义方法;2、掌握不同继承方式下,基类成员在派生类中的访问属性;3、掌握在继承方式下,构造函
34、数与析构函数的执行顺序与构造规则;4、学习虚函数在解决二义性问题中的作用。二、实验内容1、输入下列程序。#includeusing namespace std;class Basepublic:void setx(int i) x=i; int getx() return x;public:int x;class Derived:public Basepublic:void sety(int i)y=i;int gety() return y;void show()coutBase:x=xendl;/语句1public:int y;int main()Derived bb;/语句2 bb.se
35、tx(16);/语句3bb.sety(25);/语句4bb.show();/语句5coutBase:x=bb.xendl;/语句6coutDerived:y=bb.yendl;/语句7coutBase:x=bb.getx()endl;/语句8coutDerived:y=bb.gety()endl;/语句9return 0;【运行结果截图】:按以下要求,对程序进行修改后再调试,指出调试中出错的原因。将基类Base中的数据成员x的访问权限改为private时,会出现哪些错误,为什么?【运行结果分析】:x将不允许派生类继承,即在派生类中是不可直接访问的。将基类Base中的数据成员x的访问权限改为pr
36、otected时,会出现哪些错误,为什么?【运行结果分析】:基类Base中的所有公有成员在派生类中都以保护成员的身份出现。在原程序的基础上,将派生类Derived的继承方式改为private时,会出现哪些错误?为什么?【运行结果分析】:公有继承时不能访问基类的私有成员的内部和对象,不能访问基类的保护成员的对象。在原程序的基础上,将派生类Derived的继承方式改为protected时,会出现哪些错误?为什么?【运行结果分析】:保护继承时不能访问基类的私有成员的内部和对象,不能访问基类公有成员和保护成员的对象。2、编写一个学生和教师的数据输入和显示程序。学生数据有编号、姓名、性别、年龄、系别和成
37、绩,教师数据有编号、姓名、性别、年龄、职称和部门。要求将编号、姓名、性别、年龄的输入和显示设计成一个类Persona,并作为学生类Student和教师类Teacher的基类。【person类结构】:class Persona public: Persona(int numberl,string namel,string sexl,int agel) number=numberl; name=namel; sex=sexl; age=agel; void print() coutnumber:numberendl; coutname:nameendl; coutsex:sexendl; cout
38、age:ageendl; protected: int number;string name; string sex; int age; ;【Student类结构】:class Student:private Persona public: Student(int numberl,string namel,string sexl,int agel,string gradel,float scorel) :Persona(numberl,namel,sexl,agel) grade=gradel; score=scorel; void print() Persona:print(); coutg
39、rade:gradeendl; coutscore:scoreendl; private: string grade; float score; ;【Teacher类结构】:class Teacher:private Persona public: Teacher(int numberl,string namel,string sexl,int agel,string positionl,string departmentl) :Persona(numberl,namel,sexl,agel) position=positionl; department=departmentl; void p
40、rint() Persona:print(); coutposition:positionendl; coutdepartment:departmentendl; private: string position; string department; ;【运行结果截图】:3、按要求阅读、编辑、编译、调试和运行以下程序。(1)阅读、编辑、编译、调试和运行以下程序,并写出程序运行结果。#include#includeusing namespace std;class MyArraypublic:MyArray(int leng);MyArray();void Input();void Displ
41、ay(string);protected:int *alist;int length;MyArray:MyArray(int leng) if(leng=0)couterror length; exit(1); alist=new int leng; length=leng; if(alist=NULL)coutassign failure;exit(1);coutMyArray 类对象已创建。endl;MyArray:MyArray()delete alist;coutMyArray 类对象被撤销。endl;void MyArray:Display(string str)int i;int *p=alist;coutstrlength个整数:;for(i=0;ilength;i+,p+)cout*p ;coutendl;void MyArray:Input()cout请从键盘输入length个整数:;int i;int *p=alist;for(i=0;i*p;int main()MyArray a(5);a.Input();a.Display(显示已输入的);return 0;(2)声明一个类S
限制150内