C++基础第八章 函数_第1页
C++基础第八章 函数_第2页
C++基础第八章 函数_第3页
C++基础第八章 函数_第4页
C++基础第八章 函数_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、第八章 函数 1-2课程内容安排课程内容安排函数的概念、分类和组成。函数的概念、分类和组成。函数的定义、声明和原型。函数的定义、声明和原型。函数的调用和递归调用。函数的调用和递归调用。内联函数的应用。内联函数的应用。函数的综合应用。函数的综合应用。1-3函数的基本概念函数的基本概念 简单的说,函数就是对复杂问题的一种简单的说,函数就是对复杂问题的一种“自顶向下,逐自顶向下,逐步求精步求精”思想的体现。用户可以将一个大而复杂的程序思想的体现。用户可以将一个大而复杂的程序分解为若干个相对独立而且功能单一的小块程序(函数分解为若干个相对独立而且功能单一的小块程序(函数)进行编写,并通过在各个函数之间

2、进行调用来实现总)进行编写,并通过在各个函数之间进行调用来实现总体的功能体的功能 1-4函数的组成函数的组成 一般的说,函数由四部分构成:返回类型、函数名、参一般的说,函数由四部分构成:返回类型、函数名、参数列表和函数体。函数名就是函数的名字,即函数的标数列表和函数体。函数名就是函数的名字,即函数的标识符。既然是标识符,就必须遵守标识符的命名规则。识符。既然是标识符,就必须遵守标识符的命名规则。同变量的标识符相同,函数的标识符也是只能由字母、同变量的标识符相同,函数的标识符也是只能由字母、数字以及下划线组成,并且不能以数字开头。数字以及下划线组成,并且不能以数字开头。 1-5声明函数声明函数

3、函数声明的作用就是告诉调用者如何使用该函数,即函数接函数声明的作用就是告诉调用者如何使用该函数,即函数接受什么类型的参数,参数的个数,以及函数的返回类型。函受什么类型的参数,参数的个数,以及函数的返回类型。函数声明只是函数定义的一部分,缺少函数体。在数声明只是函数定义的一部分,缺少函数体。在C+中,声中,声明函数的一般形式如下所示:明函数的一般形式如下所示:类型说明符类型说明符 函数名(参数列表)函数名(参数列表);其中,类型说明符指明了本函数的类型,函数的类型实际上其中,类型说明符指明了本函数的类型,函数的类型实际上是函数返回值的类型。而函数名即一个符合是函数返回值的类型。而函数名即一个符合

4、C+语法要求的语法要求的标识符。标识符。 1-6定义函数定义函数 一个函数的定义由返回类型、函数名、参数列表和函数一个函数的定义由返回类型、函数名、参数列表和函数体组成。前面的三个部分称为函数的声明,或函数原型体组成。前面的三个部分称为函数的声明,或函数原型。相对函数体来讲,也称作是函数头。函数体是一个语。相对函数体来讲,也称作是函数头。函数体是一个语句块,由花括号句块,由花括号“”和和“”包围起来。包围起来。例如,下面语句根据上述格式定义了一个无参函数例如,下面语句根据上述格式定义了一个无参函数hello。void hello()cout”Hello World”;1-7形参和实参形参和实参

5、 一般来说,一般来说,C+中函数的参数可以分为形式参数(形参中函数的参数可以分为形式参数(形参)和实际参数(实参)两种。所谓实参,是指函数定义)和实际参数(实参)两种。所谓实参,是指函数定义时的参数。之所以称作形参,是因为这些参数实际并不时的参数。之所以称作形参,是因为这些参数实际并不存在,只是在形式上代表运行时实际出现的参数。存在,只是在形式上代表运行时实际出现的参数。相对应的,所谓实参,是指函数调用时传入的参数,也相对应的,所谓实参,是指函数调用时传入的参数,也是程序运行时实际存在的参数。简单地说,被调用函数是程序运行时实际存在的参数。简单地说,被调用函数与主调用函数之间的通信可以通过参数

6、的传递来实现。与主调用函数之间的通信可以通过参数的传递来实现。 1-8在在C+中实参传递给形参时有两种方式:值传递和地址传递中实参传递给形参时有两种方式:值传递和地址传递。其中,值传递是指实参传递给函数后,系统构建一份实参。其中,值传递是指实参传递给函数后,系统构建一份实参的副本,其值与实参的值相同。此后函数将针对这份副本进的副本,其值与实参的值相同。此后函数将针对这份副本进行操作,对原始的实参没有任何影响。行操作,对原始的实参没有任何影响。值传递过程中,被调函数的形式参数作为被调函数的局部变值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放

