第三章函数.docx
- 文档编号:12982129
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:27
- 大小:85.68KB
第三章函数.docx
《第三章函数.docx》由会员分享,可在线阅读,更多相关《第三章函数.docx(27页珍藏版)》请在冰点文库上搜索。
第三章函数
第三章函数
[本章重点]C++中函数的定义、调用和参数传递;参数传递时的两种调用方式:
传值调用和引用调用;函数的重载和递归调用;部分常见系统函数的用法。
[本章难点]函数之间进行参数传递时两种调用方式;函数的递归调用;函数重载。
函数是C++源程序的基本模块,一个C++控制台程序一般由一个主函数main()和若干个应用函数组成。
主函数main()是整个应用程序的开始执行点,正常情况下,整个C++控制台应用程序也是在main()函数中结束的。
主函数可以调用应用函数,而应用函数之间也可以根据其逻辑关系相互调用。
调用其他函数的函数称为主调函数,而被调用的应用函数称被调函数。
我们把实现某种功能的算法编成一个个相对独立的函数模块,然后用调用的方法来使用这些函数。
第一节函数的定义
一、函数的定义
C++语言系统自身提供了丰富的应用函数,这些函数被称为系统函数。
系统函数无需用户定义,只需在源程序前连接包含有该函数原型的头文件,即可在程序中直接调用(在稍后的章节里介绍)。
此外,还可以根据需求,把算法编成独立的函数模块,在源程序的适当位置进行定义和调用,这类应用函数叫做用户自定义函数。
在C++语言源程序中,用户自定义函数应用遵循先定义后使用的原则。
函数定义的一般格式为:
类型标识符函数名(形式参数表)
{
语句
}
其中:
类型标识符和函数名称为函数头,类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的数据类型,该类型标识符与前面介绍的各种数据类型说明符相同,一些情况下函数也可以没有返回值,此时函数类型标识符应为void。
函数名是由用户定义的标识符,函数名后有一对圆括号,括号内形式参数表中给出的参数称为形式参数(简称形参),它们由一个或多个带有数据类型说明的变量组成,变量之间用逗号间隔。
在进行函数调用时,主调函数将赋予这些形式参数实际的值。
函数也可以没有形式参数表,这种函数称为无参函数,尽管这种函数可以省略形式参数,但函数名后的括号不能省略。
{}中的语句称为函数体,它是用户算法的具体实现程序。
例3-1编程实现输出n行由*组成的三角形的函数。
voiddisplay(intn)
{inti,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=(2*i-1);j++)cout<<”*”;
cout< } } 例3-1中,voiddisplay(intn)说明display函数是一个无返回值函数,形式参数n为整型变量,n的具体值由主调函数在调用时传送过来。 在{}中的函数体内,首先声明了两个整形变量i和j,这两个变量仅在函数体内有效。 由主调函数传递来的值n控制循环执行的次数,双重循环实现了n行*的输出。 程序执行结束已达到预期效果,所以该函数没有返回值。 例3-2编写一个函数,将华氏温度转换为摄氏温度(转换公式: )。 floatftoc(floatf) { floatc; c=5*(f-32)/9; returnc; } ftoc函数是一个单精度浮点型函数,其返回的函数值是单精度浮点型数据,形式参数f也是单精度浮点型变量,f的具体值由主调函数在调用时传递。 函数体内除形式参数外还声明了变量c,用于存放温度转换的计算结果,return语句将这一结果返回到主调函数,有返回值函数中至少应有一个return语句。 例3-3编写一个函数,用于求两个整型数据中较大的整数。 intmax(intx,inty) { if(x>y) returnx; else returny; } max函数是一个整型函数,该函数返回值是一个整数。 形式参数x,y均为整型变量,x、y的具体值由主调函数在调用时传送。 函数体中的if语句判断x、y的大小,并用return语句把x(或y)的值作为函数的值返回给主调函数。 二、函数原型声明 在C++程序中,一个函数的定义可以放在任意位置,既可放在主调函数之前,也可放在主调函数之后,为了避免由于函数定义位置的不确定性而引起的编译错误,C++要求应在应用函数调用之前为其构造原型,即在源程序中首先声明函数原型。 函数原型声明的一般格式为: 类型标识符函数名(形式参数表); 其中: 类型标识符、函数名、形式参数表的规定与函数的定义相同。 该语句最后的分号不能缺少。 例如: 上节三个例题中的函数原型声明分别为: voiddisplay(intn); floatftoc(floatf); intmax(intx,inty); 注意: 1)同一个函数的原型声明与函数定义,在类型标识、函数名称以及形式参数表上必须完全一致。 2)函数原型声明必须出现在函数调用之前。 3)函数原型声明时,形式参数表中可以不包含参数的名字,只包含参数的类型。 因此,例3-1中的函数原型声明也可写为: voiddisplay(int); 第二节函数的调用 一、函数的调用 函数被定义以后,只有在主调函数的适当位置对它进行调用,才能发挥其作用。 函数调用实际上就是转去执行这段用函数名命名的程序代码,它包括参数传递、执行代码、返回函数值等操作。 函数调用的一般格式如下: 函数名(实际参数表) 其中: 函数调用中的函数名称应与函数定义中的函数名称相一致;实际参数表中给出的实际参数(简称实参),是主调函数转去执行被调函数了时,希望参与被调函数运算的实际值,它们可以是常量、变量或表达式。 例3-4对例3-1中函数的调用如下。 #include voiddisplay(intn);//函数原型声明 voidmain() { intx; display(3);//调用函数display,实参为常量3 cout<<”请输入x: ”; cin>>x; display(x);//调用函数display,实参为变量x } voiddisplay(intn) { inti,j; for(i=1;i<=n;i++) { for(j=1;j<=(2*i-1);j++)cout<<”*”; cout< } } 程序运行结果如下: * *** ***** 请输入x: 5 * *** ***** ******* ********* 现在我们可以从函数定义、函数原型声明以及函数调用的角度来分析整个程序,从中进一步了解函数的各种特点。 程序中首先声明了函数display的原型,然后定义主函数main,main函数之后定义并实现函数display。 程序运行时,从main函数开始执行,程序运行到display(3)语句时,调用函数display,并将常数3传递给函数display的变量n,程序转去执行display函数,输出3行*,之后返回main函数,继续执行main函数中的语句,接收用户键盘输入的数值(本次执行该数值为5)赋给变量x,然后再次调用函数display,并将x的值5传递给函数display的变量n,程序转去执行display函数,输出5行*,display函数结束返回主函数main,之后主函数结束。 例3-5编写程序,利用例3-2定义的函数ftoc,将用户输入的华氏温度转换为摄氏温度。 #include floatftoc(floatf); voidmain() { floatx,y; cout<<"请输入华氏温度: "; cin>>x; y=ftoc(x); cout<<"华氏温度"< } floatftoc(floatf) { floatc; c=5*(f-32)/9; returnc; } 程序运行结果如下: 请输入华氏温度: 50 华氏温度50度=摄氏温度10度 从函数定义以及函数原型声明中都能看出,这是一个有返回值的函数,其返回值的数据类型为单精度浮点型,形式参数f的数据类型也是单精度浮点型。 主程序中首先声明了两个单精度浮点型变量x、y,x的值在程序运行时由用户键盘输入,调用ftoc函数时将主函数中x的值传递给ftoc函数中形参变量f,转去执行ftoc函数,根据公式计算并将结果存入变量c,return语句将变量c的值带回到主函数,主函数将得到的结果赋予变量y,最后输出计算结果,整个程序结束。 函数调用时应注意以下几点: 1)函数的调用既可以独立成句,也可以作为其他语句的成分元素。 2)实际参数表中的参数必须与形式参数表中的参数在类型、个数等方面一一对应。 3)实际参数表中的参数可以是变量、常量或表达式。 二、函数的返回值 要将被调函数的计算结果,有效的传递到主调函数中去(即返回函数值),采用return语句实现。 return语句的一般格式为: return表达式; 该语句的功能是终止函数的执行,并向主调函数返回函数值,返回的函数值就是return语句中表达式的值。 该语句的表达式可以省略,若省略表达式,return语句仅表示终止函数的执行,并将系统控制权交给主调用函数。 例3-6编程用例3-3中定义的max函数,求任意输入的4个整数中的最大数。 #include intmax(intx,inty); voidmain() { inta,b,c,d,m; cout<<”请输入4个整数: ”; cin>>a>>b>>c>>d; m=max(a,b); m=max(m,c); m=max(m,d); cout< } intmax(intx,inty) { if(x>y) returnx; else returny; } 程序运行结果如下: 请输入4个整数: 3251 3、2、5、1中最大的数是5 max函数是一个整型函数,其返回的函数值也是一个整数。 形式参数x、y均为整型变量。 x、y的具体值是由主调函数在调用时传送过来的,在{}中的函数体内,return语句把x(或y)的值作为函数的值返回给主调函数。 上述例题中max函数被主函数调用三次,主函数接收用户由键盘输入的a、b、c、d四个数后,第一次调用将a、b的值作为实际参数传递给max函数的形式参数x、y,max函数比较出其中较大的一个,并返回这个值给主函数,主函数接收返回值并将其赋值给变量m,之后主函数将c和a、b中较大的值m,作为实际参数第二次调用max函数,得到c和m中较大的数并存入m中(此时m中的值为a、b、c的最大数),将d和m的值作为实际参数再次调用max函数,得到d和m中较大的数并存入m中,至此我们得到了四个数中的最大数。 使用return语句应注意以下几点: 1)有返回值函数的函数体中至少应有一个return语句。 2)C++允许函数体中存在多个return语句,当程序流程执行到其中的某个return语句时,终止函数的执行。 3)关键字return后面的表达式可有可无,当return语句不带表达式,又位于函数体的最后时,return语句可以省略。 4)关键字return后面的表达式可以用()括起来,也可以省略括号。 例: 改写[例3-2]函数如下: floatftoc(floatf) { return(5*(f-32)/9); } 或: floatftoc(floatf) { return5*(f-32)/9; } 5)函数默认的返回值数据类型为整型。 第三节函数的参数传递 一、形式参数和实际参数 C++采用函数的形式参数和实际参数实现函数间的数据传递。 形式参数在函数定义时说明,在整个函数体内都可以使用,离开该函数则不能使用,它约定了主调函数在调用该函数时,所要传递给该函数的数据个数和每个要传递数据的类型等。 实际参数出现在主调函数中,进入被调函数后,实参变量也不能使用。 实际参数就是在调用函数时,主调函数传递给被调函数符合形参约定的实际数据。 也就是说,发生函数调用时,主调函数把实参传送给被调函数的形参,从而实现主调函数向被调函数的数据传送。 函数的形参和实参具有以下特点: 1)实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。 因此应预先用赋值、输入、计算等办法使实参获得确定值。 2)实参和形参在数量、类型和顺序上应严格一致,否则会发生“类型不匹配”的错误。 3)一般情况下,形参变量只有在被调用时才分配内存单元,调用结束即刻释放所分配的内存单元。 所以,形参只在函数内部有效,函数调用结束返回主调函数后,则不能再使用形参变量。 因此,这种情况下函数调用中发生的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 但是,如果确实需要形参值的变化影响实参值的话,C++也提供了相应的解决方案。 函数调用时,形参和实参之间是否互相影响,取决于形参与实参之间的结合方式,本节简单介绍两种结合方式,函数的传值调用和引用调用。 二、函数的传值调用 函数的传值调用是最常用的一种形式参数和实际参数结合的方式,在函数调用时直接将实参的值赋给被调函数的形参,形参拥有实参的一个备份,改变形参的值时实参并不做相应地改变。 传值调用是一种参数单向传送的调用,前面例题中采用的基本都是这种方式。 例3-7编写程序,将主程序中两个变量x、y中的值,通过调用两参数交换函数swap(),对其进行交换。 #include voidswap(inta,intb); voidmain() { intx=3,y=5; cout<<”交换前: x=”< swap(x,y); cout<<”交换后: x=”< } voidswap(inta,intb) { cout<<”交换前: a=”< inttemp; temp=a; a=b; b=temp; cout<<”交换后: a=”< } 程序的运行结果是: 交换前: x=3y=5 交换前: a=3b=5 交换后: a=5b=3 交换后: x=3y=5 swap(inta,intb)函数用于交换两个参数的值,从运行结果可以看出,主函数中变量x、y的值在调用swap()函数时作为实际参数传递给了swap()函数的形式参数a、b,执行swap()函数的结果,确实将函数体内变量a、b里的值进行了交换。 但是,由于函数调用采用的是传值调用,形式参数值的改变并不影响实际参数的值,所以,当函数返回时主函数中变量x、y的值没有发生变化。 三、函数的引用调用 与传值调用不同,函数的引用调用将在主调函数的实参变量与被调函数的形参变量之间建立某种联系,使得形参变量的变化将影响实参变量的值。 在使用引用调用时,要在函数定义时将函数的形式参数类型用引用运算符“&”说明为引用类型。 所谓引用,简单的说就是另一个目标的别名,对引用的操作就相当于对引用所代表的目标进行的操作。 所以,如果在函数之间用引用的方式来传递数据(形参作为实参的引用),那么在被调函数中对形参变量的改变也会影响到实参变量。 例3-8将例3-7中对函数swap()的调用定义为引用调用。 #include voidswap(int&a,int&b); voidmain() { intx=3,y=5; cout<<”交换前: x=”< swap(x,y); cout<<”交换后: x=”< } voidswap(int&a,int&b) { cout<<”交换前:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三 函数