《C语言教程第六章函数.ppt》由会员分享,可在线阅读,更多相关《C语言教程第六章函数.ppt(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第6章章 函数函数1.概述概述2.函数的定义函数的定义3.函数的调用函数的调用6.1 概述概述#include void main()void printstar();/*对对printstar函数声明函数声明*/void print_message();/*对对print_message函数声明函数声明*/i=printstar();*调用调用printstar函数函数*print_message();/*调用调用print_message函数函数*/printstar();*调用调用printstar函数函数*/先看一个函数调用的简单例子先看一个函数调用的简单例子void printst
2、ar()*定义定义printstar函数函数*printf(*n);void print_message()*定义定义print_message函数函数*printf(How do you do!n);运行情况如下:运行情况如下:*How do you do!How do you do!*几点说明:几点说明:一个程序由一个或多个程序模块组成,每一个一个程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。对于较大的程序,程序模块作为一个源程序文件。对于较大的程序,通常将程序内容分别放在若干个源文件中,再由通常将程序内容分别放在若干个源文件中,再由若干源程序文件组成一个若干源程序文件组
3、成一个C C程序。这样便于分别程序。这样便于分别编写、分别编译,提高调试效率。一个源程序文编写、分别编译,提高调试效率。一个源程序文件可以为多个件可以为多个C C程序公用。程序公用。一个源程序文件由一个或多个函数以及其他有关一个源程序文件由一个或多个函数以及其他有关内容(如命令行、数据定义等)组成。一个源程内容(如命令行、数据定义等)组成。一个源程序文件是一个编译单位,在程序编译时是以源程序文件是一个编译单位,在程序编译时是以源程序文件为单位进行编译的,而不是以函数为单位序文件为单位进行编译的,而不是以函数为单位进行编译的。进行编译的。程序的执行是从程序的执行是从main函数开始的,如果在函数
4、开始的,如果在main函数中调用其他函数,在调用后流程返回函数中调用其他函数,在调用后流程返回到到main函数,在函数,在main函数中结束整个程序的函数中结束整个程序的运行。运行。所有函数都是平行的,即在定义函数时是分别所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的。一个函数并不从属于进行的,是互相独立的。一个函数并不从属于另一函数,即函数不能嵌套定义。函数间可以另一函数,即函数不能嵌套定义。函数间可以互相调用,但不能调用互相调用,但不能调用main函数。函数。main函数函数是系统调用的。是系统调用的。从用户使用的角度看,函数有两种:从用户使用的角度看,函数有两种:1.标准函
5、数,即库函数。这是由系统提供的,定义在标准函数,即库函数。这是由系统提供的,定义在不同的头文件中,用户不必自己定义这些函数,可不同的头文件中,用户不必自己定义这些函数,可以直接使用它们。用户使用时,必须用以直接使用它们。用户使用时,必须用#include把相应的头文件包含到程序中来。把相应的头文件包含到程序中来。2.用户自己定义的函数。用以解决用户的专门需要。用户自己定义的函数。用以解决用户的专门需要。从函数的形式看,函数分两类:从函数的形式看,函数分两类:1.无参函数。无参函数一般用来执行指定的一组操作。无参函数。无参函数一般用来执行指定的一组操作。在调用无参函数时,主调函数不向被调用函数传
6、递在调用无参函数时,主调函数不向被调用函数传递数据。数据。2.有参函数。主调函数在调用被调用函数时,通过参有参函数。主调函数在调用被调用函数时,通过参数向被调用函数传递数据。数向被调用函数传递数据。6.2 函数的定义函数的定义方式方式1 函数返回值类型名函数返回值类型名 函数名函数名(参数类型说明及参数列表参数类型说明及参数列表)局部变量说明局部变量说明;语句序列语句序列;方式方式2 函数返回值类型名函数返回值类型名 函数名函数名(参数列表参数列表)参数类型说明参数类型说明 局部变量说明局部变量说明;语句序列语句序列;如如:int max(a,b)int a,b;如如:int max(int
7、a,int b)例例 定义符号函数定义符号函数sign。int sign(int x)/*函数首部函数首部*/int y;/*函数体局部变量函数体局部变量*/y=x0?1:(x=0?0:-1);return y;/*返回函数值返回函数值*/注意注意:C语言函数分为两大部分语言函数分为两大部分:函数的说明部分函数的说明部分函数体部分函数体部分函数各部分作用函数各部分作用1.函数的说明部分函数的说明部分 函数说明部分说明函数的类型函数说明部分说明函数的类型,函数名函数名,参数表参数表及参数类型。及参数类型。(1)函数的类型说明函数的类型说明函数的类型即函数的返回值类型。若函数不提供返回函数的类型即
8、函数的返回值类型。若函数不提供返回值,则可定义其类型为值,则可定义其类型为:void。例如例如:void putdata(int a)省略函数类型名时,省略函数类型名时,C语言默认其为语言默认其为int型。型。(2)函数名函数名 函数名又称函数标识符。命名遵循函数名又称函数标识符。命名遵循C语言标识符的规语言标识符的规定;函数名要反映函数完成的功能。定;函数名要反映函数完成的功能。(3)参数表参数表参数表写在函数名后的参数表写在函数名后的()内,由一个或多个变内,由一个或多个变量标识符及类型标识符组成。量标识符及类型标识符组成。参数表中的变量称为形式参数参数表中的变量称为形式参数,简称形参。简
9、称形参。若函数没有形参,则称为无参函数,其后若函数没有形参,则称为无参函数,其后“()”不能省略。不能省略。参数必须指定类型。形参的类型说明:参数必须指定类型。形参的类型说明:int max(int a,int b)2.函数体函数体函数体以函数体以“”开始,以开始,以“”结束,包括变量定义和结束,包括变量定义和执行语句序列。函数所完成的工作由函数体中一段程执行语句序列。函数所完成的工作由函数体中一段程序实现。序实现。函数的返回值用返回语句函数的返回值用返回语句return返回,形式返回,形式:return(表达式表达式);或或 return 表达式;表达式;或或 return;如果函数的类型与
10、如果函数的类型与return语句的表达式的类型不一语句的表达式的类型不一致时致时,则以函数的类型为准。返回时自动进行数据则以函数的类型为准。返回时自动进行数据转换。转换。例例 定义函数定义函数power(x,n),求求x的的n次方。次方。函数定义如下函数定义如下:float power(float x,int n)int i;float t=1;for(i=1;ib)?a:b;y=yc?y:c;printf(max=%dn,y);void main()int x,y,z,m;scanf(%d,%d,%d,&x,&y,&z);max(x,y,z);/*采用函数语句形式调用函数采用函数语句形式调用
11、函数max*/int max(int a,int b)int y;y=(ab)?a:b;return y;void main()int x,y,z,m;scanf(%d,%d,%d,&x,&y,&z);m=max(x,y);m=max(m,z);/*/*表达式调用形式表达式调用形式*/*/printf(“max=%dn”,m);m=max(x,y);printf(max=%dn,max(m,z);/*/*函数参数调用形式函数参数调用形式*/*/6.3.2 函数声明函数声明函数定义在主调函数之后,需要进行主调函数中函数定义在主调函数之后,需要进行主调函数中加入函数声明语句。加入函数声明语句。类型
12、名类型名 函数名函数名(类型类型1 变量变量1,类型类型2 变量变量2,类型类型n 变量变量n);说明:说明:函数声明应与该函数定义的函数类型与名称、形参的函数声明应与该函数定义的函数类型与名称、形参的个数、类型、次序相一致。个数、类型、次序相一致。函数声明中的形参名可省略,其形式为函数声明中的形参名可省略,其形式为:类型名类型名 函数名(类型函数名(类型1,类型,类型2,类型,类型n););类型名类型名 函数名函数名();当函数定义在主调函数之前,即先定义当函数定义在主调函数之前,即先定义,后调用。则后调用。则调用时函数声明可以省略。调用时函数声明可以省略。例例 编写计算编写计算x的的n次乘
13、方的程序。次乘方的程序。#include”void main()float x,y;int n;float power(float x,int n);scanf(%f,%d,&x,&n);y=power(x,n);printf(“%8.2f”,y);float power(float x,int n)int i;float t=1;for(i=1;iy)t=x;else t=y;return t;2)关于形式参数和实际参数说明如下关于形式参数和实际参数说明如下:形式参数在函数被调用时才被分配内存。当函数执形式参数在函数被调用时才被分配内存。当函数执行完毕返回时行完毕返回时,形式参数占用的内存空
14、间便被释放。形式参数占用的内存空间便被释放。实参可以是变量、常量和表达式。实参可以是变量、常量和表达式。如如:y=power(x,4);y=power(x,i*2);但实参必须有确定的值。但实参必须有确定的值。3)形参和实参的类型必须相容形参和实参的类型必须相容。4)形参和实参之间的关系是形参和实参之间的关系是:单向的值的传递单向的值的传递101055axby1)形参形参y之间值的传递如图所示。之间值的传递如图所示。6.3.4 函数的嵌套调用函数的嵌套调用调用一个函数的过程中又调用了另一个函数,这种调用一个函数的过程中又调用了另一个函数,这种调用称为函数的嵌套调用调用称为函数的嵌套调用。函数函
15、数1 1 调用函数调用函数2 2 函数函数2 2 调用函数调用函数3 3 函数函数3 3 (1)(9)(8)(2)(3)(5)(4)(7)(6)6.3.5 递归调用递归调用函数调用函数本身,称为函数的递归调用。递函数调用函数本身,称为函数的递归调用。递归调用形式如下:归调用形式如下:2)间接递归间接递归 void a().b();.void b().a();.1)1)直接递归直接递归void a().a();.用递归算法计算用递归算法计算n!讨论:讨论:采用递归的方法计算。采用递归的方法计算。n!的递归定义形式的的递归定义形式的:编程编程:if(初始条件初始条件)表达式表达式;else 递推表达式递推表达式;1 n=0;n!=n*(n-1)!n0例程序:例程序:#include int fac(unsigned n)int f;if (n=0)f=1;/*递归结束条件递归结束条件*/else f=n*fac(n-1);return f;void main()int y;int n;scanf(“%d”,&n);y=fac(n);printf(“%d!=%dn”,n,y);分析分析:当程序输入当程序输入3时时y=fac(3)3*fac(2)2*fac(1)1*fac(0)1
限制150内