收藏 分销(赏)

计算机二级函数公开课一等奖优质课大赛微课获奖课件.pptx

上传人:人****来 文档编号:4942925 上传时间:2024-10-20 格式:PPTX 页数:60 大小:461KB
下载 相关 举报
计算机二级函数公开课一等奖优质课大赛微课获奖课件.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页第1页一个较大程序可分为若干一个较大程序可分为若干个个程序模块程序模块,每一个模块,每一个模块用来实现一个特定功效。用来实现一个特定功效。在高级语言中用在高级语言中用子程序子程序实实现模块功

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

3、rintstar();*调用调用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

4、you do!*假如下面函数写在main之前,函数申明能够省略第3页第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页第4页阐明:阐明:3、构成构成C程序各个函数彼此平行,独立定义,能够嵌程序各个函数彼此平行,独立定义,能够嵌套调用。但不能调用主函数套调用。但不能调用主函数main()1、一个一个C程序能够由若干个函数构成。程序能够由若干个函数构成。2、在构成在构成C程序所有函数中,有且只有一个主函数程序所有函数中,有且只有一个主函数main(),位置任意(在哪个源文献中都能够)但程序运营从,位置任意(在哪个源文献中都能够)但程序运营从主函数开始。假如主函数在调用函数前,要对调用函数进行主函数开始。假如主函数在调用函数前,要对调用函数进行申明,假如主函

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

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

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

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

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

11、数调用时,调用函数把实参值一一相应传送给被调用函数形参,从而实现调用函数向被调用函数数据传送。形参出现在函数定义中,只能在该函数体内使用(有效),调用结束,返回调用函数后,不能在使用形参变量。第10页第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,in

12、t int)int int;?;return return();();例例例例2 2 2 2:实参与形参类型应相同或赋值兼容;假如a=3.5则形参x=3字符型和整形通用运营情况下列:运营情况下列:,max is 第11页第11页通过函数调用,使两个函数中数据发生联系通过函数调用,使两个函数中数据发生联系 第12页第12页关于形参与实参阐明:关于形参与实参阐明:(1)在定义函数中指定形参,在未出现函数调用时,它们在定义函数中指定形参,在未出现函数调用时,它们并不占内存中存储单元。只有在发生函数调用时,函数并不占内存中存储单元。只有在发生函数调用时,函数max中形参才被分派内存单元。在调用结束后,

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

14、.53.5,而形参,而形参x x为整型,则将实数为整型,则将实数3.53.5转换成整数转换成整数3 3,然后送到形参然后送到形参x x。字符型与整型能够互相通用。字符型与整型能够互相通用。第14页第14页(5)在语言中,实参向对形参数据传递是“值传递”,单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同单元。图一在调用函数时,给形参分派存储单元,并将实参相应值传递给形参,调用结束后,在调用函数时,给形参分派存储单元,并将实参相应值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。因此,在执行一个被调用函数时,形参单元被释放,实参单元仍保留并

15、维持原值。因此,在执行一个被调用函数时,形参值假如发生改变,并不会改变主调函数实参值。比如,若在执行函数过程中形参值假如发生改变,并不会改变主调函数实参值。比如,若在执行函数过程中和值变为和,而和仍为和。图二和值变为和,而和仍为和。图二图一图一图二图二第15页第15页4.3 4.3 函数返回值函数返回值通常,希望通过函数调用使主调函数能得到一个拟定值,这通常,希望通过函数调用使主调函数能得到一个拟定值,这就是就是函数返回值函数返回值。比如,例中,。比如,例中,maxmax(2 2,3 3)值是,)值是,maxmax(,)值是(,)值是5 5。赋值语句将这个函数值赋给变量。赋值语句将这个函数值赋

