C-面向对象程序设计项目教程完整版教学课件-整套教程电子讲义(最全最新)_第1页
C-面向对象程序设计项目教程完整版教学课件-整套教程电子讲义(最全最新)_第2页
C-面向对象程序设计项目教程完整版教学课件-整套教程电子讲义(最全最新)_第3页
C-面向对象程序设计项目教程完整版教学课件-整套教程电子讲义(最全最新)_第4页
C-面向对象程序设计项目教程完整版教学课件-整套教程电子讲义(最全最新)_第5页
已阅读5页,还剩584页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、项目一任务一 体会面向对象与面向过程的不同思维方式任务二 创建简单的C+应用程序打开C+面向对象程序设计之门任务说明任务一 体会面向对象与面向过程的不同思维方式在本任务中我们来学习面向对象程序设计思想以及其与面向过程的不同。预备知识一、什么是面向对象的程序设计思想二、面向对象与面向过程比较一、什么是面向对象的程序设计思想其基本出发点是尽可能按照人类认识世界的方法和思维方式来分析和解决问题。客观世界是由许多具体的事物或者事件、抽象的概念和规则等组成的,因此,人们研究的对象事、物、概念都统称为“对象”。面向对象的设计方法是以对象作为最基本的元素,以对象作为分析问题、解决问题的核心。下面我们了解几个

2、面向对象程序设计中涉及的基本概念。1对象2类3封装4继承5多态面向对象程序设计方法的优势可以归纳为以下几点:二、面向对象与面向过程比较(1)程序的开发效率高(2)程序代码的可重用性高(3)程序易于维护任务实施 运用面向对象和面向过程两种思想解决同一问题案例说明本任务中我们将分别使用面向过程和面向对象的程序设计方法设计两个功能完全相同的程序(根据矩形的长和宽求其周长和面积),并结合任务内容说明两种程序设计思想的异同。实施步骤1以面向过程的程序设计方式思考步骤1 以面向过程的思想来解决问题,步骤如下:(1)确定所求长方形的长和宽。(2)确定计算长方形的周长和面积的公式并计算。(3)输出计算结果。步

3、骤2 根据解题思路编写代码,如【例1-1】所示。【例1-1】 以面向过程程序设计思想编码。/1-1.cpp#include /包含头文件iostream.husing namespace std;/使用标准命名空间void main()/主程序 int perimeter,area;/声明周长与面积变量 int length=20,width=10;/声明长、宽变量并赋初值 perimeter=2*(length+width);/求周长 area=length*width;/求面积 coutperimeter=perimeterendl;/输出结果coutarea=areaendl;2以面向对

4、象的程序设计方式思考步骤1 以面向对象的思想来解决问题,步骤如下:(1)将长方形类的共性,即两个基本属性(长和宽)和两个行为(求周长和求面积)抽取出来,设计一个长方形类。(2)根据长方形类创建一个对象。(3)通过调用对象的行为求出其周长和面积。步骤2 根据解题思路编写代码,如【例1-2】所示。【例1-2】 以面向对象程序设计思想编码。/1-2.cpp#include /包含头文件iostream.husing namespace std;/使用标准命名空间class Rectangle/定义长方形类public:Rectangle(float w=0,float l=0)width=w;len

5、gth=l;/定义构造函数,完成创建对象时的初始化工作,即为长和宽赋初值void GetArea()coutarea=width*length endl;/定义求面积方法void GetPerim()coutperimeter=2*(width+length)endl;/定义求周长方法private:float width,length; /外界不可访问的私有成员;void main() Rectangle a(10,20);/定义长方形类的一个变量a,即实例化一个/特殊的长方形对象a,它的长是20,宽是10a.GetPerim();/调用a对象的两个方法a.GetArea();任务二 创建简

6、单的C+应用程序任务说明在本任务中我们来学习C+应用程序的结构、C+程序的开发过程以及C+开发环境Visual C+ 6.0的使用。预备知识一、认识C+程序二、C+程序的开发过程三、Visual C+ 6.0集成开发环境简介四、Visual C+ 6.0的排错与调试功能1一个C+程序一、认识C+程序#include /包含头文件iostream.h#include /包含头文件string.h,字符串using namespace std;/使用标准命名空间/=int main() string greeting=hello world!; /定义一个字符串对象变量,并赋初值couthello

7、 world!n; /在屏幕上输出字符串“hello world!”并换行coutwelcome to C+!endl; /在屏幕上输出“welcome to C+!”并换行coutgreetingendl; /在屏幕上输出字符串变量greeting的内容并换行return 0;/程序结束2C+程序的构成(1)一个C+程序可以由一个或多个源程序单元构成,每个源程序单元可被看成一个文件。【例1-3】中的例子仅由一个源程序单元构成。(2)在一个源程序单元中,一般包括以下组成部分: 预处理命令。 全局声明部分。 函数。3C+程序的书写形式(1)C+的书写格式比较自由,一行内可以写几个语句,一个语句也

