002_3C++研究生程序设计.ppt
《002_3C++研究生程序设计.ppt》由会员分享,可在线阅读,更多相关《002_3C++研究生程序设计.ppt(64页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+程序设计程序设计第二章第二章 C+编程基础编程基础(三)(三)1/30/202312.3 函数函数函数概述函数的定义与声明函数的调用作用域1/30/202322.3.1 函数概述函数概述函数也称子程序、例程或过程,它是把一些相关函数也称子程序、例程或过程,它是把一些相关的语句组织在一起,用于解决某一特定问题的语的语句组织在一起,用于解决某一特定问题的语句块。句块。函数是函数是C+程序的基本特征,它将程序和代码进程序的基本特征,它将程序和代码进行了封装,实现了对程序设计的高级抽象。在行了封装,实现了对程序设计的高级抽象。在C+中常把一个程序分成多个函数来实现。这样中常把一个程序分成多个函数来
2、实现。这样设计的目的隐藏了具体实现的细节问题,而且还设计的目的隐藏了具体实现的细节问题,而且还是实现参数化和实现结构化的具体表现。函数抽是实现参数化和实现结构化的具体表现。函数抽象的实现,将有利于数据共享,节省开发时间,象的实现,将有利于数据共享,节省开发时间,增强程序的可靠性和便于管理等。增强程序的可靠性和便于管理等。1/30/202331、使用函数的优点、使用函数的优点(1)可读性好;)可读性好;(2)易于查错和修改;)易于查错和修改;(3)便于分工编写,分阶段调试;)便于分工编写,分阶段调试;(4)各各个个函函数数之之间间接接口口清清晰晰,便便于于相相互互间间交交换换信信息和使用;息和使
3、用;(5)节省程序代码和存储空间;)节省程序代码和存储空间;(6)减少用户总的工作量;)减少用户总的工作量;(7)成为实现结构程序设计思想的重要工具;)成为实现结构程序设计思想的重要工具;(8)扩充语言和计算机的原设计能力;)扩充语言和计算机的原设计能力;(9)便于验证程序正确性。)便于验证程序正确性。1/30/202342、main()函数函数设计设计C+程序的过程,实际上就是编写函数的过程序的过程,实际上就是编写函数的过程,至少要编写一个程,至少要编写一个main()()函数。函数。执行执行C+程序,也就是执行相应的程序,也就是执行相应的main()()函函数。即从数。即从main()()
4、函数的第一个左花括号函数的第一个左花括号“”开始,依次执行后面的语句,直到最后一个右花开始,依次执行后面的语句,直到最后一个右花括号括号“”为止。如果在执行过程中遇到其他的函为止。如果在执行过程中遇到其他的函数,则调用其他函数。调用完后,返回到刚才调数,则调用其他函数。调用完后,返回到刚才调用函数的下一条语句继续执行。而其他函数也只用函数的下一条语句继续执行。而其他函数也只有在执行有在执行main()()函数的过程中被调用时才会函数的过程中被调用时才会执行。执行。1/30/202352.3.2 函数的定义与声明函数的定义与声明函数分为系统函数和自定义函数两种。系统函数函数分为系统函数和自定义函
5、数两种。系统函数是是C+标准函数库中提供的可以在任何程序中使标准函数库中提供的可以在任何程序中使用的公共函数,使用系统函数必须指定函数所在用的公共函数,使用系统函数必须指定函数所在的包含文件,同样也适用于自定义函数库的调用。的包含文件,同样也适用于自定义函数库的调用。函数必须先定义才能使用。也就是说调用函数的函数必须先定义才能使用。也就是说调用函数的语句必须在函数定义或函数原型之后。为了方便语句必须在函数定义或函数原型之后。为了方便于程序设计,一般函数定义都放在一个函数文件于程序设计,一般函数定义都放在一个函数文件库中,在程序首部指定包含文件。库中,在程序首部指定包含文件。1/30/20236
6、1、函数的定义、函数的定义C+中中的的每每一一个个函函数数都都是是从从四四个个方方面面来来进进行行定定义义:类型、函数名、形式参数表、函数体。类型、函数名、形式参数表、函数体。定义一个函数的语法格式为:定义一个函数的语法格式为:类型类型 函数名(形式参数表)函数名(形式参数表)函数体;函数体;函数的定义不允许嵌套。函数的定义不允许嵌套。1/30/20237函数定义的说明:函数定义的说明:(1)类型就是该函数的类型,也就是该函数的返回)类型就是该函数的类型,也就是该函数的返回值的类型,此类型可以是值的类型,此类型可以是C+中除函数、数组类中除函数、数组类型之外的任何一个合法的数据类型,包括普通类
7、型之外的任何一个合法的数据类型,包括普通类型、指针类型和引用类型等。型、指针类型和引用类型等。(2)函数的返回值通常指明了该函数处理的结果,)函数的返回值通常指明了该函数处理的结果,由函数体中的由函数体中的return语句给出。一个函数可以有语句给出。一个函数可以有返回值,也可以无返回值(称为无返回值函数或返回值,也可以无返回值(称为无返回值函数或无类型函数)。此时需要使用保留字无类型函数)。此时需要使用保留字void作为类作为类型名,而且函数体中也不需要再写型名,而且函数体中也不需要再写return语句,语句,或者或者return的后面什么也没有。的后面什么也没有。(3)每个函数都有类型,如
8、果在函数定义时没有明)每个函数都有类型,如果在函数定义时没有明确指定类型,则默认类型为确指定类型,则默认类型为int。1/30/20238(4)函数名是一个有效的)函数名是一个有效的C+标识符,遵标识符,遵循一般的命名规则。在函数名后面必须跟循一般的命名规则。在函数名后面必须跟一对小括号一对小括号“()()”,用来将函数名与变,用来将函数名与变量名或其他用户自定义的标识符区分开来。量名或其他用户自定义的标识符区分开来。在小括号中可以没有任何信息,也可以包在小括号中可以没有任何信息,也可以包含形式参数表。含形式参数表。C+程序通过使用这个函数程序通过使用这个函数名和实参表可以调用该函数。名和实参
9、表可以调用该函数。1/30/20239(5)形式参数表又称参数表,写在函数名后面的一)形式参数表又称参数表,写在函数名后面的一对圆括号内。它可包含任意多个(含对圆括号内。它可包含任意多个(含0个,即没个,即没有)参数说明项,当多于一个时其前后两个参数有)参数说明项,当多于一个时其前后两个参数说明项之间必须用逗号分开。说明项之间必须用逗号分开。(6)每个参数说明项由一种已定义的数据类型和一)每个参数说明项由一种已定义的数据类型和一个变量标识符组成,该变量标识符称为该函数的个变量标识符组成,该变量标识符称为该函数的形式参数,简称形参,形参前面给出的数据类型形式参数,简称形参,形参前面给出的数据类型
10、称为该形参的类型。每个形参的类型可以为任一称为该形参的类型。每个形参的类型可以为任一种数据类型,包括普通类型、指针类型、数组类种数据类型,包括普通类型、指针类型、数组类型、引用类型等。型、引用类型等。1/30/202310(7)一个函数定义中的)一个函数定义中的可以被省略,表可以被省略,表明该函数为无参函数,若明该函数为无参函数,若用用void取代,取代,则也表明是无参函数,若则也表明是无参函数,若不为空,同不为空,同时又不是保留字时又不是保留字void,则称为带参函数。则称为带参函数。(8)是一条复合语句,它以左花括号开是一条复合语句,它以左花括号开始,到右花括号结束,中间为一条或若干条始,
11、到右花括号结束,中间为一条或若干条C+语句,用于实现函数执行的功能。语句,用于实现函数执行的功能。(9)在一个函数体内允许有一个或多个)在一个函数体内允许有一个或多个return语语句,一旦执行到其中某一个句,一旦执行到其中某一个return语句时,语句时,return后面的语句就不再执行,直接返回调用位后面的语句就不再执行,直接返回调用位置继续向下执行。置继续向下执行。1/30/202311例如:看下面是几个函数及返回类型。例如:看下面是几个函数及返回类型。(1)获取参数并返回值获取参数并返回值 int bigger(int a,int b)return(ab)?a:b (2)获取参数但不返
12、回值获取参数但不返回值 void delay(long a)for (int i=1;i=a;i+);/时间延时间延迟迟 1/30/202312(3)没有获取参数但返回值没有获取参数但返回值 int geti()int x;cout x;return x;(4)没有获取参数也不返回值没有获取参数也不返回值 void message()cout b)t=a;elset=b;returnt;voidmain()cout“Input two data:”xxy;coutmax(x,y)endl;1/30/2023142、函数的声明、函数的声明函函数数声声明明也也称称函函数数原原型型。函函数数原原型型
13、类类似似函函数数定定义义时时的的函函数数头头。为为了了能能使使函函数数在在定定义义之之前前就就能能被被调调用用,C+规规定定可可以以先先说说明明函函数数原原型型,然然后后就就可可以以调用函数。函数定义可放在程序后面。调用函数。函数定义可放在程序后面。由于函数原型是一条语句,因此函数原型必须以由于函数原型是一条语句,因此函数原型必须以分号结束。函数原型由函数返回类型、函数名和分号结束。函数原型由函数返回类型、函数名和参数表组成,它与函数定义的返回类型、函数名参数表组成,它与函数定义的返回类型、函数名和参数表必须一致。函数原型不必包含参数的名和参数表必须一致。函数原型不必包含参数的名字,可只包含参
14、数的类型。字,可只包含参数的类型。1/30/202315例如:例如:int area(int,int);等价于等价于 int area(int a,int b););说明:系统标准函数并没有在包含文件中说明:系统标准函数并没有在包含文件中定义,而只是提供了函数原型。在调用函定义,而只是提供了函数原型。在调用函数时,系统会正确地调用库函数。数时,系统会正确地调用库函数。注意:函数原型与函数定义必须一致,否注意:函数原型与函数定义必须一致,否则会引起编译错误。则会引起编译错误。1/30/202316例例2.3-2 求任意三角形的面积求任意三角形的面积#include iostream.h#incl
15、ude math.h“float triangle_area(float,float,float);void print();void main()float a,b,c,area;coutabc;if(a+bc&a+cb&b+ca)area=triangle_area(a,b,c);coutarea=areaendl;elseprint();float triangle_area(float x,float y,float z)float p,s;p=(x+y+z)/2;s=sqrt(p*(p-x)*(p-y)*(p-z);return s;void print()coutInput err
16、or!endl;1/30/2023172.3.3 函数的调用函数的调用1、函数调用格式:、函数调用格式:在在C+中中,除除了了主主函函数数main由由系系统统自自动动调调用用外外,其其他他函函数数都都是是由由主主函函数数直直接接或或间间接调用的。函数调用的语法格式为:接调用的。函数调用的语法格式为:函数名函数名(实际参数表);(实际参数表);实参应该与函数定义中的形参表中的形参实参应该与函数定义中的形参表中的形参一一对应,即个数相等、次序一致且对应一一对应,即个数相等、次序一致且对应参数的数据类型相同或相容参数的数据类型相同或相容。每个实参是。每个实参是一个表达式,并且必须有确定的值。一个表达
17、式,并且必须有确定的值。1/30/202318例如:例如:g1(25)/实参是一个整数实参是一个整数g2(x)/实参是一个变量实参是一个变量g3(a,2*b+3)/第一个为变量,第二个是算术表达式第一个为变量,第二个是算术表达式g4(sin(x),)/第一个为函数调用表达式,第二第一个为函数调用表达式,第二/个为字符常量个为字符常量g5(&d,*p,x/y-1)/分别为取地址运算、间接访问和分别为取地址运算、间接访问和/一般算术表达式一般算术表达式 1/30/202319函数调用方式:函数调用方式:常见的函数调用方式有下列两种:常见的函数调用方式有下列两种:方方式式一一:将将函函数数调调用用作
18、作为为一一条条表表达达式式语语句句使使用用,只只要要求求函函数数完完成成一一定定的的操操作作,而而不不使使用用其其返返回回值值。若若函函数数调调用用带带有有返回值,则这个值将会自动丢失。例如:返回值,则这个值将会自动丢失。例如:max(3,5);方方式式二二:对对于于具具有有返返回回值值的的函函数数来来说说,把把函函数数调调用用语语句句看看作作语语句句一一部部分分,使使用用函函数数的的返返回回值值参参与与相相应应的的运运算算或或执执行行相应的操作。例如:相应的操作。例如:inta=max(3,5);inta=max(3,5)+1;coutmax(3,5)endl;if(f1(a,b)cout”
19、true”endl;inta=2;a=max(max(a,3),5);1/30/2023202、函数调用过程、函数调用过程当调用一个函数时,整个调用过程分为三当调用一个函数时,整个调用过程分为三步进行,第一步是参数传递,第二步是函步进行,第一步是参数传递,第二步是函数体执行,第三步是返回,即返回到函数数体执行,第三步是返回,即返回到函数调用表达式的位置或函数调用语句的下一调用表达式的位置或函数调用语句的下一条语句。条语句。1/30/2023213、函数的调用机制、函数的调用机制函数调用对用户来讲非常简单,但实际上为了在调用函数函数调用对用户来讲非常简单,但实际上为了在调用函数后能正确地使用函数
20、参数和正确地返回到调用时的位置,后能正确地使用函数参数和正确地返回到调用时的位置,必须将一些数据存储在栈中。这个处理过程称为函数调用必须将一些数据存储在栈中。这个处理过程称为函数调用机制。机制。栈在函数调用过程中具有非常重要的作用。栈在函数调用过程中具有非常重要的作用。函数调用时,函数调用时,C+需要做下面一些工作:需要做下面一些工作:建立被调函数的栈空间建立被调函数的栈空间保护调用函数的运行状态和返回地址保护调用函数的运行状态和返回地址保护函数传递的参数保护函数传递的参数将控制转交被调函数将控制转交被调函数栈空间主要由函数内部定义的变量和函数参数所占用,由栈空间主要由函数内部定义的变量和函数
21、参数所占用,由于系统默认栈空间是有限制的,因此,当需要较多的内存于系统默认栈空间是有限制的,因此,当需要较多的内存空间时则必须在连接前设置栈空间大小。空间时则必须在连接前设置栈空间大小。1/30/2023224、函数调用时的参数传递、函数调用时的参数传递参数传递称为参数传递称为“实虚结合实虚结合”,即实参向形,即实参向形参传递信息,使形参具有确切地含义(即参传递信息,使形参具有确切地含义(即具有对应的存储空间和初值)。这种传递具有对应的存储空间和初值)。这种传递又分为两种不同的方式,一种是按值传递,又分为两种不同的方式,一种是按值传递,另一种是地址传递或引用传递。另一种是地址传递或引用传递。1
22、/30/202323(1)按值传递按值传递以按值传递方式进行参数传递的过程为:首先计以按值传递方式进行参数传递的过程为:首先计算出实参表达式的值,接着给对应的形参变量分算出实参表达式的值,接着给对应的形参变量分配一个存储空间,该空间的大小等于该形参类型配一个存储空间,该空间的大小等于该形参类型的长度,然后把已求出的实参表达式的值一一存的长度,然后把已求出的实参表达式的值一一存入到为形参变量分配的存储空间中,成为形参变入到为形参变量分配的存储空间中,成为形参变量的初值,供被调用函数执行时使用。这种传递量的初值,供被调用函数执行时使用。这种传递是把实参表达式的值传送给对应的形参变量,故是把实参表达
23、式的值传送给对应的形参变量,故称这种传递方式为称这种传递方式为“按值传递按值传递”。这种方式被调。这种方式被调用函数本身不对实参进行操作,也就是说,即使用函数本身不对实参进行操作,也就是说,即使形参的值在函数中发生了变化,实参的值也完全形参的值在函数中发生了变化,实参的值也完全不会受到影响,仍为调用前的值。不会受到影响,仍为调用前的值。1/30/202324例例2.3-3 交换两个变量的值(按值传递)交换两个变量的值(按值传递)#includeiostream.hvoidswap(int,int);voidmain()inta=3,b=4;couta=a,b=“bendl;swap(a,b);
24、couta=a,b=bendl;voidswap(intx,inty)intt=x;x=y;y=t;此程序的运行结果为:此程序的运行结果为:a=3,b=4a=3,b=41/30/202325(2)地址传递)地址传递如果在函数定义时将形参的类型说明成指针,对如果在函数定义时将形参的类型说明成指针,对这样的函数进行调用时就需要指定地址值形式的这样的函数进行调用时就需要指定地址值形式的实参。这时的参数传递方式即为地址传递方式。实参。这时的参数传递方式即为地址传递方式。这种地址传递与上述的按值传递不同,它把实参这种地址传递与上述的按值传递不同,它把实参的存储地址传送给对应的形参,从而使得形参指的存储地
25、址传送给对应的形参,从而使得形参指针和实参指针指向同一个地址。因此,被调用函针和实参指针指向同一个地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变数中对形参指针所指向的地址中内容的任何改变都会影响到实参。都会影响到实参。1/30/202326例例2.3-4 交换两个变量的值(按地址传递)交换两个变量的值(按地址传递)#includeiostream.hvoidswap(int*,int*);voidmain()inta=3,b=4;couta=a,b=“bendl;swap(&a,&b);couta=a,b=“bendl;voidswap(int*x,int*y)intt=*x;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 002 _3C 研究生 程序设计
限制150内