16、给变量。关于函数返回值一些阐明:关于函数返回值一些阐明:(1)(1)函数返回值是通过函数中函数返回值是通过函数中returnreturn语句取得。语句取得。第16页第16页假如需要从被调用函数带回一个函数值供主调函数使用,假如需要从被调用函数带回一个函数值供主调函数使用,被调用函数中必须包括被调用函数中必须包括return语句。假如不需要从被调用语句。假如不需要从被调用函数带回函数值能够不要函数带回函数值能够不要return语句。语句。一个函数中能够有一个以上一个函数中能够有一个以上return语句,执行到哪一个语句,执行到哪一个return语句,哪一个语句起作用,函数结束,因此函数只语句,哪

17、一个语句起作用,函数结束,因此函数只能返回一个值。能返回一个值。return语句后面括弧也能够不要语句后面括弧也能够不要如如:“:“return ;”;”等价于等价于“return();();”returnreturn语句将被调用函数中一个拟定值带回主调函数中语句将被调用函数中一个拟定值带回主调函数中去。去。第17页第17页return后面值能够是一个表示式。后面值能够是一个表示式。比如,例中函数比如,例中函数maxmax能够改写成:能够改写成:max(int,int)return(?););(2)(2)函数返回值应当属于某一个拟定类型,函数返回值应当属于某一个拟定类型,在定义函在定义函数时指

18、定函数返回值类型数时指定函数返回值类型。第18页第18页比如比如:下面是下面是3 3个函数首行:个函数首行:int max(float,float)/*函数值为整型函数值为整型*/char letter(char c1,char c2)/*函数值为字符型函数值为字符型*/double min(int,int)/*函数值为双精度型函数值为双精度型*/在语言中,在语言中,凡不加类型阐明函数,自动按整型处理。凡不加类型阐明函数,自动按整型处理。例中例中maxmax函数首行函数类型函数首行函数类型intint能够省写,用能够省写,用Turbo C Turbo C 2.02.0编译程序时能通过,但用编译

19、程序时能通过,但用Turbo CTurbo C 3.0 3.0编译程序编译程序时不能通过,因此时不能通过,因此,提议在定义时对所有函数都指定函数提议在定义时对所有函数都指定函数类型。类型。其中:其中:int char doubleint char double为函数类型,实质上函数类型就是为函数类型,实质上函数类型就是函数返回值类型,就是函数返回值类型,就是returnreturn语句返回数据类型。语句返回数据类型。第19页第19页(3 3)在定义函数时指定函数类型普通应当和在定义函数时指定函数类型普通应当和returnreturn语句语句中表示式类型一致。中表示式类型一致。假如函数值类型和假

20、如函数值类型和return语句中表示式值不一致,则以语句中表示式值不一致,则以函函数类型为准数类型为准。对数值型数据,能够自动进行类型转换。即。对数值型数据,能够自动进行类型转换。即函数类型决定返回值类型。函数类型决定返回值类型。(4 4)对于不带回值函数,应当用对于不带回值函数,应当用“void”“void”定义函数为定义函数为“无类型无类型”(或称(或称“空类型空类型”)。这样,系统就确保不使函)。这样,系统就确保不使函数带回任何值,即严禁在调用函数中使用被调用函数返回数带回任何值,即严禁在调用函数中使用被调用函数返回值。此时在函数体中不得出现值。此时在函数体中不得出现returnretu

21、rn语句。语句。第20页第20页例 返回值类型与函数类型不同#include void main()()int max(float,float);函数申明函数申明 float,;,;int;scanf(,);(,);max(,);(,);printf(“max is,);,);int max(float,float)float;/*z为实型变量为实型变量*/?;return();();运营情况下列:运营情况下列:1.51.5,2.5 2.5max is max is 第21页第21页4.3 4.3 函数调用函数调用 函数调用普通形式函数调用普通形式函数调用普通形式函数调用普通形式函数调用普通形