8、可以写在多行。(2)在程序中添加必要的注释,也是成为一个优秀程序员所必需的。编译系统在编译代码时会将注释内容忽略。一般情况下,内容较少的简单注释用“/”,而跨行的注释则用“/*/”。二、C+程序的开发过程1编写程序2编译程序3连接目标文件4运行程序 总体而言,C+程序的整个开发过程可用图所示的流程图表示。其中,实线表示操作流程,虚线表示文件的输入/输出。三、Visual C+ 6.0集成开发环境简介 本书选用了使用较为广泛的Visual C+ 6.0作为C+程序的开发环境,图所示为Visual C+ 6.0的集成开发环境界面。四、Visual C+ 6.0的排错与调试功能第一步 设置断点第二步

9、 开始调试程序第三步 单步运行 单步调试程序时,可以在Variables窗口和Watch窗口中察看变量值的变化,这两个窗口的作用如下: 在Variables窗口中会自动显示当前运行程序中所有变量的值。随着单步调试的进行,我们会看到变量i的值逐渐递增。 如果本地变量比较多,Variables窗口就会比较混乱,此时可以直接在代码中选中需要监控的变量,将其拖放到Watch列表,该变量的值会被显示出来。任务实施创建并运行自己的第一个C+程序单击此处添加备注 编写和调试一个简单的C+程序,以熟悉Visual C+ 6.0的程序编写、编译、连接和调试方法。实施步骤1创建源程序 步骤1 启动Visual C

10、+ 6.0,打开“文件”下拉菜单,选择“新建”菜单项,将打开如图所示的“新建”对话框。步骤2 如图1-14所示,选择“文件”选项卡,在左侧文件类型列表中选择“C+ Source File”选项,表示创建一个C+源程序。/实训1-1#include using namespace std;int main()coutWelcome to C+ World!n;coutMy Friend!endl;return 0;2编译连接将代码输入编辑区后,需要对程序进行编译连接,以发现源程序中是否存在错误。步骤1 执行“组建”“编译实训1-1.cpp”菜单命令,系统将显示图所示对话框,询问是否在创建源文件的

11、目录下建立一个活动工程和一个工作空间。步骤2 单击“是”按钮,将创建一个与C+源程序同名的工作区(对应文件为“实训1-1.dsw”)和一个工程(对应文件为“实训1-1.dsp”),系统开始编译。编译结束后,将在输出窗口输出编译信息,如图所示。步骤3 编译信息显示“实训1-1.obj - 0 error(s), 0 warning(s)”,表示编译程序时没有错误和警告。为此,继续执行“组建”“组建实训1-1.exe”菜单命令,对生成的目标程序进行连接,以生成可执行程序,如图所示。3调试运行编译连接通过后,执行“组建”“执行实训1-1.exe”菜单命令,或者直接按【Ctrl+F5】组合键,运行生成

12、的程序,将出现图所示画面。结果正确无误,按任意键返回。至此,一个完整的C+程序从建立到运行就完成了。项目拓展熟悉Visual C+工作区与工程的使用C+程序唯有放入某个工作区和工程,才能被编译和连接。为了便于读者更好地使用Visual C+,我们首先对工作区、工程等概念进行一些简要说明。(1)在Visual C+中,工作区用来管理工程,而工程用来管理C+源程序(*.cpp)、C+头文件(*.h)、资源文件等。因此,如果我们开发的程序比较庞大的话,应首先创建工作区,然后创建工程,最后利用工程管理C+源程序、头文件等。(2)我们既可以为在工作区新建工程,或者在工程中新建C+程序、头文件,也可以将现

13、有工程添加到工作区中,或者将现有C+源程序、头文件等添加到工程中。(3)Visual C+的编译是针对工程中的C+程序的,而连接是针对工程的。通过选择“组建”菜单中的“组建”,可以对工程中的程序统一进行编译和连接。(4)每个工作区和工程都与某个文件夹相对应,并且工作区文件的扩展名为.dsw,工程文件的扩展名为.dsp。(5)创建工程时,如果系统尚未创建工作区,则系统会自动创建一个与工程同名的工作区,并以此名称在指定文件夹中创建一个新文件夹,以存放相关文件。(6)要想编辑C+源程序或头文件等,最好打开工作区文件,如此一来,我们可以直接对C+源程序、头文件等进行修改、编译和连接。(7)如果创建的工

14、程是一个Win32 Console Application(Win32控制台应用程序),则必须在工程中的某个C+程序中包含main()函数,以设置应用程序的入口。此外,每个工程中只能有一个main()函数,否则,将无法连接目标文件。Thank you!项目二任务一 熟悉C+与C在基本控制上的一些区别任务二 学习有关函数方面的区别任务三 掌握C+中关于引用的灵活运用任务四 掌握C+中管理动态内存空间的方法由C到C+ 用法更灵活、功能更强大任务说明预备知识任务一 熟悉C+与C在基本控制上的一些区别 在本任务中我们来学习C+与C在基本控制上的一些区别,主要包括输入/输出的实现、强制数据类型转换方式以

15、及新增了bool类型。一、用I/O流实现输入/输出二、新增强制类型转换方式三、新增bool类型一、用I/O流实现输入/输出 cin是输入流对象,cout是输出流对象,它们是在编译系统中的输入/输出流库中定义的,定义后系统会在内存中开辟一段缓冲区,用来暂存输入/输出流的数据。使用它们时必须将头文件“iostream.h”加入到本文件中,即在程序的开头使用预处理命令“#include ”。(一)输入语句输入语句的一般格式为:cin表达式1表达式2表达式n; 在使用cin语句时,通过键盘输入的数据应与变量定义的数据类型一致,并且输入数据的个数应与变量的个数相同。输入完数据后键入回车,流提取操作符“”

16、便从输入流中提取出由空格、制表符和换行符间隔开的数据赋给相应的变量。(二)输出语句输出语句的一般格式为:cout表达式1表达式2表达式nendl; endl是C+中行结束符,只能用于输出流中,其作用是在执行换行操作的同时,将缓冲区内已有的数据全部输出,并清空缓冲区。(三)输入/输出的格式控制常用的输入/输出流格式控制符如表所示。二、新增强制类型转换方式强制转换数据类型的一般形式为:(类型名)变量 和 (类型名)(表达式)也可以写成类型名(变量) 和 类型名(表达式) 例如,下面将变量a强制转换成int型,将m与n的和强制转换成double型,将8与3取余的结果强制转换成char型。int(a)

17、double(m+n)char(8%3) 当进行强制数据类型转换的对象是一个包含多项的表达式时,必须将表达式用括号括起。例如,将7/4的结果强制转换成double型,应该写成double(7/4) 此时由于7和4均为整型,故7/4的结果为整型1,强制转换为双精度型数据后,结果仍为1,而写成(double)7/4 则表示将7的数据类型强制转换为double型,再与4求商,结果是双精度型数据1.75。三、新增bool类型 bool(布尔型,也称逻辑型)只有两个值,即整数0(表示逻辑假)和1(表示逻辑真)。在C+语言中还定义了这两个布尔型常量所对应的符号常量false和true,false的值为0,

18、表示逻辑假,true的值为1,表示逻辑真。 由于逻辑值是整数0和1,所以它也能够像其他整数一样出现在表达式里,参与各种整数运算。【例2-3】 布尔常量应用示例。#include using namespace std; int main() cout布尔类型的符号常量true对应的逻辑值是:trueendl;cout布尔类型的符号常量false对应的逻辑值是:falseendl;return 0;程序运行结果如图所示。任务实施输出杨辉三角案例说明杨辉三角是一个由数字排列成的三角形数表,如图所示。 它描述的是两个未知数和的幂次方运算后的系数问题。例如,(xy)2x22xyy2,这样系数就是1,2

19、,1,这就是杨辉三角的其中一行。依次下去,(xy)3、(xy)4等的运算结果的各项系数就构成了杨辉三角的其他各行。编写程序,根据输入的行数(小于14)输出杨辉三角。案例分析杨辉三角每行的数字是有一定规律的:每一行数字的个数等于所在的行数,每行的第一个数字均为1,其后数字为:前面数字(数字所在行号(自1起)数字所在行中的序号(自0起)/数字所在行中的序号。为了使输出的数字排列成如图所示的金字塔形状,需控制各行数字之间空格的个数。每行第一个数字之前空格的个数依次递减2,两个数字之间的空格个数有三种情况:如果输出的数字是一个一位数,则在该数字后输出3个空格;如果输出的数字是一个两位数,则在该数字后输

20、出2个空格;如果输出的数字是一个三位数,则在该数字后输出1个空格。根据以上规律,我们可以利用循环嵌套结构逐行逐个输出数字和空格。由于确定了行数,循环的次数也就跟着确定了,故我们使用的是for循环。实施步骤步骤1 在Visual C+中新建一个C+ 源文件,根据分析编写代码如下:#include void main() int n,r,c,m,j=0;coutm;while (m=14)/如果连续三次输入的数字不符合要求,则退出程序 if (j=2) cout你的错误输入已达3次,你无权再输入!endl;return;cout你输入的行数超出范围,请重新输入!endl;coutm;j+;/累计输

21、入次数for (n=0;n=m-1;n+)/逐行输出数字和空格 for(r=1;r15-n;r+)/*输出第一个数字之前的空格,为了打印出金字塔形状,要保证各行依次递减2个空格*/cout ;c=1;/第一个数字总为1coutc ;/输出第一个数字以及3个空格for(r=1;r=n;r+)/输出各行的其他数字和空格 c=c*(n-r+1)/r;/计算应输出数字if(c100)/根据数值大小确定数字后面的空格个数if(c10)coutc ;/一位数的后面输出3个空格elsecoutc ;/两位数的后面输出2个空格elsecoutc ;/三位数的后面输出1个空格coutendl;步骤2 经编译、连

