收藏 分销(赏)

计算机二级函数省公共课一等奖全国赛课获奖课件.pptx

上传人:w****g 文档编号:3526018 上传时间:2024-07-08 格式:PPTX 页数:60 大小:464.57KB
下载 相关 举报
计算机二级函数省公共课一等奖全国赛课获奖课件.pptx_第1页
第1页 / 共60页
计算机二级函数省公共课一等奖全国赛课获奖课件.pptx_第2页
第2页 / 共60页
计算机二级函数省公共课一等奖全国赛课获奖课件.pptx_第3页
第3页 / 共60页
计算机二级函数省公共课一等奖全国赛课获奖课件.pptx_第4页
第4页 / 共60页
计算机二级函数省公共课一等奖全国赛课获奖课件.pptx_第5页
第5页 / 共60页
点击查看更多>>
资源描述

1、第四章第四章 函函 数数4.4.1 1 概述概述 4.4.函数定义普通形式函数定义普通形式4.4.函数参数和函数值函数参数和函数值4.4.函数调用函数调用 4.4.函数嵌套调用函数嵌套调用4.4.函数递归调用函数递归调用 4.4.数组作为函数参数数组作为函数参数4.4.8 8 局部变量和全局变量局部变量和全局变量4.4.变量存放类别变量存放类别 4.4.10 10 内部函数和外部函数内部函数和外部函数第1页一个较大程序可分为若干一个较大程序可分为若干个个程序模块程序模块,每一个模块,每一个模块用来实现一个特定功效。用来实现一个特定功效。在高级语言中用在高级语言中用子程序子程序实实现模块功效。子

2、程序由函现模块功效。子程序由函数来完成。一个程序可数来完成。一个程序可由一个主函数和若干个其由一个主函数和若干个其它函数组成。它函数组成。由主函数调用其它函数,其它函数也能够相互调用。由主函数调用其它函数,其它函数也能够相互调用。同一个函数能够被一个或多个函数调用任意屡次。同一个函数能够被一个或多个函数调用任意屡次。函数间调用关系函数间调用关系 4.1 概述概述第2页#include void main()void printstar();/*对对printstar函数申明函数申明*/void print_message();/*对对print_message函数申明函数申明*/printst

3、ar();*调用调用printstar函数函数*print_message();/*调用调用print_message函数函数*/printstar();*调用调用printstar函数函数*/先举一个函数调用简单例子先举一个函数调用简单例子先举一个函数调用简单例子先举一个函数调用简单例子1 1 1 1:void printstar()*定义定义printstar函数函数*printf(*n);void print_message()*定义定义print_message函数函数*printf(How do you do!n);结果:结果:*How do you do!How do you do

4、!*假如下面函数写在main之前,函数申明能够省略第3页#include#include void mainvoid main()int max(int int max(int,int int);/*/*对maxmax函函数数申明申明*/*/int int,;,;scanf scanf(,);(,);maxmax(,);(,);printf printf(“max is“max is,);,);int maxint max(int int,int int)int int;?;return return();();另一个函数调用简单例子另一个函数调用简单例子另一个函数调用简单例子另一个函数调用简

5、单例子2 2 2 2:返回值形参表第4页说明:说明:3、组成组成C程序各个函数彼此平行,独立定义,能够嵌程序各个函数彼此平行,独立定义,能够嵌套调用。但不能调用主函数套调用。但不能调用主函数main()1、一个一个C程序能够由若干个函数组成。程序能够由若干个函数组成。2、在组成在组成C程序全部函数中,有且只有一个主函数程序全部函数中,有且只有一个主函数main(),位置任意(在哪个源文件中都能够)但程序运行从,位置任意(在哪个源文件中都能够)但程序运行从主函数开始。假如主函数在调用函数前,要对调用函数进行主函数开始。假如主函数在调用函数前,要对调用函数进行申明,假如主函数在调用函数后,函数申明

