《C++面向对象程序设计实验指导书谭浩强(共49页).docx》由会员分享,可在线阅读,更多相关《C++面向对象程序设计实验指导书谭浩强(共49页).docx(49页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上C+面向对象程序设计实验指导书江西理工大学电气工程与自动化学院2015年9月专心-专注-专业目录绪论0.1 目的面向对象程序设计语言是现今最流行的编程语言之一,C+语言是作为最早最流行的面向对象编程语言之一而发展起来的。学好C+语言不仅可以从面向过程的程序设计思想过渡到面向对象的程序设计思想,而且可以为以后学习其它的面向对象语言打下坚实的基础,使得学习其它的面向对象编程语言变得轻松、容易。实验作为学习C+语言不可缺少的一个环节不仅可以加深学生对C+面向对象思想的理解,同时可以提高学生的动手编程能力,培养学生良好的编码习惯。目前关于C+语言的理论教材比较多,但是适合学生
2、练习的实验指导书却比较少,这严重影响了学生对C+这门课程的学习。大多数情况下,学生学习C+语言之前都刚刚学习过C语言程序设计这门课程,从编程环境到编程语言同时转换过来需要一定的时间和合理的指引,同时在学习C+理论知识的过程中,学生很少也很难把C+程序设计和现在社会上比较流行的基于VC6.0的MFC程序设计联系起来,所以很难让学生在学习C+语言的同时,提升学生基于VC6.0的MFC程序设计的能力。编写本书的目的就是从以上几点来考虑的,首先要把学生从以前的编程环境中脱离出来,然后循序渐进地介绍新的编程环境的新知识点,同时把C+的语法结构融入到基于VC6.0的MFC程序设计中去,从而实现学生轻松掌握
3、C+这门程序设计语言和习惯编程环境以及理解C+语法和MFC之间的关系的目的,从而提高学生的程序设计能力和学生程序设计的成就感。0.2 结构安排实验课程的安排离不开理论课程的学习,本书的编排以知识点为核心,理论教材蓝本为C+面向对象程序设计教程(第2版)陈维兴 林小茶编着,清华大学出版社出版。通过为不同的知识点设计相应的实验程序,来达到学生练习和理解C+语言面向对象的思想的目的,同时本书还设计了一些程序设计课后练习题,设计本部分有三个目的:一个是有些课堂练习中没有办法练习到的知识点将在这部分体现,指导老师可以根据需要来增删课堂的讲解内容;另一个是为一部分有能力有兴趣深入学习C+程序设计的同学提供
4、一些练习题,从而提升这部分学生的程序设计能力;第三就是避免有些学生在做实验的过程中盲目按照指导书中的步骤一步一步地不加思考地写程序,学生要回答这些问题,就必须看懂这些程序中隐含的知识点,从而达到理论知识和实践知识更好地结合。对于课堂练习,本书共安排了11个实验,共24个学时,实验安排如下:实验一C+程序的运行环境和运行C+程序的方法(2学时)实验二C+对C 的扩充(2学时)实验三类和对象(一)(2学时)实验四类和对象(二)(2学时)实验五实验五 运算符重载(2学时)实验六派生与继承(2学时)实验七派生与继承多重派生(2学时)实验八实验八 C+程序、Windows程序和MFC程序(2学时)实验九
5、简单单文档MFC程序设计(2学时)实验十简单对话框程序设计(2学时)实验十一简单数据库程序设计(4学时)0.3 如何使用本书面向对象程序设计语言出现的目的就是为了设计大型的软件系统,但是教学过程中很难让学生在课堂上实现一个大型的(甚至是成型)的系统,所以作为教师应该引导学生在实现一个简单的功能性的程序的同时让学生思考,思考如何把这个地方的技术实现到一个复杂的应用系统中去;另外教师要充分利用本书中第二部分的练习,引导学生去思考如何利用C+的相关技术从头到尾设计一个具有实用价值的应用程序。作为学生如果只是简单地按照本书中提供的步骤一步一步完成某一个程序,而不去思考为什么要这样做的话,那么学生能学到
6、的知识也仅仅是C+的语法而已,并不能真正理解C+面向对象的思想,最终不能设计出好的程序来。所以学生不仅要全部实现本书中的课堂练习,得出正确的结果,而且在完成了程序后还要思考本程序为什么要这样设计,如果换成其它的程序设计语言会怎么实现,只有这样才能够真正理解C+的精髓,从而掌握C+。另外学生在学习最后四个实验的时候一定不要忘记前面C+语法知识,能否合理地将C+的三大特性运用到MFC的程序设计中是提高程序运行效率,存储效率和程序封装性一个最有效的手段。实验一 C+程序的运行环境和运行C+程序的方法1.1 实验目的(1)了解所用的计算机系统的基本操作方法, 学会独立使用该系统。(2)了解在该系统上如
7、何编辑、编译、连接和运行一个C+程序e(3)通过运行简单的C+程序, 初步了解C+源程序的结构和特点。应学会在一种以上的编译环境下运行C+程序,建议学习并掌握Visual C+ 6.0的使用方法。1.2实验内容和步骤(1) 检查所用的计算机系统是否已安装了C+编译系统, 并确定它所在的子目录。(2) 在Visual C+环境下编译和运行C +程序。在第一次上机时, 按以下步骤建立和运行C+程序: 先进入V i sual C+ 6 . 0 环境。 按照上机指导第9章介绍的方法, 在自己指定的子目录建立一个名为test. cpp 的新文件(此时尚未向文件输入内容) 。 从键盘输入以下程序(第l 章
8、第4题) int main();int a,b;c=a+b;cout” a+b=”a+b; 选择Build Compile test.cpp 命令, 对此源程序进行编译。观察和分析编译信息。 根据编译信息指出的错误,修改程序。再进行编译,如果还有错, 再重复此过程,直到编译不出错为止。 选择BuildBuild test.exe 命令,对程序进行连接, 如果不出销, 就会生成可执行程序test.exe。 选择Build- Execute test. exe 命令, 执行可执行程序test. exe。观察屏幕的变化。在输出窗口应显示程序运行结果。 分析结果是否正确, 如果不正确或认为输出格式不理
9、想,可以修改程序,然后重新执行以上至步骤。此外,还可利用已有的源程序建立一个新程序。由于刚才已建立了一个名为test. cpp的源程序, 可以以它为基础建立一个新程序。这样更方便些。按以下步骤: 通过“资源管理器”或“我的电脑”找到已有源程序test. cpp。 双击test. cpp 图标, 进入Visual C +集成环境, 打开test. cpp 。 在test. cpp 基础上将源程序修改为以下内容(第l 章第5 题) ,#include using namespace std;int main( )int a,b;c=add(a,b)cout”a+b=”cendl;return 0;
10、int add(int x,int y);z =x+y;return(z);选择File-Save as 命令,用新的文件名other.cpp 保存。此时, other.cpp 与tesl. cpp在同一子目录下。对新文件other. cpp 进行编译、连接和运行。步骤同前。(3) 请思考以下问题,并上机进行试验。将本实验中第2 个程序作以下改动:(a) 将程序第1,2 行改为下面一行#include (b) 将第3 行int main ()改为void main()( c ) 删去main 函数中的retum 0;再运行此程序。并对此作分析,得到必要的结论。(4) 输入两个整数,将它们由大到
11、小的顺序输出(本题是 C +面向对象程序设计第l章习题第8题) 。使用指针方法。使用变量的引用。比较这两种方法的特点和使用方法。实验二 C+对C 的扩充2.1 实验目的1进一步了解和熟悉VC+6.0开发环境,学会在VC+6.0环境下调试程序;2熟悉C+中简单的标准输入输出函数的实用;3理解const修饰符的作用,并学会应用const修饰符;4理解内置(内联)函数的优缺点并学会使用内置函数;5理解和使用函数重载以及带默认参数的函数;6使用new和delete进行动态内存管理;7理解和使用引用。2.2 实验内容2.2.1 程序阅读1理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题
12、。#include using namespace std;int max_def(int x, int y)return (xy?x:y);int max_def(int x, int y, int z)int temp = 0;return (temp=(xy?x:y)z?temp:z;double max_def(double x, double y)return (xy?x:y);int main()int x1 = 0;int x2 = 0;double d1 = 0.0;double d2 = 0.0;x1 = max_def(5,6);x2 = max_def(2,3,4);d1
13、 = max_def(2.1,5.6);d2 = max_def(12.3,3.4,7.8);-coutx1=x1endl;coutx2=x2endl;coutd1=d1endl;coutd2=d2endl;-return 1;问题一:上述程序的输出结果是什么?答:问题二:哪些情况可以参与函数的重载?答:问题三:处调用的是哪个函数?答:问题四:处的输出结果为什么是d2=12,而不是d2=12.3?答:2理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include using namespace std;int main()int *p1 = new int; -int
14、*p2 = new int(0); -char *p3 = new char64; -return 1;问题一:、处动态申请内存分别代表什么不一样的意思?答:问题二:该程序存在什么隐患?改正该程序使隐患消除。答:3理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include using namespace std;void swap(int a, int b)int temp = a;a = b;b = temp;void swap(int *a, int *b)int temp = *a;*a = *b;*b = temp;int main()int i = 5;in
15、t j = 10;coutBefore swap: i=i,j=jendl;swap(i,j); -coutAfter the first swap: i=i,j=jendl;swap(&i,&j); -coutAfter the second swap: i=i,j=jendl;return 1;问题一:上述程序的输出结果是什么?答:问题二:处函数调用后并不能实现两个数的交换,而处却可以,为什么?答:问题三:处调用的是哪个重载函数?答:2.2.2 程序设计1使用函数重载的方法定义两个重名函数,分别求出整形数平面间两点间距离和双精度平面间两点间距离,如果没有输入第二点的坐标则默认为圆点(0,0
16、)。2设计一个函数:exchange(float x, float y, float z),当调用exchange(a,b,c)时,将a的内容赋值给b,b的内容赋值给c,c的内容赋值给a,要求采用引用的方式来实现。2.3 思考题1自己设计一个程序,测试const的三种用法:指向常量的指针,常指针,指向常量的常指针。2编写一个函数,实现两个字符串变量的交换,要求参数用引用。实验三 类和对象(一)3.1 实验目的1类的定义;2类对象的使用;3类成员变量的定义和使用;4类成员函数的定义和使用;5理解类的作用域;6理解类的声明;7理解类中private和public权限的声明依据。3.2 实验内容1理
17、解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include using namespace std;class CDatevoid Set(int m, int d, int y ) month = m ; day = d ; year = y ; int IsLeapYear() return (year%4 = 0 & year%100 != 0)|(year%400 = 0); public:void Print() coutmonth/day/yearendl;private:int month; int day; int year;void main()CDa
18、te a; - a.Set(10,15,2007) ; a.Print();问题一:以上程序编译能通过吗,为什么,应该如何改正?答:问题二:类CDate中分别有哪些成员函数和成员变量,它们分别属于哪种访问权限?答:问题三:处语句的意思是什么?答:2理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include using namespace std;int month;/全局变量 int day; int year;void Set(int m,int d,int y) -a:month=m; -:day=d; :year=y;class CDatepublic: voi
19、d Set(int m,int d,int y) -b :Set(m,d,y); -void Print() coutmonth/day/yearendl;private: int month; /成员变量int day; int year;void main()CDate a; a.Set(10,15,2007) ;a.Print();问题一:处是在给成员变量赋值,还是在给全局变量赋值,如果去掉域作用符:,程序是否还能正确运行?答:问题二:处调用的哪个函数,如果去掉域作用符:,程序是否还能正确运行?答:问题三:该程序的输出结果是什么,试解释该输出结果。答:3.2.2 程序设计1需要求3 个长
20、方柱的体积,请编一个基于对象的程序。数据成员包括length(长)、width (宽) 、height (高)。要求用成员函数实现以下功能 由键盘分别输入3 个长方柱的长、宽、高: 计算长方柱的体积: 输出3 个长方柱的体积。编程序,上机调试并运行。本题是C+面向对象程序设计第2 章第6 题。4.3思考题1试设计一个复数类,该类有实部和虚部两个成员数据,成员数据采用私有访问权限,同时该类有两个共有成员函数,分别用来设置成员数据和输出成员数据,在主函数中分别采用对象方式,指针方式和引用方式来调用该类的公有函数设置和输出成员数据。实验四 类和对象(二)4.1 实验目的1理解掌握this指针的作用和
21、用法;2理解掌握构造函数的定义和作用;3掌握构造函数的使用;4理解掌握拷贝构造函数的定义和使用;5理解掌握构造函数的重载;6理解掌握析构函数的定义和使用。4.2 实验内容1理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include using namespace std;class CPointpublic:void Set(int x,int y);void Print();private:int x;int y;void CPoint:Set(int x,int y)x = x;y = y;void CPoint:Print()coutx=x,y=yendl;vo
22、id main()CPoint pt;pt.Set(10,20);pt.Print();问题一:以上程序编译能通过吗,试解释该程序?答:问题二:以上程序的运行结构是否正确,如果不正确,试分析为什么,应该如何改正?答:2理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include using namespace std;class CPersonpublic:void Print();private:CPerson();private:int age;char *name;CPerson:CPerson()void CPerson:Print()coutname=name
23、,age=ageendl;void main()CPerson ps(23,张三);ps.Print();问题一:以上程序存在三处大错误,在不改变主函数内容的前提下,试改正该程序。答:4.2.2 程序设计1设计实现一个CPoint类,满足以下要求:a 该类包含两个整型成员变量x(横坐标)和y(纵坐标),以及一个输出函数Print()用来输出横坐标和纵坐标,要求不可以在类的外部直接访问成员变量;b可以采用没有参数的构造函数初始化对象,此时的成员变量采用默认值0;c可以采用直接输入参数的方式来初始化该类的成员变量;d可以采用其它的CPoint对象来初始化该类的成员变量;e设计一个主函数来测试以上功
24、能。4.3思考题1设计一个CStudent(学生)类,并使CStudent类具有以下特点:a该类具有学生姓名、学号、程序设计、信号处理、数据结构三门课程的成绩;b学生全部信息由键盘输入,以提高程序的适应性;c通过成员函数统计学生平均成绩,当课程数量增加时,成员函数无须修改仍可以求取平均成绩;d输出学生的基本信息、各科成绩与平均成绩;e学生对象的定义采用对象数组实现; f统计不及格学生人数。实验五 运算符重载5.1 实验目的(1) 进一步了解运算符重载的概念和使用方法。(2) 掌握几种常用的运算符重载的方法。(3) 了解转换构造函数的使用方法。(4) 了解在Vi s ual C+ 6.0 环境下
25、进行运算符重载要注意的问题。5.2 实验内容1理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include using namespace std;class CComplexpublic:CComplex()real = 0; imag = 0;CComplex(int x,int y)real = x;imag = y;int real;int imag;CComplex operator + (CComplex obj1)-CComplex obj2(real + obj1.real, imag + obj1.imag);return obj2;void main
26、()CComplex obj1(100,30);CComplex obj2(20, 30);CComplex obj;obj = obj1+obj2; -cout obj.real endl;cout obj.imag endl;问题一:处的运算符重载,为什么该函数的返回值要设计成CComplex类型?答:问题二:处的运算符重载函数调用就相当于“obj=operator+(obj1,obj2);”,但是为什么CComplex类中的运算符重载函数只设计了一个参数?答:2理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include using namespace std;c
27、lass CComplexpublic:CComplex()real = 0.0; imag = 0.0;CComplex(float x, float y)real = x;imag = y;CComplex operator + (CComplex &obj1, CComplex &obj2)CComplex obj3(obj1.real + obj2.real, obj1.imag + obj2.imag);return obj3;CComplex &operator+(CComplex &obj)obj.real += 1;obj.imag +=1;return obj;void pr
28、int()coutreal+imagiendl;private:float real;float imag;CComplex &operator-(CComplex &x)x.real -= 1;x.imag -= 1;return x;void main()CComplex obj1(2.1,3.2);CComplex obj2(3.6,2.5);coutobj1=;obj1.print();coutobj2=;obj2.print();CComplex obj3 = obj1 + obj2;coutbefor+, obj3=;obj3.print();+obj3;coutafter+, o
29、bj3=;obj3.print();-obj3;coutafter-, obj3=;obj3.print();CComplex obj4 = +obj3;coutobj4=;obj4.print();问题一:以上程序中的三个运算符重载都有错误,试改正过来,并分析该程序的输出结果。答:5.2.2 程序设计1. 在以上复数类的基础上,增加重载运算符乘“*”、除“/”,实现复数的乘除运算。2. 有两个矩阵a 和b ,均为2 行3 列。求两个矩阵之和。重载运算符 + ,使之能用于矩阵相加. 如c=a+b, 本题是 C+面向对象程序设计第4 章第4 题。5.3思考题定义CPoint类,有两个成员变量:横
30、坐标(x)和纵坐标(y),对CPoint类重载“+”(自增运算符)、“-”(自减运算符),实现对坐标值的改变。实验六 派生与继承6.1 实验目的1理解继承的含义以及声明;2理解共有派生、私有派生和保护派生的含义以及使用;3理解单派生类中构造函数和析构函数的调用顺序。6.2 实验内容1理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include using namespace std;class CBasepublic:CBase(int a):a(a)protected:void print()couta=aendl;private:int a;class CDeriv
31、e : public CBasepublic:void print()CBase:print();coutb=bendl;private:int b;void main()CDerive d;d.print();CBase b;b.print();问题一:以上程序有两大错误,试指出来,并改正之?答:2理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include using namespace std;class CBasepublic:CBase(int a):a(a)coutbase structureendl;CBase()coutbase destructuree
32、ndl;void print()couta=aendl;protected:int a;class CDerive : public CBasepublic:CDerive(int a, int b,int c):CBase(a),b(b),c(c)coutderive structureendl;CDerive()coutderive destructureendl;void print()CBase:print();coutb.a=b.aendl;coutc=cendl;private:CBase b;int c;void main()CDerive d(1,2,3); -d.print(
33、);问题一:以上程序的输出结果是什么,说明为什么?答:问题二:答:6.2.2 程序设计1定义点CPoint类作为基类,在此基础上派生出直线CLine类和圆CCircle类,并要求基类和各派生类具有以下特点:aCLine类含有计算直线长度和斜率的成员函数;bCCircle类含有计算圆面积的成员函数。实验七 派生与继承多重派生7.1 实验目的1理解多重派生的定义;2理解多重派生中构造函数与析构函数的调用顺序;3理解多重派生中虚拟基类的作用;7.2 实验内容1理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。class CBase1public:CBase1(int a):a(a)
34、coutbase1 structure.endl;CBase1()coutbase1 destructure.endl;void print()couta=aendl;protected:int a;class CBase2public:CBase2(int b):b(b)coutbase2 structure.endl;CBase2()coutbase2 destructure.endl;void print()coutb=bendl;protected:int b;class CDerive : public CBase1, public CBase2public:CDerive()cou
35、tderive structure.endl;CDerive()coutderive destructure.endl;void print()CBase1:print();CBase2:print();b1.print();b2.print();coutc=cendl;private:CBase1 b1;CBase2 b2;int c;void main()CDerive d;d.print();问题一:改正以上程序中存在的错误,并分析该程序的输出结果。2理解下面的程序,并在VC+6.0下运行查看结果,回答程序后面的问题。#include iostream.hclass CBasepubli
36、c:CBase(int a):a(a)int a;class CDerive1 : public CBasepublic:CDerive1(int a):CBase(a);class CDerive2 : public CBasepublic:CDerive2(int a):CBase(a);class CDerive : public CDerive1,public CDerive2public:CDerive(int a,int b):CDerive1(a),CDerive2(b);void main()CDerive d(1,2);coutd.aendl;问题一:在不改变原有程序意图的前
37、提下,分别用三种方法改正以上程序,并使程序正确输出。7.2.2 程序设计1建立普通的基类building,用来存储一座楼房的层数、房间数以及它的总平方数。建立派生类house,继承building,并存储卧室与浴室的数量,另外,建立派生类office,继承building,并存储灭火器与电话的数目。设计一主函数来测试以上类的用法。7.3思考题1按照下图的类层次结构编写程序,定义属于score的对c1以及类teacher的对象t1,分别输入个数据成员的值后再显示出这些数据。实验八 C+程序、Windows程序和MFC程序8.1 实验目的1理解C+程序、Windows程序以及MFC程序之间的联系与区别;2理解Windows程序的消息机制;3学会应用VC+6.0的AppWizard创建基于MFC的Windows程序;4理解C+在MFC中的位置和作用。8.2 实验内容8.2.1 实验描述理解C+程序、Windows程序和MFC程序的联系与区别C+是面向对象编程语言中的一种,它具有封装性、继承性以及多态性三大特性,用C+语言写出来的程序需要借助