22、接后,程序运行结果如图所示。任务二 学习有关函数方面的区别任务说明在本任务中,我们来学习C+语言与C语言在函数语法和使用方面的区别。预备知识一、局部变量随用随定义二、作用域限定符:扩大全局变量的可见范围三、形式参数可带有默认值四、内联函数 在C+中,允许变量定义语句在程序中的任何地方,只要在是使用它之前就可以;而C语言中,必须要在函数开头部分。另外,C+允许重复定义变量,C语言标准中是不允许的。通常情况下,如果全局变量与局部变量同名,局部变量在其作用域内具有较高的优先权,将会屏蔽全局变量。在C+中,可以通过作用域限定符“:”访问被屏蔽的全局变量。二、作用域限定符:扩大全局变量的可见范围一、局部

23、变量随用随定义【例2-4】 使用作用域限定符: 访问被屏蔽的全局变量。#include using namespace std;int v1=80;int main() int v1=8; coutv1; coutn您输入的v1值是v1endl;coutn全局变量v1的值是:v1endl;return 0;程序运行结果如图所示。三、形式参数可带有默认值通常情况下,在调用函数时要为函数的每个形参赋予一个相应的实参值。但有时在主调函数中没有给出实参,或者多次调用同一函数使用同样的实参时,给形参设置一个默认值,被调函数就可以按指定的默认值来执行。函数形参的默认值可以在函数原型的声明中或函数定义中指定

