《C语言程序设计》电子教案课件-第7章函数_第1页
《C语言程序设计》电子教案课件-第7章函数_第2页
《C语言程序设计》电子教案课件-第7章函数_第3页
《C语言程序设计》电子教案课件-第7章函数_第4页
《C语言程序设计》电子教案课件-第7章函数_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

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

文档简介

《C语言程序设计》第七章函数《C语言程序设计》第七章函数最常用的几个库函数

7.1C的库函数简介函数原型

功能

返回值

doublefabs(doublex)求x的绝对值。

计算结果

doublesqrt(doublex)

计算x的算术平方根。

计算结果

doublepow(doublex,dlubley)

计算xy的值。

计算结果

doublesin(doublex)

计算sin(x)的值。计算结果

doublecos(doublex)

计算cos(x)的值。

计算结果

doublelog(dlublex)

计算lnx的值

计算结果

doubleexp(doublex)

求ex的值计算结果intrand(void)

产生一个0到32767之间的随机整数。

随机整数

第7章

函数最常用的几个库函数7.1C的库函数简介函数原型功最常用的几个库函数7.1C的库函数简介char*strcat(char*str1,char*str2)

把str2接到str1的后面,str1最后面的'\0'被取消。

返回str1

char*strcpy(char*str1,char*str2)

把str2指向的字符串复制到str1中去。

返回str1

unsignedstrlen(char*str)

统计字符串str中字符的个数(不包括'\0')

返回字符个数

FILE*fopen(char*filename,char*mode)

以mode指定的方式打开名为filename的文件。成功返回文件指针,否则返回0intfclose(FILE*fp)关闭fp所指的文件,释放文件缓冲区。有错返回非0值,否则返回0intfeof(FILE*fp)检查文件是否结束。文件结束返回非0值,否则返回0第7章

函数最常用的几个库函数7.1C的库函数简介char*st使用库函数应注意:1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型4、需要使用的包含文件7.1C的库函数简介第7章

函数使用库函数应注意:7.1C的库函数简介第7章

函数7.2.1函数定义的一般形式类型标识符函数名(形式参数表){ 函数声明部分; 函数语句部分;}现代风格:函数返回值类型缺省int型合法标识符函数体函数的参数例有参函数(现代风格)

intmax(intx,inty){intz;z=x>y?x:y;return(z);}例无参函数

printstar(){printf(“**********\n”);}或

printstar(void){printf(“**********\n”);}例空函数

dummy(){}第7章

函数7.2.1函数定义的一般形式类型标识符函数名(形式参数形式参数:在定义函数时函数名后面圆括号中的变量名

实际参数:在主调用函数中调用一个函数时,函数名后面圆括号中的表达式

例比较两个数并输出大者

7.3.1形式参数和实际参数

main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);}max(intx,inty){intz;z=x>y?x:y;return(z);}实参形参c=max(a,b);(main函数)(max函数)max(intx,inty){intz;z=x>y?x:y;return(z);}第7章

函数形式参数:在定义函数时函数名后面圆括号中的变量名返回语句:形式:return(表达式);

return表达式;

return;功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数说明:若无return语句,遇}时,自动返回调用函数若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换------函数调用转换7.3.2函数的返回值

第7章

函数返回语句:7.3.2函数的返回值第7章

函数

7.3.1形式参数和实际参数

形式参数:在定义函数时函数名后面圆括号中的变量名

实际参数:在主调用函数中调用一个函数时,函数名后面圆括号中的表达式

说明:实参必须有确定的值,以传值给形参形参必须指定类型形参与实参类型一致,个数相同若形参与实参类型不一致,自动按形参类型转换——函数调用转换形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放第7章

函数7.3.1形式参数和实际参数形式参调用形式:

函数名(实参表);说明:实参与形参个数相等,类型一致,按顺序一一对应无参函数调用时,圆括号不可省略函数定义与函数调用的区别:函数的定义中有“类型标识符”而函数的调用中没有。函数的定义中的参数为“形参”,而函数的调用中参数为“实参”。函数的定义后没有“;”,而函数的调用中有“;”(函数作为实参外)。7.2.2函数调用的一般形式

第7章

函数调用形式:7.2.2函数调用的一般形式第7章

函数函数调用方式函数语句:

printf("IloveChina!\n");函数表达式:例

c=max(a,b);函数参数:例