7、进量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。来的实参的值,从而成为了实参的一个副本。地址传递过程中,函数的形式参数虽然也作为局部变量在堆地址传递过程中,函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。函数对形参的任何操作都被处理成间接的实参变量的地址。函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,对形参做的任何操作都影响了主调函数中

8、的。正因为如此,对形参做的任何操作都影响了主调函数中的实参变量。实参变量。 函数参数传递函数参数传递 1-9在进行函数的声明或定义后,在其他程序中就可以对该函数进行在进行函数的声明或定义后,在其他程序中就可以对该函数进行调用了。根据根据参数传递的方式不同,函数调用可分为传值调调用了。根据根据参数传递的方式不同,函数调用可分为传值调用和传址调用;根据函数是否有返回值,函数调用可分为无返回用和传址调用;根据函数是否有返回值,函数调用可分为无返回值的调用和有返回值的调用。值的调用和有返回值的调用。 函数的调用函数的调用 1-10如果一个函数在其定义中又调用自身,这个过程叫作递如果一个函数在其定义中又

9、调用自身,这个过程叫作递归调用,该函数则称为递归函数。递归分为直接递归和归调用,该函数则称为递归函数。递归分为直接递归和间接递归。间接递归。 在递归调用中,直接递归是指函数直接调用自身,对于在递归调用中,直接递归是指函数直接调用自身,对于一个函数一个函数func而言而言 间接递归也是递归的一种重要形式,其是指间接递归也是递归的一种重要形式,其是指A函数调用函数调用了了B函数,而函数,而B函数又调用函数又调用A函数函数 递归递归 1-11main函数函数 读者知道,每个读者知道,每个C+程序都必须要有一个程序都必须要有一个main()函数,函数,main()函数也称为主函数,是函数也称为主函数,

10、是C+程序中最重要的函数,程序中最重要的函数,所有完整可运行的所有完整可运行的C+程序都必须有一个唯一的程序都必须有一个唯一的main()函函数。数。 1-12内联函数内联函数 在在C+中,如果在函数的声明前加上中,如果在函数的声明前加上inline关键字,则称为关键字,则称为内联函数。对于内联函数,编译器不创建真实的函数,内联函数。对于内联函数,编译器不创建真实的函数,而只是在函数调用处展开(即将函数的代码直接复制到而只是在函数调用处展开(即将函数的代码直接复制到调用处)。这样,在调用处)。这样,在“调用调用”函数时就不用跳转了,避函数时就不用跳转了,避免了使用真实函数的代价。例如,对于免了

11、使用真实函数的代价。例如,对于add函数,如果其函数,如果其声明为:声明为:inline int add ( int a, int b );则在函数调用处,例如:则在函数调用处,例如:int x = add ( 1, 2 );编译后,实际的代码是:编译后,实际的代码是:int x = 1 + 2;1-13小结小结 本章详细讲解的内容主要包括函数的定义、声明和调用本章详细讲解的内容主要包括函数的定义、声明和调用,这是在实际程序中使用较多的。通过函数,可以,这是在实际程序中使用较多的。通过函数,可以将实现某种功能的一系列语句组织成一个整体,以将实现某种功能的一系列语句组织成一个整体,以后使用时只要

12、使用函数名,并传入相应的参数即可后使用时只要使用函数名,并传入相应的参数即可。而不必重复实现该功能。因此,本章还重点讲述。而不必重复实现该功能。因此,本章还重点讲述函数的参数传递、嵌套调用和递归调用等。此外,函数的参数传递、嵌套调用和递归调用等。此外,本章还就内联函数做了简要介绍。本章还就内联函数做了简要介绍。 1-14习题习题 【题目题目103】下列程序的输出结果是多少?下列程序的输出结果是多少?#include using namespace std;int fun(int x,int y) return x*y;int main() int k=5; coutfun(k+, +k)end

13、l; system(“pause”); return 0;【分析分析】该试题主要考查函数的调用。上述程序中的函数该试题主要考查函数的调用。上述程序中的函数fun包含两个参数,在调用时将实参传递给形参。读者需包含两个参数,在调用时将实参传递给形参。读者需要注意实参分别为要注意实参分别为k+和和+k,进行参数传递后,进行参数传递后,k的值的值都将加都将加1。因此,传递到函数。因此,传递到函数fun后,后,x和和y都变为都变为6,运行,运行函数后,得到函数返回值函数后,得到函数返回值36。因此,该程序的输出为。因此,该程序的输出为361-15【题目题目104】已知三角形的三边,求三角形面积,将其编写