24、。例如:float area(float r=2.5);指定r的默认值为2.5,在调用此函数时可以不必给出实参的值,即等价于调用area(2.5)。如果函数中有多个形参,可以为每个形参指定一个默认值,也可以只对部分形参指定默认值,指定默认值必须按照从右到左的顺序进行。即为某个参数指定默认值时,其后的参数都必须指定默认值,否则已设默认值将被忽略。例如:void f1(double a,float b=2.5,int c=1);/正确void f2(double a,float b=2.5,int c);/*不正确。由于c未指定默认值,故b的默认值无效*/为函数中的形参设置了默认值后,实参的个数可

25、以与形参的个数不同。在进行函数调用时,实参与形参按照从左到右的顺序进行匹配,没有给出实参的,该形参就取指定的默认值。例如:int sum(int a,int b, int c=5,int d=6);在此函数原型中指定了形参c和d的默认值分别为5和6,若调用语句为:sum(3,2,1);则等价于执行语句:sum(3,2,1,6);四、内联函数定义内联函数的格式为:inline 函数类型 函数名(形参列表) 函数体 ;一般只将规模很小(一般为5个语句以下)且使用频繁的函数声明为内联函数,并且内联函数内不能包括循环语句和switch语句。【例2-6】 内联函数应用示例。#include inline

26、 int sum(int x,int y,int z);/对函数sum原型的声明,声明为内联函数void main() int a,b,c,s;coutabc;s=sum(a,b,c); /求三个数的和coutsum is sendl;int sum(int x,int y,int z)/定义内联函数sum return x+y+z; 程序运行结果如图所示。任务实施汉诺塔问题求解案例说明已知台上有3根标号为A、B、C的柱子,在A柱子上放着若干个盘子,每一个都比下面的略小一些。现要把A柱子上的盘子全部移到C柱子上,要求是:一次只能移动一个盘子,移动过程中大盘子不能放在小盘子上面。编写程序,输入A

27、柱子上盘子的数量,输出将盘子从A柱子移动到C柱子上时移动的步骤。案例分析汉诺塔问题是典型的递归调用问题。当n1时,直接将盘子从A移动到C即可。将n(n1)个盘子从A柱移动到C柱可以分为三个步骤: 将n-1个盘子借助C柱子移到B柱子; 将最后一个盘子从A柱子移到C柱子; 将n-1个盘子从B借助A移到C。计算移动次数的公式为2m-1,其中m是盘子总数。实施步骤步骤1 在Visual C+中新建一个C+ 源文件,根据分析编写代码如下:#includevoid move(char one,char anoth) /将一个柱子上的盘子移动到另一个柱子 coutone anothendl; void ha