22、式为函数调用普通形式为:函数名函数名(实参表)(实参表)假如实参表列包括多个实参,则各参数间用逗号隔开。假如实参表列包括多个实参,则各参数间用逗号隔开。实参与形参个数应相等,类型应匹配。实参与形参按实参与形参个数应相等,类型应匹配。实参与形参按顺序相应,一一传递数据。顺序相应,一一传递数据。假如是调用无参函数,则假如是调用无参函数,则“实参表实参表”能够没有,但括能够没有,但括弧不能省略。弧不能省略。第22页第22页例例 实参求值顺序实参求值顺序#include void main()int f(int a,int b);/*函数申明函数申明*/int i=2,p;p=f(i,+i);/*函数

23、调用函数调用*/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页第23页假如按自左至右顺序求实参值,假如按自左至右顺序求实参值,则函数调用相称于(,)则函数调用相称于(,)假如按假如按从右至左从右至左顺序求实参值,则顺序求实参值,则函数调用相称于(函数调用相称于(3,),)普通选择普通选择从右至左。结果为:从右至左。结果为:0 对于函数调用对于函数调用 int i=2,p;p=f(i,+i);第24页第24页4.3.4.3.函数调用方式函数调用方

24、式函数语句函数语句把函数调用作为一个语句。如例把函数调用作为一个语句。如例1中中printstar();这时不要;这时不要求函数带回值,只要求函数完毕一定操作。求函数带回值,只要求函数完毕一定操作。函数表示式函数表示式函数出现在一个表示式中,这种表示式称为函数出现在一个表示式中,这种表示式称为函数表示式函数表示式。这时要求函数带回一个拟定值以参与表示式运算。比如这时要求函数带回一个拟定值以参与表示式运算。比如:*max*max(,);(,);按函数在程序中出现位置来分,能够有三种调用方式按函数在程序中出现位置来分,能够有三种调用方式第25页第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对被调用函数申明和函数原型对被调用函数申明

26、和函数原型在一个函数中调用另一个函数需要具备哪些条件:在一个函数中调用另一个函数需要具备哪些条件:被调用函数已经存在(库函数或用户自定义);被调用函数已经存在(库函数或用户自定义);使用库函数或别文献中函数,应当在本文献开头用使用库函数或别文献中函数,应当在本文献开头用#include命令将相关编译预处理信息包括到本文献中来。命令将相关编译预处理信息包括到本文献中来。例:例:使用输入输出函数使用输入输出函数#include“stdio.h”使用数学函数使用数学函数#include“math.h”若使用用户自己定义函数,并且该函数与主调函数在同一个若使用用户自己定义函数,并且该函数与主调函数在同

27、一个文献中,则需在主调函数中对被调用函数进行阐明。文献中,则需在主调函数中对被调用函数进行阐明。阐明形式阐明形式 类型名类型名 函数名(类型函数名(类型1 变量变量1,类型,类型n 变量变量n);第27页第27页函数原型普通形式为函数原型普通形式为(1)(1)函数类型函数类型 函数名函数名(参数类型参数类型1 1,参数类型,参数类型2)2);(2)(2)函数类型函数类型 函数名函数名(参数类型参数类型1 1,参数名,参数名1 1,参数类型,参数类型2 2,参数名,参数名2)2);申明作用申明作用是把函数名、函数参数个数和参数类型等信是把函数名、函数参数个数和参数类型等信息告知编译系统,以便在碰

28、到函数调用时,编译系统能正息告知编译系统,以便在碰到函数调用时,编译系统能正确辨认函数并检查调用是否合法。确辨认函数并检查调用是否合法。(比如函数名是否正(比如函数名是否正确,实参与形参类型和个数是否一致)。确,实参与形参类型和个数是否一致)。第28页第28页#include void main()()int max(float,float);函数原型申明函数原型申明 float,;,;int;scanf(,);(,);max(,);(,);printf(“max is,);,);int max(float,float)float;/*z为实型变量为实型变量*/?;return();();第2

29、9页第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页改写例改写例#inclu

