C语言程序设计教程 教学课件 ppt 作者 李丽娟 第6章函数与宏定义

上传人:E**** 文档编号:89347167 上传时间:2019-05-23 格式:PPT 页数:49 大小:710KB
返回 下载 相关 举报
C语言程序设计教程 教学课件 ppt 作者  李丽娟 第6章函数与宏定义_第1页
第1页 / 共49页
C语言程序设计教程 教学课件 ppt 作者  李丽娟 第6章函数与宏定义_第2页
第2页 / 共49页
C语言程序设计教程 教学课件 ppt 作者  李丽娟 第6章函数与宏定义_第3页
第3页 / 共49页
C语言程序设计教程 教学课件 ppt 作者  李丽娟 第6章函数与宏定义_第4页
第4页 / 共49页
C语言程序设计教程 教学课件 ppt 作者  李丽娟 第6章函数与宏定义_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《C语言程序设计教程 教学课件 ppt 作者 李丽娟 第6章函数与宏定义》由会员分享,可在线阅读,更多相关《C语言程序设计教程 教学课件 ppt 作者 李丽娟 第6章函数与宏定义(49页珍藏版)》请在金锄头文库上搜索。

1、19:16,1/49,第六章 函数与宏定义,6.1 函数概念,6.2 变量作用域和存储类型,6.3 内部函数与外部函数,6.4 递归函数设计和调用,6.6 综合范例,19:16,2/49,6.1 函数概念,C语言允许把问题设计成一个一个的模块,程序通过调用模块功能来解决问题。这些模块通常都是通过函数来实现的,又可称其为函数模块。,C语言中,函数可分为两类 :,一类是由系统定义的标准函数,又称为库函数,其函数声明一般是放在系统的include目录下以.h为后缀的头文件中,如在程序中要用到某个库函数,必须在调用该函数之前用#include命令将库函数信息包含到本程序中。,另一类函数是自定义函数 ,

2、两种形式:,第一种:函数声明、函数调用、函数定义。 第二种:函数定义、函数调用。,19:16,3/49, 6.1.1 函数定义,函数定义的一般形式可以有两种。,形式一:,存储类型符 返回值类型符 函数名(形参说明表) 函数语句体 ,形式二:,存储类型符 返回值类型型符 函数名(形参表) 形参说明; 函数语句体 ,19:16,4/49,说明:,1存储类型符指的是函数的作用范围,它只有两种形式:static和extern。 static说明函数只能作用于其所在的源文件,用static说明的函数又称为内部函数。 extern说明函数可被其它源文件中的函数调用,用extern说明的函数,又称为外部函数

3、。 缺省情况为extern。,2返回值类型符指的是函数体语句执行完成后,函数返回的值的类型,如int, float, char等等,若函数无返回值,则用空类型void来定义函数的返回值。 缺省情况为int型。,19:16,5/49,3函数名由任何合法的标识符构成。建议将函数名的命名与函数内容有一定关系。,4在第一种函数定义的形式中,形参说明表是一系列用逗号分开的每个形参变量说明。 如:int x, int y, int z 这表示形参变量有三个:x, y, z。它们的类型都是int型。 在第二种函数定义的形式中,形参表是一系列用逗号分开的形参变量。如:x, y, z,5函数语句体是放在一对花括