printf("%d\n",max(a,b));putchar(getchar());实参表求值顺序,因系统而定(TurboC自右向左)7.2.2函数调用的一般形式

第7章

函数函数调用方式7.2.2函数调用的一般形式第7章

函数main(){inti=2,p;p=f(i,++i);printf("%d",p);}intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}main(){inti=2,p;p=f(i,i++);printf("%d",p);}intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}运行结果:0运行结果:17.2.2函数调用的一般形式

第7章

函数main()main()运行结果:0运行结果:17.2.2函调用函数时,对被调函数的要求:必须是已存在的函数库函数:

#include<*.h>用户自定义函数:函数类型声明函数声明:一般形式:

函数类型函数名(形参类型[形参名],…..);作用:告诉编译系统函数类型、参数个数及类型,以便检验函数定义与函数声明不同函数声明位置:程序的数据说明部分(函数内或外)下列情况下,可不作函数声明

1、若函数返值是char或int型,系统自动按int型处理2、被调用函数定义出现在主调函数之前

3、在所有函数的定义之前,在文件的开头已经作了函数声明

7.2.3对被调用函数的声明

第7章

函数调用函数时,对被调函数的要求:7.2

7.2.3对被调用函数的声明

main(){floatadd(float,float);/*函数原型声明*/floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}floatadd(floatx,floaty)/*函数首部*/

{floatz;/*函数体*/z=x+y;return(z);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}被调函数出现在主调函数之前,不必函数说明main(){floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);}int型函数可不作函数说明第7章

函数7.2.3对被调用函数的声明mai例交换两个数

7.3.1形式参数和实际参数

711x:y:调用前:调用结束:711x:y:main(){intx=7,y=11;printf("x=%d,\ty=%d\n",x,y);printf("swapped:\n");

swap(x,y);printf("x=%d,\ty=%d\n",x,y);}swap(inta,intb){inttemp;temp=a;a=b;b=temp;}调用:711a:b:711x:y:swap:711x:y:117a:b:temp第7章

函数例交换两个数7.3.1形式参数和实例函数返回值类型转换7.3.2函数的返回值main(){intmax(float,float)floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;

return(z);}第7章

函数例函数返回值类型转换7.3.2函数的返回值mai7.2.1函数定义的一般形式类型标识符函数名(形式参数表){ 函数声明部分; 函数语句部分;}合法标识符函数体函数的参数第7章

函数7.2.1函数定义的一般形式类型标识符函数名(形式参数形式参数:在定义函数时函数名后面圆括号中的变量名

实际参数:在主调用函数中调用一个函数时,函数名后面圆括号中的表达式

例比较两个数并输出大者

7.3.1形式参数和实际参数

main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);}max(intx,inty){intz;z=x>y?x:y;return(z);}实参形参c=max(a,b);(main函数)(max函数)max(intx,inty){intz;z=x>y?x:y;return(z);}第7章

函数形式参数:在定义函数时函数名后面圆括号中的变量名模块化程序设计基本思想:将一个大的程序按功能分割成一些小模块开发方法:自上向下,逐步分解,分而治之概述第7章

函数模块化程序设计概述第7章

函数概述C程序结构第7章

函数概述C程序结构第7章

函数函数是程序的基本组成单位必须有且只能有一个名为main的主函数C程序的执行总是从main函数开始,在main中结束函数与函数之间是平行的独立的,不能嵌套定义,可以嵌套调用概述第7章

函数函数是程序的基本组成单位概述第7章

函数C规定:函数定义不可嵌套,但可以嵌套调用函数7.4.1函数的嵌套调用

main()调用函数a结束a函数b函数调用函数b第7章

函数C规定:函数定义不可嵌套,但可以嵌套调用函数7.4.1函数的例求三个数中最大数和最小数的差值7.4.1函数的嵌套调用

intdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);main(){inta,b,c,d;scanf("%d%d%d",&a,&b,&c);

d=dif(a,b,c);printf("Max-Min=%d\n",d);}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}intmax(intx,inty,intz){intr;r=x>y?x:y;return(r>z?r:z);}intmin(intx,inty,intz){intr;r=x<y?x:y;return(r<z?r:z);}第7章

函数例求三个数中最大数和最小数的差值7.4.1函数的嵌套调例求三个数中最大数和最小数的差值7.4.1函数的嵌套调用