14、已知三角形的三边,求三角形面积,将其编写成一个函数,在成一个函数,在main函数中调用该函数。例如,运行该函数中调用该函数。例如,运行该程序段后输入三角形的三边分别为程序段后输入三角形的三边分别为3 4 5,输出三角形面,输出三角形面积如下图所示。积如下图所示。1-16【题目题目105】编写函数,重复打印给定字符编写函数,重复打印给定字符n次。例如,在主函数中调次。例如,在主函数中调用该函数后,给出打印字符和次数,该函数将在屏幕上输出指定字用该函数后,给出打印字符和次数,该函数将在屏幕上输出指定字符。符。【分析分析】该试题主要考查字符串参数在函数调用过程中的传递。根据该试题主要考查字符串参数在

15、函数调用过程中的传递。根据前面章节的学习,读者知道字符的输出可以通过输出流前面章节的学习,读者知道字符的输出可以通过输出流cout来实现来实现,但更好的办法是通过,但更好的办法是通过putchar函数来实现。指定输出字符的次数函数来实现。指定输出字符的次数后,通过一个循环语句来实现即可。同时,在主函数中要指定需打后,通过一个循环语句来实现即可。同时,在主函数中要指定需打印的字符,也可以用函数印的字符,也可以用函数getchar来实现接收。来实现接收。 【题目题目107】编写一个递归函数,将输入的整数按字符串形式正序输编写一个递归函数,将输入的整数按字符串形式正序输出。例如:输入出。例如:输入1

16、2345,输出:,输出:1 2 3 4 5。1-17【题目题目106】下面程序段的运行结果是多少?下面程序段的运行结果是多少?#include using namespace std;int func(int x) int p;if (x=0 | x=1) return (3);p=x- func(x-2);return p;int main( ) coutfunc(9); system(“pause”); return 0; 1-18【题目题目108】编写一个递归函数,求出:编写一个递归函数,求出:(x/1!)+(x*x*x/3!)+(5个个x相乘相乘/5!)+(2n-1)个个X相乘相乘/(

17、2*n-1)!)的值,到第的值,到第n项,项,n和和x的值由键盘输入。的值由键盘输入。【分析分析】该试题主要考查递归函数的编写及实现。在该函数该试题主要考查递归函数的编写及实现。在该函数中,只有当中,只有当x为为1时其阶乘才为时其阶乘才为0,其他时候为,其他时候为2*n-1的阶的阶乘,其次乘,其次n个个x相乘即相乘即x的(的(2n-1)次方,可以通过幂函数)次方,可以通过幂函数pow来实现。该表达式好要求和,因此使用循环语句将来实现。该表达式好要求和,因此使用循环语句将这(这(2n-1)个表达式相加。因此,该程序可以编写两个)个表达式相加。因此,该程序可以编写两个函数,一个用于实现递归,另一个

18、求出表达式函数,一个用于实现递归,另一个求出表达式(2n-1)个个X相乘相乘/(2*n-1)!)的值,然后再主函数的值,然后再主函数main中调用,并通过中调用,并通过循环求出最终值。循环求出最终值。1-19【题目题目109】下列是正确的递归函数的是?下列是正确的递归函数的是?Aint fun(int n)Bint fun(int n) if (n1) return 1; if (abs(n)1) return 1; if (n1) return 1; else return n*fun(n*2); else return n*fun(n-1); 【分析分析】该试题主要考查递归函数的定义。在上

19、述该试题主要考查递归函数的定义。在上述4个选项个选项中,选项中,选项A中递归调用中递归调用fun(n+1)将导致参数越来越大,从将导致参数越来越大,从而无法进行回归;选项而无法进行回归;选项C和选项和选项D都不能执行到递归,无都不能执行到递归,无法进行递推,都不符合递归函数的定义;只有选项法进行递推,都不符合递归函数的定义;只有选项B既能既能递推也能回归,因此选项递推也能回归,因此选项B是正确的。是正确的。1-20【题目题目110】编写一个函数,用于检验用户输入的一个字符编写一个函数,用于检验用户输入的一个字符是大写字母还是小写字母或不是是大写字母还是小写字母或不是26个英文字母。个英文字母。【题目题目111】编写一个函数,将华氏温度转换为摄氏温度,编写一个函数,将华氏温度转换为摄氏温度,公式为公式为C=(F-32)*5/9;并在主函数中调用。;并在主函数中调用。【题目题目112】编写一个函数,利用非递归

温馨提示

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

评论

0/150

提交评论