28、noi(int n,char no1,char no2,char no3)/求解汉诺塔问题 if (n=1) move(no1,no3);/只有一个盘子时,从A移动到Celse hanoi(n-1,no1,no3,no2);/将n-1个盘子借助C从A移动到Bmove(no1,no3);/将最后一个盘子从A移动到Chanoi(n-1,no2,no1,no3);/将n-1个盘子借助A从B移动到Cint times(int n)/计算移动次数 int i,times=1;for(i=1;i=n;i+)times*=2;return times-1;void main() int m;coutm;co

29、ut当有m个盘子时,移动步骤依次为:endl;hanoi(m,A,B,C);cout移动次数为times(m)次endl;步骤2 经编译、连接后,程序运行结果如图所示。任务三 掌握C+中关于引用的灵活运用任务说明引用是C+对C的一个重要扩充,在本任务中我们就来学习引用。一、引用的概念及使用预备知识二、引用作为形式参数三、引用与指针的区别四、引用作为返回值一、引用的概念及使用引用是指为变量起一个别名,声明引用型变量的一般形式为:数据类型 &引用名变量名;例如,假设有一个变量a,若给它起一个别名b,就可以这样来声明:int a;int &b=a;/声明b是a的引用声明引用时,b和a表示相同的变量,

30、它们具有相同的地址。换句话说,对b进行操作也就是对a进行操作。在声明一个引用型变量时,必须同时对其进行初始化。以下语句是不合法的:int a;int &b;b=a;【例2-7】 引用的简单应用。#include void main() int a=10;int &b=a;/声明b是a的引用a=a*a;couta bendl;b=b/2;coutb aendl;程序运行结果如图所示。二、引用作为形式参数在C语言中我们已经学了函数参数传递的两种方式:值传递和地址传递。将引用作为函数的参数时,参数的传递方式为引用传递。引用传递实际上传递的是变量的地址,这种方式节省了大量存储空间,从而能够提高程序的执

31、行效率。下面我们通过【例2-8】来比较值传递、地址传递和引用传递这三种传递方式。【例2-8】 引用作为函数参数的应用示例。要求实现两个整型数据的交换。#includevoid swap1(int x,int y)/参数的值传递 int temp;temp=x;x=y;y=temp;void swap2(int *x,int *y)/参数的地址传递 int temp;temp=*x;*x=*y;*y=temp;void swap3(int &x,int &y)/参数的引用传递 int temp;temp=x;x=y;y=temp;void main( ) int a,b;coutab;/输入a、

32、b两变量的值swap1(a,b);cout值传递的结果:a bendl;swap2(&a,&b);cout地址传递的结果:a bendl;swap3(a,b);cout引用传递的结果:a bendl;程序运行结果如图所示。三、引用与指针的区别 引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间。 引用访问一个变量是直接访问,而指针是间接访问。 引用在开始的时候就绑定到了一个内存空间,所以开始必须赋初值,而指针可以先定义后赋值。【例2-9】 引用与指针对比应用示例。#includevoid main( ) int i = 3,j = 4; couti=ij=jendl;i

33、nt &x = i;/定义引用couti=i;j=j;x=xendl;couti的地址&i;j的地址&j;x的地址&xendl;x = j;couti=i;j=j;x=xendl;couti的地址&i;j的地址&j;x的地址&xendl;程序运行结果如图所示。int *y;/定义指针couty的地址¥dl;y = &j;couti=i;j=j;y=yendl;couti的地址&i;j的地址&j;y的地址¥dl;四、引用作为返回值以引用返回函数值时,定义函数时需要在函数名前加&,定义函数的格式一般如下:类型标识符 &函数名(形参列表及类型说明)函数体1通过引用返回函数值的最大好处是,

34、在内存中不产生被返回值的副本。【例2-10】 定义两个函数:一个以变量方式返回函数值,一个以引用方式返回函数值。#includefloat temp;/定义全局变量tempfloat fn1(float r);/声明函数fn1float &fn2(float r);/声明函数fn2float fn1(float r)/定义函数fn1,以返回值的方法返回函数值 temp=r*r*3.14; return temp;float &fn2(float r)/定义函数fn2,以引用方式返回函数值 temp=r*r*3.14; return temp;void main()/主函数 float a=fn

35、1(10.0); float b=fn2(10.0); coutaendlbendl;程序运行结果如图所示。从上图中我们可以看出,两种方式的运行结果是相同的,但是它们在内存中的活动情况却是不相同的,下面我们对照图示进行说明。函数fn1()是一般的函数返回值方式:返回全局变量temp值时,C+创建临时变量并将temp的值314复制给该临时变量,返回到主函数后,赋值语句a=fnl(10.0)把临时变量的值314复制给a,其内存情况如图所示。函数fn2()以引用方式返回返回值,不产生副本,所以,直接将变量temp返回给主函数,这样避免了临时变量的产生。这种方式提高了程序执行效率和空间利用率,其内存情