main()调用函数dif输出结束dif函数max函数调用函数max调用函数minmin函数main(){……

d=dif(a,b,c);

……}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}intmax(intx,inty,intz){……}intmin(intx,inty,intz){……}第7章

函数例求三个数中最大数和最小数的差值7.4.1函数的嵌套调定义:函数直接或间接的调用自身叫函数的递归调用7.4.2函数的递归调用

intf(intx){inty,z;……

z=f(y);…….return(2*z);}intf1(intx){inty,z;……

z=f2(y);…….return(2*z);}intf2(intt){inta,c;……

c=f1(a);…….return(3+c);}f()调f调f2调f1f1()f2()第7章

函数定义:函数直接或间接的调用自身叫函数的递归调用7.4.2函数说明:C编译系统对递归函数的自调用次数没有限制必须有一个明确的结束递归的条件。

7.4.2函数的递归调用

第7章

函数说明:7.4.2函数的递归调用第7章

函数例求n的阶乘7.4.2函数的递归调用

intfac(intn){intf;if(n<0)printf("n<0,dataerror!");elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}main(){intn,y;printf("Inputaintegernumber:");scanf("%d",&n);

y=fac(n);printf("%d!=%15d",n,y);}第7章

函数例求n的阶乘7.4.2函数的递归调用intfac(in作用域:

若某个标识符仅能在源程序正文的某个范围内被使用,则称源程序正文的这个范围为该标识符的作用域。分程序作用域:

指该复合语句的左括弧“{”和右括弧“}”之间的源程序正文。

文件作用域:

指一个编译单位内的所有程序正文。根据作用域的不同,将变量分类:

局部变量、全局变量7.5.1作用域

第7章

函数作用域:7.5.1作用域第7章

函数局部变量---内部变量

在函数内定义,只在本函数内有效说明:动态分配内存单元main中定义的变量只在main中有效不同函数中同名变量,占不同内存单元形参属于局部变量可定义在复合语句中有效的变量有包含关系的两个作用域中的同名变量,外层同名变量被屏蔽。

7.5.2局部变量

第7章

函数局部变量---内部变量7.5.2局部变量第7章

函数有包含关系的两个作用域中的同名变量7.5.2局部变量

main(){inta,b,c;…

{intc;c=a+b;…

}…

}使用内层同名变量c变量a,b可以在整个范围内使用第7章

函数有包含关系的两个作用域中的同名变量7.5.2局部变量mai全局变量---外部变量说明:有效范围:从定义变量的位置开始到本源文件结束,及有extern说明的其它源文件静态分配全局变量的内存单元减少函数调用时实参与形参之间的数据传递若外部变量与局部变量同名,则外部变量被屏蔽不足:全局变量在程序全部执行过程中占用存储单元降低程序的可读性,降低函数的通用性7.5.3全局变量第7章

函数全局变量---外部变量7.5.3全局变量第7章

函数不同作用域中的同名变量

7.5.3全局变量intk=5;main(){intk=7;printf("k=%d\n",k);{intk=11;printf("k=%d\n",k);{k+=1; printf("k=%d\n",k);}printf("k=%d\n",k);}printf("k=%d\n",k);}/*全局变量k*//*同名局部变量k*//*同名局部变量k*/运行结果:k=7k=11k=12k=12k=7第7章

函数不同作用域中的同名变量7.5.3全局变量intk=例外部变量与局部变量7.5.3全局变量inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;return(c);}main(){inta=8;printf("max=%d",max(a,b));}运行结果:max=8局部变量a、b有效范围局部变量a有效范围全局变量a、b有效范围第7章

函数例外部变量与局部变量7.5.3全局变量inta=静态存储方式:

程序运行期间,始终占有固定的存储空间。

动态存储方式:

程序运行期间,根据需要动态的分配存储空间。变量的存储类型:auto-----自动型register-----寄存器型static------静态型extern-----外部型变量的定义格式:[存储类型]数据类型变量表;7.6.1动态存储方式与静态存储方式

第7章

函数静态存储方式:7.6.1动态存储方式与静态存储方式第内存用户区:

7.6.1动态存储方式与静态存储方式

程序区静态存储区动态存储区全局变量、局部静态变量形参变量局部动态变量(autoregister)函数调用现场保护和返回地址等

生存期

静态变量:从程序开始执行到程序结束动态变量:从包含该变量定义的函数开始执行至函数执行结束第7章

