您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C++课件-chap3-函数
函数的定义函数原型声明函数调用及参数传递*函数的嵌套、递归调用内联函数函数重载有默认参数的函数作用域与存储类别指针与函数Part4函数函数概念的引入函数:独立的功能,构成的程序的基本单位。通用:标准函数(函数库):sqrt,fabs,strcat,strlen,…用户自定义函数#includeiostream.hvoidmain(){doublex,m=1,sum=0;cinx;m=1;for(inti=0;i7;i++)m*=x;//m=x7sum+=4*m;m=1;for(i=0;i5;i++)m*=x;//m=x4sum+=2*m;m=1;for(i=0;i4;i++)m*=x;//m=x3sum+=3*m;coutsumendl;}//求4x7+2x5+3x4一段程序被执行了多次,完成一个独立的功能优化程序结构#includeiostream.hvoidmain(){doublex,m=1,sum=0;cinx;m=power(x,7);sum+=4*m;m=power(x,5);sum+=2*m;m=power(x,4);sum+=3*m;coutsumendl;}doublepower(doublex,intn){doubles=1;for(inti=1;i=n;i++)s*=x;returns;}主调函数被调函数函数的引入函数定义形式数据类型函数名(形参列表){语句序列}函数是一段具有独立功能的程序模块§1函数定义(不允许嵌套定义)函数说明函数体doublepower(doublex,intn){doubles=1;for(inti=1;i=n;i++)s*=x;returns;}#includeiostream.hvoidmain(){doublex,s;intn;cinxn;s=power(x,n);coutsendl;}函数说明:数据类型函数名(形参列表)doublearea(doublex,doubley,doublez){doubles;if(x+yz||x+zy||y+zx)return0;s=(x+y+z)/2;s=sqrt(s*(s-x)*(s-y)*(s-z));returns;}数据类型:规定了函数返回值的类型。函数值由return提供。注意:若函数定义时省略数据类型,则默认为整型(int);若函数无返回值,数据类型应为void。intadd(intx,inty){returnx+y;}add(intx,inty){returnx+y;}voidmain(){inta,b,s;cinab;s=add(a,b);coutsendl;}doublearea(doublex,y,z){doubles;if(x+yz||x+zy||y+zx)return0;s=(x+y+z)/2;s=sqrt(s*(s-x)*(s-y)*(s-z));returns;}注:函数说明后无分号函数名:有效的C++标识符。形式参数表:是用逗号隔开的变量说明列表,每个函数参数必须同时说明参数类型和参数名。注意:函数可以无参数,形参表为空,但函数名后的一对圆括号不能省略。函数分为两类:无参函数与有参函数。关于return(返回)语句函数值的类型:以函数定义的类型为准,若不同,需将return语句表达式的值转换类型。在一个函数中可有多个return语句,但每次被调用只能执行一个return语句。无返回值时void,可无return语句,执行到函数体}时返回。#includemath.hintsushu(intn){intk,i;k=sqrt((double)n);for(i=2;i=k;i++)if(!(n%i))return0;return1;}#includeiostream.hvoidmain(){for(inti=3;i100;i+=2)if(sushu(i)!=0)couti“\t”;//return;}作用:函数体中的流程控制语句。先计算表达式的值,然后从被调函数返回到主调函数,表达式的值作为函数的返回值。(注意:只能返回一个值)语句格式:return;//无值voidreturn表达式;//有值return(表达式);//有值§2函数原型(对被调函数的声明)参数类型说明列表:用逗号隔开的参数类型说明,其参数个数和类型必须和函数定义中的一致。也可以给出参数名,但对编译器没有什么意义。函数调用(使用)前必须先声明后调用。函数原型的形式:数据类型函数名(形参类型列表);例:doublearea(double,double,double);函数原型用来说明一个函数的返回值类型、参数的个数和类型。使编译器检查该函数被调用的正确与否。s=area(a,b,c);调用用户自定义函数,当对一个函数的调用出现在该函数定义之前时,必须先对函数进行原型声明。当被调函数的定义写在主调函数后面时才需声明,否则可以省略函数原型说明。调用库函数时,一般在文件的开头用#include命令将包含该函数说明的头文件加入到程序中。doublearea(doublex,doubley,doublez);求三角形面积#includeiostream.h#includemath.h//需要声明????voidmain(){doublea,b,c,s;coutPleaseinputa,b,c=;cinabc;s=area(a,b,c);coutarea=sendl;}doublearea(doublex,doubley,doublez){doubles;if(x+yz||x+zy||y+zx)return0;s=(x+y+z)/2;returnsqrt(s*(s-x)*(s-y)*(s-z));}#includeiostream.h#includemath.h//需要声明????doublearea(doublex,doubley,doublez){doubles;if(x+yz||x+zy||y+zx)return0;s=(x+y+z)/2;returnsqrt(s*(s-x)*(s-y)*(s-z));}voidmain(){doublea,b,c,s;coutPleaseinputa,b,c=;cinabc;s=area(a,b,c);coutarea=sendl;}原型说明放在函数被调用前doublearea(double,double,double);§3函数调用函数名(实参数列表)Forexample:s=area(a,b,c);t=sum(1,2);实参表可包含多个参数,用逗号分开;可为常量、变量、函数调用、表达式(先求值,再将值传递给形参)。要求实参的类型和个数要与形参一致。可以没有参数,但圆括号一定要有,不能省略。函数调用一般用来构成表达式。m=power(x,7);3.1函数的调用形式voidmain(){…...s=area(a,b,c);…...}doublearea(doublex,doubley,doublez){……return…}主调函数被调函数实参形参参数传递?3.2函数调用过程1.在主调函数中通过函数调用转到被调函数从而开始执行被调函数。2.执行被调函数时,遇到return语句或函数体的右大括号},则返回主调函数继续执行下面的语句。返回值?3.3函数调用中的参数传递两种机制:传值调用:先计算实参的值,将实参的值传递给形参。(1)传递变量的值:(2)传递变量的地址:传引用参数是主调函数与被调用函数之间交换数据的通道。按照参数书写的先后次序(与名字无关),由实参向形参的单向传递要求实参和形参的类型和个数要一致,实参可为任意表达式,但要有确定值常量:5变量:a,b,c其他表达式:t*(t-a)*(t-b)*(t-c)地址值:&a当函数未被调用时,形参不占内存当函数被调用时,为形参分配内存,并将实参的值传递给形参当函数调用结束时,释放形参所占存储空间变量值的传递:先计算实参的值,将实参的值传递给形参。函数的参数传递:实参将值“单向性”的“值传递”给形参在被调函数中对形参的值的修改不会影响到实参(两数交换)形参:各函数中的变量互不相关,可同名。特点:地址值的传递实参可为变量的地址,或数组名;形参为指针变量。求三角形面积特点:实参将一个地址值传递给形参时,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。1.传值调用演示求三角形面积#includeiostream.h#includemath.hdoublearea(doublex,doubley,doublez);voidmain(){doublea,b,c,s;coutPleaseinputa,b,c=;cinabc;s=area(a,b,c);coutarea=sendl;}doublearea(doublex,doubley,doublez){doubles;if(x+y=z||x+z=y||y+z=x)return0;s=(x+y+z)/2;returnsqrt(s*(s-x)*(s-y)*(s-z));}Pleaseinputa,b,c=屏幕abcs345345xyzs34566area=6实参形参内存主调函数被调函数#includeiostream.hvoidswap(intx,inty);voidmain(){inta,b;a=2;b=6;swap(a,b);couta=ab=b;}voidswap(intx,inty){intt;t=x;x=y;y=t;}内存实参形参xyb6a2266t22屏幕a=2b=6主调函数被调函数并未发生互换!编写函数实现两数的互换:方案1传递变量值编写函数实现两数的互换:方案2传递地址值#includeiostream.hvoidswap(int*x,int*y);voidmain(){inta,b;a=2;b=6;swap(&a,&b);couta=ab=b;}voidswap(int*x,int*y){intt;t=*x;*x=*y;*y=t;}主调函数被调函数实参形参xy&a&bt2屏幕a=6b=2发生互换!&a&ba2b6内存62voidsort(intx[]){inti,j,t;for(i=0;i9;i++)for(j=0;j9-i;j++)if(x[j]x[j+1]){t=x[j];x[j]=x[j+1];x[j+1]=t;}}voidoutput(intx[]){inti;coutThenumbersare:\n;for(i=0;i10;i++)coutx[i]\t;cout\n;}#includeiostream.hvoidsort(int[]),output(int[]);voidmain(){inta[10],i;for(i=0;i10;i++)cina[i];output(a);sort(a);output(a);}数组名作参数例程1-1形参:数组名实参:数组名a[0]ax[0]x数组名作参数例程1-2形参可以包括元素个数voidsort(intx[],intn){inti,j,t;for(i=0;in-1;i++)for(j=0;jn-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;coutThenumbersare:\n;for(i=0;in;i++)coutx[i]\t;cout\n;}#includeiostream.hvoidsort(int[],int),output(
本文标题:C++课件-chap3-函数
链接地址:https://www.777doc.com/doc-5081394 .html