C语言课件第七章本.ppt
《C语言课件第七章本.ppt》由会员分享,可在线阅读,更多相关《C语言课件第七章本.ppt(82页珍藏版)》请在三一文库上搜索。
1、共 81页 第 1 页,第七章,函 数,共 81页 第 2 页,本章要点 函数的定义 函数的调用 函数参数的传递方式 变量的作用域和存储方法 内部函数和外部函数,共 81页 第 3 页,C程序是函数的集合体,每个函数是一个独立的程序模块; 由一个主函数和若干个子函数组成,程序总是从主函数开始执行; 所有子函数地位平等,可互相调用、自我调用。 函数可集中或分散存放在一个或多个源程序文件中。 引入函数的优点: 减少重复编写程序的工作量;使程序便于调试和阅读。,函数,C语言程序的结构,7.1 函数的概念和函数的定义,共 81页 第 4 页,main: 主函数 e, d, h ,g 被多次调用 a,
2、b, c,d, e, f,g, h, 相互调用,函数是C程序的最小单元。主函数可以调用其它函数,其它函数可以相互调用.,共 81页 第 5 页,函数调用举例,main() /* 主函数 */ printstar(); /*调用printstar函数画*/ print_message(); /*调用print _message函数写字*/ printstar(); /*调用printstar函数画*/ printstar() /*printstar函数*/ printf(“n*”); print_message() /* print_message函数*/ printf(“n Hello! ”)
3、; ,运行结果:* Hello! *,共 81页 第 6 页,一个c程序由一个或多个源文件组成,# include “lx2.c” # include “lx3.c” main() printstar(); print_message(); printstar(); printstar() printf(“n*”); print_message() printf(“n Hello! ”); ,共 81页 第 7 页,数学函数 #include math.h 字符和字符串函数 ctype.h, string.h I/O函数 #include stdio.h 动态存储分配函数,C函数的分类,共 8
4、1页 第 8 页,一、定义形式: 类型标识符 函数名(形式参数表) 形式参数说明 说明与定义部分 语句 ,7.1.2 函数的定义,有参函数定义形式,有参函数定义形式,共 81页 第 9 页,无参函数的定义形式: 类型标识符 函数名( ) 说明部分 语句 ,例:print_message( ) printf(“How are you !n”); ,例:dummy ( ) ,没有数据类型说明、 形参和形参说明,函数体为空。,共 81页 第 10 页,long facto ( n ) int n; long s=1;int i; for (i=1; i=n; i+) s *= i; return (
5、s); ,函数名,形式参数列表,函数类型,形式参数说明,函数体,函数返回,求阶乘函数facto的定义,函数的定义(举例),共 81页 第 11 页,main( ) int a,b,c; int max(); scanf(”%d,%d”, ,形式参数列表:是用,分开的一组变量,用来接收调用时传入的数据,形式参数说明:在 外面对形式参数的类型进行说明,函数调用,求两个变量的最大值,函数的定义(举例),函数声明,共 81页 第 12 页,二、 形式参数和实际参数 形式参数: 形参调用前不占内存单元,调用时占用,调用后释放 形参是函数的内部变量,只在函数内部才有意义。 对每个形参必须指明其名字和数据类
6、型。 实际参数: 实参必须有确定的值,可以是常量,变量或表达式。 实参与形参的类型、个数必须一致。,共 81页 第 13 页,7.1.3 函数的调用,1. 函数调用的一般形式为: 函数名(实际参数列表); 或 函数名(实际参数列表) 实参的数量、类型和排列顺序必须与函数定义时形参表中形参的数量、类型和排列顺序一致。,2. 执行过程:,在一个函数中调用另一个函数时,程序将控制从调用函数处转移到被调用函数,并且执行被调用函数。 在执行完被调用函数的所有语句或者遇到return语句时,程序的控制要返回到调用函数中原来调用函数的地方继续执行。,共 81页 第 14 页,例:调用max函数的程序 mai
7、n() int a,b,c; int max(); scanf(“%d,%d“, ,函数调用,int max(x,y) int x,y; int z; if(xy)z=x; else z=y; return(z); ,实际参数,形式参数,返回函数值,接收 返回值,程序执行顺序?,共 81页 第 15 页,/*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*11*/ /*12*/ /*13*/ /*14*/ /*15*/ /*16*/,main() int a,b,c; int max(); scanf(“%d,%d“, ,断点,保护断点和 现场,转向11,入口,返回断点 恢复现场
8、带回函数值,函数执行过程,共 81页 第 16 页,(1) 函数语句 (把函数调用作为一个语句) 一般形式:函数名(实际参数表); 此时不要求函数带回值,只要求函数完成一定的操作。 例如: printstar( );,3. 函数调用的几种方式,(2) 函数表达式(函数调用出现在表达式中) 一般形式:变量名=函数表达式 这时要求函数带回一个确定的值以参加表达式的运算。 例如:c=3+max(a, b);,注意:无返回值函数的调用,不能出现在表达式中。,函数调用作为一个函数的实参。 例如:m = max( a, max(b, c) );,(3) 函数参数 (函数调用出现函数参数中),值传递: 在调
9、用函数时,实参将值传递给形参。 C语言规定,实参对形参的数据传递是“值传递”,即单向传递。 在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。 因此,在执行一个被调用函数时,形参的值如果发生变化,并不会改变主调函数中实参的值。,7.1.4 函数参数的传递方式,共 81页 第 18 页,例如: void add(int a, int b) a+=3; b+=6; printf(“a=%d, b=%dn”, a,b); ,main( ) int x=1, y=2; add(x, y); printf(“x=%d, y=%dn”, x
10、, y); ,输出结果: a=4,b=8,值传递,x=1,y=2,执 行 函 数 体,返回,共 81页 第 19 页,值传递的优点:被调用的函数不可能改变调用函数 中变量的值,而只能改变它的局部的临时副本。,值传递的缺点:每个形式参数仅能传递一个数据, 不适用需要在函数之间传递大量数据。,地址传递:将实参的地址传递给形参,实参和 形参指向同一内存空间,对形参的修改,可以直 接影响实参。,7.1.4 函数参数的传递方式(续),共 81页 第 20 页,7.1.5 函数的返回值,2. 函数的返回值语句: return语句 一般形式: return (表达式); 或 return 表达式;,定义:通
11、过函数调用使主调函数得到一个确定 的值,称为函数的返回值。,注意不要丢掉;,可以省略括号,功能:将表达式的值带回主调函数。,共 81页 第 21 页,说明:,一个函数中可以有多个return语句,但是一次 函数执行只能执行其中的一个。当执行到某个 return语句时,则终止函数执行,并带回函数值。,fun(int x) if(x1) return 2*x+1; else if(x=10) return x* x; else return 3*x10;,共 81页 第 22 页,说明(续):,若函数体内没有return语句,就一直将函数执行 完,再返回调用函数,返回一个不确定的值。, retur
12、n后面可以无“返回值”(即 return ;),则 该return语句只起到 终止函数执行,返回主调 函数的作用。,共 81页 第 23 页,int max(x,y) int x,y; int z; if (xy) z=x; else z=y; return(z); ,返回整型 函数值,int max(x,y) int x,y; int z; if (xy) z=x; else z=y; return; ,无返回值,max(x,y) int x,y; int z; if (xy) z=x; else z=y; ,无返回语句 在此返回,缺省类型说明,函数返回值,共 81页 第 24 页,3. 函
13、数值的类型,函数定义时应该指定函数的类型(即函数值的类型),应该与return语句的类型一致。,说明:,凡不加类型说明的函数,一律自动按整型处理。,如果函数类型和return语句的类型不一致,以函 数类型为准。对数值型数据,可以自动进行类型 转换。既函数类型决定返回值的类型。,如果函数无返回值,可以将函数定义为“无类 型”void (或称“空类型”)。,例如: void print_star(),注意:函数中没有return语句,函数带回的是一个不确定的值。为明确表示不带回值,可以用void定义。,共 81页 第 25 页,例:编写计算 的程序。,程序运行结果:s=3.597740,调用函数时
14、,变量做函数实参,它和对应的形参各自占用 独立的存储单元。,共 81页 第 26 页,例:阅读程序 float add (x, y) float x, y; float z; z=x+y; return (z); main( ) float a, b; scanf(“%f, %f“, ,程序运行: 3.6, 5.5 ,sum is 9.100000,共 81页 第 28 页,7.1.6 函数的说明, 对被调用函数说明的前提条件,被调用函数必须是已存在的函数,如用户自定义函数或库函数。,2. 被调用函数是用户自定义函数的函数说明,同变量一样,函数的调用也应该遵循“先说明,后使用”的原则。,如使用
15、用户自定义函数,而且主调函数和被调用函数在同一个文件中,应该在主调函数中说明被调函数的类型。其说明形式如下:,共 81页 第 29 页,函数说明的一般形式: 类型标识符 函数名(类型1,类型2,); 或类型标识符 函数名(类型1 形参1,类型2 形参2,); 功能:通知编译程序函数值是什么类型,有多少参数及它们各自的类型,为编译程序进行类型检查提供依据。,main() float add(float x,float y); float a, b, c; scanf(“ %f, %f”, ,/*定义add函数*/ float add (float x,float y) float z; z=x+
16、y; return (z); ,对被调用函数的说明,作为表达式被调用,运行结果: 3.6, 5.5 sum is 9.100000,或:类型标识符 函数名();,共 81页 第 30 页,3. 函数说明和函数定义的区别,函数说明的作用是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查。,函数定义是指对函数功能的确立,包括指定函数名、函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。,函数说明与函数定义的首部唯一区别:函数说明语句的( )之后必须有分号,而函数定义首部的( )之后没有分号。,共 81页 第 31 页,4. 以下
17、三种情况可以省略被调用函数的说明,函数的返回值为整型或字符型时,可以不进行 函数声明,系统按整型处理。,main( ) int a,b,c; scanf (“%d,%d”, ,可省略函数说明,该函数没有加类型说明,为整型函数.,共 81页 第 32 页,被调用函数的定义在主调函数之前,可以省略声明。,float add (float x, float y) float z; z=x+y; return (z); main() float a, b; scanf(“ %f, %f, “ ,共 81页 第 33 页,如果已在所有函数定义之前,在文件的开头, 在函数的外部已说明了函数类型,则在各个主
18、 调函数中不必对所调用的函数再作声明。,char letter( char,char); float f(float,float ); int i(float,float); main( ) . char letter (char c1,char c2) float f(float x,float y) int i(float,float) ,此处不必说明,共 81页 第 34 页,# include “stdio.h” /*调用输入输出函数*/ # include “math.h” /*调用数学函数*/ # include “string.h” /*调用字符,字符串函数*/ # includ
19、e “graphics.h” /*调用图形函数*/ 用户也可建立自己的库函数,这是高级应用的内容。,5. 库函数及调用 库函数:由人们根据需要编制并提供给用户使用的一些基 本函数,在用户定义的函数中常常调用这些函数。 方法:在文件的开头用#include 命令将需要的库函数包含到 文件中。,共 81页 第 35 页,7.2 数组作函数参数,数组元素可以作函数的实参 数组名可以作函数的实参和形参 多维数组可以作函数参数 7.2.1. 数组元素作函数实参 由于表达式可以做实参,数组元素可以作为表达式的组成部分,因此,数组元素可以做函数的实参,与变量一样,是单向传递,即“值传送”方式。 例如: in
20、t a10; x=power(a9,5);,共 81页 第 36 页,7.2.2数组名作函数的参数,可以用数组名作函数参数,此时实参和形参都用数组名。 由于数组名代表的就是数组在内存中存放区域的首地址。把数组名作为函数参数来实现大量数据的传递是一个非常好的数据传递方法。,这种传递方式是“地址传递”,共 81页 第 37 页,有两种形式: 函数值类型说明符 函数名(类型说明符 数组名 ,) 函数体 函数值类型说明符 函数名(数组名,) 类型说明符 数组名 ; 函数体 ,1. 一维数组作函数参数,2. 数组作函数形参的函数调用方式 函数名(数组名,),共 81页 第 38 页,说明: 在主调函数和
21、被调用函数中分别定义数组。 实参数组和形参数组类型要一致。 实参数组和形参数组大小可以不一致,形参数组可以不指定大小。 (这里指一维数组)。 函数调用时,形参数组将获得实参数组的起始地址。,共 81页 第 39 页,例: 编写函数,求n个数组元素的算术平均值。 double average(int a , int n) int i; double s=0; for(i=0; in; i+) s=s+ai; return s/n; ,主函数调用如何编写?,main() int b3=1,2,3; double s; s=average(b,3); printf(“%fn”,s); ,形参数组不指
22、定大小,数组名后跟一个空方括号,a获得b的起始地址,数组名做函数是“地址传递”。也就是把实参数组的起始地址传递给形参数组,这样二者共占一段内存单元。因此,形参数组各元素的值如果发生变化会使实参数组各元素的值发生同样的变化。 例:阅读下列程序,指出输出结果。 main( ) void swap( ); /*函数声明*/ int b2=10,2; swap(b); printf(“b0=%d, b1=%dn”, b0, b1); ,void swap( int a ) int t; t=a0; a0=a1; a1=t; ,共 81页 第 41 页,函数开始调用之前,函数开始调用,实参数组b将起始地
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课件 第七
链接地址:https://www.31doc.com/p-2143432.html