函数内存用户区:7.6.1动态存储方式与静态存储方式局部变量默认为auto型静态局部变量具有全局寿命和可继承性寄存器变量个数受限,且不能为long,double,float型extern不是变量定义,可扩展外部变量作用域7.6.1动态存储方式与静态存储方式静态动态存储方式程序整个运行期间函数调用开始至结束生存期编译时赋初值,只赋一次每次函数调用时赋初值自动赋初值0或空字符不确定未赋初值静态存储区动态区存储区寄存器局部变量外部变量作用域定义变量的函数或复合语句内本文件其它文件register局部staticauto外部static外部存储类别第7章

函数局部变量默认为auto型7.6.1动态存储方式与静态存储例auto变量的作用域7.6.2局部变量的存储方式

main(){voidprt(void);intx=1;prt();printf(“1stx=%d\n”,x);}voidprt(void){intx=5;printf(“2ndx=%d\n”,x);}运行结果:2ndx=51stx=1x=5作用域x=1作用域第7章

函数例auto变量的作用域7.6.2局部变量的存储方式ma考察静态局部变量的值

7.6.2局部变量的存储方式

intfun(inta){autointb=0;staticintc=3;b++;c++;returna+b+c;}main(){inta=2,i;for(i=1;i<=3;i++)printf("%d",fun(a));}运行结果:789第7章

函数考察静态局部变量的值7.6.2局部变量的存储方式int例有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁;问第4个人的岁数,他说比第3个人大2岁;问第3个人,又说比第2个人大2岁;问第2个人,说比第1个人大2岁;最后问第1个人,他说是10岁。请问第一个人多大?7.7程序举例

age(n)=10(n=1)age(n-1)+2(n>1)intage(intn);main(){printf("%d\n",age(5));}intage(intn){intk;if(n==1)k=10;elsek=age(n-1)+2;returnk;}第7章

函数例有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁《C语言程序设计》第七章函数《C语言程序设计》第七章函数最常用的几个库函数

7.1C的库函数简介函数原型

功能

返回值

doublefabs(doublex)求x的绝对值。

计算结果

doublesqrt(doublex)

计算x的算术平方根。

计算结果

doublepow(doublex,dlubley)

计算xy的值。

计算结果

doublesin(doublex)

计算sin(x)的值。计算结果

doublecos(doublex)

计算cos(x)的值。

计算结果

doublelog(dlublex)

计算lnx的值

计算结果

doubleexp(doublex)

求ex的值计算结果intrand(void)

产生一个0到32767之间的随机整数。

随机整数

第7章

函数最常用的几个库函数7.1C的库函数简介函数原型功最常用的几个库函数7.1C的库函数简介char*strcat(char*str1,char*str2)

把str2接到str1的后面,str1最后面的'\0'被取消。

返回str1

char*strcpy(char*str1,char*str2)

把str2指向的字符串复制到str1中去。

返回str1

unsignedstrlen(char*str)

统计字符串str中字符的个数(不包括'\0')

返回字符个数

FILE*fopen(char*filename,char*mode)

以mode指定的方式打开名为filename的文件。成功返回文件指针,否则返回0intfclose(FILE*fp)关闭fp所指的文件,释放文件缓冲区。有错返回非0值,否则返回0intfeof(FILE*fp)检查文件是否结束。文件结束返回非0值,否则返回0第7章

函数最常用的几个库函数7.1C的库函数简介char*st使用库函数应注意:1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型4、需要使用的包含文件7.1C的库函数简介第7章

函数使用库函数应注意:7.1C的库函数简介第7章

函数7.2.1函数定义的一般形式类型标识符函数名(形式参数表){ 函数声明部分; 函数语句部分;}现代风格:函数返回值类型缺省int型合法标识符函数体函数的参数例有参函数(现代风格)

intmax(intx,inty){intz;z=x>y?x:y;return(z);}例无参函数

printstar(){printf(“**********\n”);}或

printstar(void){printf(“**********\n”);}例空函数

dummy(){}第7章

函数7.2.1函数定义的一般形式类型标识符函数名(形式参数形式参数:在定义函数时函数名后面圆括号中的变量名

实际参数:在主调用函数中调用一个函数时,函数名后面圆括号中的表达式

例比较两个数并输出大者

7.3.1形式参数和实际参数

main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);}max(intx,inty){intz;z=x>y?x:y;return(z);}实参形参c=max(a,b);(main函数)(max函数)max(intx,inty){intz;z=x>y?x:y;return(z);}第7章