6、能够省略。申明,假如主函数在调用函数后,函数申明能够省略。第5页一、一、1.1.系统函数(库函数)需要在程序前包含头文件系统函数(库函数)需要在程序前包含头文件 2.2.用户自己定义函数用户自己定义函数二、二、1.1.有返回值函数(注意返回值类型)有返回值函数(注意返回值类型)2.2.无返回值函数(函数类型应定义为空类型无返回值函数(函数类型应定义为空类型voidvoid)4.2.1函数分类函数分类三三、1.1.无无参参函函数数。在在调调用用无无参参函函数数时时,主主调调函函数数不不向向被被调调 用函数传递数据。无参函数普通用来执行指定一组操作用函数传递数据。无参函数普通用来执行指定一组操作

7、2.2.有有参参函函数数。在在调调用用函函数数时时,主主调调函函数数在在调调用用被被调调用用函函数数时时,经经过过参参数数向向被被调调用用函函数数传传递递数数据据,普普通通情情况况下下,执执行行被调用函数时会得到一个函数值,供主调函数使用。被调用函数时会得到一个函数值,供主调函数使用。第6页4.2.2 4.2.2 函数定义函数定义 1.1.无参函数定义普通形式无参函数定义普通形式无参函数定义普通形式无参函数定义普通形式 定义定义无参函数无参函数普通形式为普通形式为:类型说明符类型说明符函数名函数名()()说明语句部分;说明语句部分;可执行可执行语句部分;语句部分;在定义函数时要用在定义函数时要

8、用“类型说明符类型说明符”指指定函数值类型,即定函数值类型,即函数带回来值类型函数带回来值类型。例中例中printstarprintstar和和print_messageprint_message函数函数为为voidvoid类型,表示类型,表示不需要带回函数值不需要带回函数值 为函数首部(函数头)内为函数体第7页2.2.有参函数定义普通形式有参函数定义普通形式有参函数定义普通形式有参函数定义普通形式 定义定义有参函数有参函数普通形式为普通形式为:类型说明符类型说明符函数名函数名(形式参数表)(形式参数表)说明语句部分;说明语句部分;可执行可执行语句部分;语句部分;例例2 2:Int maxIn

9、t max(int int,int int)int int;/*/*函数体中申明部分函数体中申明部分*?;return return();();形式参数表简称形参形式参数表简称形参表,多个形参之间用表,多个形参之间用逗号分隔逗号分隔形参是变量,必须进形参是变量,必须进行类型说明行类型说明第8页3.空函数空函数 定义定义空函数空函数普通形式为普通形式为:类型说明符类型说明符函数名函数名()()比如:比如:void dmvoid dm()()调用此函数时,什么工调用此函数时,什么工作也不做,没有任何实作也不做,没有任何实际作用。在主调函数中际作用。在主调函数中写上写上“dm“dm();();”表明

10、表明“这里要调用一个函数这里要调用一个函数”,而现在这个函数没,而现在这个函数没有起作用,等以后扩充有起作用,等以后扩充函数功效时补充上。函数功效时补充上。括号不能省略第9页4.2.3函数参数和函数值函数参数和函数值 1.1.形式参数和实际参数形式参数和实际参数形式参数和实际参数形式参数和实际参数 形式参数:将函数定义中参数表称为形式参数表,简称形参表。与调用函数提供实际参数区分。实际参数:调用有参函数时,调用函数必须赋予这些参数实际值,调用函数中参数称为实际参数。实参可认为变量,常量,函数,表达式,但实参要按照形参类型和个数对应排列。当函数调用时,调用函数把实参值一一对应传送给被调用函数形参

11、,从而实现调用函数向被调用函数数据传送。形参出现在函数定义中,只能在该函数体内使用(有效),调用结束,返回调用函数后,不能在使用形参变量。第10页#include#include void mainvoid main()int max(int int max(int,int int);/*/*对maxmax函函数数申明申明*/*/int int,;,;scanf scanf(,);(,);maxmax(,);(,);printf printf(“max is“max is,);,);int maxint max(int int,int int)int int;?;return return()

12、;();例例例例2 2 2 2:实参加形参类型应相同或赋值兼容;假如a=3.5则形参x=3字符型和整形通用运行情况以下:运行情况以下:,max is 第11页经过函数调用,使两个函数中数据发生联络经过函数调用,使两个函数中数据发生联络 第12页关于形参加实参说明:关于形参加实参说明:(1)在定义函数中指定形参,在未出现函数调用时,它们在定义函数中指定形参,在未出现函数调用时,它们并不占内存中存放单元。只有在发生函数调用时,函数并不占内存中存放单元。只有在发生函数调用时,函数max中形参才被分配内存单元。在调用结束后,形参所占中形参才被分配内存单元。在调用结束后,形参所占内存单元也被释放。内存单

13、元也被释放。(2)2)实参能够是常量、变量或表示式,如:实参能够是常量、变量或表示式,如:(,);(,);但要求它们有确定值。在调用时将实参值赋给形参。但要求它们有确定值。在调用时将实参值赋给形参。第13页(3)(3)在被定义函数中,必须指定形参类型(见例在被定义函数中,必须指定形参类型(见例2 2程序中程序中“max(,);(,);”)。)。(4)(4)实参加形参类型应相同或赋值兼容。例中实实参加形参类型应相同或赋值兼容。例中实参和形参都是整型。假如实参为整型而形参参和形参都是整型。假如实参为整型而形参x x为实型,或为实型,或者相反,则按不一样类型数值赋值规则进行转换。者相反,则按不一样类

14、型数值赋值规则进行转换。比如实参值比如实参值a a为为3.53.5,而形参,而形参x x为整型,则将实数为整型,则将实数3.53.5转换成整数转换成整数3 3,然后送到形参然后送到形参x x。字符型与整型能够相互通用。字符型与整型能够相互通用。第14页(5)(5)在语言中,实参向对形参数据传递是在语言中,实参向对形参数据传递是“值传递值传递”,单向传递,只由实参传,单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不一样给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不一样单元。单元。图一图一在调用函数时,给形参分配存放单元,并将实参对应值传递

15、给形参,调用结束后,在调用函数时,给形参分配存放单元,并将实参对应值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。所以,在执行一个被调用函数时,形参单元被释放,实参单元仍保留并维持原值。所以,在执行一个被调用函数时,形参值假如发生改变,并不会改变主调函数实参值。比如,若在执行函数过程中形参值假如发生改变,并不会改变主调函数实参值。比如,若在执行函数过程中和值变为和,而和仍为和。图二和值变为和,而和仍为和。图二图一图一图二图二第15页4.3 4.3 函数返回值函数返回值通常,希望经过函数调用使主调函数能得到一个确定值,这通常,希望经过函数调用使主调函数能得到一个确定值,这就是

16、就是函数返回值函数返回值。比如,例中,。比如,例中,maxmax(2 2,3 3)值是,)值是,maxmax(,)值是(,)值是5 5。赋值语句将这个函数值赋给变量。赋值语句将这个函数值赋给变量。关于函数返回值一些说明:关于函数返回值一些说明:(1)(1)函数返回值是经过函数中函数返回值是经过函数中returnreturn语句取得。语句取得。第16页假如需要从被调用函数带回一个函数值供主调函数使用,假如需要从被调用函数带回一个函数值供主调函数使用,被调用函数中必须包含被调用函数中必须包含return语句。假如不需要从被调用语句。假如不需要从被调用函数带回函数值能够不要函数带回函数值能够不要re

17、turn语句。语句。一个函数中能够有一个以上一个函数中能够有一个以上return语句,执行到哪一个语句,执行到哪一个return语句,哪一个语句起作用,函数结束,所以函数只语句,哪一个语句起作用,函数结束,所以函数只能返回一个值。能返回一个值。return语句后面括弧也能够不要语句后面括弧也能够不要如如:“:“return ;”;”等价于等价于“return();();”returnreturn语句将被调用函数中一个确定值带回主调函数中语句将被调用函数中一个确定值带回主调函数中去。去。第17页return后面值能够是一个表示式。后面值能够是一个表示式。比如,例中函数比如,例中函数maxmax能

18、够改写成:能够改写成:max(int,int)return(?););(2)(2)函数返回值应该属于某一个确定类型,函数返回值应该属于某一个确定类型,在定义函在定义函数时指定函数返回值类型数时指定函数返回值类型。第18页比如比如:下面是下面是3 3个函数首行:个函数首行:int max(float,float)/*函数值为整型函数值为整型*/char letter(char c1,char c2)/*函数值为字符型函数值为字符型*/double min(int,int)/*函数值为双精度型函数值为双精度型*/在语言中,在语言中,凡不加类型说明函数,自动按整型处理。凡不加类型说明函数,自动按整型

19、处理。例中例中maxmax函数首行函数类型函数首行函数类型intint能够省写,用能够省写,用Turbo C Turbo C 2.02.0编译程序时能经过,但用编译程序时能经过,但用Turbo CTurbo C 3.0 3.0编译程序编译程序时不能经过,所以时不能经过,所以,提议在定义时对全部函数都指定函数提议在定义时对全部函数都指定函数类型。类型。其中:其中:int char doubleint char double为函数类型,实质上函数类型就是为函数类型,实质上函数类型就是函数返回值类型,就是函数返回值类型,就是returnreturn语句返回数据类型。语句返回数据类型。第19页(3 3

20、)在定义函数时指定函数类型普通应该和在定义函数时指定函数类型普通应该和returnreturn语句语句中表示式类型一致。中表示式类型一致。假如函数值类型和假如函数值类型和return语句中表示式值不一致,则以语句中表示式值不一致,则以函函数类型为准数类型为准。对数值型数据,能够自动进行类型转换。即。对数值型数据,能够自动进行类型转换。即函数类型决定返回值类型。函数类型决定返回值类型。(4 4)对于不带回值函数,应该用对于不带回值函数,应该用“void”“void”定义函数为定义函数为“无类型无类型”(或称(或称“空类型空类型”)。这么,系统就确保不使函)。这么,系统就确保不使函数带回任何值,即

21、禁止在调用函数中使用被调用函数返回数带回任何值,即禁止在调用函数中使用被调用函数返回值。此时在函数体中不得出现值。此时在函数体中不得出现returnreturn语句。语句。第20页例例 返回值类型与函数类型不一样返回值类型与函数类型不一样#include void main()()int max(float,float);函数申明函数申明 float,;,;int;scanf(,);(,);max(,);(,);printf(“max is,);,);int max(float,float)float;/*z为实型变量为实型变量*/?;return();();运行情况以下:运行情况以下:1.5

22、1.5,2.5 2.5max is max is 第21页4.3 4.3 函数调用函数调用 函数调用普通形式函数调用普通形式函数调用普通形式函数调用普通形式函数调用普通形式为函数调用普通形式为:函数名函数名(实参表)(实参表)假如实参表列包含多个实参,则各参数间用逗号隔开。假如实参表列包含多个实参,则各参数间用逗号隔开。实参加形参个数应相等,类型应匹配。实参加形参按实参加形参个数应相等,类型应匹配。实参加形参按次序对应,一一传递数据。次序对应,一一传递数据。假如是调用无参函数,则假如是调用无参函数,则“实参表实参表”能够没有,但括能够没有,但括弧不能省略。弧不能省略。第22页例例 实参求值次序

23、实参求值次序#include void main()int f(int a,int b);/*函数申明函数申明*/int i=2,p;p=f(i,+i);/*函数调用函数调用*/printf(%dn,p);int f(int a,int b)/函数定义函数定义*/int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);第23页假如按自左至右次序求实参值,假如按自左至右次序求实参值,则函数调用相当于(,)则函数调用相当于(,)假如按假如按从右至左从右至左次序求实参值,则次序求实参值,则函数调用相当于(函数调用相当于(3,),)普通选择普通选择从右至

24、左。结果为:从右至左。结果为:0 对于函数调用对于函数调用 int i=2,p;p=f(i,+i);第24页4.3.4.3.函数调用方式函数调用方式函数语句函数语句把函数调用作为一个语句。如例把函数调用作为一个语句。如例1中中printstar();这时不要;这时不要求函数带回值,只要求函数完成一定操作。求函数带回值,只要求函数完成一定操作。函数表示式函数表示式函数出现在一个表示式中,这种表示式称为函数出现在一个表示式中,这种表示式称为函数表示式函数表示式。这时要求函数带回一个确定值以参加表示式运算。比如这时要求函数带回一个确定值以参加表示式运算。比如:*max*max(,);(,);按函数在

25、程序中出现位置来分,能够有三种调用方式按函数在程序中出现位置来分,能够有三种调用方式第25页函数参数函数参数函数调用作为一个函数实参。比如函数调用作为一个函数实参。比如:m=max(a,max(b,c);其中其中max(b,c)是一次函数调用,它值作为是一次函数调用,它值作为max另一次调另一次调用实参。用实参。m值是值是a、b、c三者中最大者。又如三者中最大者。又如:printf(%d,max(a,b);也是把也是把max(a,b)作为作为printf函数一个函数一个参数。参数。函数调用作为函数参数,实质上也是函数表示式形式函数调用作为函数参数,实质上也是函数表示式形式调用一个,因为函数参数

26、原来就要求是表示式形式。调用一个,因为函数参数原来就要求是表示式形式。第26页4.3.3对被调用函数申明和函数原型对被调用函数申明和函数原型在一个函数中调用另一个函数需要具备哪些条件:在一个函数中调用另一个函数需要具备哪些条件:被调用函数已经存在(库函数或用户自定义);被调用函数已经存在(库函数或用户自定义);使用库函数或别文件中函数,应该在本文件开头用使用库函数或别文件中函数,应该在本文件开头用#include命令将相关编译预处理信息包含到本文件中来。命令将相关编译预处理信息包含到本文件中来。例:例:使用输入输出函数使用输入输出函数#include“stdio.h”使用数学函数使用数学函数#

27、include“math.h”若使用用户自己定义函数,而且该函数与主调函数在同一个若使用用户自己定义函数,而且该函数与主调函数在同一个文件中,则需在主调函数中对被调用函数进行说明。文件中,则需在主调函数中对被调用函数进行说明。说明形式说明形式 类型名类型名 函数名(类型函数名(类型1 变量变量1,类型,类型n 变量变量n);第27页函数原型普通形式为函数原型普通形式为(1)(1)函数类型函数类型 函数名函数名(参数类型参数类型1 1,参数类型,参数类型2)2);(2)(2)函数类型函数类型 函数名函数名(参数类型参数类型1 1,参数名,参数名1 1,参数类型,参数类型2 2,参数名,参数名2)

28、2);申明作用申明作用是把函数名、函数参数个数和参数类型等信是把函数名、函数参数个数和参数类型等信息通知编译系统,方便在碰到函数调用时,编译系统能正息通知编译系统,方便在碰到函数调用时,编译系统能正确识别函数并检验调用是否正当。确识别函数并检验调用是否正当。(比如函数名是否正(比如函数名是否正确,实参加形参类型和个数是否一致)。确,实参加形参类型和个数是否一致)。第28页#include void main()()int max(float,float);函数原型申明函数原型申明 float,;,;int;scanf(,);(,);max(,);(,);printf(“max is,);,);

29、int max(float,float)float;/*z为实型变量为实型变量*/?;return();();第29页#include void main()()float add(float x,float y););*对被调用函数对被调用函数add申明申明*float a,b,c;scanf(f,f,a,b););cadd(a,b);printf(sum is f n,c););float add(float,float)*函数首部函数首部*float;/*函数体函数体*/z;return(z););例例 对被调用函数作申明对被调用函数作申明假如假如 被调用函数定义出现在主调函数之前,能够

30、无须加以申明。被调用函数定义出现在主调函数之前,能够无须加以申明。第30页改写例改写例#include float add(float,float)*函数首部函数首部*float;/*函数体函数体*/z;return(z););void main()()float a,b,c;scanf(f,f,a,b););cadd(a,b);printf(sum is f n,c););因为:函数add写在主函数之前,能够在主函数中省略对add函数申明第31页4.4 函数嵌套调用函数嵌套调用1、被调函数在调用过程中,调用其它函数称为函被调函数在调用过程中,调用其它函数称为函数嵌套调用。数嵌套调用。2、函数

31、能够嵌套调用,不允许嵌套定义。函数能够嵌套调用,不允许嵌套定义。一个函数不能定义在其它函数内部,一个函数不能定义在其它函数内部,函数之间是相互独立,是平行函数之间是相互独立,是平行函数外部性函数外部性第32页嵌套调用函数执行情况如图所表示嵌套调用函数执行情况如图所表示mainmainmainmain函数函数函数函数 调用函调用函调用函调用函数数数数 A;A;A;A;函数函数函数函数 A A A A 调用函数调用函数调用函数调用函数B B;函数函数函数函数 B B B B 第33页例例6:计算:计算s值值#includelong int f1(int n,int k)计算计算nk次方次方long

32、 int power=1;int i;for(i=1;i=k;i+)power=power*n;return power;long int f2(int n,int k)计算累加和计算累加和long int sum=0;int i;for(i=1;i=n;i+)sum+=f1(i,k);return sum;main()scanf(“%d,%d”,&n,&k);printf(“%dn”,f2(n,k);当输入:当输入:4,2运行结果:运行结果:30第34页4.5 函数递归调用函数递归调用 在调用一个函数过程中又出现直接或间在调用一个函数过程中又出现直接或间接地调用该函数本身,称为函数递归调接地

33、调用该函数本身,称为函数递归调用。比如:用。比如:例例7 7:用递归方法求!:用递归方法求!求!也能够用递归方法,即!等于!求!也能够用递归方法,即!等于!,而!,而!。可用下面递归公式表示:!。可用下面递归公式表示:!(,)(,)()!()!()()第35页(1)递推:递推:从一个已知事实出发,按一定规律推出下一个事从一个已知事实出发,按一定规律推出下一个事 实。用同一个变量存放推出结果,给同一个变量赋新值实。用同一个变量存放推出结果,给同一个变量赋新值 n!=1*2*3*(n-2)*(n-1)*n i 1 2 3 n 初值:初值:n=1 m m=m*i m=1 程序段为:程序段为:m=1;

34、for(i=1;i1)求求n!与求与求(n-1)!方法是一样,只是参数值不一样。方法是一样,只是参数值不一样。第36页 long fac(int n)long f;if(n=0)f=1;/*递归结束条件递归结束条件*/else f=n*fac(n-1);/*直接递归调用直接递归调用*/return f;main()long y;int n;scanf(“%d”,&n);y=fac(n);printf(“%d!=%ld”,n,y);例例7 7:用递归方法求!:用递归方法求!第37页 当输入当输入3时时,函数调用过程以下:函数调用过程以下:回推阶段回推阶段main()fac函数函数 fac函数函数

35、 fac函数函数 fac函数函数 n=3 n=2 n=1 n=0 fac(3)fac(2)fac(1)fac(0)y=fac(3)f=3*fac(2)f=2*fac(1)f=1*fac(0)f=1 6 2 1 1 return(f)return(f)return(f)return(f)输出:输出:3!=6 递推阶段递推阶段 fac函数在回推阶段被调用了函数在回推阶段被调用了4次,递归调用了次,递归调用了3次,到终止条次,到终止条件件n=0时才有确定值,然后再递推出每一次调用值,最终得到所求时才有确定值,然后再递推出每一次调用值,最终得到所求结果。结果。第38页例例 8 有个人坐在一起,问第个人

36、多少岁?他说比有个人坐在一起,问第个人多少岁?他说比第个人大岁。问第个人岁数,他说比第个人大第个人大岁。问第个人岁数,他说比第个人大岁。问第个人,又说比第个人大岁。问第个人,岁。问第个人,又说比第个人大岁。问第个人,说比第个人大岁。最终问第个人,他说是岁。说比第个人大岁。最终问第个人,他说是岁。请问第个人多大。请问第个人多大。age()()age()()age()()age()()age()()age()()age()()age()()age()()10能够用数学公式表述以下:能够用数学公式表述以下:age()()()()age(-)()()第39页能够用一个函数来描述上述递归过程:能够用一个

37、函数来描述上述递归过程:int age(int)*求年纪递归函数求年纪递归函数*int;*存放函数返回值变量存放函数返回值变量*if(=1)=10;else =age(n-1););return();();用一个主函数调用用一个主函数调用age函数,求得第函数,求得第5人年纪。人年纪。#include void main()()printf(,age();();运行结果以下:运行结果以下:18第40页例例8:斐波那契数列:斐波那契数列:1,1,2,3,5,8,13,21,#includeint fibonacci(int n)if(n=2)return 1;else return fibona

38、cci(n-1)+fibonacci(n-2);void main()int n;scanf(“%d”,&n);printf(“%dn”,fibonacci(n);递归结束递归结束条件条件迫近递归结束迫近递归结束条件条件第41页/*兔子繁殖问题或称为斐波那契数列兔子繁殖问题或称为斐波那契数列*/#includestdio.hmain()int n,k=3,a1=1,a2=1,h=0;/*h为第为第n月兔子总对数月兔子总对数*/printf(请输入月份:请输入月份:);scanf(%d,&n);printf(n第第%d月有月有%d对兔子对兔子,1,1);printf(n第第%d月有月有%d对兔子

39、对兔子,2,1);while(k=n)h=a1+a2;printf(n第第%d月有月有%d对兔子对兔子,k,h);a1=a2;a2=h;k+;第42页例例9:求两个整数:求两个整数a,b最大条约数最大条约数#includelong int gys(int x,int y)if(x%y=0)return y;else return gys(y,x%y);void main()int a,b;scanf(“%d,%d”,&a,&b);printf(“%dn”,gys(a,b);第43页第44页第45页C语言中变量:v1、数据类型v2、作用域 由变量定义位置决定局部变量局部变量和全局变量全局变量v3

40、、生命期 由变量在内存中储存方式决定静态存放类静态存放类和和动态存放类动态存放类第46页4.6局部变量和全局变量局部变量和全局变量4.6.14.6.1局部变量局部变量局部变量局部变量在一个函数内部定义变量是内部变量,它只在本在一个函数内部定义变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量。使用它们,在此函数以外是不能使用这些变量。这称为这称为“局部变量局部变量”。第47页float f1(int a)/*函数函数f1*/int b,c;b、c有效有效 char f2(int x,int y)/

41、*函数函数f2*/int i,j,b;x、y、i、j,b有效有效 void main()/*主函数主函数*/int m,n;m、n有效有效 第48页(1)主函数中定义变量主函数中定义变量(m,n)也只在主函数中有效也只在主函数中有效(使用使用),而不因为在而不因为在主函数中定义而在整个文件或程序中有效。主函数也不能使用其主函数中定义而在整个文件或程序中有效。主函数也不能使用其它函数中定义变量。它函数中定义变量。(2)不一样函数中能够使用相同名字变量不一样函数中能够使用相同名字变量,它们代表不一样对象它们代表不一样对象,互不互不干干扰。比如扰。比如,上面在上面在f1函数中定义了变量函数中定义了变

42、量b和和c,倘若在倘若在f2函数中也定义变函数中也定义变量量b和和c,它们在内存中占不一样单元它们在内存中占不一样单元,互不混同。互不混同。(3)形式参数也是局部变量。比如上面形式参数也是局部变量。比如上面f1函数中形参函数中形参a,也只在也只在f1函数函数中有效。其它函数能够调用中有效。其它函数能够调用f1函数,但不能引用函数,但不能引用f1函数形参函数形参a。(4)在一个函数内部在一个函数内部,能够在复合语句中定义变量能够在复合语句中定义变量,这些变量只在本复这些变量只在本复合合语句中有效语句中有效,这种复合语句也称为这种复合语句也称为“分程序分程序”或或“程序块程序块”。说明说明第49页

43、习题习题5void main()int i=1,j=3;printf(“%d”,i+);int i=0;i+=j*2;printf(“%d,%d”,i,j);i=0在复合语句范围内有效在复合语句范围内有效 printf(“%d,%dn”,i,j);i=1在复合语句之外范围内有效在复合语句之外范围内有效 输出输出结果:结果:1,6,3,2,3第50页4.6.2 全局变量全局变量在函数内定义变量是局部变量,而在函数之外定义变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可认为本文件中其他函数所共用。它有效范围为从定义变量位置开始到根源文件结束。注意:同一文件中,允许全局变量同名,在局

44、注意:同一文件中,允许全局变量同名,在局部变量作用域内,全局变量不起作用。部变量作用域内,全局变量不起作用。第51页int p=1,q=5;/*p和和q 全局(外部)变量全局(外部)变量*/float f1(int a)/*定义函数定义函数f1*/int b,c;char c1,c2;/*c1,c2全局(外部)全局(外部)变量变量*/char f2(int x,int y)/*定义函数定义函数f2*/int i,j;void main()/*主函数主函数*/int m,n;全全局局变变量量pq作作用用范范围围全全局局变变量量c1c2作作用用范范围围第52页4.7 变量存放类别变量存放类别 4.

45、7.1 4.7.1 动态存放方式与静态存放方式动态存放方式与静态存放方式动态存放方式与静态存放方式动态存放方式与静态存放方式 前面已介绍了从前面已介绍了从变量作用域(即从空间)角度变量作用域(即从空间)角度来分,有来分,有全局变量全局变量和和局部变量局部变量。那么从。那么从变量值存在时间(即生存变量值存在时间(即生存期)角度期)角度来分,又能够有来分,又能够有静态存放方式静态存放方式和和动态存放方式动态存放方式。所谓所谓静态存放方式静态存放方式是指在程序运行期间由系统分是指在程序运行期间由系统分配固定存放空间方式。而配固定存放空间方式。而动态存放方式动态存放方式则是在程则是在程序运行期间依据需

46、要进行动态分配存放空间方式。序运行期间依据需要进行动态分配存放空间方式。第53页在语言中每一个变量和函数有两个属性:数据类型和数在语言中每一个变量和函数有两个属性:数据类型和数据存放类别。据存放类别。对数据类型,读者已熟悉(如整型、字符型等)。对数据类型,读者已熟悉(如整型、字符型等)。存放类别指是数据在内存中存放方式。存放类别指是数据在内存中存放方式。存放方式分为两大类:存放方式分为两大类:静态存放类静态存放类和和动态存放类动态存放类。详细包含四种:详细包含四种:自动自动(auto),),静态静态(static),),存放器存放器(register),),外部外部(extern)。第54页4