4、号 中,由局部数据类型描述和功能实现两部分组成。,19:16,6/49,6函数返回语句的形式有以下两种: 函数无返回值的情况:return; 函数有返回值的情况:return(表达式的值); 在第种情况下要注意“表达式的值”的类型必须与函数返回值的类型相一致。,例如:求两个任意整数的绝对值的和,用函数abs_sum()实现。,/*直接调用库函数来计算m和n的绝对值 */ int abs_sum(int m, int n) return (abs(m)+abs(n); /*函数abs()是在头文件math.h中声明的*/,19:16,7/49,函数定义如下: int abs_sum(int m,

5、 int n) if (m0) m=-m; if(n0) n=-n; return(m+n); ,6.1.2 函数声明和调用,一函数的声明 函数声明的一般形式:,存储类型符 返回值类型符 函数名(形参说明表); 如:int abs-sun(int m, int n);,19:16,8/49,二函数调用 函数调用是通过函数调用语句来实现的,分两种形式:,无返回值的情况: 函数名(实参表); 有返回值的情况: 变量名函数名(实参表); 该变量名的类型必须与函数的返回值类型相同。,函数调用时都会去执行函数语句中的内容,函数执行完毕后,回到函数的调用处,继续执行下面的语句。,19:16,9/49,6.

6、1.3 函数的传值方式,函数的传值方式: 采用实参表将每一个实参的值相应地传递给每一个形参变量,形参变量在接收到实参表传过来的值时,会在内存临时开辟新的空间,以保留形参变量的值,当函数执行完毕时,这些临时开辟的内存空间会被释放,并且形参的值在函数中不论是否发生变化,都不会影响到实参变量的值的变化,这就是函数的传值方式。,自定义函数在程序中的使用顺序有两种形式:, 先进行函数声明,再进行函数调用,函数定义放在函数调用之后。函数声明在函数调用之前。 函数定义放在函数调用之前。,19:16,10/49,【例6-1】 编程序,通过调用函数abs-sum(),求任意两个整数的绝对值的和。,/*exam6

7、_1.c 调用函数求两整数绝对值的和*/ #include int abs_sum(int m,int n); main() int x,y,z; scanf(“%d%d“, ,程序运行结果: 7 12 sum is 19,19:16,11/49,用传值方式调用函数时,实参也可以是函数调用语句,【例6-2】求任意三个数的绝对值的和。,/*exam6_2.c 调用函数求三个整数绝对值的和*/ #include int abs_sum(int m,int n); main() int x,y,z,sum; scanf(“%d%d%d“, ,程序运行结果: 7 12 5 sum is 24,19:1

8、6,12/49,注意:,对于有返回值的函数,调用时若没有把它赋给某个变量,仍然是可以的,只是函数的返回值有可能会被丢失。,【例6-3】 求任意两数的乘积。,自定义一个函数mul(),用于求两数的乘积,程序: /*exam6_3.c 求两个数的乘积*/ #include float mul(float a,float b); main() float x,y,z; scanf(“%f %f“, /* */,19:16,13/49,x=x*2; y=y*2; printf(“z=%f,mul(%f,%f)=%fn“,z,x,y,mul(x,y); /* * / float mul(float a,

9、float b) return a*b; ,程序运行结果: 5 6 z=30.000000,mul(30.000000,-8.000000)=-240.000000,19:16,14/49,程序说明:,注释处调用函数后的返回值赋给变量z。,注释处调用函数后的返回值没有赋给任何变量,函数的返回值被丢失。,注释处调用函数后的返回值成为了printf()函数的参数。,19:16,15/49,6.2 变量作用域和存储类型,一变量的作用域,变量的作用域:指的是变量的有效范围,针对变量不同的作用域,可把变量分为局部变量和全局变量。,局部变量:在函数内部或某个控制块的内部定义的变量为局部变量,局部变量的有效

10、范围只限于本函数内部,退出函数,该变量自动失效。,全局变量:在函数外面定义的变量称为全局变量,全局变量的作用域是从该变量定义的位置开始,直到源文件结束。在同一文件中的所有函数都可以引用全局变量。,19:16,16/49,局部变量和全局变量的作用域如图所示:,19:16,17/49,【例6-4】 变量作用域应用举例,阅读下面的程序,注意区分局部变量和全局变量的作用域。,/*exam6_4.c 变量作用域举例*/ #include void a( void ); void b( void ); void c( void ); int x = 1; main() int x = 5; printf(

11、“local x in outer scope of main is %dn“, x );,19:16,18/49, int x = 7; printf( “local x in inner scope of main is %dn“, x ); printf( “local x in outer scope of main is %dn“, x ); a(); b(); c(); a(); b(); c();,前三次输出结果: local x in outer scope of main is 5 local x in inner scope of main is 7 local x in

12、outer scope of main is 5,19:16,19/49,printf( “local x in main is %dn“, x ); getchar(); return 0; void a( void ) int x = 25; printf( “nlocal x in a is %d after entering an“, x ); +x; printf( “local x in a is %d before exiting an“, x ); ,19:16,20/49,void b( void ) static int x = 50; printf( “nlocal st

13、atic x is %d on entering bn“, x ); +x; printf( “local static x is %d on exiting bn“, x ); void c( void ) printf( “nglobal x is %d on entering cn“, x ); x *= 10; printf( “global x is %d on exiting cn“, x ); ,19:16,21/49,程序运行结果: 后6次函数调用,local x in a is 25 after entering a local x in a is 26 before exi

14、ting a local static x is 50 on entering b local static x is 51 on exiting b global x is 1 on entering c global x is 10 on exiting c local x in a is 25 after entering a local x in a is 26 before exiting a local static x is 51 on entering b local static x is 52 on exiting b global x is 10 on entering

15、c global x is 100 on exiting c,最后一次输出: local x in main is 5,19:16,22/49,二变量的存储类型,变量的存储类型:指的是变量的存储属性,它说明变量占用存储空间的区域。,在内存中,供用户使用的存储区由程序区、静态存储区和动态存储区三部分组成。,变量的存储类型有四种:auto型、register型、static型和extern型。,auto型变量存储在内存的动态存储区。 register型变量保存在寄存器中。 static型变量和extern型变量存储在静态存储器。,19:16,23/49,局部变量的存储类型缺省值为auto型 。 全

16、局变量的存储类型缺省值为extern型 。,auto型变量和register型变量只用于定义局部变量。 static型变量即可定义成局部变量,又可定义成全局变量。,【例6-5】 设计一个函数:long fac(int n),可用来计算15的阶乘。,分析:可在函数中定义一个static型变量,用来保存上次的计算结果。,19:16,24/49,/*exam6_5.c 用static型变量保留上次阶乘的值*/ #include long fac(int n) static int f=1; f=f*n; return f; main() int i; for(i=1;i=5;i+) printf(“%d!=%ldn“,i,fac(i); ,程序运行结果: 1!=1 2!=

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号