《C-面向对象程序设计项目教程完整版教学课件-整套教程电子讲义(最全最新).ppt》由会员分享,可在线阅读,更多相关《C-面向对象程序设计项目教程完整版教学课件-整套教程电子讲义(最全最新).ppt(589页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、项目一项目一任务一任务一 体会面向对象与面向过程的不同思维方式体会面向对象与面向过程的不同思维方式任务二任务二 创建简单的创建简单的C+应用程序应用程序打开打开C+面向对象程序设计之门面向对象程序设计之门任务说明任务说明任务一任务一 体会面向对象与面向过程的不同思维方式体会面向对象与面向过程的不同思维方式在本任务中我们来学习面向对象程序设计思想以及其与面向过在本任务中我们来学习面向对象程序设计思想以及其与面向过程的不同。程的不同。预备知识预备知识一、什么是面向对象的程序设计思想一、什么是面向对象的程序设计思想二、面向对象与面向过程比较二、面向对象与面向过程比较一、什么是面向对象的程序设计思想一
2、、什么是面向对象的程序设计思想其基本出发点是尽可能按照人类认识世界的方法和思维方式来其基本出发点是尽可能按照人类认识世界的方法和思维方式来分析和解决问题。客观世界是由许多具体的事物或者事件、抽象的分析和解决问题。客观世界是由许多具体的事物或者事件、抽象的概念和规则等组成的,因此,人们研究的对象概念和规则等组成的,因此,人们研究的对象事、物、概念都事、物、概念都统称为统称为“对象对象”。面向对象的设计方法是以对象作为最基本的元素,。面向对象的设计方法是以对象作为最基本的元素,以对象作为分析问题、解决问题的核心。以对象作为分析问题、解决问题的核心。下面我们了解几个面向对象程序设计中涉及的基本概念。
3、下面我们了解几个面向对象程序设计中涉及的基本概念。1对象对象2类类3封装封装4继承继承5多态多态面向对象程序设计方法的优势可以归纳为以下几点:面向对象程序设计方法的优势可以归纳为以下几点:二、面向对象与面向过程比较二、面向对象与面向过程比较(1)程序的开发效率高)程序的开发效率高(2)程序代码的可重用性高)程序代码的可重用性高(3)程序易于维护)程序易于维护任务实施任务实施 运用面向对象和面向过程两种思想解决同一问题运用面向对象和面向过程两种思想解决同一问题案例说明案例说明本任务中我们将分别使用面向过程和面向对象的程序设计本任务中我们将分别使用面向过程和面向对象的程序设计方法设计两个功能完全相
4、同的程序(根据矩形的长和宽求其周方法设计两个功能完全相同的程序(根据矩形的长和宽求其周长和面积),并结合任务内容说明两种程序设计思想的异同。长和面积),并结合任务内容说明两种程序设计思想的异同。实施步骤实施步骤1以面向过程的程序设计方式思考以面向过程的程序设计方式思考步骤步骤1 以面向过程的思想来解决问题,步骤如下:以面向过程的思想来解决问题,步骤如下:(1)确定所求长方形的长和宽。)确定所求长方形的长和宽。(2)确定计算长方形的周长和面积的公式并计算。)确定计算长方形的周长和面积的公式并计算。(3)输出计算结果。)输出计算结果。步骤步骤2 根据解题思路编写代码,如【例根据解题思路编写代码,如
5、【例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;/求面积求面积 coutperi
6、meter=perimeterendl;/输出结果输出结果coutarea=areaendl;2以面向对象的程序设计方式思考以面向对象的程序设计方式思考步骤步骤1 以面向对象的思想来解决问题,步骤如下:以面向对象的思想来解决问题,步骤如下:(1)将长方形类的共性,即两个基本属性(长和宽)和两个行)将长方形类的共性,即两个基本属性(长和宽)和两个行为(求周长和求面积)抽取出来,设计一个长方形类。为(求周长和求面积)抽取出来,设计一个长方形类。(2)根据长方形类创建一个对象。)根据长方形类创建一个对象。(3)通过调用对象的行为求出其周长和面积。)通过调用对象的行为求出其周长和面积。步骤步骤2 根据
7、解题思路编写代码,如【例根据解题思路编写代码,如【例1-2】所示。】所示。【例【例1-2】 以面向对象程序设计思想编码。以面向对象程序设计思想编码。/1-2.cpp#include /包含头文件包含头文件iostream.husing namespace std;/使用标准命名空间使用标准命名空间class Rectangle/定义长方形类定义长方形类public:Rectangle(float w=0,float l=0)width=w;length=l;/定义构造函数,完成创建对象时的初始化工作,即为长和宽赋初值定义构造函数,完成创建对象时的初始化工作,即为长和宽赋初值void GetAr
8、ea()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对象的两个方法对象的两
9、个方法a.GetArea();任务二任务二 创建简单的创建简单的C+应用程序应用程序任务说明任务说明在本任务中我们来学习在本任务中我们来学习C+应用程序的结构、应用程序的结构、C+程序的开发过程以及程序的开发过程以及C+开发环境开发环境Visual C+ 6.0的使用。的使用。预备知识预备知识一、认识一、认识C+程序程序二、二、C+程序的开发过程程序的开发过程三、三、Visual C+ 6.0集成开发环境简介集成开发环境简介四、四、Visual C+ 6.0的排错与调试功能的排错与调试功能1一个一个C+程序程序一、认识一、认识C+程序程序#include /包含头文件包含头文件iostream
10、.h#include /包含头文件包含头文件string.h,字符串,字符串using namespace std;/使用标准命名空间使用标准命名空间/=int main() string greeting=hello world!; /定义一个字符串对象变量,并赋初值定义一个字符串对象变量,并赋初值couthello world!n; /在屏幕上输出字符串在屏幕上输出字符串“hello world!”并换行并换行coutwelcome to C+!endl; /在屏幕上输出在屏幕上输出“welcome to C+!”并换行并换行coutgreetingendl; /在屏幕上输出字符串变量在屏
11、幕上输出字符串变量greeting的内容并换行的内容并换行return 0;/程序结束程序结束2C+程序的构成程序的构成(1)一个)一个C+程序可以由一个或多个源程序单元构成,每个源程序单元程序可以由一个或多个源程序单元构成,每个源程序单元可被看成一个文件。【例可被看成一个文件。【例1-3】中的例子仅由一个源程序单元构成。】中的例子仅由一个源程序单元构成。(2)在一个源程序单元中,一般包括以下组成部分:)在一个源程序单元中,一般包括以下组成部分: 预处理命令。预处理命令。 全局声明部分。全局声明部分。 函数。函数。3C+程序的书写形式程序的书写形式(1)C+的书写格式比较自由,一行内可以写几个
12、语句,一个的书写格式比较自由,一行内可以写几个语句,一个语句也可以写在多行。语句也可以写在多行。(2)在程序中添加必要的注释,也是成为一个优秀程序员所必)在程序中添加必要的注释,也是成为一个优秀程序员所必需的。编译系统在编译代码时会将注释内容忽略。一般情况下,需的。编译系统在编译代码时会将注释内容忽略。一般情况下,内容较少的简单注释用内容较少的简单注释用“/”,而跨行的注释则用,而跨行的注释则用“/*/”。二、二、C+程序的开发过程程序的开发过程1编写程序编写程序2编译程序编译程序3连接目标文件连接目标文件4运行程序运行程序 总体而言,总体而言,C+程序的整个开发过程可用图所示的流程图表示。其
13、中,程序的整个开发过程可用图所示的流程图表示。其中,实线表示操作流程,虚线表示文件的输入实线表示操作流程,虚线表示文件的输入/输出。输出。三、三、Visual C+ 6.0集成开发环境简介集成开发环境简介 本书选用了使用较为广泛的本书选用了使用较为广泛的Visual C+ 6.0作为作为C+程序的开发环境,图所程序的开发环境,图所示为示为Visual C+ 6.0的集成开发环境界面。的集成开发环境界面。四、四、Visual C+ 6.0的排错与调试功能的排错与调试功能第一步第一步 设置断点设置断点第二步第二步 开始调试程序开始调试程序第三步第三步 单步运行单步运行 单步调试程序时,可以在单步调
14、试程序时,可以在Variables窗口和窗口和Watch窗口中察看变量窗口中察看变量值的变化,这两个窗口的作用如下:值的变化,这两个窗口的作用如下: 在在Variables窗口中会自动显示当前运行程序中所有变量的值。窗口中会自动显示当前运行程序中所有变量的值。随着单步调试的进行,我们会看到变量随着单步调试的进行,我们会看到变量i的值逐渐递增。的值逐渐递增。 如果本地变量比较多,如果本地变量比较多,Variables窗口就会比较混乱,此时可窗口就会比较混乱,此时可以直接在代码中选中需要监控的变量,将其拖放到以直接在代码中选中需要监控的变量,将其拖放到Watch列表,该列表,该变量的值会被显示出来
15、。变量的值会被显示出来。任务实施任务实施创建并运行自己的第一个创建并运行自己的第一个C+程序程序单击此处添加备注 编写和调试一个简单的编写和调试一个简单的C+程序,以熟悉程序,以熟悉Visual C+ 6.0的程序编写、的程序编写、编译、连接和调试方法。编译、连接和调试方法。实施步骤实施步骤1创建源程序创建源程序 步骤步骤1 启动启动Visual C+ 6.0,打开,打开“文件文件”下拉菜单,选择下拉菜单,选择“新建新建”菜单项,将打开如图所示的菜单项,将打开如图所示的“新建新建”对话框。对话框。步骤步骤2 如图如图1-14所示,选择所示,选择“文件文件”选项卡,在左侧文件类型选项卡,在左侧文
16、件类型列表中选择列表中选择“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”菜单命令,系统将显示菜单命令,系统将显示图所示对话框,询
17、问是否在创建源文件的目录下建立一个活动工程和图所示对话框,询问是否在创建源文件的目录下建立一个活动工程和一个工作空间。一个工作空间。步骤步骤2 单击单击“是是”按钮,将创建一个与按钮,将创建一个与C+源程序同名的工作区源程序同名的工作区(对应文件为(对应文件为“实训实训1-1.dsw”)和一个工程(对应文件为)和一个工程(对应文件为“实训实训1-1.dsp”),系统开始编译。编译结束后,将在输出窗口输出编译信息,),系统开始编译。编译结束后,将在输出窗口输出编译信息,如图所示。如图所示。步骤步骤3 编译信息显示编译信息显示“实训实训1-1.obj - 0 error(s), 0 warning
18、(s)”,表示,表示编译程序时没有错误和警告。为此,继续执行编译程序时没有错误和警告。为此,继续执行“组建组建”“组建组建实训实训1-1.exe”菜单命令,对生成的目标程序进行连接,以生成可执行程序,菜单命令,对生成的目标程序进行连接,以生成可执行程序,如图所示。如图所示。3调试运行调试运行编译连接通过后,执行编译连接通过后,执行“组建组建”“执行执行实训实训1-1.exe”菜单命令,或者菜单命令,或者直接按【直接按【Ctrl+F5】组合键,运行生成的程序,将出现图所示画面。结果正】组合键,运行生成的程序,将出现图所示画面。结果正确无误,按任意键返回。确无误,按任意键返回。至此,一个完整的至此
19、,一个完整的C+程序从建立到运行就完成了。程序从建立到运行就完成了。项目拓展项目拓展熟悉熟悉Visual C+工作区与工程的使用工作区与工程的使用C+程序唯有放入某个工作区和工程,才能被编译和连接。程序唯有放入某个工作区和工程,才能被编译和连接。为了便于读者更好地使用为了便于读者更好地使用Visual C+,我们首先对工作区、工程,我们首先对工作区、工程等概念进行一些简要说明。等概念进行一些简要说明。(1)在)在Visual C+中,工作区用来管理工程,而工程用来管理中,工作区用来管理工程,而工程用来管理C+源程序(源程序(*.cpp)、)、C+头文件(头文件(*.h)、资源文件等。因此,如)
20、、资源文件等。因此,如果我们开发的程序比较庞大的话,应首先创建工作区,然后创建工果我们开发的程序比较庞大的话,应首先创建工作区,然后创建工程,最后利用工程管理程,最后利用工程管理C+源程序、头文件等。源程序、头文件等。(2)我们既可以为在工作区新建工程,或者在工程中新建)我们既可以为在工作区新建工程,或者在工程中新建C+程序、头文件,也可以将现有工程添加到工作区中,或者将现有程序、头文件,也可以将现有工程添加到工作区中,或者将现有C+源程序、头文件等添加到工程中。源程序、头文件等添加到工程中。(3)Visual C+的编译是针对工程中的的编译是针对工程中的C+程序的,而连接是针程序的,而连接是
21、针对工程的。通过选择对工程的。通过选择“组建组建”菜单中的菜单中的“组建组建”,可以对工程中的,可以对工程中的程序统一进行编译和连接。程序统一进行编译和连接。(4)每个工作区和工程都与某个文件夹相对应,并且工作区文)每个工作区和工程都与某个文件夹相对应,并且工作区文件的扩展名为件的扩展名为.dsw,工程文件的扩展名为,工程文件的扩展名为.dsp。(5)创建工程时,如果系统尚未创建工作区,则系统会自动)创建工程时,如果系统尚未创建工作区,则系统会自动创建一个与工程同名的工作区,并以此名称在指定文件夹中创建一创建一个与工程同名的工作区,并以此名称在指定文件夹中创建一个新文件夹,以存放相关文件。个新
22、文件夹,以存放相关文件。(6)要想编辑)要想编辑C+源程序或头文件等,最好打开工作区文件,源程序或头文件等,最好打开工作区文件,如此一来,我们可以直接对如此一来,我们可以直接对C+源程序、头文件等进行修改、编译源程序、头文件等进行修改、编译和连接。和连接。(7)如果创建的工程是一个)如果创建的工程是一个Win32 Console Application(Win32控制台应用程序),则必须在工程中的某个控制台应用程序),则必须在工程中的某个C+程序中包含程序中包含main()函数,以设置应用程序的入口。此外,每个工程中只能有一个函数,以设置应用程序的入口。此外,每个工程中只能有一个main()函
23、数,否则,将无法连接目标文件。函数,否则,将无法连接目标文件。Thank you!项目二项目二任务一任务一 熟悉熟悉C+与与C在基本控制上的一些区别在基本控制上的一些区别任务二任务二 学习有关函数方面的区别学习有关函数方面的区别任务三任务三 掌握掌握C+中关于引用的灵活运用中关于引用的灵活运用任务四任务四 掌握掌握C+中管理动态内存空间的方法中管理动态内存空间的方法由由C到到C+ 用法更灵活、功能更强大用法更灵活、功能更强大任务说明任务说明预备知识预备知识任务一任务一 熟悉熟悉C+与与C在基本控制上的一些区别在基本控制上的一些区别 在本任务中我们来学习在本任务中我们来学习C+与与C在基本控制上
24、的一些区别,主要在基本控制上的一些区别,主要包括输入包括输入/输出的实现、强制数据类型转换方式以及新增了输出的实现、强制数据类型转换方式以及新增了bool类型。类型。一、用一、用I/O流实现输入流实现输入/输出输出二、新增强制类型转换方式二、新增强制类型转换方式三、新增三、新增bool类型类型一、用一、用I/O流实现输入流实现输入/输出输出 cin是输入流对象,是输入流对象,cout是输出流对象,它们是在编译系统中的是输出流对象,它们是在编译系统中的输入输入/输出流库中定义的,定义后系统会在内存中开辟一段缓冲区,输出流库中定义的,定义后系统会在内存中开辟一段缓冲区,用来暂存输入用来暂存输入/输
25、出流的数据。使用它们时必须将头文件输出流的数据。使用它们时必须将头文件“iostream.h”加入到本文件中,即在程序的开头使用预处理命令加入到本文件中,即在程序的开头使用预处理命令“#include ”。(一)输入语句(一)输入语句输入语句的一般格式为:输入语句的一般格式为:cin表达式表达式1表达式表达式2表达式表达式n; 在使用在使用cin语句时,通过键盘输入的数据应与变量定义的数语句时,通过键盘输入的数据应与变量定义的数据类型一致,并且输入数据的个数应与变量的个数相同。输入据类型一致,并且输入数据的个数应与变量的个数相同。输入完数据后键入回车,流提取操作符完数据后键入回车,流提取操作符
26、“”便从输入流中提取出由便从输入流中提取出由空格、制表符和换行符间隔开的数据赋给相应的变量。空格、制表符和换行符间隔开的数据赋给相应的变量。(二)输出语句(二)输出语句输出语句的一般格式为:输出语句的一般格式为:cout表达式表达式1表达式表达式2表达式表达式nendl; endl是是C+中行结束符,只能用于输出流中,其作用是中行结束符,只能用于输出流中,其作用是在执行换行操作的同时,将缓冲区内已有的数据全部输出,在执行换行操作的同时,将缓冲区内已有的数据全部输出,并清空缓冲区。并清空缓冲区。(三)输入(三)输入/输出的格式控制输出的格式控制常用的输入常用的输入/输出流格式控制符如表所示。输出
27、流格式控制符如表所示。二、新增强制类型转换方式二、新增强制类型转换方式强制转换数据类型的一般形式为:强制转换数据类型的一般形式为:(类型名)变量(类型名)变量 和和 (类型名)(表达式)(类型名)(表达式)也可以写成也可以写成类型名(变量)类型名(变量) 和和 类型名(表达式)类型名(表达式) 例如,下面将变量例如,下面将变量a强制转换成强制转换成int型,将型,将m与与n的和强制转的和强制转换成换成double型,将型,将8与与3取余的结果强制转换成取余的结果强制转换成char型。型。int(a)double(m+n)char(8%3) 当进行强制数据类型转换的对象是一个包含多项的表达式时,
28、当进行强制数据类型转换的对象是一个包含多项的表达式时,必须将表达式用括号括起。例如,将必须将表达式用括号括起。例如,将7/4的结果强制转换成的结果强制转换成double型,型,应该写成应该写成double(7/4) 此时由于此时由于7和和4均为整型,故均为整型,故7/4的结果为整型的结果为整型1,强制转换为双,强制转换为双精度型数据后,结果仍为精度型数据后,结果仍为1,而写成,而写成(double)7/4 则表示将则表示将7的数据类型强制转换为的数据类型强制转换为double型,再与型,再与4求商,结果求商,结果是双精度型数据是双精度型数据1.75。三、新增三、新增bool类型类型 bool(
29、布尔型,也称逻辑型)只有两个值,即整数(布尔型,也称逻辑型)只有两个值,即整数0(表示逻辑(表示逻辑假)和假)和1(表示逻辑真)。在(表示逻辑真)。在C+语言中还定义了这两个布尔型常量所语言中还定义了这两个布尔型常量所对应的符号常量对应的符号常量false和和true,false的值为的值为0,表示逻辑假,表示逻辑假,true的值为的值为1,表示逻辑真。,表示逻辑真。 由于逻辑值是整数由于逻辑值是整数0和和1,所以它也能够像其他整数一样出现在表,所以它也能够像其他整数一样出现在表达式里,参与各种整数运算。达式里,参与各种整数运算。【例【例2-3】 布尔常量应用示例。布尔常量应用示例。#incl
30、ude using namespace std; int main() cout布尔类型的符号常量布尔类型的符号常量true对应的逻辑值是:对应的逻辑值是:trueendl;cout布尔类型的符号常量布尔类型的符号常量false对应的逻辑值是:对应的逻辑值是:falseendl;return 0;程序运行结果如图所示。程序运行结果如图所示。任务实施任务实施输出杨辉三角输出杨辉三角案例说明案例说明杨辉三角是一个由数字排列成的三角形数表,如图所示。杨辉三角是一个由数字排列成的三角形数表,如图所示。 它描述的是两个未知数和的幂它描述的是两个未知数和的幂次方运算后的系数问题。例如,次方运算后的系数问题
31、。例如,(xy)2x22xyy2,这样系数就是,这样系数就是1,2,1,这就是杨辉三角的其中,这就是杨辉三角的其中一行。依次下去,一行。依次下去,(xy)3、(xy)4等的运算结果的各项系数就构成了等的运算结果的各项系数就构成了杨辉三角的其他各行。编写程序,杨辉三角的其他各行。编写程序,根据输入的行数(小于根据输入的行数(小于14)输出杨)输出杨辉三角。辉三角。案例分析案例分析杨辉三角每行的数字是有一定规律的:每一行数字的个数等于所杨辉三角每行的数字是有一定规律的:每一行数字的个数等于所在的行数,每行的第一个数字均为在的行数,每行的第一个数字均为1,其后数字为:前面数字,其后数字为:前面数字(
32、数字(数字所在行号(自所在行号(自1起)数字所在行中的序号(自起)数字所在行中的序号(自0起)起)/数字所在行中数字所在行中的序号。的序号。为了使输出的数字排列成如图所示的金字塔形状,需控制各行数为了使输出的数字排列成如图所示的金字塔形状,需控制各行数字之间空格的个数。每行第一个数字之前空格的个数依次递减字之间空格的个数。每行第一个数字之前空格的个数依次递减2,两个,两个数字之间的空格个数有三种情况:如果输出的数字是一个一位数,则数字之间的空格个数有三种情况:如果输出的数字是一个一位数,则在该数字后输出在该数字后输出3个空格;如果输出的数字是一个两位数,则在该数字个空格;如果输出的数字是一个两
33、位数,则在该数字后输出后输出2个空格;如果输出的数字是一个三位数,则在该数字后输出个空格;如果输出的数字是一个三位数,则在该数字后输出1个空格。个空格。根据以上规律,我们可以利用循环嵌套结构逐行逐个输出数字和根据以上规律,我们可以利用循环嵌套结构逐行逐个输出数字和空格。由于确定了行数,循环的次数也就跟着确定了,故我们使用的空格。由于确定了行数,循环的次数也就跟着确定了,故我们使用的是是for循环。循环。实施步骤实施步骤步骤步骤1 在在Visual C+中新建一个中新建一个C+ 源文件,根据分析编写代码如下:源文件,根据分析编写代码如下:#include void main() int n,r,
34、c,m,j=0;coutm;while (m=14)/如果连续三次输入的数字不符合要求,则退出程序如果连续三次输入的数字不符合要求,则退出程序 if (j=2) cout你的错误输入已达你的错误输入已达3次,你无权再输入!次,你无权再输入!endl;return;cout你输入的行数超出范围,请重新输入!你输入的行数超出范围,请重新输入!endl;coutm;j+;/累计输入次数累计输入次数for (n=0;n=m-1;n+)/逐行输出数字和空格逐行输出数字和空格 for(r=1;r15-n;r+)/*输出第一个数字之前的空格,为了打印出金输出第一个数字之前的空格,为了打印出金字塔形状,要保证
35、各行依次递减字塔形状,要保证各行依次递减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 ;/三位数的后面输出三位数的后
36、面输出1个空格个空格coutendl;步骤步骤2 经编译、连接后,程序运行结果如图所示。经编译、连接后,程序运行结果如图所示。任务二任务二 学习有关函数方面的区别学习有关函数方面的区别任务说明任务说明在本任务中,我们来学习在本任务中,我们来学习C+语言与语言与C语言在函数语法和使用方面的区别。语言在函数语法和使用方面的区别。预备知识预备知识一、局部变量随用随定义一、局部变量随用随定义二、作用域限定符二、作用域限定符:扩大全局变量的可见范围扩大全局变量的可见范围三、形式参数可带有默认值三、形式参数可带有默认值四、内联函数四、内联函数 在在C+中,允许变量定义语句在程序中的任何地方,只要在是中,允
37、许变量定义语句在程序中的任何地方,只要在是使用它之前就可以;而使用它之前就可以;而C语言中,必须要在函数开头部分。另外,语言中,必须要在函数开头部分。另外,C+允许重复定义变量,允许重复定义变量,C语言标准中是不允许的。语言标准中是不允许的。通常情况下,如果全局变量与局部变量同名,局部变量在其作用通常情况下,如果全局变量与局部变量同名,局部变量在其作用域内具有较高的优先权,将会屏蔽全局变量。在域内具有较高的优先权,将会屏蔽全局变量。在C+中,可以通过作中,可以通过作用域限定符用域限定符“:”访问被屏蔽的全局变量。访问被屏蔽的全局变量。二、作用域限定符二、作用域限定符:扩大全局变量的可见范围扩大
38、全局变量的可见范围一、局部变量随用随定义一、局部变量随用随定义【例【例2-4】 使用作用域限定符使用作用域限定符: 访问被屏蔽的全局变量。访问被屏蔽的全局变量。#include using namespace std;int v1=80;int main() int v1=8; coutv1; coutn您输入的您输入的v1值是值是v1endl;coutn全局变量全局变量v1的值是的值是:v1endl;return 0;程序运行结果如图所示。程序运行结果如图所示。三、形式参数可带有默认值三、形式参数可带有默认值通常情况下,在调用函数时要为函数的每个形参赋予一个相应的通常情况下,在调用函数时要为
39、函数的每个形参赋予一个相应的实参值。但有时在主调函数中没有给出实参,或者多次调用同一函数实参值。但有时在主调函数中没有给出实参,或者多次调用同一函数使用同样的实参时,给形参设置一个默认值,被调函数就可以按指定使用同样的实参时,给形参设置一个默认值,被调函数就可以按指定的默认值来执行。的默认值来执行。函数形参的默认值可以在函数原型的声明中或函数定义中指定。函数形参的默认值可以在函数原型的声明中或函数定义中指定。例如:例如:float area(float r=2.5);指定指定r的默认值为的默认值为2.5,在调用此函数时可以不必给出实参的值,即,在调用此函数时可以不必给出实参的值,即等价于调用等
40、价于调用area(2.5)。如果函数中有多个形参,可以为每个形参指定一个默认值,如果函数中有多个形参,可以为每个形参指定一个默认值,也可以只对部分形参指定默认值,指定默认值必须按照从右到左也可以只对部分形参指定默认值,指定默认值必须按照从右到左的顺序进行。即为某个参数指定默认值时,其后的参数都必须指的顺序进行。即为某个参数指定默认值时,其后的参数都必须指定默认值,否则已设默认值将被忽略。例如:定默认值,否则已设默认值将被忽略。例如:void f1(double a,float b=2.5,int c=1);/正确正确void f2(double a,float b=2.5,int c);/*不
41、正确。由于不正确。由于c未指定默认值,故未指定默认值,故b的默认值无效的默认值无效*/为函数中的形参设置了默认值后,实参的个数可以与形参的个为函数中的形参设置了默认值后,实参的个数可以与形参的个数不同。在进行函数调用时,实参与形参按照从左到右的顺序进行数不同。在进行函数调用时,实参与形参按照从左到右的顺序进行匹配,没有给出实参的,该形参就取指定的默认值。例如:匹配,没有给出实参的,该形参就取指定的默认值。例如:int sum(int a,int b, int c=5,int d=6);在此函数原型中指定了形参在此函数原型中指定了形参c和和d的默认值分别为的默认值分别为5和和6,若调用,若调用语
42、句为:语句为:sum(3,2,1);则等价于执行语句:则等价于执行语句:sum(3,2,1,6);四、内联函数四、内联函数定义内联函数的格式为:定义内联函数的格式为:inline 函数类型函数类型 函数名(形参列表)函数名(形参列表) 函数体函数体 ;一般只将规模很小(一般为一般只将规模很小(一般为5个语句以下)且使用频繁的函个语句以下)且使用频繁的函数声明为内联函数,并且内联函数内不能包括循环语句和数声明为内联函数,并且内联函数内不能包括循环语句和switch语句。语句。【例【例2-6】 内联函数应用示例。内联函数应用示例。#include inline int sum(int x,int
43、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柱子上放着若干柱子上放着若干个盘子,每一个都比下面的略小一些。现要把个
44、盘子,每一个都比下面的略小一些。现要把A柱子上的盘子全柱子上的盘子全部移到部移到C柱子上,要求是:一次只能移动一个盘子,移动过程中柱子上,要求是:一次只能移动一个盘子,移动过程中大盘子不能放在小盘子上面。大盘子不能放在小盘子上面。编写程序,输入编写程序,输入A柱子上盘子的数量,输出将盘子从柱子上盘子的数量,输出将盘子从A柱子移柱子移动到动到C柱子上时移动的步骤。柱子上时移动的步骤。案例分析案例分析汉诺塔问题是典型的递归调用问题。当汉诺塔问题是典型的递归调用问题。当n1时,直接将盘子时,直接将盘子从从A移动到移动到C即可。将即可。将n(n1)个盘子从)个盘子从A柱移动到柱移动到C柱可以分为柱可以
45、分为三个步骤:三个步骤: 将将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 ano
46、thendl; void hanoi(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,ti
47、mes=1;for(i=1;i=n;i+)times*=2;return times-1;void main() int m;coutm;cout当有当有m个盘子时,移动步骤依次为:个盘子时,移动步骤依次为:endl;hanoi(m,A,B,C);cout移动次数为移动次数为times(m)次次endl;步骤步骤2 经编译、连接后,程序运行结果如图所示。经编译、连接后,程序运行结果如图所示。任务三任务三 掌握掌握C+中关于引用的灵活运用中关于引用的灵活运用任务说明任务说明引用是引用是C+对对C的一个重要扩充,在本任务中我们就来学习引用。的一个重要扩充,在本任务中我们就来学习引用。一、引用的概念
48、及使用一、引用的概念及使用预备知识预备知识二、引用作为形式参数二、引用作为形式参数三、引用与指针的区别三、引用与指针的区别四、引用作为返回值四、引用作为返回值一、引用的概念及使用一、引用的概念及使用引用是指为变量起一个别名,声明引用型变量的一般形式为:引用是指为变量起一个别名,声明引用型变量的一般形式为:数据类型数据类型 &引用名变量名引用名变量名;例如,假设有一个变量例如,假设有一个变量a,若给它起一个别名,若给它起一个别名b,就可以这样,就可以这样来声明:来声明:int a;int &b=a;/声明声明b是是a的引用的引用声明引用时,声明引用时,b和和a表示相同的变量,它们具有相同的地址。
49、换句表示相同的变量,它们具有相同的地址。换句话说,对话说,对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;程序运行结果如图所示。程序运行结果如图所示。二、引用作为形式参数二、引用作为形式参数
50、在在C语言中我们已经学了函数参数传递的两种方式:值传递和地语言中我们已经学了函数参数传递的两种方式:值传递和地址传递。将引用作为函数的参数时,参数的传递方式为引用传递。址传递。将引用作为函数的参数时,参数的传递方式为引用传递。引用传递实际上传递的是变量的地址,这种方式节省了大量存储空引用传递实际上传递的是变量的地址,这种方式节省了大量存储空间,从而能够提高程序的执行效率。间,从而能够提高程序的执行效率。下面我们通过【例下面我们通过【例2-8】来比较值传递、地址传递和引用传递】来比较值传递、地址传递和引用传递这三种传递方式。这三种传递方式。【例【例2-8】 引用作为函数参数的应用示例。要求实现两