30、de 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页第31页4.4 函数嵌套调用函数嵌套调用1、被调函数在调用过程中,调用其它函数称为函被调函数在调用过程中,调用其它函数称为函数嵌套调用。数嵌套调用。2、函数能够嵌套调用,不允许嵌套定义。函数能够嵌套调用,不允许嵌套定义。一个函数不能定义在其它函数

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

32、er=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页第34页4.5 函数递归调用函数递归调用 在调用一个函数过程中又出现直接或间在调用一个函数过程中又出现直接或间接地调用该函数本身,称为函数递归调接地调用该函数本身,称为函数递归调用。比如:用。比如:例例7 7:用递

33、归办法求!:用递归办法求!求!也能够用递归办法,即!等于!求!也能够用递归办法,即!等于!,而!,而!。可用下面递归公式表示:!。可用下面递归公式表示:!(,)(,)()!()!()()第35页第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;for(i=1;i1)求n!与求(n-1)!方法是一样,只是参数值不同。第36页第36页 long fac(int n)long f;if(n=0)f=1;/*递归结束条

34、件递归结束条件*/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页第37页 当输入当输入3时时,函数调用过程下列:函数调用过程下列:回推阶段回推阶段main()fac函数函数 fac函数函数 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

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

36、人,又说比第个人大岁。问第个人,说比第个人大岁。最后问第个人,他说是岁。说比第个人大岁。最后问第个人,他说是岁。请问第个人多大。请问第个人多大。age()()age()()age()()age()()age()()age()()age()()age()()age()()10能够用数学公式表述下列:能够用数学公式表述下列:age()()()()age(-)()()第39页第39页能够用一个函数来描述上述递归过程:能够用一个函数来描述上述递归过程:int age(int)*求年龄递归函数求年龄递归函数*int;*存储函数返回值变量存储函数返回值变量*if(=1)=10;else =age(n-1)

37、;);return();();用一个主函数调用用一个主函数调用age函数,求得第函数,求得第5人年龄。人年龄。#include void main()()printf(,age();();运营结果下列:运营结果下列:18第40页第40页例例8:斐波那契数列:斐波那契数列:1,1,2,3,5,8,13,21,#includeint fibonacci(int n)if(n=2)return 1;else return fibonacci(n-1)+fibonacci(n-2);void main()int n;scanf(“%d”,&n);printf(“%dn”,fibonacci(n);递归

38、结束递归结束条件条件迫近递归结束迫近递归结束条件条件第41页第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对兔子对兔子,2,1);while(k=n)h=a1+a2;printf(n第第%d月有月有%d对兔子对兔子,k,h);a1=a2;a2=h;k+;第42页第42页例

39、例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页第43页第44页第44页第45页第45页C语言中变量:v1、数据类型v2、作用域 由变量定义位置决定局部变量局部变量和全局变量全局变量v3、生命期 由变量在内存中储存方式决定静态存储类静态存储类和和动态存储类动态存储类第46页第46页4.6局部变量和全局变量局部变量

40、和全局变量4.6.14.6.1局部变量局部变量局部变量局部变量在一个函数内部定义变量是内部变量,它只在本在一个函数内部定义变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才干函数范围内有效,也就是说只有在本函数内才干使用它们,在此函数以外是不能使用这些变量。使用它们,在此函数以外是不能使用这些变量。这称为这称为“局部变量局部变量”。第47页第47页float f1(int a)/*函数函数f1*/int b,c;b、c有效有效 char f2(int x,int y)/*函数函数f2*/int i,j,b;x、y、i、j,b有效有效 void main()/*主函数主函数*/in

41、t m,n;m、n有效有效 第48页第48页(1)主函数中定义变量主函数中定义变量(m,n)也只在主函数中有效也只在主函数中有效(使用使用),而不由于在而不由于在主函数中定义而在整个文献或程序中有效。主函数也不能使用其主函数中定义而在整个文献或程序中有效。主函数也不能使用其它函数中定义变量。它函数中定义变量。(2)不同函数中能够使用相同名字变量,它们代表不同对象,互不干扰。比如,上面在f1函数中定义了变量b和c,倘若在f2函数中也定义变量b和c,它们在内存中占不同单元,互不混同。(3)形式参数也是局部变量。比如上面形式参数也是局部变量。比如上面f1函数中形参函数中形参a,也只在也只在f1函数函