36、况如图所示。2返回引用的函数可以作为左值。下面我们通过一个案例来了解这种使用方法。【例2-11】 将返回引用的函数值作为赋值表达式的左值。#include int &put(int n);int vals10;int error=-1;void main() put(0)=10; /以put(0)函数值作为左值,等价于vals0=10; put(9)=20; /以put(9)函数值作为左值,等价于vals9=20; coutvals0endl; coutvals9=0 & n=9 ) return valsn; else coutsubscript error; return error; 程

37、序运行结果如图所示。引用作为返回值时,要注意以下两点:(1)不能返回局部变量的引用(2)不能返回函数内部new分配的内存的引用案例说明任务实施通过引用操作数组创建两个数组,输入数组元素后将数组值输出,然后将两数组合并为一个数组并输出。实施步骤步骤1 在Visual C+中新建一个C+ 源文件,编写代码如下:#include#include#include#define LIST_INIT_SIZE 100/ 数组初始化元素个数#define LISTINCREMENT 10/ 数组元素个数递增长度#define Status int#define ElemType int#define OK

38、1#define ERROR 0#define OVERFLOW -2typedef struct ElemType *elem;int length;/ 数组中实际存放的元素个数int listsize;/ 数组长度,可容纳的最大元素个数 SqList ;Status InitList_Sq(SqList &L) / 构造一个空的数组L L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType); if (!L.elem) return ERROR;/ 存储分配失败 L.length = 0;/ 数组实际长度为0 L.listsiz

39、e = LIST_INIT_SIZE;/ 初始存储容量 return OK;Status InputList_Sq(SqList &L) / 向数组L中输入n个元素 int i; printf(nInput %d numbers:,L.length); for(i=0;iL.length;i+) scanf(%d,&L.elemi); printf(nInput Success!:); return OK;Status OutputList_Sq(SqList L) / 输出数组L中的所有元素 int i; printf(nThere Are %d numbers :, L.length);

40、for(i=0;i L.length;i+) printf(%d , L.elemi); printf(nOutput Success!:); return OK;void MergeList_Sq(SqList La, SqList Lb, SqList &Lc) / 归并La和Lb得到新的顺序线性表Lc ElemType *pa,*pb,*pc,*pa_last,*pb_last; pa = La.elem; pb = Lb.elem; Lc.listsize = Lc.length = La.length+Lb.length; pc = Lc.elem = (ElemType *)mal