函数形式参数:在定义函数时函数名后面圆括号中的变量名返回语句:形式:return(表达式);

return表达式;

return;功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数说明:若无return语句,遇}时,自动返回调用函数若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换------函数调用转换7.3.2函数的返回值

第7章

函数返回语句:7.3.2函数的返回值第7章

函数

7.3.1形式参数和实际参数

形式参数:在定义函数时函数名后面圆括号中的变量名

实际参数:在主调用函数中调用一个函数时,函数名后面圆括号中的表达式

说明:实参必须有确定的值,以传值给形参形参必须指定类型形参与实参类型一致,个数相同若形参与实参类型不一致,自动按形参类型转换——函数调用转换形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放第7章

函数7.3.1形式参数和实际参数形式参调用形式:

函数名(实参表);说明:实参与形参个数相等,类型一致,按顺序一一对应无参函数调用时,圆括号不可省略函数定义与函数调用的区别:函数的定义中有“类型标识符”而函数的调用中没有。函数的定义中的参数为“形参”,而函数的调用中参数为“实参”。函数的定义后没有“;”,而函数的调用中有“;”(函数作为实参外)。7.2.2函数调用的一般形式

第7章

函数调用形式:7.2.2函数调用的一般形式第7章

函数函数调用方式函数语句:

printf("IloveChina!\n");函数表达式:例

c=max(a,b);函数参数:例

printf("%d\n",max(a,b));putchar(getchar());实参表求值顺序,因系统而定(TurboC自右向左)7.2.2函数调用的一般形式

第7章

函数函数调用方式7.2.2函数调用的一般形式第7章

函数main(){inti=2,p;p=f(i,++i);printf("%d",p);}intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}main(){inti=2,p;p=f(i,i++);printf("%d",p);}intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}运行结果:0运行结果:17.2.2函数调用的一般形式

第7章

函数main()main()运行结果:0运行结果:17.2.2函调用函数时,对被调函数的要求:必须是已存在的函数库函数:

#include<*.h>用户自定义函数:函数类型声明函数声明:一般形式:

函数类型函数名(形参类型[形参名],…..);作用:告诉编译系统函数类型、参数个数及类型,以便检验函数定义与函数声明不同函数声明位置:程序的数据说明部分(函数内或外)下列情况下,可不作函数声明

1、若函数返值是char或int型,系统自动按int型处理2、被调用函数定义出现在主调函数之前

3、在所有函数的定义之前,在文件的开头已经作了函数声明

7.2.3对被调用函数的声明

第7章

函数调用函数时,对被调函数的要求:7.2

7.2.3对被调用函数的声明

main(){floatadd(float,float);/*函数原型声明*/floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}floatadd(floatx,floaty)/*函数首部*/

{floatz;/*函数体*/z=x+y;return(z);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}被调函数出现在主调函数之前,不必函数说明main(){floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);}int型函数可不作函数说明第7章

函数7.2.3对被调用函数的声明mai例交换两个数

7.3.1形式参数和实际参数

711x:y:调用前:调用结束:711x:y:main(){intx=7,y=11;printf("x=%d,\ty=%d\n",x,y);printf("swapped:\n");

swap(x,y);printf("x=%d,\ty=%d\n",x,y);}swap(inta,intb){inttemp;temp=a;a=b;b=temp;}调用:711a:b:711x:y:swap:711x:y:117a:b:temp第7章

函数例交换两个数7.3.1形式参数和实例函数返回值类型转换7.3.2函数的返回值main(){intmax(float,float)floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;

return(z);}第7章

函数例函数返回值类型转换7.3.2函数的返回值mai7.2.1函数定义的一般形式类型标识符函数名(形式参数表){ 函数声明部分; 函数语句部分;}合法标识符函数体函数的参数第7章

函数7.2.1函数定义的一般形式类型标识符函数名(形式参数形式参数:在定义函数时函数名后面圆括号中的变量名

实际参数:在主调用函数中调用一个函数时,函数名后面圆括号中的表达式

例比较两个数并输出大者

7.3.1形式参数和实际参数

main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);}max(intx,inty){intz;z=x>y?x:y;return(z);}实参形参c=max(a,b);(main函数)(max函数)max(intx,inty){intz;z=x>y?x:y;return(z);}第7章

函数形式参数:在定义函数时函数名后面圆括号中的变量名模块化程序设计基本思想:将一个大的程序按功能分割成一些小模块开发方法:自上向下,逐步分解,分而治之概述第7章

