C语言程序设计 教学课件 ppt 作者 曹玲焕 孙萍主编 第七章

上传人:E**** 文档编号:89422441 上传时间:2019-05-25 格式:PPT 页数:41 大小:556.50KB
返回 下载 相关 举报
C语言程序设计 教学课件 ppt 作者 曹玲焕 孙萍主编 第七章_第1页
第1页 / 共41页
C语言程序设计 教学课件 ppt 作者 曹玲焕 孙萍主编 第七章_第2页
第2页 / 共41页
C语言程序设计 教学课件 ppt 作者 曹玲焕 孙萍主编 第七章_第3页
第3页 / 共41页
C语言程序设计 教学课件 ppt 作者 曹玲焕 孙萍主编 第七章_第4页
第4页 / 共41页
C语言程序设计 教学课件 ppt 作者 曹玲焕 孙萍主编 第七章_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《C语言程序设计 教学课件 ppt 作者 曹玲焕 孙萍主编 第七章》由会员分享,可在线阅读,更多相关《C语言程序设计 教学课件 ppt 作者 曹玲焕 孙萍主编 第七章(41页珍藏版)》请在金锄头文库上搜索。

1、1,第七章,函 数,2,第七章 函数,一、函数概述 二、函数的定义和返回值 三、函数的调用 四、函数的说明 五、局部变量和全局变量 六、变量的存储类别 七、嵌套调用和递归调用 八、函数的存储类型 九、函数程序举例,主要内容,end,3,一、函数概述,C程序结构,第七章 函数,4,一个C程序可由一个主函数和若干个函数构成。 由主函数调用其他函数。 其他函数可以相互调用。 同一函数可以被一个或多个函数调用任意多次。,基本概念,分 类,从用户使用的角度看:标准函数和用户自定义函数 从函数的形式看:无参函数和有参函数,第七章 函数,back,5,(一)、举例 (二)、函数的定义 (三)、函数的返回值,

2、二、函数的定义和返回值,第七章 函数,back,6,(一)、举例,先来看一个函数使用的例子,输入两个数,输出最大值。(判断的两个数的最大值用函数),main() int a,b,c; c=max(a,b); printf(“The max is %d”,c); int max(int x,int y) int z; if (xy) z=x; else z=y; return(z); ,函数调用,函数定义,第七章 函数,7,(二)、函数定义,类型标识符 函数名(形参列表 ) 声明部分 语句部分,int max(int x,int y) int z; if (xy) z=x; else z=y;

3、return(z); ,函数首部,函数体,格式,int: 函数类型 max:函数名 int x,int y: 形参及其定义,声明部分: int z; 说明函数内部用到的变量。 语句部分: if . 说明函数的功能 return(z) 返回函数的结果,第七章 函数,8,(三)、函数的返回值,1、函数的返回值是通过函数中的return语句获得的。 一个函数中可以有一个以上的return语句。只有一个起作用。,2、return (z); return z;,3、如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。,4、如果被调用函数中没有return语句,一般表示此函数完成一定操

4、作,并不带回任何值。,5、为了明确表示“不带回值”,可以用“void”定义“无类型”。,第七章 函数,9,例 无返回值函数 void swap(int x,int y) int temp; temp=x; x=y; y=temp; ,printstar( ) printf(“*“); main( ) int a; a=printstar( ); printf(“%d“,a); ,void printstar( ) printf(“*“); main( ) int a; a=printstar( ); printf(“%d“,a); ,正确。函数printstar()没有说明类型表示整型,在ma

5、in()中,语句a=printstar( );执行函数调用,因为在函数定义时没有定义返回值,所以返回一个随机整数。运行结果: *10 10就是返回的随机整数。,错误!在编译时将提 示下列信息: cannot convert from void to int 即不能将void转换为 int,举例,第七章 函数,10,三、 函数的调用,(一)、函数调用可以有两种方式 (二)、函数的参数传递 (三)、函数调用的语法要求,第七章 函数,back,11,(一)函数调用可以有两种方式,函数调用出现在表达式中 例:c = max(a,b)是一个赋值表达式 函数调用以语句的形式出现 例:若调用hello函数,