42、数中有效。其它函数能够调用中有效。其它函数能够调用f1函数,但不能引用函数,但不能引用f1函数形参函数形参a。(4)在一个函数内部在一个函数内部,能够在复合语句中定义变量能够在复合语句中定义变量,这些变量只在本复这些变量只在本复合合语句中有效语句中有效,这种复合语句也称为这种复合语句也称为“分程序分程序”或或“程序块程序块”。阐明阐明第49页第49页习题习题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);

43、i=1在复合语句之外范围内有效在复合语句之外范围内有效 输出输出结果:结果:1,6,3,2,3第50页第50页4.6.2 全局变量全局变量在函数内定义变量是局部变量,而在函数之外定义变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可认为本文献中其他函数所共用。它有效范围为从定义变量位置开始到本源文献结束。注意:同一文献中,允许全局变量同名,在局注意:同一文献中,允许全局变量同名,在局部变量作用域内,全局变量不起作用。部变量作用域内,全局变量不起作用。第51页第51页int p=1,q=5;/*p和和q 全局(外部)变量全局(外部)变量*/float f1(int a)/*定义函数

44、定义函数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页第52页4.7 变量存储类别变量存储类别 4.7.1 4.7.1 动态存储方式与静态存储方式动态存储方式与静态存储方式动态存储方式与静态存储方式动态存储方式与静态存储方式 前面已简介了从前面已简介了从变量作用域(即从空间)角度变量作用域(即从空间)角度来分,有来分,有全

45、局变量全局变量和和局部变量局部变量。那么从。那么从变量值存在时间(即生存变量值存在时间(即生存期)角度期)角度来分,又能够有来分,又能够有静态存储方式静态存储方式和和动态存储方式动态存储方式。所谓所谓静态存储方式静态存储方式是指在程序运营期间由系统分是指在程序运营期间由系统分派固定存储空间方式。而派固定存储空间方式。而动态存储方式动态存储方式则是在程则是在程序运营期间依据需要进行动态分派存储空间方式。序运营期间依据需要进行动态分派存储空间方式。第53页第53页在语言中每一个变量和函数有两个属性:数据类型和数在语言中每一个变量和函数有两个属性:数据类型和数据存储类别。据存储类别。对数据类型,读者

46、已熟悉(如整型、字符型等)。对数据类型,读者已熟悉(如整型、字符型等)。存储类别指是数据在内存中存储方式。存储类别指是数据在内存中存储方式。存储方式分为两大类:存储方式分为两大类:静态存储类静态存储类和和动态存储类动态存储类。详细包括四种:详细包括四种:自动自动(auto),),静态静态(static),),存储器存储器(register),),外部外部(extern)。第54页第54页4.7.2 auto4.7.2 auto变量变量变量变量(1)自动变量,只在定义函数内有效;函数被调用时分派存放空 间,调用结束就释放。定义形式为:auto 数据类型 变量表;其中auto能够省略 动态存放变量

47、能够是函数形式参数、局部变量、函数调用时返回地址。自动变量定义时不初始化,则其值是不确定。假如初始化,则赋初值操作是在调用时进行,且每次调用都要重新赋一次初值。在复合语句中定义自动变量,只在该复合语句中有效。在不同函数或复合语句中允许使用同名变量而不会混同。第55页第55页4.7.34.7.3用用用用staticstatic申明局部变量申明局部变量申明局部变量申明局部变量在函数体(或复合语句)内部,用下列定义格式定义变在函数体(或复合语句)内部,用下列定义格式定义变量称为静态局部变量:量称为静态局部变量:static 数据类型数据类型 变量表;变量表;比如:比如:static int a=8;

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

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信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 

客服