函数模块化程序设计概述第7章

函数概述C程序结构第7章

函数概述C程序结构第7章

函数函数是程序的基本组成单位必须有且只能有一个名为main的主函数C程序的执行总是从main函数开始,在main中结束函数与函数之间是平行的独立的,不能嵌套定义,可以嵌套调用概述第7章

函数函数是程序的基本组成单位概述第7章

函数C规定:函数定义不可嵌套,但可以嵌套调用函数7.4.1函数的嵌套调用

main()调用函数a结束a函数b函数调用函数b第7章

函数C规定:函数定义不可嵌套,但可以嵌套调用函数7.4.1函数的例求三个数中最大数和最小数的差值7.4.1函数的嵌套调用

intdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);main(){inta,b,c,d;scanf("%d%d%d",&a,&b,&c);

d=dif(a,b,c);printf("Max-Min=%d\n",d);}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}intmax(intx,inty,intz){intr;r=x>y?x:y;return(r>z?r:z);}intmin(intx,inty,intz){intr;r=x<y?x:y;return(r<z?r:z);}第7章

函数例求三个数中最大数和最小数的差值7.4.1函数的嵌套调例求三个数中最大数和最小数的差值7.4.1函数的嵌套调用

main()调用函数dif输出结束dif函数max函数调用函数max调用函数minmin函数main(){……

d=dif(a,b,c);

……}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}intmax(intx,inty,intz){……}intmin(intx,inty,intz){……}第7章

函数例求三个数中最大数和最小数的差值7.4.1函数的嵌套调定义:函数直接或间接的调用自身叫函数的递归调用7.4.2函数的递归调用

intf(intx){inty,z;……

z=f(y);…….return(2*z);}intf1(intx){inty,z;……

z=f2(y);…….return(2*z);}intf2(intt){inta,c;……

c=f1(a);…….return(3+c);}f()调f调f2调f1f1()f2()第7章

函数定义:函数直接或间接的调用自身叫函数的递归调用7.4.2函数说明:C编译系统对递归函数的自调用次数没有限制必须有一个明确的结束递归的条件。

7.4.2函数的递归调用

第7章

函数说明:7.4.2函数的递归调用第7章

函数例求n的阶乘7.4.2函数的递归调用

intfac(intn){intf;if(n<0)printf("n<0,dataerror!");elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}main(){intn,y;printf("Inputaintegernumber:");scanf("%d",&n);

y=fac(n);printf("%d!=%15d",n,y);}第7章

函数例求n的阶乘7.4.2函数的递归调用intfac(in作用域:

若某个标识符仅能在源程序正文的某个范围内被使用,则称源程序正文的这个范围为该标识符的作用域。分程序作用域:

指该复合语句的左括弧“{”和右括弧“}”之间的源程序正文。

文件作用域:

指一个编译单位内的所有程序正文。根据作用域的不同,将变量分类:

局部变量、全局变量7.5.1作用域

第7章

函数作用域:7.5.1作用域第7章

函数局部变量---内部变量

在函数内定义,只在本函数内有效说明:动态分配内存单元main中定义的变量只在main中有效不同函数中同名变量,占不同内存单元形参属于局部变量可定义在复合语句中有效的变量有包含关系的两个作用域中的同名变量,外层同名变量被屏蔽。

7.5.2局部变量

第7章

函数局部变量---内部变量7.5.2局部变量第7章

函数有包含关系的两个作用域中的同名变量7.5.2局部变量

main(){inta,b,c;…

{intc;c=a+b;…

}…

}使用内层同名变量c变量a,b可以在整个范围内使用第7章

函数有包含关系的两个作用域中的同名变量7.5.2局部变量mai全局变量---外部变量说明:有效范围:从定义变量的位置开始到本源文件结束,及有extern说明的其它源文件静态分配全局变量的内存单元减少函数调用时实参与形参之间的数据传递若外部变量与局部变量同名,则外部变量被屏蔽不足:全局变量在程序全部执行过程中占用存储单元降低程序的可读性,降低函数的通用性7.5.3全局变量第7章

函数全局变量---外部变量7.5.3全局变量第7章

函数不同作用域中的同名变量

7.5.3全局变量intk=5;main(){intk=7;printf("k=%d\n",k);{intk=11;

温馨提示

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

评论

0/150

提交评论