41、loc(Lc.listsize*sizeof(ElemType); if (!Lc.elem) exit(OVERFLOW);/ 存储分配失败 pa_last = La.elem+La.length-1; pb_last = Lb.elem+Lb.length-1; while (pa = pa_last & pb = pb_last) / 归并 if (*pa = *pb) *pc+ = *pa+; else *pc+ = *pb+; while (pa = pa_last) *pc+ = *pa+;/ 插入La的剩余元素 while (pb = pb_last) *pc+ = *pb+;/

42、 插入Lb的剩余元素 void main()/ 主函数 SqList La,Lb,Lc; InitList_Sq(La); InitList_Sq(Lb); InitList_Sq(Lc);La.length=5;Lb.length=4;printf(nInput array A); InputList_Sq(La); / 输入数组La OutputList_Sq(La); printf(nInput array B); InputList_Sq(Lb); / 输入数组Lb OutputList_Sq(Lb); MergeList_Sq(La,Lb,Lc); / 将数组La与Lb合并 prin

43、tf(nC=merge(A,B):); OutputList_Sq(Lc);步骤2 经编译、连接后,程序运行结果如图所示。任务四 掌握C+中管理动态内存空间的方法任务说明在本任务中我们来学习使用C+应用程序的结构、C+程序的开发过程、C+开发环境Visual C+ 6.0的使用。预备知识在C+语言中,new和delete可用来实现动态内存空间的管理。一、用new申请动态内存空间二、用delete释放动态内存空间new运算符的操作数是一个数据类型,其作用是为变量分配内存空间,并返回指向该变量的指针。new运算符使用的一般格式为:一、用new申请动态内存空间指针变量new 数据类型 (初值)其中,

44、初值也可以不给出。例如:int *p;/定义了一个指向整型变量的指针p=new int(5);/*为一个整型变量分配内存空间,p指向该变量的首地址,将该整型变量初始化为5*/new运算符还可以为多个变量分配存储空间。例如:int *p;/定义了一个指向整型变量的指针p=new int 8;/*为8个整型变量分配内存空间,p指向第一个整型变量的首地址*/for(int i=0;i8;i+)/为p指向的8个整型变量赋值pi=i;二、用delete释放动态内存空间当new分配的空间使用完之后,必须用delete运算符释放这些空间。delete运算符的一般格式为:delete 指针变量其中,指针变量是

45、指用new运算符申请分配的内存地址。当用delete释放为多个变量分配的地址时,其格式为:delete 指针变量其中中不需要填写变量的个数。例如:int *p=new int a8;delete p;任务实施new、delete的基本使用方法案例说明在本任务中,我们使用new和delete操作符对内存进行一些基本操作。实施步骤步骤1 在Visual C+中新建一个C+ 源文件,编写代码如下:#include using namespace std;int main ( ) /基本数据类型 int *i = new int; /没有初始值 int *j = new int(100); /初始值为

46、100 float *f = new float(3.1415f); /初始值为3.1415 cout i = *i endl; cout j = *j endl; cout f = *f endl; /数组 int *iArr = new int3;for (int k=0; k3; k+) iArrk = (k+1)*10; cout k : iArrk endl; /释放内存 delete i; delete j; delete f; delete iArr;/释放数组空间 return 0;步骤2 编译、连接程序,程序运行结果如图所示。Thank you!项目三任务一 初识类与对象任务

47、二 深入学习类与对象的相关知识类与对象 抽象与实体的完美结合任务说明预备知识任务一 初识类与对象类(Class)是具有相同属性和行为的一组对象的集合,是对属于该类的全部对象的统一抽象描述。类是面向对象中最为重要的概念之一,利用类可以实现数据的封装、隐藏、继承和派生,C+中许多复杂的程序都是用类来实现的。使用类时,用户不需要了解类的具体实现,只需要通过外部接口,以特定的访问权限来使用类的成员即可。一、类的声明及类成员的访问二、类成员函数的定义三、对象成员的定义与引用四、构造函数与析构函数一、类的声明及类成员的访问类也是一种数据类型,与结构体类型不同的是,类中除了包含数据以外,还包含对这些数据操作

48、的函数,它将数据和操作封装在一起。声明类的一般形式为:class 类名public:公有数据成员;公有成员函数;private:私有数据成员;私有成员函数;protected:保护数据成员;保护成员函数;9; 二、类成员函数的定义C+中,类成员的访问属性有以下三种:(1)public(公有的)公有的成员用public来声明,这类成员既可以被本类中的成员函数引用,也可以被任何外部函数引用。它是类与外界的接口。(2)private(私有的)私有的成员用private来声明,这类成员只能被本类中的成员函数所引用。(3)protected(保护的)受保护的成员用protected来声明,这类成员只能被

49、本类及本类的派生类中成员函数引用(本书将在项目四中详细讲述类的继承与派生)。三、对象成员的定义与引用在类的声明中声明了类的数据成员和成员函数的原型之后,还要通过对类的成员函数进行定义来实现成员函数的功能,即成员函数的实现。成员函数的定义方法有以下3种。(1)在类内直接定义成员函数C+中可以直接将成员函数定义在类的内部。(2)在类外定义成员函数在类外定义成员函数的一般形式为:返回类型 类名:成员函数名(参数列表)函数体 “:”为作用域限定符,用来标识该成员函数所属的类。(3)在类外定义成内联函数在类外定义成内联函数的一般形式为:inline 返回类型 类名:成员函数名(参数列表)函数体 【例3-

50、1】 声明一个时钟类,定义该类中的几个成员函数。#includeclass Clock/定义时钟类Clock public:/公有成员void SetTime(int h=0,int m=0,int s=0);/成员函数void ShowTime()/在类内定义成员函数ShowTime()couthour:minute:secondendl;private:/私有成员int hour,minute,second; ; /数据成员void Clock:SetTime(int h,int m,int s)/在类外定义成员函数SetTime() hour=h;minute=m;second=s;vo

51、id main()/主函数 Clock myClock;/定义对象myClockcoutfirst time set and output:endl;myClock.SetTime();/调用成员函数myClock.ShowTime();coutsecond time set and output:endl;myClock.SetTime(8,30,45);myClock.ShowTime();程序运行结果如图所示。四、构造函数与析构函数(一)构造函数1构造函数概述构造函数是一种特殊的成员函数,它的主要功能是为对象分配存储空间,以及为类的成员变量赋初值。构造函数可以在类中定义,也可以在类中声明

52、、在类外定义。定义构造函数的一般形式为:类名: 构造函数名(参数列表) 函数体 构造函数名必须与类名相同,构造函数可以有任意类型的参数,但不能有任何返回值和返回类型。构造函数不需要用户来调用,而是在创建对象时自动被调用,且只调用一次。如果是在类中定义,则省略类名和作用域限定符。如果在定义类时没有定义任何构造函数,编译系统会自动为这个类生成一个默认的构造函数。这个默认的构造函数没有参数且函数体是空的,它不执行任何初始化操作。【例3-2】 定义一个复数类的构造函数。#include class Complex/类Complex的声明public:/定义共有成员Complex()/在类内定义构造函数

53、 cout不带参数的构造函数被调用!endl;real=0;imag=0; void show()/定义成员函数 cout(real,imag); private:/定义私有成员double real,imag;void main() Complex com;/创建一个对象com.show();/调用成员函数show 程序运行结果如图所示。2带参数的构造函数对于不带参数的构造函数,当定义该类的对象时,所有对象都具有相同的初值。但在实际应用中,用户往往希望对不同的对象赋予不同的初值,这时就需要使用带参数的构造函数。定义对象的一般形式为:类名 对象名(实参1,实参2,实参n)【例3-3】 在【例3

54、-2】基础上添加带参数的构造函数。#include class Complex/类的声明 public:/定义公有成员Complex();/声明无参数的构造函数Complex(double,double);/声明带参数的构造函数void show()/定义公有成员函数cout(real,imag)endl;private:/定义私有成员double real,imag;Complex:Complex() /定义无参数的构造函数 cout不带参数的构造函数被调用!endl;real=0;imag=0; Complex:Complex(double r,double i)/定义带参数的构造函数co

55、ut带参数的构造函数被调用!endl;real=r;imag=i;void main() Complex com;/定义对象com,调用无参数的构造函数com.show();/调用对象的公有成员函数Complex com1(3,4);/定义对象com1,调用带参数的构造函数com1.show();/调用对象的公有成员函数Complex com2(1,2);/定义对象com2,调用带参数的构造函数com2.show();/调用对象的公有成员函数 程序运行结果如图所示。3带默认参数的构造函数当构造函数带有参数时,可以通过实参将值传递给形参,也可以为构造函数的参数指定默认值。如果用户在定义对象时没有

56、指定实参值,编译系统就使用默认参数值来初始化数据成员。【例3-4】 带默认参数的构造函数应用示例。#include class Complex/类的声明 public:/定义公有成员Complex(double=0.0,double=0.0);/声明带默认参数的构造函数void show()/定义公有成员函数cout(real,imag)endl;private:/定义私有成员double real,imag;Complex:Complex(double r,double i)/定义带参数的构造函数 cout带默认参数的构造函数被调用!endl;real=r;imag=i; void main

57、() Complex com;/定义对象com,调用带默认参数的构造函数com.show();/调用对象的公有成员函数Complex com1(3); /定义对象com1,调用带参数的构造函数com1.show();/调用对象的公有成员函数Complex com2(1,2);/定义对象com2,调用带参数的构造函数com2.show();/调用对象的公有成员函数程序运行结果如图所示。4带参数初始化表的构造函数构造函数除了可以在函数体中使用赋值语句实现对数据成员的初始化,还可以通过参数初始化表来实现。带参数初始化表的构造函数的一般形式为:类名:构造函数名(参数列表):参数初始化表 函数体 其中,

58、参数初始化表的一般形式为:参数名1(初值1), 参数名2(初值2), , 参数名n(初值n)【例3-5】 带参数初始化表的构造函数应用示例。#include class Complex/类的声明public:/定义公有成员Complex();/声明不带参数的构造函数Complex(double r,double i);/声明带参数的构造函数void show()/定义公有成员函数cout(real,imag)endl;private:/定义私有成员double real,imag;Complex:Complex():real(0),imag(0)/定义带参数初始化表的构造函数 cout带参数初

59、始化表的构造函数被调用!endl; Complex:Complex(double r,double i):real(r),imag(i)/定义带参数初始化表的构造函数 cout带参数初始化表的构造函数被调用!endl; void main() Complex com;/定义对象com,调用无参数的构造函数com.show();/调用对象的公有成员函数Complex com1(1,2);/定义对象com1,调用带参数的构造函数com1.show();/调用对象的公有成员函数 程序运行结果如图所示。5构造函数的重载在一个类中可以定义多个构造函数,这些构造函数的名字相同,而参数的个数或参数的类型不同

60、,程序将根据参数自动调用该类中对应的构造函数,从而对对象使用不同的初始化方法,增加程序设计的灵活性。这就是构造函数的重载。【例3-6】 重载构造函数应用示例。#include class Complex/类的声明 public:/定义公有成员Complex();/声明不带参数的构造函数Complex(int,int);/声明带参数的构造函数Complex(double,double);/构造函数的重载void show()/公有成员函数 cout(real,imag)endl; private:/定义私有成员double real,imag;Complex:Complex()/定义不带参数的构

温馨提示

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

评论

0/150

提交评论