第5章 函数
- 格式:doc
- 大小:58.00 KB
- 文档页数:15
第5章函数及其应用5.1 函数种类5.1.1 命令函数,例如:getchar(),putchar()等。
5.1.2标准C++库函数,fabs(), pow(), rand(),sin(x), sqrt(), fexp()等,要使用头文件。
5.1.3自定义函数5.2 自定义函数的概念及使用方法例1:求两个数中的最大数#include <iostream.h>int imax (int a, int b){return (a>b ? a:b); }void main(){int a=6,b=9;cout<<"max="<<imax(a,b)<<endl;}例2:求x的n次方#include "iostream.h"main(){ float mpow(float a,int n);cout<<"pow="<<mpow(3.,3)<<endl;}float mpow(float a,int n){int i;float k=1;for(i=1;i<=n;i++)k=k*a;return (k); }5.3 自定义函数的三种形式5.3.1 无参函数,例如main(),getchar()等。
主函数与子函数之间不传输数据例:输出字符四方形************************************************void print(){int i;for(i=1;i<5;i++)cout<<(“************\n”;}5.3.2. 空函数例:null(){ }5.3.3. 有参函数如例1,例2说明:1.C++语言程序由一个主函数和若干个子函数(模块)组成。
1.子函数也有类型和函数值。
2.子函数程序体可以作为单独的文件存放,如果单独存放,应在主函数中作为头文件进行说明。
5.3.2 函数的极值与最大(小)值第1课时函数的极值与导数学习目标核心素养1.了解极大值、极小值的概念.(难点)2.了解函数在某点取得极值的必要条件和充分条件.(重点、易混点)3.会用导数求函数的极大值、极小值.(重点)1.通过极值点与极值概念的学习,体现了数学抽象的核心素养.2.借助函数极值的求法,提升学生的逻辑推理、数学运算的核心素养.“横看成岭侧成峰,远近高低各不同”.请同学们思考:“山势有什么特点?”由此联想庐山的连绵起伏形成好多的“峰点”与“谷点”.这就是我们这节课研究的函数的极值.1.极值点与极值(1)极小值点与极小值若函数y=f (x)在点x=a的函数值f (a)比它在点x=a附近其他点的函数值都小,f ′(a)=0,而且在点x=a附近的左侧f ′(x)<0,右侧f ′(x)>0,就把点a叫做函数y=f (x)的极小值点,f (a)叫做函数y=f (x)的极小值.(2)极大值点与极大值若函数y=f (x)在点x=b的函数值f (b)比它在点x=b附近其他点的函数值都大,f ′(b)=0,而且在点x=b附近的左侧f ′(x)>0,右侧f ′(x)<0,就把点b叫做函数y=f (x)的极大值点,f (b)叫做函数y=f (x)的极大值.(3)极大值点、极小值点统称为极值点;极大值、极小值统称为极值.思考:导数为0的点一定是极值点吗?[提示]不一定,如f (x)=x3,f ′(0)=0,但x=0不是f (x)=x3的极值点.所以,当f ′(x0)=0时,要判断x=x0是否为f (x)的极值点,还要看f ′(x)在x0两侧的符号是否相反.2.求可导函数y=f (x)的极值的方法解方程f ′(x)=0,当f ′(x0)=0时:(1)如果在x0附近的左侧f ′(x)>0,右侧f ′(x)<0,那么f (x0)是极大值;(2)如果在x0附近的左侧f ′(x)<0,右侧f ′(x)>0,那么f (x0)是极小值.1.判断正误(正确的打“√”,错误的打“×”)(1)极大值一定比极小值大.( )(2)每一个函数都至少有一个极大值或极小值.( )(3)若f ′(x0)=0,则x0一定是极值点.( )(4)单调函数不存在极值.( )[提示](1)极大值不一定比极小值大,∴(1)错误;(2)有的函数可能没有极值.∴(2)错;(3)若f ′(x0)=0,只有导函数的变号零点,x0才是极值点,故(3)错误;(4)正确.[答案](1)×(2)×(3)×(4)√2.函数f (x)的定义域为R,导函数f ′(x)的图象如图所示,则函数f (x)( )A.无极大值点,有四个极小值点B.有三个极大值点,两个极小值点C.有两个极大值点,两个极小值点D.有四个极大值点,无极小值点C[设y=f ′(x)的图象与x轴的交点从左到右横坐标依次为x1,x2,x3,x4,则f (x)在x=x1,x=x3处取得极大值,在x=x2,x=x4处取得极小值.]3.(多选题)下列四个函数中,在x=0处取得极值的函数是( )A.y=x3B.y=x2+1C.y=|x| D.y=2xBC[对于A,y′=3x2≥0,∴y=x3单调递增,无极值;对于B,y′=2x,x>0时y′>0,x<0时y′<0,∴x=0为极值点;对于C,根据图象,在(0,+∞)上单调递增,在(-∞,0)上单调递减,∴C 符合;对于D ,y =2x单调递增,无极值.故选BC.]4.函数f (x )=x +2cos x 在⎣⎢⎡⎦⎥⎤0,π2上的极大值点为( )A .0B .π6C .π3D .π2B [f ′(x )=1-2sin x .令f ′(x )=0,∵x ∈⎣⎢⎡⎦⎥⎤0,π2,∴x =π6,x ∈⎝ ⎛⎭⎪⎫π6,π2时f ′(x )<0,x ∈⎝⎛⎭⎪⎫0,π6时,f ′(x )>0.∴x =π6是f (x )在⎣⎢⎡⎦⎥⎤0,π2上的极大值点.]不含参数的函数求极值(1)y =x 3-3x 2-9x +5; (2)y =x 3(x -5)2.[解] (1)∵y ′=3x 2-6x -9,令y ′=0,即3x 2-6x -9=0,解得x 1=-1,x 2=3. 当x 变化时,y ′,y 的变化情况如下表:x (-∞,-1)-1 (-1,3) 3 (3,+∞)y ′ + 0 - 0 + y↗极大值↘极小值↗当x =3时,函数y =f (x )有极小值,且f (3)=-22. (2)y ′=3x 2(x -5)2+2x 3(x -5) =5x 2(x -3)(x -5).令y ′=0,即5x 2(x -3)(x -5)=0,解得x 1=0,x 2=3,x 3=5.当x 变化时,y ′与y 的变化情况如下表:x (-∞,0)0 (0,3) 3 (3,5) 5 (5,+∞)y ′ + 0 + 0 - 0 + y↗无极↗极大值↘极小值0↗值108∴x =0不是y 的极值点;x =3是y 的极大值点,y 极大值=f (3)=108; x =5是y 的极小值点,y 极小值=f (5)=0.一般地,求函数y =fx 的极值的步骤1求出函数的定义域及导数f ′x ; 2解方程f ′x =0,得方程的根x 0可能不止一个;3用方程f ′x=0的根,顺次将函数的定义域分成若干个开区间,可将x ,f ′x ,f x 在每个区间内的变化情况列在同一个表格中;4由f ′x 在各个开区间内的符号,判断f x在f ′x =0的各个根处的极值情况:如果左正右负,那么函数f x 在这个根处取得极大值; 如果左负右正,那么函数fx 在这个根处取得极小值;如果导数值在这个根左右两侧同号,那么这个根不是极值点.[跟进训练]1.求函数f (x )=3x 3-3x +1的极值. [解] f ′(x )=9x 2-3, 令f ′(x )=0,得x 1=-33,x 2=33. 当x 变化时,f ′(x ),f (x )的变化情况如下表:x ⎝⎛⎭⎪⎫-∞,-33-33⎝ ⎛⎭⎪⎫-33,3333 ⎝ ⎛⎭⎪⎫33,+∞ f ′(x ) + 0 - 0 + f (x )↗极大值↘极小值↗根据上表可知x 1=-33为函数f (x )=3x 3-3x +1的极大值点,极大值为f ⎛⎪⎫-3=1+233; x 2=33为函数f (x )=3x 3-3x +1的极小值点,极小值为f ⎝ ⎛⎭⎪⎫33=1-233.含参数的函数求极值【例2】 已知函数f (x )=16x 3-20ax 2+8a 2x -a 3,其中a ≠0,求f (x )的极值. [思路探究] 求导―→解f ′x =0―→比较极值点大小 ―→进行讨论求极值[解] ∵f (x )=16x 3-20ax 2+8a 2x -a 3,其中a ≠0,∴f ′(x )=48x 2-40ax +8a 2=8(6x 2-5ax +a 2)=8(2x -a )(3x -a ), 令f ′(x )=0,得x 1=a 2,x 2=a3.①当a >0时,a 3<a2,则随着x 的变化,f ′(x ),f (x )的变化情况如下表:x ⎝ ⎛⎭⎪⎫-∞,a 3 a3⎝ ⎛⎭⎪⎫a 3,a 2a2⎝ ⎛⎭⎪⎫a 2,+∞f ′(x ) + 0 - 0 + f (x )↗极大值↘极小值↗∴当x =a3时,函数f (x )取得极大值,为f ⎝ ⎛⎭⎪⎫a 3=a327;当x =a2时,函数f (x )取得极小值,为f ⎝ ⎛⎭⎪⎫a 2=0. ②当a <0时,a 2<a3,则随着x 的变化,f ′(x ),f (x )的变化情况如下表:x ⎝ ⎛⎭⎪⎫-∞,a 2 a2⎝ ⎛⎭⎪⎫a 2,a 3a3⎝ ⎛⎭⎪⎫a 3,+∞f ′(x ) + 0 - 0 + f (x )↗极大值↘极小值↗∴当x =a2时,函数f (x )取得极大值,为f ⎝ ⎛⎭⎪⎫a 2=0;当x =a3时,函数f (x )取得极小值,为f ⎝ ⎛⎭⎪⎫a 3=a327.综上,当a >0时,函数f (x )在x =a 3处取得极大值a 327,在x =a2处取得极小值0;当a <0时,函数f (x )在x =a 2处取得极大值0,在x =a 3处取得极小值a 327.函数极值的注意点1求函数的极值需严格按照求函数极值的步骤进行,重点考虑两个问题:一是函数的定义域,注意判断使导数值为0的点是否在定义域内,如果不在定义域内,需要舍去;二是检查导数值为0的点的左右两侧的导数值是否异号,若异号,则该点是极值点,否则不是极值点.2求解析式中含有参数的函数极值时,有时需要用分类讨论的思想才能解决问题.讨论的依据有两种:一是看参数是否对f ′x 的零点有影响,若有影响,则需要分类讨论;二是看f ′x 在其零点附近的符号的确定是否与参数有关,若有关,则需要分类讨论.[跟进训练]2.若函数f (x )=x -a ln x (a ∈R ),求函数f (x )的极值. [解] 函数f (x )的定义域为(0,+∞),f ′(x )=1-a x =x -ax.(1)当a ≤0时,f ′(x )>0,函数f (x )在(0,+∞)上单调递增,函数f (x )无极值. (2)当a >0时,令f ′(x )=0,解得x =a .当0<x <a 时,f ′(x )<0;当x >a 时,f ′(x )>0.∴f (x )在x =a 处取得极小值,且f (a )=a -a ln a ,无极大值. 综上可知,当a ≤0时,函数f (x )无极值;当a >0时,函数f (x )在x =a 处取得极小值a -a ln a ,无极大值.由极值求参数的值或取值范围322A .4或-3B .4或-11C .4D .-3(2)若函数f (x )=12x 2+(a -1)x -a ln x 没有极值,则( )A .a =-1B .a ≥0C .a <-1D .-1<a <0[思路探究] (1)由f ′(1)=0且f (1)=10.求解a ,b ,注意检验极值的存在条件. (2)求导分解因式主要对参数分类讨论.(按根的大小)(1)C (2)A [(1)∵f (x )=x 3+ax 2+bx +a 2,∴f ′(x )=3x 2+2ax +b .由题意得⎩⎪⎨⎪⎧f ′1=3+2a +b =0,f 1=1+a +b +a 2=10,即⎩⎪⎨⎪⎧2a +b =-3,a +b +a 2=9,解得⎩⎪⎨⎪⎧a =-3b =3,或⎩⎪⎨⎪⎧a =4,b =-11,当⎩⎪⎨⎪⎧a =-3b =3,时,f ′(x )=3x 2-6x +3=3(x -1)2≥0,故函数f (x )单调递增,无极值,不符合题意.∴a =4.故选C.(2)f ′(x )=(x -1)⎝ ⎛⎭⎪⎫a x+1,x >0,当a ≥0时,a x+1>0,令f ′(x )<0,得0<x <1; 令f ′(x )>0,得x >1.f (x )在x =1处取极小值. 当a <0时,方程a x+1=0必有一个正数解x =-a ,①若a =-1,此正数解为x =1,此时f ′(x )=x -12x≥0,f (x )在(0,+∞)上单调递增,无极值.②若a ≠-1,此正数解为x ≠1,f ′(x )=0必有2个不同的正数解,f (x )存在2个极值.综上,a =-1.故选A.]已知函数极值求参数的方法对于已知可导函数的极值求参数的问题,解题的切入点是极值存在的条件:极值点处的导数值为0,极值点两侧的导数值异号.1已知可导函数的极值求参数问题的解题步骤: ①求函数的导数f ′x ;②由极值点的导数值为0,列出方程组,求解参数. 注意:求出参数后,一定要验证是否满足题目的条件. 2对于函数无极值的问题,往往转化为f ′x ≥0或f ′x ≤0在某区间内恒成立的问题,此时需注意不等式中的等号是否成立.[跟进训练]3.若x =2是函数f (x )=x (x -m )2的极大值点,求函数f (x )的极大值.[解] ∵f ′(x )=(x -m )(3x -m ),且f ′(2)=0, ∴(m -2)(m -6)=0,即m =2或m =6. (1)当m =2时,f ′(x )=(x -2)(3x -2), 由f ′(x )>0得x <23或x >2;由f ′(x )<0得23<x <2.∴x =2是f (x )的极小值点,不合题意,故m =2舍去. (2)当m =6时,f ′(x )=(x -6)(3x -6), 由f ′(x )>0得x <2或x >6; 由f ′(x )<0得2<x <6.∴x =2是f (x )的极大值,∴f (2)=2×(2-6)2=32. 即函数f (x )的极大值为32.极值问题的综合应用1.如何画出函数f (x )=2x 3-3x 2-36x +16的大致图象.[提示] f ′(x )=6x 2-6x -36=6(x 2-x -6)=6(x -3)(x +2). 由f ′(x )>0得x <-2或x >3,∴函数f (x )的递增区间是(-∞,-2)和(3,+∞). 由f ′(x )<0得-2<x <3, ∴函数f (x )的递减区间是(-2,3).由已知得f (-2)=60,f (3)=-65,f (0)=16.∴结合函数单调性及以上关键点画出函数f (x )大致图象如图所示. 2.当a 变化时,方程2x 3-3x 2-36x +16=a 有几解?[提示] 方程2x 3-3x 2-36x +16=a 解的个数问题可转化为函数y =a 与y =2x 3-3x 2-36x +16的图象有几个交点的问题,结合探究点1可知:(1)当a >60或a <-65时, 方程2x 3-3x 2-36x +16=a 有且只有一解; (2)当a =60或a =-65时,方程2x 3-3x 2-36x +16=a 有两解; (3)当-65<a <60时,方程2x 3-3x 2-36x +16=a 有三解.【例4】 已知函数f (x )=x 3-3x +a (a 为实数),若方程f (x )=0有三个不同实根,求实数a 的取值范围.[思路探究] 求出函数的极值,要使f (x )=0有三个不同实根,则应有极大值大于0,极小值小于0,由此可得a 的取值范围.[解] 令f ′(x )=3x 2-3=3(x +1)(x -1)=0, 解得x 1=-1,x 2=1. 当x <-1时,f ′(x )>0; 当-1<x <1时,f ′(x )<0;当x >1时,f ′(x )>0.所以当x =-1时,f (x )有极大值f (-1)=2+a ; 当x =1时,f (x )有极小值f (1)=-2+a . 因为方程f (x )=0有三个不同实根,所以y =f (x )的图象与x 轴有三个交点,如图.由已知应有⎩⎪⎨⎪⎧2+a >0,-2+a <0,解得-2<a <2,故实数a 的取值范围是(-2,2).1.(改变条件)本例中,若方程f (x )=0恰有两个根,则实数a 的值如何求解? [解] 由例题知,函数的极大值f (-1)=2+a ,极小值f (1)=-2+a , 若f (x )=0恰有两个根,则有2+a =0,或-2+a =0, 所以a =-2或a =2.2.(改变条件)本例中,若方程f (x )=0有且只有一个实根,求实数a 的范围. [解] 由例题可知,要使方程f (x )=0有且只有一个实根, 只需2+a <0或-2+a >0, 即a <-2或a >2.3.(变条件、变结论)讨论方程ln xx=a 的根的情况.[解] 令f (x )=ln x x ,则定义域为(0,+∞),f ′(x )=1-ln xx2. 令f ′(x )=0,得x =e.当x 变化时,f ′(x )与f (x )的变化情况如下表:x (0,e) e (e ,+∞)f ′(x ) + 0 - f (x )↗1e↘因此,x =e 是函数f (x )的极大值点,极大值为f (e)=1e ,函数f (x )没有极小值点.其图象如图.∴当0<a <1e 时,ln xx =a 有两个不同的根;当a =1e 或a ≤0时,ln xx =a 只有一个根;当a >1e 时,ln x x=a 没有实数根.利用导数求函数零点的个数1利用导数可以判断函数的单调性; 2研究函数的极值情况;3在上述研究的基础上突出函数的大致图象;4直观上判断函数的图象与x 轴的交点或两个图象的交点的个数.若含有参数,则需要讨论极值的正负.1.若函数y =f (x )在区间(a ,b )内有极值,那么y =f (x )在(a ,b )内绝不是单调函数,即在某区间上单调函数没有极值.2.已知函数的极值情况,逆向应用确定函数的解析式,研究函数性质时,需注意两点:(1)常根据极值点处导数为0和极值两个条件列方程组,利用待定系数法求解.(2)因为函数在一点的导数值等于零不是此点为极值点的充要条件,所以利用待定系数法求解后必须验证极值点的合理性.3.已知函数零点(方程根)的个数,求参数取值范围的三种常用的方法:(1)直接法,直接根据题设条件构建关于参数的不等式,再通过解不等式确定参数范围;(2)分离参数法,先将参数分离,转化成求函数值域问题加以解决;(3)数形结合法,先对解析式变形,在同一平面直角坐标系中,画出函数的图象,然后数形结合求解.一是转化为两个函数y=g(x),y=h(x)的图象的交点个数问题,画出两个函数的图象其交点的个数就是函数零点的个数,二是转化为y=a,y=g(x)的图象的交点个数问题.1.函数f (x)的定义域为R,它的导函数y=f ′(x)的部分图象如图所示,则下面结论错误的是( )A.在(1,2)上函数f (x)为增函数B.在(3,4)上函数f (x)为减函数C.在(1,3)上函数f (x)有极大值D.x=3是函数f (x)在区间[1,5]上的极小值点D[由题图可知,当1<x<2时,f ′(x)>0,当2<x<4时,f ′(x)<0,当4<x<5时,f ′(x)>0,∴x=2是函数f (x)的极大值点,x=4是函数f (x)的极小值点,故A,B,C正确,D 错误.]2.设函数f (x)=x e x,则( )A.x=1为f (x)的极大值点B.x=1为f (x)的极小值点C.x=-1为f (x)的极大值点D.x=-1为f (x)的极小值点D [令f ′(x )=e x +x ·e x =(1+x )e x =0,得x =-1.当x <-1时,f ′(x )<0;当x >-1时,f ′(x )>0.故当x =-1时,f (x )取得极小值.]3.已知函数f (x )=x 3+3ax 2+3(a +2)x +1既有极大值又有极小值,则实数a 的取值范围是________.(-∞,-1)∪(2,+∞) [f ′(x )=3x 2+6ax +3(a +2),∵函数f (x )既有极大值又有极小值,∴方程f ′(x )=0有两个不相等的实根,∴Δ=36a 2-36(a +2)>0,即a 2-a -2>0,解得a >2或a <-1.]4.已知函数f (x )=2e f ′(e)ln x -x e,则函数f (x )的极大值为________. 2ln 2 [f ′(x )=2e f ′e x -1e ,故f ′(e)=2e f ′e e -1e, 解得f ′(e)=1e ,所以f (x )=2ln x -x e ,f ′(x )=2x -1e. 由f ′(x )>0得0<x <2e ,f ′(x )<0得x >2e.所以函数f (x )在(0,2e)单调递增,在(2e ,+∞)单调递减,故f (x )的极大值为f (2e)=2ln 2e -2=2ln 2.]。
第五章函数5.1函数概述函数也称子程序、例程或过程,它是把一些相关的语句组织在一起,用于解决某一特定问题的语句块。
函数是C++程序的基本特征,它将程序和代码进行了封装,实现了对程序设计的高级抽象。
在C++中常把一个程序分成多个函数来实现。
这样设计的目的隐藏了具体实现的细节问题,使用者精力集中在函数的接口外,而且还是实现参数化和实现结构化的具体表现。
函数抽象的实现,将有利于数据共享,节省开发时间,增强程序的可靠性和便于管理等。
关于函数的一些概念:●函数分为系统函数和自定义函数两种。
系统函数是C++标准函数库中提供的可以在任何程序中使用的公共函数,使用系统函数必须指定函数所在的包含文件,同样也适用于自定义函数库的调用。
●函数必须先定义才能使用。
也就是说调用函数的语句必须在函数定义或函数原型之后。
为了方便于程序设计,一般函数定义都放在一个函数文件库中,在程序首部指定包含文件。
●函数的组成如下:<类型><函数名>(<参数表>){<若干条语句>}类型是该函数的类型,即返回值的类型。
类型可以是各种数据类型。
如果没有返回值,值是一个过程调用,则函数类型为void。
例如:看下面是几个函数及返回类型。
(1)获取参数并返回值int bigger(int a, int b){return(a>b)?a:b’}(2)获取参数但不返回值int delay(long a){for (int i=1;i<=a;i++); //时间延迟}(3)没有获取参数但返回值int geti( ){int x;cout <<”Please inp ut a integer:\n”;cin>>x;return x;}(4)没有获取参数也不返回值void message( ){cout <<”This is a message. \n”}●return语句用来结束函数的执行并返回一定的值,返回的值必须与定义的函数类型一致。
如果函数是void类型,return语句后不带返回值。
例如:void message(int a);{if (a%10=0){ cout <<endl;return;}else{ cout <<’\t’;return;}}●函数定义不允许嵌套,即函数中不允许再定义一个函数5.2函数原型函数原型类似函数定义时的函数头。
为了能使函数在定义之前就能被调用,C++规定可以先说明函数原型,然后就可以调用函数。
函数定义可放在程序后面。
由于函数原型是一条语句,因此函数原型必须以分号结束。
函数原型由函数返回类型、函数名和参数表组成,它与函数定义的返回类型、函数名和参数表必须一致。
函数原型不必包含参数的名字,可只包含参数的类型。
例如:int area (int, int );等价于int area (int a ,int b );说明:系统标准函数并没有在包含文件中定义,而只是提供了函数原型。
在调用函数时,系统会正确地调用库函数。
注意:函数原型与函数定义必须一致,否则会引起编译错误。
5.3全局变量与局部变量变量都有其作用范围,可以在全不程序中起作用也可以只在某个函数内部起作用,这就产生了全局变量和局部变量。
1、程序的内存区域程序执行必须先调入到内存中,内存中存放了程序的代码和程序中用到的数据程序在内存中执行时分别占用四部分空间。
如下图1:图1上面四块区域的作用如下:● 代码区:存放程序的代码● 全局数据区:存放程序的全局数据和静态数据。
如全局变量、静态变量、常量。
● 堆区:动态数据分配空间。
由new 、delete 、malloc 、free 动态实现。
● 栈区:局部变量、函数参数、返回数据、返回地址。
2、全局变量在函数外面定义的变量称为全局变量。
特点:● 全局变量可被每个函数使用。
● 全局变量存放在全局数据区。
● 全局变量默认初始值为0,也可专门初始化。
例5.3.1 指出下面程序的输出结果。
(1) #include <iostream.h>(2) int a;(3) int max(int x,int y);代码区 code area堆区code area 全局数据区code area 栈区stack area(4) void main( )(5) {(6) int x=1,y=8;(7) x+=a++ - y;(8) cout<<max(x,y)<<a<<x<<y;(9) }(10) int max(int x,int y)(11) {(12) a=(x>y)?x:y;(13) return a;(14) }输出结果:8 1 -7 8计算过程:先执行mian函数,初始x=1,y=8;再执行语句(7)结果x=-7,a=1;执行cout向输出流中插入四个表达式。
Max(x,y)结果为8,a的值仍为输出语句之前的值1,再输出x的值-7,y的值8。
问:如果将上面的语句(8)改为下面两个语句,结果如何?cout<<max(x,y);cout<<a<<x<<y;答:结果为:8 8 -7 8原因是在执行了第一个cout语句后a的值已经变为8,故结果与前面的程序不同。
说明:从上面的程序看出全局变量在所有子程序中是可见的,任何对全局变量的修改都可能影响到其它程序对全局变量的使用。
另外,全局变量的定义并不一定放在程序的前面,只要定义在函数外都是全局变量,但有一点,只有在定义前是不可见的,对不可见的变量的使用是非法的。
3、局部变量局部变量即在函数内部定义的变量或函数参数。
局部变量仅在定义的函数内部是可见的。
特点:●局部变量只能在函数内部使用。
●局部变量存放在栈中,当函数运行时分配空间,在运行结束时释放空间。
●局部变量必须先初始化才能使用。
●局部变量可以与全局变量同名,那么全局变量在函数中将不再起作用。
例5.3.2#include <iostream.h>int a;int max(int x,int y);void main( ){int x=1,y=8;x+=a++ - y;//z=max(x,y);cout<<max(x,y);cout<<' '<<a<<' '<<x<<' '<<y;}int max(int x,int y){int a;a=(x>y)?x:y;return a;}这个程序与前面的程序的区别是函数max中定义了与全局变量同名的变量a,结果函数中a的变化不影响全局变量a的值。
5.4函数调用机制函数调用对用户来讲非常简单,但实际上为了在调用函数后能正确地使用函数参数和正确地返回到调用时的位置,必须将一些数据存储在栈中。
这个处理过程称为函数调用机制。
由于栈在函数调用过程中具有非常重要的作用,在此讲解一下函数调用时栈的使用特点和要求。
函数调用时,C++需要做下面一些工作:(1)建立被调函数的栈空间(2)保护调用函数的运行状态和返回地址(3)保护函数传递的参数(4)将控制转交被调函数栈空间主要由函数内部定义的变量和函数参数所占用,由于系统默认栈空间是有限制的,因此,当需要较多的内存空间时则必须在连接前设置栈空间大小。
5.5静态局部变量在局部变量前加上static关键字,就成了静态局部变量。
特点:●静态局部变量在定义它的函数内部是可见的,只能被定义它的函数使用。
这一点与局部变量相同。
●静态局部变量存放在内存的全局数据区,静态局部变量一经定义不会再次分配存储空间,也不会自行消失,直到程序运行结束,这一点与全局变量相同。
●静态局部变量默认初始值为0,也可专门初始化。
这一点又与全局变量相同例5.5.1下面的程序定义了全局变量、静态局部变量和局部变量,指出程序运行结果。
#include <iostream.h>void func( )int n=1;void main( ){static int a;int b=-10;cout<<”a:”<<a<<”b:”<<b<<”n:”<<n<<endl;b+=4;func( );cout<<”a:”<<a<<”b:”<<b<<”n:”<<n<<endl;n+=10;func( );}void func( ){static int a=2;int b=5;a+=2;n+=12;b+=5;cout<<”a:”<<a<<”b:”<<b<<”n:”<<n<<endl;}答:输出结果为a:0 b:-10 n:1a:4 b:10 n:13a:0 b:-6 n:13a:6 b:10 n:35解释:main()函数两次调用了func()函数,从运行结果看出,程序控制每次进入func()函数时,局部变量b都被初始化。
而静态局部变量a 进在第一次调用时被初始化,第二次进入该函数时,不再进行初始化,这时它的值是第一次调用后的结果值4。
Main()函数中的变量a和b与func ()函数中a和b的存储空间是不一样的,所以相应的值也不一样。
5.6递归函数1、递归概念函数的递归调用是指在调用一个函数的过程中又直接或间接调用了函数本身。
例5.6.1:下面的函数用来求n!long fact(int n){if (n==1)return 1;return fact(n-1)*n;}这是直接递归调用的例子。
例2:下面的函数调用是间接递归调用int fn1(int a){int b;b=fn2(a+1);...}int fn2(int s){int c;c=fn1(s-1);...}2、函数递归调用机制前面已经讲了函数调用机制,递归函数调用同样遵守函数调用机制,当函数调用自己时也要将函数状态、返回地址、函数参数、局部变量压入栈中进行保存。
实际上函数被调用时执行的代码是函数的一个副本,与调用函数的代码无关。
当一个函数被调用两次,则函数就会有两个副本在内存中运行,每个副本都有自己的栈空间且与调用函数的栈空间不同,因此不会相互影响。
这种调用机制决定了函数是可以递归调用的。
下面举例分析一下例1是如何求出3!的。
递归调用分两个过程:调用和回归。
调用即继续调用函数本身;回归即函数运行结束返回一个值,并返回到原调用位置继续执行。