47、.7.2 auto4.7.2 auto变量变量变量变量(1)(1)自动变量自动变量,只在定义函数内有效;函数被调用时分配存放空只在定义函数内有效;函数被调用时分配存放空 间,调用结束就释放。间,调用结束就释放。定义形式为定义形式为:auto 数据类型数据类型 变量表变量表;其中auto能够省略 动态存放变量能够是函数形式参数、局部变量、函数调用时返动态存放变量能够是函数形式参数、局部变量、函数调用时返回地址回地址。自动变量定义时不初始化,则其值是不确定。假如初始化,则自动变量定义时不初始化,则其值是不确定。假如初始化,则赋初值操作是在调用时进行,且每次调用都要重新赋一次初值赋初值操作是在调用时

48、进行,且每次调用都要重新赋一次初值。在复合语句中定义自动变量,只在该复合语句中有效在复合语句中定义自动变量,只在该复合语句中有效。在不一样函数或复合语句中允许使用同名变量而不会混同。在不一样函数或复合语句中允许使用同名变量而不会混同。第55页4.7.34.7.3用用用用staticstatic申明局部变量申明局部变量申明局部变量申明局部变量在函数体(或复合语句)内部,用以下定义格式定义变在函数体(或复合语句)内部,用以下定义格式定义变量称为静态局部变量:量称为静态局部变量:static 数据类型数据类型 变量表;变量表;比如:比如:static int a=8;静态局部变量初始化只在编译时进行

49、一次,每次调静态局部变量初始化只在编译时进行一次,每次调用它们所在函数时,不再重新赋初值,用它们所在函数时,不再重新赋初值,只是保留上次调只是保留上次调用结束时值用结束时值。若定义但不初始化,则自动赋以。若定义但不初始化,则自动赋以“”(数(数值型)或值型)或0(字符型)。(字符型)。第56页例例13:考查静态局部变量值。考查静态局部变量值。#include void main()()int(int);int,;,;for(;(;)printf(,();,();int(int)aut int;static;return();();运行结果:运行结果:789第57页例例14:输出到阶乘值。输出到阶乘值。#include void main()()int fac(int);int;for(;)(;)printf(%!=,fac();();int fac(int)static int;*;return();();第58页结束结束第59页第60页

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服