资源预览内容
第1页 / 共51页
第2页 / 共51页
第3页 / 共51页
第4页 / 共51页
第5页 / 共51页
第6页 / 共51页
第7页 / 共51页
第8页 / 共51页
第9页 / 共51页
第10页 / 共51页
亲,该文档总共51页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第7章,第七章 函数,退出,7.1 C函数概述 7.1.1 函数的概念 7.1.2 C函数分类 7.2 函数定义 7.2.1 函数定义的一般形式 7.2.2 return语句 7.3 函数调用与函数声明 7.3.1 函数调用 7.3.2 函数声明 7.3.3 函数间参数传递的二种方式,7.4 函数的嵌套调用和递归调用 7.4.1 函数嵌套调用 7.4.2 函数递归调用 7.5 局部变量与全局变量 7.5.1 变量作用域 7.5.2 局部变量 7.5.3 全局变量 7.6 变量的存储类别 7.6.1 程序占用内存空间情况 7.6.2 变量的四种存储类别 7.6.3 各种存储类别变量使用举例 7.7 函数编写实例,本章小结,7.1 C函数概述,所谓函数,是结构化程序设计的基本模块单元,它用于完成某一特定的功能。在C语言中,C程序的基本结构是由函数构成,一个C程序可以有一个或多个函数构成,各函数在C程序中位置上是并列的关系,即所有函数处于平等的地位,不存在从属关系,但每个完整的C源程序有且只有一个主函数main()。主函数是C程序执行的起点。 1C函数模块的一般结构形式 函数首部 函数体 其中, (1) 函数首部包括函数类型、函数名、函数参数类型及参数名,其一般形式为: 函数类型 函数名(参数类型1参数名1,参数类型n,参数名n) (2) 函数体包括:声明部分和执行部分 声明部分:在这部分给出本函数所使用的变量定义说明和需要调用的函数声明等。 执行部分:程序段,由若干条语句组成命令序列(可以在其中调用其它函数)。 看书本P138页的例7.1,7.1.1 函数的概念,7.1 C函数概述,2C函数的执行方式(举例) 计算并输出i!/j!(i-j)!;本例中阶层出现三次,可以用函数完成,避免程序中多次出现重复的语句,程序如下: #include main() int i,j; long jc(int x); for(i=0;i6;i+) for(j=0;j=i;j+) printf(“%ldt“,jc(i)/(jc(j)*jc(i-j); printf(“n“); long jc(int x) long jcx=1; int k; for(k=1;k=x;k+) jcx=jcx*k; return jcx; 书本P139-P142的例7.2更能说明利用函数可使得程序设计模块化, 提高可读性。,返回,7.1 C函数概述,C语言中的函数可分为三类:主函数、标准库函数、用户自定义函数。 1主函数 函数是C程序的基本单位,即一个C程序可由一个或多个函数构成,但任何一个完整的C程序必须有一个主函数,且函数名必须是main,主函数是C程序执行的起点,不论main函数在程序中的位置。 2标准库函数 C语言编译系统将一些常用的操作或计算定义为函数,实现特定的功能,例如,数学中求数的平方根函数sqrt,这些函数称为标准库函数,简称库函数。每一种C编译系统都提供了一批库函数,并按函数功能分类存放在相应“库文件”中,供用户使用。C标准函数库非常丰富,ANSI C提供100多个库函数,Turbo C提供300多个库函数。不同的C编译系统提供的库函数的数量和功能不同,但有一些基本的函数是共同的。 3自定义函数 在用C语言编程时,除使用系统提供的标准库函数外,用户也可以自己定义函数,以实现用户需要的功能,这种由用户自定义的函数,称为用户自定义函数。 本章主要介绍自定义函数的定义、申明与调用等内容。,7.1.2 C函数分类,返回,7.2 函数定义,函数需要先定义后使用,没有定义过的函数不能使用。函数定义的形式有两种: 1现代方式(ANSI C新标准推荐形式) 函数类型标识符 函数名(类型1 形参1,类型2 形参2,类型n 形参n) 函数体 2传统形式 (老版本C中使用) 函数类型标识符 函数名(形参1, 形参2,形参n) 类型1 形参1;类型2 形参2; 类型n 形参n; 函数体 例7.3 用现代方式定义一个比较两个整数大小的函数,函数名为xycmp,函数返回大数,函数返回值类型为整型。 int xycmp(int x, int y) int max; max=xy?x:y; return xy?x:y; return max; ,7.2.1 函数定义的一般形式,当函数定义中缺省形参说明列表时,则为无参函数的定义形式若既缺少形参列表说明又缺少函数体则为空函数的定义形式,同一类型的多个形参说明可放在一起,用逗号隔开,形参说明用分号结束,7.2 函数定义,例7.4 下面两种函数定义都是错误的,找一找错在哪里 (1) int xycmp(int x, int y); return xy?x:y ; (2) int xycmp(int x,y ) return xy?x:y; 错误分析:在(1)的函数定义中,函数首部后不能加分号;在(2)的函数定义中,函数首部中对同类型形参的说明不能合在一起说明,应改为 int x, int y 函数定义的说明: (1) 当函数首部中有形参时,函数为有参函数,若无任何形参,称无参函数。 (2) 在函数定义中,若缺少函数类型,默认为int,因此例7.3中自定义函数 xycmp的函数定义中函数类型int也可省。 (3)为明确表示函数无返回值,可以用 void定义函数类型为无类型或空类型。,返回,7.2 函数定义,return语句属于C语言的控制语句,它一般是放在函数体内,用于返回函数值,在函数体中一旦执行return语句,则结束当前函数的执行,返回到主调函数的调用点。一个函数中可以有一个以上的return语句,但只会有一个return语句被执行,即执行到哪一个return语句,哪一个语句起作用。 1return 语句一般形式 形式1:return ; 此形式函数无返回值,在函数体中该语句也可省。 形式2:return (表达式); 表达式的值作为函数返回值,返回供主调函数使用 2return 语句使用的说明 若需要从被调函数带回函数值供主调函数使用,被调函数中必须有return语 句,反之不需要。 (2) return语句中,表达式的括号可以省略。 (3) 如果函数值的类型和return语句中表达式值类型不一致,则以函数类型为准。 系统可以进行自动类型转换,即函数类型决定返回值的类型。,7.2.2 return语句,返回,7.3 函数调用与函数声明,程序中使用已定义好的函数,称为函数调用。如果函数A调用函数B,则称函数A为主调函数,函数B为被调函数。除了主函数,其他函数的执行都必须通过函数调用来执行。 函数调用的三种形式: (1) 表达式方式:即函数调用出现在一个表达式中,这类函数必须有返回值, 其返回值参加表达式的运算。 (2) 参数方式:即函数调用出现在另一个函数调用的实参列表中。这类函数也 必须是有返回值,其返回值作为另一个函数调用的实参。 (3) 语句方式:即函数调用作为一个独立的语句。一般用在仅要求函数完成一 定的操作,丢弃函数的返回值或函数本身没有返回值。如 printf函数的调用。,7.3.1 函数调用,7.3 函数调用与函数声明,例7.5 有参函数的调用(输出两数之中较大的一个数) #include “stdio.h “ int max(int x, int y) /*max函数形参有两个形参x,y*/ int d; d=xy?x:y; return d; void main( ) int a=4,b=7,m; m=max(a,b); /*表达式调用方式*/ printf(“max=%d”,m); 如果要输出三数之中较大的数,怎么表达? 例7.6 无参函数的调用 #include “stdio.h “ void star( ) /*star函数无形参*/ printf(“*n”); void main( ) int i; for(i=0;i4;i+) star(); /*语句调用方式*/ ,返回,7.3 函数调用与函数声明,函数声明:在函数的执行部分,若需要调用函数就同使用变量一样,在调用前应该在主调函数中事先对被调用函数加以说明。 函数声明的方法:在主调函数函数体的声明部分或函数之外加上被调用函数的函数原型,即函数定义中的函数首部形式。 1函数声明的一般形式 在C语言,对被调用的自定义函数声明有以下三种合法形式。 形式一: 函数类型标识符 函数名(类型1 形参1,类型2 形参2,类型n 形参n); 形式二: 函数类型标识符 函数名(类型1,类型2,类型n); 形式三: 函数类型标识符 函数名( ); 2函数声明的作用 函数声明的目的是向编译系统提供被调函数的信息,即函数返回值的类型、函数名、形参的个数及类型等信息,编译系统根据这些信息对函数体中的函 数调用语句进行核对,以检验函数调用是否正确。,7.3.2 函数声明,3函数声明的位置 函数声明的位置一般放在主调函数的函数体中声明部分;但当此函数被多个函数调用时,其位置也可放在函数模块外,位于各主调函数之前。 例7.7 函数声明位置在函数模块内。按级数展开式求e的近似值,要求精确到最后一项的值小于10-4。e=1+1/1!+1/2!+1/3!+1/n!。 #include “stdio.h“ main() double e=1,t=1;int i=1; long jc(int x); while(t=10e-4) t=1.0/jc(i); e=e+t; i+; printf(“e=%lf“,e); ,7.3 函数调用与函数声明,long jc(int x) long jcx=1;int n; for(n=1;n=x;n+) jcx=jcx*n; return jcx; ,例7.8 函数声明位置在函数模块外。编程求an的值。a为非零实数,n为整数,其值由键盘输入。 #include double mp(double,int); /*在主函数模块外对函数mp的声明*/ main() double a;int n; printf(“input a and n :“); scanf(“%lf%d“, ,返回,7.3 函数调用与函数声明,程序运行结果为:,7.3 函数调用与函数声明,1传值方式 在传值方式下,主调函数将实参的数据复制到被调函数对应的形参中,实现实参与形参间的数据传递。传值方式的特点是:实参和形参在内存中占有不同的存储单元。形参只能复制实参的值,而不能改变实参所在存储单元中的值。 2传地址 在传址方式下,主调函数将实参的地址复制给对应的形参,形参直接引用该地址中的数据。由于实参和形参指向同一地址,因而在被调函数内操作的是与实参共享的同一存储区域的数据。 说明: (1)当函数调用时实参为常量、变量和表达式,其值的类型为整型、实型、字符 型等数据类型,实参与形参间的数据传递方式为传值方式。 (2)当函数调用时实参值是指针类型的数据,形参可以是数组或指针变量。 实参 可以是常量、变量或表达式,但实参值类型必须是地址。,7.3.3 函数间参数传递的二种方式,传递方式 形参 实参 传值 变量 常量、变量、表达式、数组元素 传址 指针、数组名 变量地址、指针、数组名,7.3 函数调用与函数声明,例7.9 传值方式函数间参数传递示例。 编程实现输出100至999之间所有的水仙花数,所谓水仙花数是指一个三位数 的各位数字立方和等于该数本身。例如153=13+53+33,则153即为水仙花数。 #include #include int isflower(int
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号