




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
函数与预处理第1页,课件共66页,创作于2023年2月§5.1.1函数概念的引入#include<iostream.h>voidmain(){
staticinta[20]={8,12,19,23,33,39,42,55,62,69,76,85}; intn=12,i,x; cout<<"Thenumbersare:\n"; for(i=0;i<n;i++) cout<<a[i]<<'\t'; cout<<"*****************\n"; cout<<"insertnumberis:"; cin>>x; for(i=n-1;i>=0;i--) if(a[i]>x)a[i+1]=a[i]; elsebreak; a[i+1]=x; n++; cout<<"Thenumbersare:\n"; for(i=0;i<n;i++) cout<<a[i]<<'\t'; cout<<"****************\n";}第2页,课件共66页,创作于2023年2月函数的引入#include<iostream.h>voidmain(){ staticinta[20]={8,12,19,23,33,39,42,55,62,69,76,85}; intn=12,i,x;
arrayprint(a,n);
cout<<"insertnumberis:"; cin>>x; for(i=n-1;i>=0;i--) if(a[i]>x)a[i+1]=a[i]; elsebreak; a[i+1]=x; n++;
arrayprint(a,n);
}voidarrayprint(inta[],intn){cout<<"Thenumbersare:\n";for(i=0;i<n;i++) cout<<a[i]<<'\t';cout<<"*****************\n";}主调函数被调函数一段程序被执行了多次优化程序结构通用:函数库第3页,课件共66页,创作于2023年2月§5.1.2函数的定义函数体例:intadd(intx,inty){returnx+y;}数据类型函数名(形参列表){
语句序列
}函数说明voidmain(){inta,b,s;cin>>a>>b;s=add(a,b);cout<<s<<endl;}第4页,课件共66页,创作于2023年2月函数说明数据类型函数名(形参列表)doublearea(doublex,doubley,doublez){ doubles; if(x+y<z||x+z<y||y+z<x) return0; s=(x+y+z)/2; s=sqrt(s*(s-x)*(s-y)*(s-z)); returns;}⑴数据类型规定了函数返回值的类型。函数值由return提供。注意:若函数定义时无数据类型,则默认为整型(int);若函数无返回值,数据类型应为void。⑵函数名是有效的C++标识符。⑶形式参数表是用逗号隔开的变量说明列表,每个函数参数必须同时说明参数类型和参数名。注意:函数可以无参数,此时形参表为空,但函数名后的一对圆括号不能省略。可将函数分为两类:无参函数与有参函数。注:函数说明后无分号intadd(intx,inty){returnx+y;}add(intx,inty){returnx+y;}voidmain(){inta,b,s;cin>>a>>b;s=add(a,b);cout<<s<<endl;}doublearea(doublex,y,z){ doubles; if(x+y<z||x+z<y||y+z<x) return0; s=(x+y+z)/2; s=sqrt(s*(s-x)*(s-y)*(s-z)); returns;}第5页,课件共66页,创作于2023年2月函数体例1无参函数display_sum,用来计算两个数之和。#include<iostream.h>voiddisplay_sum(){ intx,y,sum; cout<<"Enteraandb:"<<endl; cin>>x>>y; sum=x+y; cout<<"x+y="<<sum<<endl;}voidmain(){ display_sum();}由花括号所括起的语句序列,是完成函数功能所要执行的具体操作。当函数执行结束需要返回一个值时,在这个函数体中还必须有一个return语句。例2有参函数sum,用于求两个数之和。intsum(intx,inty){inttemp;temp=x+y;returntemp;}voidmain(){ints=sum(10,5);cout<<”sum=”<<s;}第6页,课件共66页,创作于2023年2月N!三角形面积doublepower(intn){inti;doublel=1;for(i=1;i<=n;i++)l*=i;returnl;}doublearea(doublex,doubley,doublez){doubles;if(x+y<z||x+z<y||y+z<x)return0;s=(x+y+z)/2;s=sqrt(s*(s-x)*(s-y)*(s-z));returns;}第7页,课件共66页,创作于2023年2月5.1.3return语句语句格式:
return; //无值void return表达式;//有值
return(表达式);//有值函数体中的流程控制语句。先计算表达式的值,然后从被调函数返回到主调函数,表达式的值作为函数的返回值。(注意:只能返回一个值)函数值的类型:以函数定义的类型为准,若不同,需将return语句表达式的值转换类型。无返回值void时,可无return语句,执行到函数体}时返回。例有参函数sum,用于求两个数之和。intsum(intx,inty){inttemp;temp=x+y;returntemp;}voidmain(){ints=sum(10,5);cout<<”sum=”<<s;}第8页,课件共66页,创作于2023年2月return语句在一个函数中可有多个return语句,但每次被调用只能执行一个return语句。例,判断素数(或求三角形面积)#include<iostream.h>voidmain(){ inti; for(i=2;i<100;i++) if(sushu(i)) cout<<"\t"<<i;}#include<math.h>intsushu(intn){intk,i;k=sqrt((double)n);for(i=2;i<=k;i++) if(n%i==0)return0;return1;}第9页,课件共66页,创作于2023年2月5.1.4函数声明函数原型的形式:
数据类型被调函数的函数名(形参类型说明);
例:doublearea(double,double,double);参数类型说明列表是用逗号隔开的的参数类型说明,其参数个数和类型必须和函数定义中的参数个数和类型一致。也可以给出参数名,但对编译器没有什么意义。函数原型用来说明一个函数的返回值类型、参数的个数和类型。使编译器检查该函数被调用的正确与否。
函数必须先说明后调用。调用库函数时,一般在文件的开头用#include命令将包含该函数原型的头文件加入到程序中。调用用户自定义函数,当对一个函数的调用出现在该函数定义之前时,必须先对函数进行原型声明。即当被调函数的定义写在主调函数后面时才需声明。第10页,课件共66页,创作于2023年2月实参表可包含多个参数,用逗号分开;可为常量、变量、函数调用、表达式(先求值,再将值传递给形参)。要求实参的类型和个数要与形参一致。可以没有参数,但圆括号一定要有,不能省略。函数调用一般用来构成表达式。§5.2.1函数的调用形式一、函数调用形式:函数名(实参列表)§5.2函数的调用 t=sqrt(t*(t-a)*(t-b)*(t-c));s=area(a,b,c);s=sum(5,7
);例第11页,课件共66页,创作于2023年2月二、函数调用过程1.在主调函数中通过函数调用转到被调函数从而开始执行被调函数。2.执行被调函数时,遇到return语句或函数体的右大括号},则返回主调函数继续执行下面的语句。3.函数间相互独立:各函数中的变量互不相关,可同名。主调函数被调函数floatarea(x,y,z){……returns……}main(){……s=area(a,b,c);……}实参形参
参数传递?
返回值第12页,课件共66页,创作于2023年2月在函数调用时,按照书写参数的先后次序(与名字无关),将实参的值(先计算)传递给对应的形参。要求实参和形参的类型和个数要一致。实参将值“单向性”的“值传递”给形参。在被调函数中对形参的值的修改不会影响到实参。当函数未被调用时,形参不占内存。当函数被调用时,为形参分配内存,并将实参的值传递给形参;函数调用结束时,释放形参所占存储空间。传值调用:先计算实参的值,将实参的值传递给形参。一、传递变量的值§5.2.2函数调用的过程编写函数,交换两个变量的值练习:编写convert函数实现将任意一个正整数逆序,若主函数中输入123,调用该函数处理,并将结果321在主函数中输出。第13页,课件共66页,创作于2023年2月地址传递:引用调用:通过在函数中使用引用参数实现地址传递。把形参声明为引用方式,在参数名字前加上引用运算符&。引用时给已知变量起一个别名,并不占用存储空间。#include<iostream.h>voidswap(int&x,int&y);voidmain(){ inta,b; cin>>a>>b; swap(a,b); cout<<a<<b<<endl;}voidswap(int&x,int&y){intt=x;x=y;y=t;}利用引用传递机制进行参数调用,有两个优点(1)在函数内对形参的修改实际是针对实参的修改。(2)在传递大型的数据时,不再有高额的内存单元与时间的开销。(3)容易使用,易于维护第14页,课件共66页,创作于2023年2月§5.3指针与函数#include<iostream.h>intfun(int*);voidmain(){inta=8,b;b=fun1(&a);cout<<"a=“<<a<<“b=“<<b;}intfun1(int*p){intx=4;*p+=x;cout<<x<<*p<<“\n”;return*p*x;}8abpa=12b=484x48125.3.1指针变量作为函数参数412第15页,课件共66页,创作于2023年2月#include<iostream.h>intfun(int*);voidmain(){inta=8,b;b=fun1(&a);cout<<"a=“<<a<<“b=“<<b;}intfun1(int*p){intx=4;*p+=x;cout<<x<<*p<<“\n”;return*p*x;}#include<iostream.h>intfun(int);voidmain(){inta=8,b;b=fun1(a);cout<<"a=“<<a<<“b=“<<b;}intfun1(intp){intx=4;p+=x;cout<<x<<p<<“\n”;returnp*x;}a=12b=48412传变量的值和地址的区别a=8b=48412第16页,课件共66页,创作于2023年2月swap(int*x,int*y){intt;t=*x;*x=*y;*y=t;}#include<iostream.h>voidmain(){inta,b;a=5;b=9;swap(&a,&b);cout<<“a=“<<a<<“b=“<<b;}
swap(intx,inty){intt;t=x;x=y;y=t;}#include<iostream.h>voidmain(){inta,b;a=5;b=9;swap(a,b);cout<<“a=“<<a<<“b=“<<b;}程序1程序2P141例5.13:编写函数实现两数的互换主调函数被调函数实参形参结果有何不同?第17页,课件共66页,创作于2023年2月主调函数被调函数include<iostream.h>intswap(int,int);voidmain(){inta,b;a=5;b=9;swap(a,b);cout<<“a=“<<a<<“b=“<<b;}swap(intx,inty){intt;t=x;x=y;y=t;}55ab实参形参99xyab程序1xy95第18页,课件共66页,创作于2023年2月主调函数被调函数&a实参形参&b*x*yabswap(int*x,int*y){ intt; t=*x; *x=*y; *y=t;}#include<iostream.h>intswap(int*,int*);voidmain(){inta,b;a=5;b=9;swap(&a,&b);cout<<“a=”<<a<<“b=“<<b;}
5ab9程序2xy&b&a95第19页,课件共66页,创作于2023年2月指针变量作为函数参数指针作为函数的参数时,是以变量的地址作为实参调用一个函数,即作为参数传递的不是数据本身,而是数据的地址。在主调函数中,要以变量的存储地址作为实参来调用另一个函数。被调用函数的形参必须是可以接受地址值的指针变量,而它的数据类型应与被传送的数据类型保持一致。第20页,课件共66页,创作于2023年2月用数组名作实参,就是将数组的首地址传递给形参,实参数组与形参数组占用同一段内存。则在被调函数中对形参数组元素的进行赋值,就是对主调函数的实参数组进行操作,会在函数返回时将对数组的修改结果带回主调函数。形参为一维数组名时,元素个数可省。一般将所处理数组中元素个数也作为形参,在调用时将数组中使用的元素个数传递给被调函数。数组名作实参时,形参也可为指针。5.3.2函数调用中数组的传递(数组名做函数参数)第21页,课件共66页,创作于2023年2月#include<iostream.h>voidsort(int[]),output(int[]);voidmain(){inta[10],i;/*INPUT*/cout<<"\nInputdata:";for(i=0;i<10;i++) cin>>a[i];output(a);sort(a);output(a);}voidsort(intx[]){inti,j,t;for(i=0;i<9;i++) for(j=0;j<9-i;j++) if(x[j]>x[j+1]) {t=x[j]; x[j]=x[j+1]; x[j+1]=t;}}voidoutput(intx[]){inti;
cout<<"Thedatumare:\n";for(i=0;i<10;i++) cout<<x[i]<<“\t”;cout<<"\n";}数组名作参数例1-1a[0]a(形参为数组名)x[0]x第22页,课件共66页,创作于2023年2月
#include<iostream.h>#defineSIZE40voidsort(int*),output(int*);voidmain(){inta[SIZE],i,n;cout<<"\nPleaseinputn=";cin>>n;for(i=0;i<n;i++) cin>>a[i];output(a,n);sort(a,n);output(a,n);}voidsort(intx[],intn){inti,j,t;for(i=0;i<n-1;i++)for(j=0;j<n-i-1;j++) if(x[j]>x[j+1]) {t=x[j]; x[j]=x[j+1]; x[j+1]=t;}}voidoutput(intx[],intn){inti;
cout<<"Thedatumare:\n";for(i=0;i<n;i++) cout<<x[i]<<“\t”;cout<<"\n";}数组名作参数例1-2(形参包括元素个数)第23页,课件共66页,创作于2023年2月
voidsort(int*px,intn){inti,j,t;for(i=0;i<n-1;i++)for(j=0;j<n-i-1;j++) if(px[j]>px[j+1]) {t=px[j]; px[j]=px[j+1]; px[j+1]=t;}}voidoutput(int*px,intn){inti;
cout"Thedatumare:\n";for(i=0;i<n;i++)cout<<px[i]<<“\t”; cout<<"\n";}数组名作参数例1-3#include<iostream.h>#defineSIZE40voidmain(){voidsort(),output();inta[SIZE],i,n;cout<<"\nPleaseinputn=";cin>>n;for(i=0;i<n;i++) cin>>a[i];output(a,n);sort(a,n);output(a,n);}(形参为指针变量)第24页,课件共66页,创作于2023年2月总结如果程序是对数组进行处理,应采用地址传递,因为实参与形参共用同一存储空间。如果程序希望从函数中返回多个值,形参应声明为指针或引用。如果程序希望形成的改变能影响到相应的形参,形参应声明为指针变量或引用。除以上情况外,应采用变量的值传递方式,可以减少函数间的关联。第25页,课件共66页,创作于2023年2月5.3.3函数指针一个函数在编译时被分配一个入口地址(第一条指令的地址),可以将该地址赋给一个指针变量,该指针中存储的就是该函数的入口地址,这样的指针为函数指针。函数指针定义的一般形式为:数据类型(*指针变量名)(形参列表)
在说明函数指针时,要同时描述这个指针所指向的形参类型和个数,及函数的返回值类型,例如:Int(*funp)(inta,intb)函数指针的意义:在进行指针运算时的结果是使程序控制转移至该函数指针所指向的函数的入口地址,从而开始执行该函数。第26页,课件共66页,创作于2023年2月#include<iostream.h>intfunc(inta,intb);voidmain(){ int(*pf)(inta,intb); pf=func; cout<<"inputtwonumber:"<<endl; intm,n; cin>>m>>n;
intresult=(*pf)(m,n); cout<<"result="<<result<<endl;}intfunc(inta,intb){ returna+b;}定义指向调用第27页,课件共66页,创作于2023年2月设一个函数process,在调用它时,每次实现的功能不同,第一次调用找出两个数的最大值,第二次调用找出两个数的最小值,第三次调用求和。#include<iostream.h>intmax(intx,inty);intmin(intx,inty);intadd(intx,inty);voidprocess(intx,inty,int(*fun)(int,int));voidmain(){ inta,b; cout<<"inputa&b:\n"; cin>>a>>b; cout<<"max="; process(a,b,max); cout<<"min="; process(a,b,min); cout<<"sum="; process(a,b,add);}intmax(intx,inty){ return(x>y?x:y);}intmin(intx,inty){ return(x<y?x:y);}intadd(intx,inty){ returnx+y;}voidprocess(intx,inty,int(*fun)(int,int)){ intresult; result=(*fun)(x,y); cout<<result<<endl;}第28页,课件共66页,创作于2023年2月
在程序设计中使用函数指针,注意:函数指针时一个指向函数的指针变量,专门用来存放函数的入口地址,因此在一段程序中,一个指针函数可被多次赋值,指向不同的函数。函数指针只能指向函数的入口地址,不能指向函数中某一条指令,对函数指针进行如下操作是无意义的:p++,p+a;第29页,课件共66页,创作于2023年2月§5.4函数的嵌套调用 main(){……调用a函数...}a函数{…调用b函数…}b函数{………}①③④⑤⑥⑦②在被调函数中,又调用了函数----嵌套调用第30页,课件共66页,创作于2023年2月#include<iostream.h>doublearea(double,double,double);voidmain(){doublea,b,c,s;cout<<"inputa,b,c=";cin>>a>>b>>c;s=area(a,b,c);cout<<“area=“<<s<<“\n”;}#include<math.h>doublearea(doublex,doubley,doublez){doubles;if(x+y<z||x+z<y||y+z<x)return0;s=(x+y+z)/2;s=sqrt(s*(s-x)*(s-y)*(s-z));returns;}doublesqrt(…){………return…}
求三角形面积第31页,课件共66页,创作于2023年2月§5.5函数的递归调用
函数的递归调用----在函数中直接或间接地调用该函数本身intf1(intx){inty,z;z=f2(y);…...return(2*z);}intf2(inty){inta,b,c;c=f1(a);……return(3+c);}间接调用第32页,课件共66页,创作于2023年2月用递归方法求n!doublefac(intn){doublef;
if(n==0||n==1)f=1;elsef=fac(n-1)*n;returnf;}1 n=0,1n*(n-1)!n>1n!=#include<iostream.h>voidmain(){intn;doubley;cin>>n;if(n<0) cout<<"n<0,dataerror!";else{ y=fac(n); cout<<n<<“!=“<<y;}}直接调用(1)写出调用终止条件(2)写出计算公式第33页,课件共66页,创作于2023年2月用递归方法求n!(3!)doublefac(intn){………f=fac(n-1)*n;returnf;}voidmain(){……y=fac(n);…}doublefac(intn){………f=fac(n-1)*n;returnf;}doublefac(intn){……if(n==0||n==1)f=1;…returnf;}321126执行过程第34页,课件共66页,创作于2023年2月定义递归函数时应遵循以下原则有一个能结束递归调用的条件。有一个递归调用语句练习:用递归方法求Fibonacci数列的前n项。第35页,课件共66页,创作于2023年2月5.6内联函数和重载函数
5.6.1内联函数函数调用时,首先需要保存主调函数的现场和返回地址,然后程序转移到被调函数的起始地址开始执行。被调函数执行结束后,先回复主调函数的现场,取出返回地址并将返回值赋予函数调用本身。最后在返回地址处开始继续执行。对于函数体比较小且功能简单的函数,如果反复多次调用,系统开销也比较大。内联函数,编译器在编译时,并不生成普通的函数,而是将程序中出现的内联函数的调用表达式用该内联函数的函数体进行替换,这样虽然可以增加目标代码量,但不会产生由于函数调用而引起的在时间和空间中转来转去。第36页,课件共66页,创作于2023年2月2.内联函数的定义在函数头前加关键字inline用内联函数计算圆面积。#include<iostream.h>constdoubleP=3.14;inlinedoublearea(doubler);voidmain(){ doubler=3.0; doubles; s=area(r); cout<<"theareais"<<s<<endl;}inlinedoublearea(doubler){ returnP*r*r;}第37页,课件共66页,创作于2023年2月3.使用内联函数应注意的事项内联函数也遵循定义在前,调用在后的原则。内联函数不允许有循环语句,Switch语句等负责的语句,如有这些,则按普通函数处理内联函数的函数体不可过大1~5行为宜递归函数不能被用作内联函数。类结构中,类体内定义的成员函数都是内联函数。第38页,课件共66页,创作于2023年2月5.6.2重载函数求一个数的绝对值:Intabs(int)Longlabs(long);Doublefabs(double);函数功能相同,但名称不同。重载函数:使得同一个函数名可以对应着不同的函数实现。定义:所谓函数的重载就是指建立多个同名的函数,但函数的形参表必须互不相同。Intabs(int)Longabs(long);Doubleabs(double);第39页,课件共66页,创作于2023年2月2.调用重载函数时选择的原则重载函数至少要在参数类型、参数个数或参数顺序有所不同,仅仅是返回值类型不同时不够的。Intfun(int,double);Intfun(double,int);Voidfun(int,double)重载函数的选择是按下述顺序查找的:将实参类型与所有别调用的重载函数的形参一一比较,显示查找到一个严格匹配的,如找到了就调用该函数;再是通过内部数据转换查找一个匹配的,如找到了就调用该函数。最后是用过用户所定义的强制转换来查找一个匹配的。可以重载不可重载第40页,课件共66页,创作于2023年2月重载函数举例:编程求两个或三个操作数之和#include<iostream.h>intsum(intx,inty);intsum(intx,inty,intz);doublesum(doublex,doubley);doublesum(doublex,doubley,doublez);voidmain(){ cout<<sum(2,5)<<endl; cout<<sum(2,4,7)<<endl; cout<<sum(2.5,5.9)<<endl; cout<<sum(2.9,5.4,3.4)<<endl;}intsum(intx,inty){ returnx+y;}intsum(intx,inty,intz){ returnx+y+z;}doublesum(doublex,doubley){ returnx+y;}doublesum(doublex,doubley,doublez){ returnx+y+z;}第41页,课件共66页,创作于2023年2月5.7默认参数的函数C++中,允许在函数声明或定义时为一个或多个形参指定默认值,这样,当进行函数调用时,如果省略了对应位置上的实参,则在执行被调函数时,以该形参的默认值进行运算。1.默认参数的声明:默认参数一般在函数声明中提高。如果程序中即有函数的声明,又有函数定义,则定义函数时不允许再指定默认值;如果程序中只有函数的定义而没有函数的声明,则默认参数可出现在函数定义中。Voidpoint(intx=3,inty=4);//声明中给出默认值Voidpoint(intx,inty)//定义中不可再指定默认值
{…}2.默认参数的顺序:如果一个函数中有多个默认参数,则默认参数值的定义必须遵循从右至左的顺序。即:如果函数的某个形参没有默认值,则它前面的参数就不能有默认值。3.默认值可以使全局变量、全局常量,甚至可以是一个函数,但不能是局部变量Voidpoint(int=3,int=4);第42页,课件共66页,创作于2023年2月5.8作用域与生命期5.8.1作用域5.8.2局部变量和全局变量5.8.3生命期第43页,课件共66页,创作于2023年2月5.8.1作用域函数原型作用域:作用范围:始于函数原型说明的左括号,结束与函数原型说明的右括号处。例如:#include<iostream.h>intsum(intx,inty);voidmain(){ inta=9,b=6; cout<<sum(a,b);}intsum(inta,intb){returna+b;}作用范围块作用域:函数中一对花括号括起的代码区域。例如:形参、复合语句中声明的变量、函数体内声明的普通变量。第44页,课件共66页,创作于2023年2月函数作用域:在该函数内任何地方可见。C++中,只有Goto语句的标号具有函数作用域。类作用域:文件作用域:在函数或类之外说明的标识符具有文件作用域,其作用范围为从定义点开始,到文件结尾结束。第45页,课件共66页,创作于2023年2月#include<iostream.h>
inta;intsum(intx,inty)voidmain(){intb=6;a=3;sum(a,b);cout<<a<<b<<endl;}intsum(inta,intb){a=a+b;b=b+a;returnb;}第46页,课件共66页,创作于2023年2月5.8.2全局变量和局部变量局部变量:在函数体内部或在复合语句内定义的变量,形参也是局部变量。全局变量:在函数体外定义的变量。例:charf1(intx,inty){inti,j,a,b;...}voidmain(){intm,n;...}intx,y;//全局变量voidf1(){......}doublea,b;//全局变量intf1(intc){intm;}voidmain(){intm,n;//局部变量...}xy的作用范围ab的作用范围第47页,课件共66页,创作于2023年2月全局变量与局部变量的作用域变量的作用域
(有效范围)
变量在程序中能被使用的范围;只有在变量的作用域中才可以对变量进行操作:赋值或使用其值。局部变量有效范围为本函数体内。
(不同函数中的局部变量互不影响,可同名)
全局变量有效范围为从定义变量的位置开始到本源文件结束。第48页,课件共66页,创作于2023年2月intx,y,z;doublef1(inta){ intb,c;
……}charf2(intx,inty){ inti,j;
…….}voidmain(){ inta,b,c;
x=
a+b+c; …….}全局变量局部变量全局变量x,y,z的有效范围(作用域)a,b,c的有效范围x,y,i,j的有效范围a,b,c的有效范围局部变量名与全局变量名相同时,在局部变量的作用域中,局部变量起作用,全局变量不起作用。第49页,课件共66页,创作于2023年2月doublef1(inta){ intb,c;
……}intx,y,z;charf2(intx,inty){ inti,j;
…….}voidmain(){ inta,b,c;
x=
a+b+c; …….}全局变量局部变量全局变量x,y,z的有效范围(作用域)a,b,c的有效范围x,y,i,j的有效范围a,b,c的有效范围第50页,课件共66页,创作于2023年2月
求一元二次方程的实根root(doublea,doubleb,doublec){ doublet; t=b*b-4*a*c; if(t>=0&&a) { t=sqrt(t);
x1=(-b+t)/(2*a);
x2=(-b-t)/(2*a); return1; } return0;}#include<iostream.h>#include<math.h>introot(double,double,double);doublex1,x2;voidmain(){doublea,b,c;cout<<"Pleaseinputa,b,c=";cin>>a>>b>>c;if(root(a,b,c))cout<<“x1=“<<x1<<“\tx2=“<<x2<<“\n”;}第51页,课件共66页,创作于2023年2月#include<iostream.h>intx=1,y=2,z=3;fun1
(int
x){int
z;
z
=x+y;
y=1;cout<<“x=“<<x<<“y=“<<y<<“z=“<<z;returnz;}voidmain(){int
a=10;x=fun1(a);cout<<"x=“<<x<<“y=“<<y<<“z=“<<z<<“\n”;}全局变量局部变量输出结果:
x=10,y=1,z=12局部变量与全局变量同名fun1(10)10→x10+2→z1→yx=12,y=1,z=3第52页,课件共66页,创作于2023年2月5.8.3生命期一、存储类别二、局部变量的存储类别三、全局变量的存储类别四、作用域和生命期第53页,课件共66页,创作于2023年2月变量的存储类别静态存储方式:程序运行期间分配固定的存储空间的方式。动态存储方式:程序运行期间根据需要进行动态的分配存储空间方式。程序区静态存储区动态存储区形参、自动局部变量、函数调用的现场等全局变量、静态局部变量5.8.3生命期第54页,课件共66页,创作于2023年2月变量的存储类型1、自动存储类型auto
自动变量存储在动态存储区;当函数被调用时随机分配存储空间,返回时释放(其初始化相当于一次赋值,函数每次被调用时都执行);是局部变量的缺省存储类型。2、静态存储类型static
静态变量存储在静态存储区;在执行程序的整个过程中,不管函数是否被调用,都占据其存储空间;只初始化一次3、外部存储类型extern
全局变量的缺省类型为extern类型4、寄存器存储类型register
寄存器变量存储在寄存器中(cpu中),因寄存器数量有限,该种变量个数不能多。第55页,课件共66页,创作于2023年2月局部变量的自动和静态存储类型举例(1)#include<iostream.h>fun1(intx){ staticinty; intz=10; x=x+y; y=x+z; cout<<“x=“<<x<<“y=“<<y<<“z=“<<z<<“\n”;}voidmain(){ fun1(1); fun1(1);} 输出结果:x=1,y=11,z=10x=12,y=22,z=10静态变量只初始化一次第56页,课件共66页,创作于2023年2月局部变量的自动和静态存储类型举例(2)#include<iostream.h>fun1(intk){ intn=1; staticm=1; n+=k; m+=k; cout<<“\nn=“<<n<<“\tm=“m;}voidmain(){ fun1(8); fun1(8); fun1(8);} 输出结果:n=9 m=9n=9 m=17静态变量只初始化一次n=9 m=25第57页,课件共66页,创作于2023年2月局部变量的自动和静态存储类型举例(2)#include<iostream.h>fun1(intk){ intn; staticintm; n=1; m=1; n+=k; m+=k; cout<<"\nn=“<<n<<“\tm=“<<m;}voidmain(){ fun1(8); fun1(8); fun1(8);}输出结果:n=9 m=9n=9 m=9n=9 m=9第58页,课件共66页,创作于2023年2月2、全局变量的存储类别外部变量存储在静态存储区,(改变作用域)静态外部变量static
静态外部变量作用域为本程序文件,其它程序文件不能使用外部变量extern外部变量除本程序文件使用外,也可被其它程序文件使用全局变量的声明:在定义外部变量之前使用该变量,需对其声明extern数据类型变量名表;注意:用extern声明只是起一个说明作用,不产生新变量,与定义变量不同第59页,课件共66页,创作于2023年2月//文件file1.cpp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025汽车买卖委托书合同
- 专科牙医知识培训课程表课件
- 广西河池市天峨县2026届数学八上期末质量跟踪监视模拟试题含解析
- 个体合作协议书9篇
- 2026届四川省成都市双流黄甲中学数学七年级第一学期期末经典模拟试题含解析
- 旅游景区管理与服务质量标准
- 戏剧表演中的语言艺术研究
- 2026届福建省厦门市双十中学数学七年级第一学期期末学业水平测试模拟试题含解析
- 邮储银行黄冈市罗田县2025秋招半英文面试题库及高分答案
- 中国银行衡水市武邑县2025秋招半英文面试题库及高分答案
- 2025年福建省职业技能鉴定考试(劳动关系协调员·一级/高级技师)历年参考题库含答案详解(5卷)
- 马铃薯水肥一体化技术
- 基金会专项基金管理办法
- 2025年高考湖南省物理真题(含解析)
- 中国银行校招笔试题目及答案
- 《血常规解读》课件
- 微机室日常维护与保养计划
- 无印良品客服应聘简历
- 2025年煤矿安全生产知识题库
- 兄弟自动切线平缝机S-7000DD中文使用说明书
- 4.3平面镜成像(练习)原卷版
评论
0/150
提交评论