C语言-函数省公共课一等奖全国赛课获奖课件.pptx
《C语言-函数省公共课一等奖全国赛课获奖课件.pptx》由会员分享,可在线阅读,更多相关《C语言-函数省公共课一等奖全国赛课获奖课件.pptx(119页珍藏版)》请在咨信网上搜索。
第八章第八章第1页8.18.1概述概述 一个较大程序可分为若干个程序模块程序模块,每一个模块用来实现一个特定功效。在高级语言中用子程序子程序实现模块功效。子程序由函数来完成。一个程序可由一个主函数和若干个其它函数组成。由主函数调用其它函数,其它函数也能够相互调用。由主函数调用其它函数,其它函数也能够相互调用。同一个函数能够被一个或多个函数调用任意屡次。同一个函数能够被一个或多个函数调用任意屡次。函数间调用关系函数间调用关系第2页#include void main()void printstar();/*对对printstar函数申明函数申明*/void print_message();/*对对print_message函数申明函数申明*/printstar();*调用调用printstar函数函数*print_message();/*调用调用print_message函数函数*/printstar();*调用调用printstar函数函数*/例例8.18.1先举一个函数调用简单例子先举一个函数调用简单例子第3页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页 说明:(1)一个程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。对较大程序,一般不希望把全部内容全放在一个文件中,而是将他们分别放在若干个源文件中,再由若干源程序文件组成一个C程序。这么便于分别编写、分别编译,提高调试效率。一个源程序文件可认为多个C程序公用。第5页(2 2)一个源程序文件由一个或多个函数以及其它相关内容(如命令行、数据定义等)组成。一个源程序文件是一个编译单位,在程序编译时是以源程序文件为单位进行编译,而不是以函数为单位进行编译。(3 3)程序执行是从函数开始,如是在函数中调用其它函数,在调用后流程返回到函数,在函数中结束整个程序运行。第6页(4 4)全部函数都是平行,即在定义函数时是分别进行,是相互独立。一个函数并不隶属于另一函数,即函数不能嵌套定义。函数间能够相互调用,但不能调用函数。函数是系统调用。第7页(5 5)从用户使用角度看,函数有两种:标标准准函函数数,即库函数。这是由系统提供,用户无须自己定义这些函数,能够直接使用它们。应该说明,不一样C系统提供库函数数量和功效会有一些不一样,当然许多基本函数是共同。用用户户自自己己定定义义函函数数。用以处理用户专门需要。第8页(6 6)从函数形式看,函数分两类:无无 参参 函函 数数。如 例 8.1中 printstar和print_message就是无参函数。在调用无参函数时,主调函数不向被调用函数传递数据。无参函数普通用来执行指定一组操作。比如,例8程序中printstar函数。有有参参函函数数。在调用函数时,主调函数在调用被调用函数时,经过参数向被调用函数传递数据,普通情况下,执行被调用函数时会得到一个函数值,供主调函数使用。第9页8.函数定义普通形式函数定义普通形式 8.2.1.8.2.1.无参函数定义普通形式无参函数定义普通形式无参函数定义普通形式无参函数定义普通形式 定义定义无参函数无参函数普通形式为普通形式为:类型标识符类型标识符函数名函数名()()申明部分申明部分 语句部分语句部分 在定义函数时要用“类型标识符”指定函数值类型,即函数带回来值类型。例8.中printstar和print_message函数为void类型,表示不需要带回函数值。第10页8.2.2.有参函数定义普通形式有参函数定义普通形式 定义定义有参函数有参函数普通形式为普通形式为:类型标识符类型标识符函数名函数名(形式参数表列)(形式参数表列)申明部分申明部分 语句部分语句部分 比如:比如:(int,int);/*函数体中申明部分*?;();第11页8.2.3 空函数空函数 定义定义空函数空函数普通形式为普通形式为:类型标识符类型标识符函数名函数名()()比如:比如:()()调用此函数时,什么工作也不做,没有任何实际作用。在主调函数中写上“();”表明“这里要调用一个函数”,而现在这个函数没有起作用,等以后扩充函数功效时补充上。第12页8.函数参数和函数值函数参数和函数值 8 8.形式参数和实际参数形式参数和实际参数形式参数和实际参数形式参数和实际参数 在前面提到有参函数中,在定义函数时函数名后面括弧中变量名称为“形式参数”(简称“形参形参”),在主调函数中调用一个函数时,函数名后面括弧中参数(能够是一个表示式)称为“实际参数”(简称“实参实参”)。return后面括弧中值()作为函数带回值(称函数返回值函数返回值)。第13页在不一样函数之间传递数据,能够使用法:参数:经过形式参数和实际参数返回值:用return语句返回计算结果全局变量:外部变量大多数情况下,主调函数和被调用函数之间有数据传递关系。第14页#include#include void void()()int max(int int max(int,int int);/*/*对函数申明对函数申明*/*/int int,;,;scanf scanf(,);(,);(,);(,);printf printf(,);,);例例8.8.调用函数时数据传递调用函数时数据传递 第15页int max(int int max(int,int int)*定义有参函数定义有参函数max*max*int int;?;return return();();运行情况以下:,第16页经过函数调用,使两个函数中数据发生联络经过函数调用,使两个函数中数据发生联络 第17页关于形参加实参说明:关于形参加实参说明:(1)在定义函数中指定形参,在未出现函数调用时,它们并不占内存中存放单元。只有在发生函数调用时,函数中形参才被分配内存单元。在调用结束后,形参所占内存单元也被释放。(2)实参能够是常量、变量或表示式,如:(,);但要求它们有确定值。在调用时将实参值赋给形参。第18页(3)在被定义函数中,必须指定形参类型(见例8.2程序中“(,);(,);”)。(4)实参加形参类型应相同或赋值兼容。例8中实参和形参都是整型。假如实参为整型而形参x为实型,或者相反,则按第3章介绍不一样类型数值赋值规则进行转换。比如实参值a为3.5,而形参x为整型,则将实数3.5转换成整数3,然后送到形参b。字符型与整型能够相互通用。第19页(5)在语言中,实参向对形参数据传递是“值传递”,单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不一样单元。第20页在调用函数时,给形参分配存放单元,并将实参对应值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。所以,在执行一个被调用函数时,形参值假如发生改变,并不会改变主调函数实参值。比如,若在执行函数过程中和值变为和,而和仍为和。第21页8.3.2 8.3.2 函数返回值函数返回值通常,希望经过函数调用使主调函数能得到一个确定值,这就是函数返回值函数返回值。比如,例8.中,(,)值是,(,)值是5。赋值语句将这个函数值赋给变量。关于函数返回值一些说明:关于函数返回值一些说明:(1)(1)函数返回值是经过函数中函数返回值是经过函数中returnreturn语句取得。语句取得。第22页假如需要从被调用函数带回一个函数值供主调函数使用,被调用函数中必须包含return语句。假如不需要从被调用函数带回函数值能够不要return语句。一个函数中能够有一个以上return语句,执行到哪一个return语句,哪一个语句起作用。return语句后面括弧也能够不要,如如:“:“return ;”;”等价于等价于“return();();”return语句将被调用函数中一个确定值带回主调函数中去。见图8.2中从return语句返回箭头。第23页return后面值能够是一个表示式。比如,例8中函数能够改写成:(int,int)(?););(2)(2)函数返回值应该属于某一个确定类型,函数返回值应该属于某一个确定类型,在在定义函数时指定函数返回值类型定义函数时指定函数返回值类型。第24页比如比如:下面是下面是3 3个函数首行:个函数首行:int max(float,float)/*函数值为整型*/char letter(char c1,char c2)/*函数值为字符型*/double min(int,int)/*函数值为双精度型*/在语言中,凡不加类型说明函数,自动按整型处理。例8.中函数首行函数类型int能够省写,用Turbo C 2.0编译程序时能经过,但用Turbo C 3.0编译程序时不能经过,因为C+要求全部函数都必须指定函数类型。所以,提议在定义时对全部函数都指定函数类型。第25页(3 3)在定义函数时指定函数类型普通应该和在定义函数时指定函数类型普通应该和returnreturn语句中表示式类型一致。语句中表示式类型一致。假如函数值类型和return语句中表示式值不一致,则以函数类型为准。对数值型数据,能够自动进行类型转换。即函数类型决定返回值类型。(4 4)对于不带回值函数,应该用对于不带回值函数,应该用“void”“void”定义定义函数为函数为“无类型无类型”(或称(或称“空类型空类型”)。这么,)。这么,系统就确保不使函数带回任何值,即禁止在调系统就确保不使函数带回任何值,即禁止在调用函数中使用被调用函数返回值。此时在函数用函数中使用被调用函数返回值。此时在函数体中不得出现体中不得出现returnreturn语句。语句。第26页例例 8.8.返回值类型与函数类型不一样返回值类型与函数类型不一样#include void main()()int(float,float);float,;,;int;scanf(,);(,);(,);(,);printf(,);,);int max(float,float)float;/*z为实型变量为实型变量*/?;return();();运行情况以下:,Max is 第27页8.8.函数调用函数调用 8.8.函数调用普通形式函数调用普通形式函数调用普通形式函数调用普通形式函数调用普通形式为函数调用普通形式为:函数名函数名(实参表列)(实参表列)假如实参表列包含多个实参,则各参数间用逗号隔开。实参加形参个数应相等,类型应匹配。实参加形参按次序对应,一一传递数据。假如是调用无参函数,则“实参表列”能够没有,但括弧不能省略。第28页假如实参表列包含多个实参,对实参求值次序并不是确定,有系统按自左至右次序求实参值,有系统则按自右至左次序。许多版本是按自右而左次序求值,比如Tubro+。第29页例例 8 8 实参求值次序实参求值次序#include void main()int f(int a,int b);/*函数申明函数申明*/int i=2,p;p=f(i,+i);/*函数调用函数调用*/printf(%dn,p);第30页int f(int a,int b)/*函数定义函数定义*/int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);第31页假如按自左至右次序求实假如按自左至右次序求实参值,则函数调用相当于参值,则函数调用相当于(,)(,)假如按自左至右次序求实假如按自左至右次序求实参值,则函数调用相当于参值,则函数调用相当于(3,),)对于函数调用对于函数调用 int i=2,p;p=f(i,+i);第32页8.8.函数调用方式函数调用方式函数语句函数语句把函数调用作为一个语句。如例8.1中printstar(),这时不要求函数带回值,只要求函数完成一定操作。函数表示式函数表示式函数出现在一个表示式中,这种表示式称为函数表示函数表示式式。这时要求函数带回一个确定值以参加表示式运算。比如:*(,);(,);第33页函数参数函数参数函数调用作为一个函数实参。比如:m=max(a,max(b,c);其中max(b,c)是一次函数调用,它值作为max另一次调用实参。m值是a、b、c三者中最大者。又如:printf(%d,max(a,b);也是把max(a,b)作为printf函数一个参数。函数调用作为函数参数,实质上也是函数表示式形式调用一个,因为函数参数原来就要求是表示式形式。第34页8.对被调用函数申明和函数原型对被调用函数申明和函数原型(1)首先被调用函数必须是已经存在函数(是库函数或用户自己定义函数)。但光有这一条件还不够。8.对被调用函数申明和函数原型对被调用函数申明和函数原型第35页(3)假如使用用户自己定义函数,而该函数位置在调用它函数(即主调函数)后面(在同一个文件中),应该在主调函数中对被调用函数作申明对被调用函数作申明。(2)假如使用库函数,还应该在本文件开头用命令将调用相关库函数时所需用到信息“包含”到本文件中来。第36页函数原型普通形式为函数原型普通形式为(1)(1)函数类型函数类型 函数名函数名(参数类型参数类型1 1,参数,参数类型类型2)2);(2)(2)函数类型函数类型 函数名函数名(参数类型参数类型1 1,参数,参数名名1 1,参数类型,参数类型2 2,参数名,参数名2)2);第37页“申明申明”一词原文是delaration,过去在许多书中把它译为“说明”。申明作用申明作用是把函数名、函数参数个数和参数类型等信息通知编译系统,方便在碰到函数调用时,编译系统能正确识别函数并检验调用是否正当。(比如函数名是否正确,实参加形参类型和个数是否一致)。第38页注意:注意:函数函数“定义定义”和和“申明申明”不是一回不是一回事事。函数定义函数定义是指对函数功效确实立,包含指定函数名,函数值类型、形参及其类型、函数体等,它是一个完整、独立函数单位。而函数申明函数申明作用则是把函数名字、函数类型以及形参类型、个数和次序通知编译系统,方便在调用该函数时系统按此进行对照检验。第39页#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););例例8 对被调用函数作申明对被调用函数作申明第40页假如假如 被调用函数定义出现在主调函数之前,能够无须加以申明。因为编译系统已经先知道了已定义函数相关情况,会依据函数首部提供信息对函数调用作正确性检验。假如假如 被调用函数定义出现在主调函数之前,能够无须加以申明。因为编译系统已经先知道了已定义函数相关情况,会依据函数首部提供信息对函数调用作正确性检验。第41页改写例改写例 8.#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););第42页8.函数嵌套调用函数嵌套调用嵌套定义就是在定义一个函数时,其函数体内又包含另一个函数完整定义。语言不能嵌套定义函数,但能够嵌套调用函数,也就是说,在调用一个函数过程中,又调用另一个函数。第43页第44页例例 8.8.用弦截法求方程用弦截法求方程 f(x)=x3-5x2+16x-80=0 f(x)=x3-5x2+16x-80=0 根根 第45页(1)取两个不一样点x1,x2,假如f(x1)和f(x2)符号相反,则(x1,x2)区间内必有一个根。假如f(x1)与f(x2)同符号,则应改变x1,x2,直到f(x1)、f(x2)异号为止。注意x1、x2值不应差太大,以确保(x1,x2)区间内只有一个根。(2)连接(x1,f(x1)和(x2,f(x2)两点,此线(即弦)交x轴于x。方法:方法:第46页(3)(3)若f(x)与f(x1)同符号,则根必在(x,x2)区间内,此时将x作为新x1。假如f(x)与f(x2)同符号,则表示根在(x1,x)区间内,将x作为新x2。(4)(4)重复步骤(2)和(3),直到 f(x)为止,为一个很小数,比如 10-6.此时认为 f(x)0 第47页N-S流程图流程图 第48页分别用几个函数来实现各部分功效分别用几个函数来实现各部分功效:(1)用函数f(x)代表x函数:x3-5x2+16x-80.(2)用函数调用xpoint(x1,x2)来求(x1,f(x1)和 (x2,f(x2)连线与x轴交点x坐标。(3)用函数调用root(x1,x2)来求(x1,x2)区间 那个实根。显然,执行root函数过程中要用 到函数xpoint,而执行xpoint函数过程中要用 到f函数。第49页 float f(float x)*定义函数,以实定义函数,以实 现现f(x)x3-5x2+16x-80*;=(-.)*+.)*-.;();();第50页float xpoint(float x1,float x2)*定义定义xpoint函数,求出弦与函数,求出弦与x轴交点轴交点*/;=(*()()-*()()()()-();();();();第51页float root(float,float)/*定义定义root函数,求近似根函数,求近似根*/,;,;();();do (,);(,);();();if(*)/*()与与()同符号同符号*/;while()().););();();第52页 void main()()主函数主函数float,;,;do printf(,:);,:);scanf(,);(,);();();();();while(*););(,);(,);printf(root of equation is .n,);运行情况以下:运行情况以下:,:,root of equation is 第53页8函数递归调用函数递归调用 在在调调用用一一个个函函数数过过程程中中又又出出现现直直接接或或间间接接地地调调用用该该函函数数本本身身,称称为为函函数数递递归归调调用用。语语言言特特点之一就在于允许函数递归调用。比如:点之一就在于允许函数递归调用。比如:(int),;,;();();return(*););第54页第55页例例 8 有个人坐在一起,问第个人多少岁?有个人坐在一起,问第个人多少岁?他说比第个人大岁。问第个人岁数,他说比第他说比第个人大岁。问第个人岁数,他说比第个人大岁。问第个人,又说比第个人大岁。个人大岁。问第个人,又说比第个人大岁。问第个人,说比第个人大岁。最终问第个人,问第个人,说比第个人大岁。最终问第个人,他说是岁。请问第个人多大。他说是岁。请问第个人多大。()()()()()()()()()()()()()()()()()()能够用数学公式表述以下:能够用数学公式表述以下:()()()()()()()第56页能够用一个函数来描述上述递归过程:能够用一个函数来描述上述递归过程:int age(int)*求年纪递归函数求年纪递归函数*int;*用作存放函数返回值变量用作存放函数返回值变量*if()();else ();();return();();用一个主函数调用用一个主函数调用age函数,求得第函数,求得第5人年纪。人年纪。#include void main()()(,();,();运行结果以下:运行结果以下:第57页例例8.8.用递归方法求!用递归方法求!求!也能够用递归方法,即!等于求!也能够用递归方法,即!等于!,而!,而!。!。可用下面递归公式表示:可用下面递归公式表示:!(,)(,)()!()!()()第58页例例 8.8.(汉诺)塔问题(汉诺)塔问题。这。这是一个古典数学问题,是一个用递归方法解题是一个古典数学问题,是一个用递归方法解题经典例子。问题是这么:古代有一个梵塔,塔经典例子。问题是这么:古代有一个梵塔,塔内有内有3 3个座个座A A、B B、C C,开始时座上有个盘,开始时座上有个盘子,盘子大小不等,大在下,小在上(见图子,盘子大小不等,大在下,小在上(见图8 8)。有一个老和尚想把这个盘子从)。有一个老和尚想把这个盘子从座移到座,但每次只允许移动一个盘,且座移到座,但每次只允许移动一个盘,且在移动过程中在在移动过程中在3 3个座上都一直保持大盘在下,个座上都一直保持大盘在下,小盘在上。在移动过程中能够利用座,要求小盘在上。在移动过程中能够利用座,要求编程序打印出移动步骤。编程序打印出移动步骤。第59页第60页为便于了解,我们先分析将座上个盘子移到座上过程:(1)将座上个盘子移到座上(借助);(2)将座上个盘子移到座上;(3)将座上个盘子移到座上(借助)。其中第()步能够直接实现。第步又可用递归方法分解为:将上个盘子从移到;将上个盘子从移到;将上个盘子从移到。第()步能够分解为:将上个盘子从移到上;将上个盘子从移到上;将上个盘子从移到上。将以上综合起来,可得到移动3个盘子步骤为,。第61页由上面分析可知:将个盘子从座移到座能够分解为以下3个步骤:(1)将上个盘借助座先移到座上。(2)把座上剩下一个盘移到座上。(3)将个盘从座借助于座移到座上。第62页程序以下:程序以下:#include void main()void hanoi(int n,char one,char two,char three);/*对对hanoi函数申明函数申明*/int m;printf(input the number of diskes:);scanf(“%d”,&m);printf(The step to moveing%d diskes:n,m);hanoi(m,A,B,C);第63页void hanoi(int n,char one,char two,char three)/*定义定义hanoi函数函数,将个盘从将个盘从one座借助座借助two座,移座,移到到three座座*/void move(char x,char y);/*对对move函数申明函数申明*/if(n=1)move(one,three);else hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);void move(char x,char y)/*定义定义move函数函数*/printf(“%c-%cn,x,y);第64页运行情况以下:运行情况以下:input the number of diskes:3 The steps to noving 3 diskes:第65页8.数组作为函数参数数组作为函数参数8.7.1 8.7.1 数组元素作函数实参数组元素作函数实参数组元素作函数实参数组元素作函数实参因因为为实实参参能能够够是是表表示示式式,而而数数组组元元素素能能够够是是表表示示式式组组成成部部分分,所所以以数数组组元元素素当当然然能能够够作作为为函函数数实实参参,与与用用变变量量作作实实参参一一样样,是是单单向向传传递递,即即“值值传传送送”方式。方式。例例8.有有两两个个数数组组和和,各各有有个个元元素素,将将它它们们对对应应地地逐逐一一相相比比(即即与与比比,与与比比)。假假如如数数组组中中元元素素大大于于数数组组中中对对应应元元素素数数目目多多于于b数数组组中中元元素素大大于于a数数组组中中对对应应元元素素数数目目(比比如如,aibi6次次,biai3次次,其其中中i每每次次为为不不一一样样值值),则则认认为为a数数组组大大于于b数数组组,并并分分别别统统计计出出两两个个数数组组对对应应元元素素大大于、等于、小于次数。于、等于、小于次数。第66页#include void main()()int large(int x,int y);/*函数申明函数申明*/int 10,10,,;,;printf(enter array a););for(;(;)scanf(,);,);printf(););printf(enter array););for(;(;)scanf(,);,);printf(););for(;)(;)if(large(i,i)=);else if(large(i,i)=)=+;else;第67页printf(aibi%d timesnai=bi%d timesnaik)printf(array a is larger than array bn);else if(nk)printf(array a is smaller than array bn);else printf(array is equal to array bn);large(int,int)int;if();();else if()()flag;else flag;return(flag););第68页运行情况以下:运行情况以下:enter array a:5 3 8 9 1 3 5 6 0 4 array a is smaller thann array b第69页8.7.2 数组名作函数参数数组名作函数参数 能能够够用用数数组组名名作作函函数数参参数数,此此时时形形参参应应该该用用数数组组名名或用指针变量或用指针变量。例例8.11 有一个一维数组,内放有一个一维数组,内放个学生成绩,求平均成绩。个学生成绩,求平均成绩。第70页#include void main()()float average(float array10);/*函数申明函数申明*/float score10,aver;int;printf(input scores:););for(;(;scanf(,score););printf(););averaverage(score););printf(average score is.n,aver););第71页float average(float array10)int;float aver,;,;for (;);return(aver););运行情况以下:运行情况以下:input scores:.5 .5 average score is 83.40 第72页例例 8.形参数组不定义长度形参数组不定义长度#include void main()()float average(float ,int)float score_15,.,;float score_210=67.5,89.5,99,6.5,77,89.5,76.5,54,60,99.5;printf(“the average of class A is%6.2fn”,average(score_1,5);printf(“the average of class B is%6.2fn”,average(score_2,10);第73页float average(float ,int)int;float aver,;,;for(;(;sumsumarray;aversum;return();();运行结果以下:运行结果以下:the average of class A is 80.40The average of class is 78.20第74页例例 8.13 用选择法对数组中用选择法对数组中10个整数按由个整数按由小到大排序。所谓选择法就是先将小到大排序。所谓选择法就是先将10个数个数中最小数与中最小数与a0对换对换;再将再将a1到到a9中最小数与中最小数与a1对换对换每比较每比较一轮一轮,找出一个未经排序数中最小一个。找出一个未经排序数中最小一个。共比较共比较9轮。轮。第75页a0 a1 a2 a3 a4 3 6 1 9 4 未排序时情况未排序时情况 1 6 3 9 4 将将5个数中最小数个数中最小数1与与a0对换对换 1 3 6 9 4 将余下将余下4个数中最小数个数中最小数3与与a1对换对换 1 3 4 9 6 将余下将余下3个数中最小数个数中最小数4与与a2对换对换 1 3 4 6 9 将余下将余下2个数中最小数个数中最小数6与与a3对对 换,至此完成排序换,至此完成排序 第76页程序实例程序实例#include void main()()void sort(int,int);int,;,;printf(enter the array););for(;(;scanf(,);,);sort(,);(,);printf(the sorted array););for(;(;printf(,);,);printf(););第77页void sort(int,int)int,;,;for(;)(;);for(;)(;)if(array array=;=arrayk;arrayk=arrayi;arrayi=t 第78页8.7.3.多维数组名作函数参多维数组名作函数参数数程序以下:程序以下:#include void main()()max_value(int 4);int 34=1,3,5,7,2,4,6,8,15,17,34,12;printf(max value is,max_value(a)););第79页max_value(int array 4)int,;,;=;(=;);)(;(;(array)=array;return();();运行结果以下:运行结果以下:Max value is 34第80页8.8局部变量和全局变量局部变量和全局变量8.8.18.8.1局部变量局部变量局部变量局部变量在一个函数内部定义变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量。这称为“局部变量”。第81页float f1(int a)/*函数函数f1*/int b,c;a、b、c有效有效 char f2(int x,int y)/*函数函数f2*/int i,j;x、y、i、j有效有效 void main()/*主函数主函数*/int m,n;m、n有效有效 第82页(1)主函数中定义变量(m,n)也只在主函数中有效,而不因为在主函数中定义而在整个文件或程序中有效。主函数也不能使用其它函数中定义变量。(2)不一样函数中能够使用相同名字变量,它们代表不一样对象,互不干扰。比如,上面在f1函数中定义了变量b和c,倘若在f2函数中也定义变量b和c,它们在内存中占不一样单元,互不混同。(3)形式参数也是局部变量。比如上面f1函数中形参a,也只在f1函数中有效。其它函数能够调用f1函数,但不能引用f1函数形参a。(4)在一个函数内部,能够在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为“分程序”或“程序块”。说说明明第83页void main()int a,b;int c;c=a+b;c在此范围内有效在此范围内有效 a,b在此范围内有效在此范围内有效 第84页8.8.2 全局变量全局变量在函数内定义变量是局部变量,而在函数之外定义变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可认为本文件中其他函数所共用。它有效范围为从定义变量位置开始到根源文件结束。第85页int p=1,q=5;/*外部变量外部变量*/float f1(int a)/*定义函数定义函数f1*/int b,c;char c1,c2;/*外部变量外部变量*/char f2(int x,int y)/*定义函数定义函数f2*/int i,j;全局变量全局变量p,q作用范围作用范围 全局变量全局变量c1,c2作用范围作用范围void main()/*主函数主函数*/int m,n;第86页例例 8.15 有一个一维数组,内放个学生成绩,写有一个一维数组,内放个学生成绩,写一个函数,求出平均分、最高分和最低分。一个函数,求出平均分、最高分和最低分。#include float Max,Min;*全局变量全局变量*void main()()float average(float array,int n);float ave,score10;int;for(;)(;)scanf(,);,);ave=average(,);(,);printf(“max=%6.2fnmin=%6.2fn average=%6.2fn“,Max,Min,ave);第87页float average(float array,int n)*定义函数,形参为数组定义函数,形参为数组*/int;float aver,sum=array;Max=Min=array;for(=;);)if(arrayMax)Maxarray;else if(arrayMin)Min array;sum=sum+array;aver;return();();运行情况以下:运行情况以下:第88页第89页提议不在必要时不要使用全局变量,原因以下:全局变量在程序全部执行过程中都占用存放单元,而不是仅在需要时才开辟单元。使用全局变量过多,会降低程序清楚性,人们往往难以清楚地判断出每个瞬时各个外部变量值。在各个函数执行时都可能改变外部变量值,程序轻易犯错。所以,要限制使用全局变量。第90页它使函数通用性降低了,因为函数在执行时要依赖于其所在外部变量。假如将一个函数移到另一个文件中,还要将相关外部变量及其值一起移过去。但若该外部变量与其它文件变量同名时,就会出现问题,降低了程序可靠性和通用性。普通要求把程序中函数做成一个封闭体,除了能够经过“实参形参”渠道与外界发生联络外,没有其它渠道。第91页例例 8.8.6 6 外部变量与局部变量同名外部变量与局部变量同名#include int a=3,b=5;/*a,b为外部变量为外部变量*/a,b作用范围作用范围void main()int a=8;/*a为局部变量为局部变量*/局部变量局部变量a作用范围作用范围 printf(%d,max(a,b);全局变量全局变量b作用范围作用范围 max(int a,int b)/*a,b为局部变量为局部变量*/int c;c=ab?a b;形参形参a、b作用范围作用范围 return(c);运行结果为运行结果为8 第92页8.变量存放类别变量存放类别 8.8.动态存放方式与静态存放方式动态存放方式与静态存放方式动态存放方式与静态存放方式动态存放方式与静态存放方式 前面已介绍了从变量作用域(即从空间)角度来分,能够分为全局变量全局变量和局部变量局部变量。那么从变量值存在时间(即生存期)角度来分,又能够分为静态存放静态存放方式方式和动态存放方式动态存放方式。所谓静态存放方式是指在程序运行期间由系统分配固定存放空间方式。而动态存放方式则是在程序运行期间依据需要进行动态分配存放空间方式。这个存放空间能够分为三部分,1.程序区程序区2.静态存放区静态存放区3.动态存放区动态存放区第93页在语言中每一个变量和函数有两个属性:数数据类型据类型和数据存放类别数据存放类别。对数据类型,读者已熟悉(如整型、字符型等)。存放类别指是数据在内存中存放方式。存放方式分为两大类:静态存放类和动态存放类。详细包含四种:自自动动(),(),静态静态(),(),存存放器放器(),(),外部外部()。依据变量存放类别,能够知道变量作用域和生存期。第94页8.8.auto auto变量变量变量变量函数中局部变量,如不专门申明为static存放类别,都是动态地分配存放空间,数据存放在动态存放区中。函数中形参和在函数中定义变量(包含在复合语句中定义变量),都属这类,在调用该函数时系统会给它们分配存放空间,在函数调用结束时就自动释放这些存放空间。所以这类局部变量称为自动变量。自动变量用关键字作存放类别申明。比如:int(int)*定义f函数,为形参*auto- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 函数 公共课 一等奖 全国 获奖 课件
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【a199****6536】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【a199****6536】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【a199****6536】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【a199****6536】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文