6、可用以下语句: hello();,第七章 函数,12,格式,函数名(实参列表 ),方式,1。函数语句 printstar() 2。函数表达式 c=a*max(a,b) 3。函数参数 m=max(a,max(b,c),main() int a,b,c; c=max(a,b); printf(“The max is %d”,c); ,函数调用,第七章 函数,13,举例,C(m,n)=m!/(n!*(m-n)!) (mn),main() float c; int m,n; float fac(int x); printf(“input m,n:”); scanf(“%d%d”, ,input m,n

7、:5 3,The result is 10.0,第七章 函数,14,(二)、函数的参数传递,计算实在参数的值,为形式参数分配存储单元,将实在参数的值传给对应的形式参数。 通过return语句将返回值返回到调用处,释放形式参数所分配的内存单元。因此,形参只在函数内部有效,函数调用结束返回主调函数后则不能再使用该形参变量。 函数之间还可以通过全局变量传递参数,将在本章后续内容中介绍。 在C语言中,数据只能从实参传给形式参数,而不能把形式参数的值传回给实在参数,称为“按值传递”,既单向传递。,第七章 函数,15,实际参数与形式参数的关系,对应关系,个数对应 顺序对应 类型对应(类型相同或赋值相容),

8、传递关系,实参传递给形参 值传递(单向传递),第七章 函数,形参:定义函数时函数名后面括号 中的变量名,形参:定义函数时函数名后面括号中的变量名,说明: (1)形参在函数被调用前不占内存; (2)函数调用时为形参分配内存; 调用结束,释放内存 (3)实参可以是常量、变量或表达式 (4)在被定义的函数中,必须指 定形参的类型 (5)形参与实参类型一致,个数相同 (6)若形参与实参类型不一致,自 动按形参类型转换(函数调用 转换) (7)实参对形参与进行“值传递” (8)形参与实参占用不同的内存 单元, 单向传递,16,(三)、函数调用的语法要求,函数调用的语法要求 函数调用时,函数名必须与定义的

9、函数名完全一致。 实参可以是常量、变量、表达式、函数等,在进行函数调用时,它们都必须具有确定的值,实参的个数必须与形参的个数相等,顺序一致,类型匹配,否则会发生“类型不匹配”的错误。 被调函数类型是int或char以外的函数,应先定义或说明,后使用。,第七章 函数,17,四、函数的说明,(一)、函数说明的形式 其一般形式如下: 数据类型 函数名(类型名 形式参数1,类型名 形式参数2,); 或者也可以省略形式参数的名字,写成下面形式: 数据类型 函数名(类型名1,类型名2); 如果被调函数的返回值是整型或字符型时,可以不对被调函数作说明,而直接调用 当被调函数的定义出现在主调函数之前时,在主调

10、函数中也可以不对被调函数再作说明而直接调用,第七章 函数,18,(二)函数说明的位置 函数说明可以放在两个位置: 主调函数的说明部分 所有函数外部,被调用之前,第七章 函数,back,19,五、局部变量和全局变量,局部变量 定义:在函数内定义,只在本函数内有效 说明: main中定义的变量只在main中有效 不同函数中同名变量,占不同内存单元 形参属于局部变量 局部变量可用存储类型:auto register static (默认为auto),全局变量-外部变量 定义:在函数外定义的变量 有效范围:从定义变量的位置开始到本源文件结束 应尽量少使用全局变量,第七章 函数,20,第七章 函数,21

11、,例 不同函数中同名变量(局部变量),main( ) int a,b; a=3; b=4; printf(“main:a=%d,b=%dn“,a,b); sub(); printf(“main:a=%d,b=%dn“,a,b); sub( ) int a,b; a=6; b=7; printf(“sub:a=%d,b=%dn“,a,b); ,运行结果: main:a=3,b=4 sub:a=6,b=7 main:a=3,b=4,第七章 函数,22,float max,min; float average(float array, int n) int i; float sum=array0;

12、max=min=array0; for(i=1;imax) max=arrayi; else if(arrayimin) min=arrayi; sum+=arrayi; return(sum/n); main() int i; float ave,score10; /*Input */ ave=average(score,10); printf(“max=%6.2fnmin=%6.2fn average=%6.2fn“,max,min,ave); ,例 全局变量,第七章 函数,back,23,六、变量的存储类别,变量定义的一般形式如下: 存储类型标识符 数据类型 变量名,变量名,; (一)

13、auto变量:局部变量可以定义为auto型,而全局变量不能被说 明成此类型对于局部变量,如果没有指定存储类型、或使用了 auto说明符,糸统就认为所定义的变量具有自动类别。因此, int x;等价于auto int x; auto变量的存储单元被分配在内存的动态存储区。每当进入函数体或复合语句时,糸统自动为auto变量分配存储单元;退出时自动释放这些存储单元另作它用。因此,这类局部变量的作用域是从定义的位置起,到函数体或复合语句结束为止。所有自动类存储单元都是在进入这些局部变量所在的函数体或复合语句时生成,退出其所在的函数体或复合语句时消失。这就是自动类局部变量的“生存期”。当再次进入函数体或

14、复合语句时,系统将为它们另行分配存储单元;未赋初值的自动变量其值不确定。 自动变量的赋初值是在程序运行过程中进行的,每进入一次函数体或复合语句,就赋一次初值。,第七章 函数,24,寄存器变量也是自动类变量。它与auto类变量的区别在于:用register定义的变量占CPU中的寄存器,而auto类的变量占用内存的动态存储区。程序运行时访问寄存器的速度要比访问内存的速度快得多。因此,当程序对运行速度有较高要求时,把那些频繁引用的少数变量定义为寄存器类型,可以显著地提高运行速度。 在使用寄存器类型的变量时需要注意: (1)CPU中的寄存器是有限的,因此只能说明少量(两个左右)的寄存器变量。 (2)

15、register型变量的值是存放在CPU中的寄存器中,而不是放在内存中,所以register型变量没有地址。也就不能对它们进行求地址运算。 (3)register型变量的说明应尽量放在靠近使用的地方,用完之后尽快释放,以提高寄存器的利用率。 (4)局部变量可以说明为register型,而全局变量不能被说明成此类 型。,(二)register变量,第七章 函数,25,(三) static变量,static变量的存储单元被分配在内存的静态存储区中,它们在程序开始运行前就分配了固定的存储单元,在程序运行过程中占用的存储单元始终不变,只有在程序结束后,才释放所占用的内存单元。 对于局部变量和全局变量都

16、可以说明成static类型。 静态局部变量如果进行初始化,只有第一次执行定义语句时随着定义而进行初始化。当退出所定义的函数或复合语句时,将保留当时值,再次进入所定义的函数或复合语句时,不重新定义,所以也不重新初始化,此时,该变量的值是上次离开时的值。静态局部变量如果不进行初始化,C语言编译系统将自动为其赋予零。,第七章 函数,26,例:static局部变量应用举例。,#include main() int i,s; int f(int m); for (i=1;i=5;i+) s=f(i); printf(“i=%d,s=%dn“,i,s); int f(int m) static int t =1; t=t*m; return(

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

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

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