




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章函数第1页本章内容①函数概述②函数定义和调用③
函数原型
④参数传递机制
⑤嵌套调用和递归调用
⑥
函数与指针
⑦
函数参数缺省⑧
函数重载
⑨函数模板
⑩
内联函数
⑪系统函数
⑫作用域、生存期与可见性⑬
编译预处理
第2页4.1函数概述[例]计算Xm+Xn程序实现1:#include<iostream.h>voidmain(){longintx,xm=1,xn=1;intm,n;cin>>x;cin>>m>>n;inti=1;while(i<=m){xm*=x;i++;}i=1;while(i<=n){xn*=x;i++;}cout<<“xm+xn=”<<xm+xn<<endl;}第3页4.1函数概述程序实现2:#include<iostream.h>voidmain(){longintx;intm,n;cin>>x;cin>>m>>n;cout<<“xm+xn=”;cout<<power(x,m)+power(x,n)<<endl;}longintpower(longx,intn){ longinty=1; inti=1; while(i<n){ y*=x; i++;}
returny;}函数作用:1.将复杂问题分解成简单问题给予完成;2.多人协同工作;3.最大程度地利用已经有工作,防止重复劳动。第4页1.C++函数函数是能完成特定功效程序段。2.C++源程序组成一个C++程序是由若干个含有调用关系函数组成。每个C++程序有且只有一个函数main(),它是程序执行起点。其它函数必须经过调用来执行。4.1函数概述第5页4.1函数概述3.函数分类系统函数(库函数)在头文件中由系统预先定义,在程序中直接调用,但需包含对应头文件。自定义函数编程人员在程序中定义和调用第6页4.2函数定义和调用1.函数定义普通形式
类型名
函数名(形式参数表){语句序列}函数头函数体类型名:说明函数被调用后返回值类型。假如一个函数没有返回值,类型名为void,缺省为int。函数名:函数标识名,按标示符规则命名。形式参数表:用来接收调用时传递给函数数据,形式为:
类型名1参数1,类型名2参数2,….语句序列:完成函数特定功效一组语句。第7页retuen语句功效:1.结束函数执行。2.将返回值带回到调用处。普通形式
格式一:
return表示式;表示式值作为函数返回值,当表示式类型与函数类型不一样时,把表示式类型强制转换为函数类型。
格式二:
return;函数没有返回值时使用,此时函数类型必须为void,假如return;为函数体中最终一条语句,则可省略。第8页longpower(intx,intn){longp=1;for(inti=1;i<=n;i++)p=p*x;returnp;}函数名函数类型形式参数表返回语句例1:函数定义举例(求xn)。第9页//求两个数中较大一个intmax(inta1,inta2){ if(a1>a2) returna1; else returna2;}例2:有多个return语句函数定义举例第10页//交换两个变量值voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;cout<<“x=“<<x<<““;cout<<“y=“<<y<<endl;return;//能够省略}例3:无返回值函数定义举例第11页例4:没有形式参数函数定义举例voidprint()//括号不可少//等价形式:voidprint(void){cout<<“Goodluck!\n”;}第12页2.函数调用1)函数调用过程在一个函数(主调函数)执行期间,转去执行其它函数(被调函数),被调函数执行完成再返回主调函数过程。2)函数调用形式:函数名(实参表)函数名:已定义函数名实参表:由若干个实际参数组成,其作用是对形式参数进行初始化。形式为:实参1,实参2,…3)函数调用使用方式:(1)参加表示式运算(2)作为实参(3)作为单独语句第13页(1)参加表示式运算
函数调用能够作为操作数出现在表示式中。此时被调用函数必须有返回值,函数返回值将参加表示式计算。[例]编写计算Xm+Xn程序自定义函数:longpower(intx,intn){longp=1;for(inti=1;i<=n;i++)p=p*x;returnp;}主函数:#include<iostream.h>voidmain(){intx;intm,n;cin>>x;cin>>m>>n;cout<<“xm+xn=”<<power(x,m)+power(x,n)
<<endl;}第14页(2)作为实参
函数返回值将作为实参传递给形参进行下一次调用,此时被调用函数必须有返回值。例:利用power函数计算(x2)3voidmain(){intx,i;cout<<″输入x值:″;cin>>x;longm=power(power(x,2),3);cout<<m<<endl;}第15页(3)作为单独语句:用于不需要返回值函数调用例:交换两个变量值函数//主函数voidmain(){intx,y;cout<<“输入两个整数:”;cin>>x>>y;
swap(x,y);}voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;cout<<“x=“<<x<<““;cout<<“y=“<<y<<endl;}第16页4.3函数原型函数原型只给出函数头函数申明。何时需要函数原型说明
函数调用在前、定义在后时需要;反之则不需要。函数原型说明普通形式:形式一:类型名函数名(形参表);形式二:类型名函数名(各形参类型);
第17页#include<iostream.h>intpower(intx,intn);
//或
intpower(int,int);
voidmain(){intx;intm,n;cin>>x;cin>>m>>n;cout<<“xm+xn=”<<power(x,m)+power(x,n)<<endl;}longpower(intx,intn){longp=1;for(inti=1;i<=n;i++)p=p*x;returnp;}[例]编写计算Xm+Xn程序(需要函数原型)第18页#include<iostream.h>longpower(intx,intn){longp=1;for(inti=1;i<=n;i++)p=p*x;returnp;}voidmain(){intx;intm,n;cin>>x;cin>>m>>n;cout<<“xm+xn=”<<power(x,m)+power(x,n)<<endl;}[例]编写计算Xm+Xn程序(不需要函数原型)第19页4.4参数传递机制作用实现函数间数据共享。基本规则在调用一个函数时,必须提供与形式参数个数相同、类型一致实际参数,实参和形参按位置对应以实现函数间数据传递。两种实现方式值传递(值调用) 传数值调用 传地址调用
引用传递(引用调用)第20页1.传值调用特点函数定义时:形参定义为变量;实参提供数值,能够是常数、变量或表示式函数被调用时系统为形参分配存放空间实参值拷贝(传递)给与之对应形参。被调函数执行结束,分配给形参存放空间被释放。注意:形参和实参都是变量时,改变形参值不影响实参原有值。这种方式是一个单向传递,即实参将数值传给形参第21页#include<iostream.h>voidswap(intx,inty);voidmain(){inta(15),b(18);cout<<"main()输出1:
a="<<a<<"b="<<b<<endl;swap(a,b);cout<<"main()输出2
:a="<<a<<"b="<<b<<endl;}voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;cout<<"swap()输出:x="<<x<<"y="<<y<<endl;}例:传值调用举例输出结果:main()输出1:a=15b=18swap()输出:x=18y=15main()输出2:a=15b=18第22页2.传地址调用机制函数定义时,形参申明为指针或数组,实参提供地址函数被调用时,为形参分配空间以存放实参提供地址注意:在被调用函数中改变形参值,对实参提供地址值无影响在被调用函数中改变形参指针指向存放单元内容,实参地址对应存放单元内容同时也被改变这种方式能够实现双向传递数据第23页例1:传地址调用机制举例程序执行结果:main()输出1:a=15b=18swap()输出:*px=18*py=15main()输出2:a=18b=15第24页例2:传地址调用机制举例程序执行结果:main()输出1:a=15b=18swap()输出:*px=18*py=15main()输出2:a=15b=18第25页经过传地址调用向被调用函数传递一维数组。数组作函数参数例1(例4.10):编写函数将数组a中数按由小到大次序重新排列第26页#include<iostream.h>voidsort(int*a,intn);//函数原型voidmain(){ints[10]={2,3,5,1,7,9,0,4,8,6};sort(s,10);//调sort函数for(inti=0;i<10;i++)//输出排序后结果cout<<s[i]<<"";cout<<endl;}voidsort(int*a,intn){inttemp;for(inti=0;i<n-1;i++)for(intj=i+1;j<n;j++) if(a[i]>a[j]) {temp=a[i];a[i]=a[j];a[j]=temp;}}思索:编写函数将任意大小数组a中数按由小到大次序重新排列注意:函数sort()形参int*a也能够写成inta[],但不能写成inta[n]。第27页例2:编写函数实现两个等长一维数组相加。第28页
例1:求二维数组中每行元素最大值及其所在列。经过传地址调用向被调用函数传递二维数组。程序说明:函数fmax()形参intp[N][N]也能够写成int(*p)[N]或intp[][N](不能写成intp[][])。第29页
例2:求任意大小二维数组中每行元素最大值及其所在列。第30页3.函数引用调用机制形参定义为引用;实参应为变量,而不能是常量或表示式函数被调用时,不为形参分配存放空间,使用实参存放空间。注意:在被调用函数中改变形参值,实参内容同时也被改变。这种方式能够实现双向传递数据第31页例:引用调用举例#include<iostream.h>voidswap(int&x,int&y);
//函数原型//等价形式:
voidswap(int&,int&);voidmain(){inta=15,b=18;cout<<“main()输出1:a="<<a<<"b="<<b<<endl;
swap(a,b);cout<<"main()输出2:
a="<<a<<"b="<<b<<endl;}voidswap(int&x,int&y){inttemp;temp=x;x=y;y=temp;}输出结果:main()输出1:a=15b=18main()输出2:a=18b=15第32页函数参数传递机制总结传递机制形参实参特点传值调用定义为变量同类型常量、变量、表示式数据单向传递传地址调用定义为指针与形参相匹配地址数据双向传递引用调用定义为引用与形参同类型变量数据双向传递第33页利用函数编程基本步骤1.功效划分
合理确定各个函数功效2.函数设计函数接口设计(函数头):参数和返回值函数体设计(函数功效实现方法)3.编程实现
选择适当语句实现各个函数第34页函数应用举例例题:有5名学生参加一门课程考试,编写程序实现以下功效:1。输入5名学生学号和考试成绩。2。输出最高分学生学号和成绩。3。将成绩按由高到低次序排列,输出排列后学号和成绩。第35页问题分析:1。功效划分1)主函数数据输入输出成绩最高学生学号及成绩输出排序结果2)子函数(1)求最高分及学号,将结果返回主函数(2)对成绩进行排序第36页问题分析:2。函数设计1)求最高分函数:接收参数:两个一维数组:处理学号和成绩一个整型变量:学生人数返回值最高分及其学号函数原型:
intMaxScore(intNo[],intScore[],intNum,int&MaxNo);算法:利用求一维数组最大值算法第37页函数应用综合举例(续):最高分函数intMaxScore(intNo[],intScore[],intNum,int&MaxNo){ inti,Max; Max=Score[0]; MaxNo=No[0]; for(i=1;i<Num;i++)if(Score[i]>Max){Max=Score[i];MaxNo=No[i];} returnMax;}第38页问题分析:2。函数设计2)排序函数:接收参数:两个一维数组:处理学号和成绩一个整型变量:学生人数返回值无函数原型:
voidSort(intNo[],intScore[],intNum);算法:利用冒泡排序算法第39页函数应用综合举例(续):排序函数voidSort(intNo[],intScore[],intNum){ inti,j,temp; for(i=0;i<Num;i++)for(j=0;j<Num-i-1;j++)if(Score[j]<Score[j+1]){temp=Score[j];Score[j]=Score[j+1];Score[j+1]=temp;temp=No[j];No[j]=No[j+1];No[j+1]=temp;}}第40页问题分析:2。函数设计3)主函数数据:两个一维数组:存放学号和成绩两个整型变量:接收最高分函数返回最高分及学号算法:输入数据调用最高分函数输出最高分和学号调用排序函数输出排序结果第41页函数应用综合举例(续):主函数#include<iostream.h>constintN=5;voidmain(){ intNo[N],Score[N];for(inti=0;i<N;i++)cin>>No[i]>>Score[i]; intms,mn; ms=MaxScore(No,Score,N,mn); cout<<“最高分:”<<ms<<“学号:"<<mn<<endl;Sort(No,Score,N);cout<<“排序后成绩单:”<<endl;for(i=0;i<N;i++)cout<<No[i]<<““<<Score[i]<<endl;}第42页4.5嵌套调用和递归调用1.嵌套调用在调用一个函数过程中又调用另一个函数。
C++不允许对函数作嵌套定义,即不能在一个函数定义中出现另一个函数定义。例:voidfa(){voidfb(){:}}第43页嵌套调用举例例12:编写计算以下函数程序程序中一共有四个函数:Main()函数计算f(x,y)函数计算s(n)函数计算阶乘函数p(i)调用关系:Main()f(x,y)s(n)p(i)第44页#include<iostream.h>longp(inti)//计算阶乘函数定义{longk=1;for(intn=1;n<=i;n++)k=k*n;returnk;}longs(intn)//计算阶乘和函数{longsum=0;for(intj=1;j<=n;j++)sum=sum+p(j);returnsum;}doublef(intx1,inty1)//计算f(x,y)函数{return(double)s(x1)/(double)s(y1);}voidmain(){intx,y;cout<<"输入x、y:";cin>>x>>y;cout<<"f(x,y)="<<f(x,y)<<endl;}注意:1。各个函数定义先后次序被调用函数在前,调用者在后。2。执行次序主函数首先被执行,其它函数按调用次序执行。第45页longp(inti)//计算阶乘函数定义{longk=1;for(intn=1;n<=i;n++)k=k*n;returnk;}longs(intn)//计算阶乘和函数{longsum=0;for(intj=1;j<=n;j++)sum=sum+p(j);returnsum;}doublef(intx1,inty1)//计算f(x,y)函数{return(double)s(x1)/(double)s(y1);}#include<iostream.h>longp(inti);longs(intn);doublef(intx1,inty1);voidmain(){intx,y;cout<<"输入x、y:";cin>>x>>y;cout<<"f(x,y)="<<f(x,y)<<endl;}当有多个函数之间存在调用关系时,可经过函数原型申明确保调用关系正确性。第46页2.递归调用
1)递归调用(自调用):在定义函数时直接或间接地调用自己。2)使用递归条件:
1)有递推关系2)有递归终止条件4.5嵌套调用和递归调用例:数学中阶乘函数递归定义。
1若n=0终止条件n!=n*(n-1)!若n>0递推关系第47页递归调用举例:用递归函数实现求n!#include<iostream.h>longfact(intn)//递归函数{longh;if(n>0)h=n*fact(n-1);elseh=1;returnh;}voidmain(){intn;cout<<"输入正整数n:";cin>>n;cout<<“n!="<<fact(n)<<endl;}假设n=3,程序执行过程为:第48页递归调用练习:
用递归函数计算菲波纳契数列前20项
11235813……voidmain(){for(inti=1;i<=20;i++)cout<<f(i)<<“”;cout<<endl;}例:菲波纳契数列递归定义。
1若n=1或n=2终止条件f(n)=f(n-1)+f(n-2)若n>2递推关系#include<iostream.h>longf(intn)//递归函数{longh;if(n>2)h=f(n-1)+f(n-2);elseh=1;returnh;}第49页输出结果:1121311251212138112133112513……思索:上例程序以下编写,输出结果对吗?#include<iostream.h>longf(intn)//递归函数{longh;if(n>2)h=f(n-1)+f(n-2);elseh=1;cout<<h;returnh;}voidmain(){cout<<f(20)<<endl;}第50页1.指针型函数:函数返回值是一个地址函数。定义形式:类型名
*函数名(参数)
例4.15:输入0-6数字,输出对应英文星期表示
#include<iostream.h>//定义指针函数char*fun(intn){staticcharpstr[][7]={"sun","mon","tue","wed","thu","fri","sat"};returnpstr[n];}4.6函数与指针第51页例4.15:输入0-6数字,输出对应英文星期表示
//主函数intmain(){intn;cout<<"输入0-6:";cin>>n;if(n<0||n>6)cout<<"输入错!\n";elsecout<<fun(n)<<endl;return0;}第52页编写指针型函数时要注意:
从函数返回地址必须是有效,不能从函数返回函数中定义非静态变量地址。比如:#include<iostream.h>char*fun(intn){charpstr[][7]={"sun","mon","tue","wed","thu","fri","sat"};returnpstr[n];//错误}第53页2.返回引用:返回值是一个变量引用#include<iostream.h>int&large(int&a,int&b);voidmain(){intv1=15,v2=6;
large(v1,v2)=50;cout<<"v1="<<v1<<"v2="<<v2<<endl;}int&large(int&a,int&b){return(a>b?a:b);}输出结果:v1=50v2=6第54页函数返回引用时要注意:不要从函数返回函数执行结束时存放空间会被释放变量。例:int&large(inta,intb){if(a>b)returna;//错误elsereturnb;//错误}第55页4.7函数参数缺省
在函数原型或函数定义中,可为形参指定一个值(称为缺省值或默认值)。调用函数时若对应实参省略,则用缺省值对形参初始化。函数参数缺省几点要求:必须从参数表最右边开始连续为形参指定缺省值,中间不能间断。例:voidfunc(inty,intx=2,intz=10);
//正确
voidfunc(intx=2,inty,intz=10);
//错误若函数有原型申明,缺省值只需在原型申明中给出,函数定义时参数表中不能再给出。第56页#include<iostream.h>longpower(intx=10,intn=2);//原型说明voidmain(){intk=5;cout<<power(k)<<endl;cout<<power(k,3)<<endl;cout<<power()<<endl;}longpower(intx,intn){longp=1;while(n>0){p=p*x;n--;}returnp;}例:函数参数缺省举例。第57页例:编写实现两个整数、单浮点数和双浮点数相加函数。需要定义3个不一样函数名函数:intaddi(intx,inty){returnx+y;};floataddf(floatx,floaty){returnx+y;};doubleaddd(doublex,doubley){returnx+y;};4.8函数重载函数重载:两个或两个以上函数使用相同函数名。但这些函数形参必须在个数或者类型上有所不一样。第58页例1:参数类型不一样函数重载
第59页例2:参数个数不一样重载函数
第60页将上面int、float、double用一个参数T来代替。
Tadd(Tx,Ty){returnx+y;}函数模板:用一个函数处理不一样类型参数和返回值函数。4.9函数模板例:编写实现两个整数、单浮点数和双浮点数相加函数。采取函数重载需要定义3个同名函数:intadd(intx,inty){returnx+y;};floatadd(floatx,floaty){returnx+y;};doubleadd(doublex,doubley){returnx+y;};第61页定义函数模板普通形式为:template<classT>类型函数名(形参表){函数体}其中:template为保留字,用于说明模板参数;class也能够写成:typename;T为模板参数,能够是任何正当标示符;用到T行末无分号第62页#include<iostream.h>template<classT>Tadd(Tx,Ty);voidmain(){inti=100,j=200;floata=15.55,b=27.89;doublex=6.3e10,y=8.05e12;cout<<"Integer:"<<add<int>(i,j)<<"\n";cout<<"Float:"<<add(a,b)<<"\n";cout<<"Double:"<<add(x,y)<<"\n";}
template<classT>Tadd(Tx,Ty){returnx+y;}例:函数模板举例。第63页1.内联函数:函数定义或申明时在函数头前加inline
。
4.10内联函数2.使用内联函数需注意:内联函数定义应先于对它调用。内联函数中不应有switch语句、if嵌套、循环语句,它也不能是递归函数。第64页4.11系统函数1.系统函数概述系统函数又称标准函数或库函数。使用时需在程序中用
#include命令嵌入对应头文件。
几类主要系统函数头文件:string.h:字符串处理函数ctype.h:字符处理函数放在头文件math.h:数学函数第65页2.字符串处理函数惯用字符串处理函数。
1)求字符串长度函数strlen()2)字符串拷贝函数strcpy()3)字符串连接函数strcat()4)字符串比较函数strcmp()第66页1)求字符串长度函数strlen()函数原型:
intstrlen(char*str);功效:返回str所指字符串中第一个‘\0’之前字符个数,不包括‘\0’。#include<iostream.h>#include<string.h>voidmain(){chars1[15]=”HelloC++”;cout<<”s1:”<<strlen(s1)<<endl;chars2[]=”Hello\0string”;cout<<”s2:”<<strlen(s2)<<endl;}思索:sizeof(s1)=?sizeof(s2)=?第67页#include<iostream.h>#include<string.h>constintN=80voidrever(char*s);//将字符串反序函数voidmain(){charstring[N];cout<<"输入一个字符串:";cin.getline(string,N);rever(string);//调用rever函数
cout<<"倒序后字符串:";cout<<string<<endl;}voidrever(char*s){char*t;intc;for(t=s+(strlen(s)-1);s<t;s++,t--){c=*s;*s=*t;*t=c;}}例4.39将输入字符串倒序并输出。第68页2)字符串拷贝函数strcpy()函数原型:char*strcpy(char*str1,constchar*str2);函数功效:将字符串str2复制到str1中,函数返回str1值。使用示例:chars1[]="C++programming";chars2[20],*s3="Hello!";strcpy(s2,s1);cout<<"s2:"<<s2<<endl;cout<<strcpy(s1+4,s3)<<endl;cout<<"s1:"<<s1<<endl;char*s4=newchar[strlen(s3)+1];cout<<“s4:"<<strcpy(s4,s3)<<endl;s2:C++programmingHello!s1:C++Hello!s4:Hello!结果:第69页3)字符串连接函数strcat()函数原型:
char*strcat(char*str1,char*str2);函数功效:将字符串str2连接到字符串str1后面,去掉str1后边’\0’,使两个字符串成为一个字符串。函数返回str1值。示例chars1[20]="Hello";chars2[]="everybody";
strcat(s1,s2);cout<<"s1:"<<s1<<endl;输出结果:s1:Helloeverybody第70页4)字符串比较函数strcmp()函数原型:
intstrcmp(constchar*str1,constchar*str2);函数功效:比较两个字符串(按位置比较对应字符ASCII码值),函数返回值:若str1和str2相等,函数返回值为0;若str1大于str2,函数返回值为1;若str1小于str2,函数返回值为-1。比如:strcmp(“abcdxay”,”abcdefg”)值为1strcmp(“abcdefg”,”abcdefg”)值为0strcmp(“abcde”,”abcdefg”)值为-1第71页3。字符处理函数例4.25键盘输入一字符串,统计输出其中字母、数字、空格和其它字符个数及字符总个数。第72页4.数学函数数学函数头文件:#include<math.h>以下是几个惯用数学函数:函数功效abs(x)|x|sqrt(x)pow(x,y)xyexp(x)exsin(x)三角函数第73页例4.27用梯形法求定积分值#include<iostream.h>#include<math.h>doublefx(doublex){return(sin(x)+exp(-x));}近似公式:voidmain(){doublea,b,y,h;intn,i;a=0.0;b=2.0;cout<<“输入n值:”;cin>>n;h=(b-a)/n;y=(fx(a)+fx(b))/2.0;for(i=1;i<n;i++)y=y+fx(a+i*h);y=y*h;cout<<"y="<<y<<endl;}其中:h=(b-a)/n第74页4.12作用域、生存期与可见性✿
操作系统为一个C++程序运行所分配空间。堆区(动态数据)栈区(函数局部数据)main()函数局部数据全局数据区(全局变量、静态变量、常量)代码区(程序代码)初始时全部清“0”第75页C++程序中每个标识符(如变量名、数组名、函数名、标号等)都有各自作用域、生存期、可见性。1.作用域一个标识符在源程序正文中有意义区域。按作用域范围分,有5种作用域:文件作用域块作用域函数作用域函数原型作用域类作用域:第5章介绍4.12标示符作用域、生存期、可见性第76页1)文件作用域有效范围:从标识符定义位置开始直到源程序文件末尾。在任何函数之外定义或说明标识符都含有文件作用域。全局变量:含有文件作用域变量例:以下是C++源文件test.cpp中部分代码。
inti;//全局变量 intfun1(){…}//函数定义floatj;//全局变量 voidmain(){…}变量i、j和函数名fun1作用域为文件作用域。第77页例:全局变量(数组)举例。求5个数和。#include<iostream.h>ints[5];//全局数组,初值默认为0intsu;
//全局变量,初值默认为0voidsum();voidmain(){inti;for(i=0;i<5;i++)cin>>s[i];sum();cout<<su<<endl;}voidsum(){inti;for(i=1;i<5;i++)su+=s[i];}第78页2)块作用域有效范围:从定义或说明处开始,一直到块结束花括号为止。任何在函数体内或复合语句内定义标识符都含有块作用域。局部变量:含有块作用域变量。例1:voidfun(intx)//函数定义时形参x含有块作用域
{inta;if(x>0)a=x;else{intb;cout<<″输入一个整数:″;cin>>b;a=x+b*b;}cout<<″a=″<<a<<endl;}a、x作用域b作用域假定x值为-5,b值为3,则输出结果为:a=4第79页#include<iostream.h>voidmain(){inta[2][3]={1,2,3,4,5,6},sum=0;for(inti=0;i<2;i++)for(intj=0;j<3;j++)sum+=a[i][j];for(i=0;i<2;i++){for(intj=0;j<3;j++)cout<<a[i][j]<<““;cout<<endl;}cout<<“sum=“<<sum<<endl;}例2:块作用域示例。j作用域i作用域j作用域第80页3)函数作用域只有语句标号有函数作用域。4)函数原型作用域函数原型参数表中使用标识符含有函数原型作用域。比如:voidfunction(doublex,doubley);voidmain(){cin>>x>>y;//错误;x、y未定义….}
以上函数原型也能够写成:intfun(int,double);第81页2.生存期
指程序运行时一个变量或数组从给它分配内存空间到释放所占空间经历期间。三类生存期静态生存期局部生存期动态生存期局部生存期、静态生存期可用存放类别要求。第82页1)静态生存期静态生存期:与程序运行期一致生存期文件作用域全局变量或数组、函数、常数含有静态生存期块作用域静态变量或数组含有静态生存期。静态变量定义格式是:
static<类型名>变量名表;若在定义含有静态生存期变量(或数组)时没有指定初值,则它们初值是0。第83页例4.15:输入0-6,输出对应英文星期表示
#include<iostream.h>//定义指针函数char*fun(intn){staticchar*pstr[]={"sun","mon","tue","wed","thu","fri","sat"};returnpstr[n];}内部静态变量使用示例第84页例4.15:输入0-6数字,输出对应英文星期表示
//主函数intmain(){intn;cout<<"输入0-6:";cin>>n;if(n<0||n>6)cout<<"输入错!\n";elsecout<<fun(n)<<endl;return0;}第85页2)局部生存期
与某个函数或语句块执行期相同生存期称为局部生存期块作用域自动变量(或数组)含有局部生存期。自动变量定义格式是:[auto]<类型名>变量名表;注意:若在定义自动变量(或数组)时没有指定初值,则在系统为其分配空间后它值是无意义(即为垃圾值)。例:intfun(int*x,intn)//形参x含有局部生存期{intsum;//不给初值,结果为垃圾值for(inti=0;i<n;i++)sum+=x[n];returnsum;}第86页3)动态生存期用运算符new在内存中分配变量或数组含有动态生存期。生存期由new和delete操作决定。比如:int*p,a[10];p=newint(12);//生存期开始……deletep;//生存期结束*p=200;//错误p=a;//正确第87页3.可见性
假如一个已定义标示符在程序某个区域能引用,则称该标示符在该区域可见,不然为不可见。1)含有文件作用域标识符可见性普通情况下,可见性与其作用域相同可由存放类别static或extern来限定或扩展其可见性第88页//源程序文件f1.cpp#include<iostream.h>staticdoublea;//外部静态变量a仅在本文件中可见voidmain(){externdoublex[10];//引用在后面定义全局数组
externintc;//引用其它文件全局变量
externvoidprint();
//引用其它文件函数for(inti=0;i<10;i++)a=a+x[i]*c;cout<<"a="<<a<<endl;print();}doublex[10]={0.1,1.1,2.1,3.1,4.1,5.1,6.1,7.1,8.1,9.1};例//源程序文件f2.cpp#include<iostream.h>intc=10;//全局变量voidprint(){cout<<“c="<<c<<endl;}第89页2)含有块作用域变量可见性
可见性为从其在块内定义或说明之处开始,直到所在块结束为止。#include<iostream.h>voidmain(){inta=10;//a可见性?cout<<"a="<<a<<endl;
{intb=20;//b可见性?a=a+b;cout<<"a="<<a<<endl;cout<<"b="<<b<<endl;a=15;
}cout<<"a="<<a<<endl;}输出结果为:a=10a=30b=20a=15第90页3)作用域重合同名标识符可见性按“局部优先”标准确定它们可见性。#include<iostream.h>inta=10;
//定义全局变量avoidmain(){cout<<"全局变量a="<<a<<endl;floata=7.8;
//定义函数体内局部变量acout<<"main中a="<<a<<endl;{inta=5;
//定义复合语句中局部变量acout<<"复合语句中a="<<a<<endl;a=15;}cout<<"a="<<a<<endl;}输出结果为:全局变量a=100main中a=7.8复合语句中a=5a=7.8第91页4)作用域分辨符(::)#include<iostream.h>inta=1;voidmain(){inta=10;{inta=3;::a=5;//作用域运算优先级最高a=::a+a;cout<<"::a="<<::a<<"a="<<a<<endl;}::a++;cout<<"::a="<<::a<<"a="<<a<<endl;}注意:“::”运算符只能用于访问全局变量,不能用于访问含有块作用域局部变量。::a=5a=8::a=6a=10使用作用域分辨符“::”,能够使全局变量处处可见。输出结果为:第92页5)内部静态变量可见性和生存期可见性仅限于它所在程序块内。特点:在定义作用域外,它即使不可见,但生命期在语句块执行后并未结束,其值一直保持到下次被执行时。第93页#include<iostream.h>intsum(intp[],int&a);voidmain(){intdata[][3]={{1,2,3},{4,5,6},{7,8,9}},sc;for(inti=0;i<3;i++){cout<<sum(data[i],sc)<<""<<sc<<endl;}}intsum(intp[],int&a){inti,k=0;
staticints=0;
//定义局部静态变量sfor(i=0;i<3;i++){s+=p[i];k+=p[i];}a=k;//经过形参带回结果returns;}6621154524例4.31内部静态变量使用示例输出结果为:第94页4.13编译预处理编译预处理:在对源程序编译之前,找出源程序中以“#”开始预处理命令行,并依据其中出
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 不锈钢家具合同标准文本
- 个人门窗装修合同样本
- 货物运输保险合同条款二零二五年
- 远期买卖合同
- 二零二五民间借贷居间人的法律责任
- 电商培训合同范例二零二五年
- 东莞买卖土地合同标准文本
- 人教版四年级语文上册第六单元语文园地指导方案
- 公司合作拍摄合同标准文本
- 探究式教学【教学设计】《勾股定理》
- 浙江省医疗机构麻醉药品、精神药品管理实施细则
- 《中国近现代史纲要》 课件 第十一章 中国特色社会主义进入新时代
- 机关单位申请要人的请示范文
- 铀矿冶安全规程
- 国标热镀锌钢管规格尺寸理论重量表
- 设计方案投标技术标文件
- 圆来如此简单公开课优质课件获奖
- (本科)审计(第五版)全套教学课件完整版PPT
- GB∕T 3639-2021 冷拔或冷轧精密无缝钢管
- 西师版六年级下册数学第五单元 总复习 教案
- 拖欠货款合同纠纷起诉状范本
评论
0/150
提交评论