




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
函数调用中的参数传变量的作用域 类1函数C程序执行是从main函数(主函数)开所有的函数独立定义,main()函数可以调用,但任何函数都不能调用main2函数的库函数:由系统提供,供用自定义函数:由程序员自己定义,解决特定的有参函数:函数带有参数(自变量无参函数:函数无getchar(、有返回值函数:函数被调用后返回一sin(x、无返回值函数:函数3函数的定义与两个两个形式参函数调函函数调函数定 x2y2函数两个实函数两个实际参
3242=一、函数定义与调用的一般[函数类型名]函数名([形参及形 表]{内部变量定义和 }函数名实参表5(一)无参无返回值函数的定义与函数类型 (“空类型 表示无返回值
函数
voidpstar(数 函数 体voidmain({intfor}
6(二)有参无返回值函数的定义与形参#include
定义为intvoidpstar(intn {int
体内变量定义,形参 for(i=1;i<=n;i++) 义}voidmain({intfor(i=1;i<=10;i++)
实参 若实参改为i,程序输出是什么7(三)有返回值函数的定义与int型函数(int可缺省),表示函数返回值为
例有有返 maxmax(intx,inty函 return}}
不能写为int/*/*returnx>y?x:y;return后可以是一个表voidmain({int
max函数带回返回值并赋给printf("maxis%d\n",c}8有返回值函数的定义与#include函intmaxintxinty数义定return义}voidmain({inta,b;printf("maxis%d\n",max(a,b)}将max函数的返回 作为printf函数的参数9maxmax(intx,inty{if(x>yreturnxreturny}二、函数的返回值函数返回值通过return语句获return表达return一个函数可以有多个return函数的返函数返回值的类型:取决于函数的类型intmaxintmax(floatx,floaty{floatz=x>y?x:y;return(z);函数返回值是float还是int函数调用的格式:函数名([实参表]pstar(2;printf("o!");如如,printf("maxisd\n",max(a,b举例判断素数函数1(无返回值函数#include<stdio.h>#includevoidprime(intm{intk=for(j=2;j<=k;j++if(m%j==0)
为了明确表示“不带值”,用void定义函if(j>k)printf("%disaprimenumber\n",m);elseprintf("%disnotaprimenumber\n",m);}main({intn;scanf("%d",&n)prime(n); }举例判断素数函数2(有返回值函数函数返回值类型为int时函数返回值类型为int时int可缺intjkfksqrt(m/*f标识是否为素数for(j=2;j<=k;j++if(m%j==0)if(j>k
f=1else f=0;return(f);}voidmain({intscanf("%d",&n)
/*返回1表示m返回0表示m不是素数 printf("%disaprimenumber\n",elseprintf("%disnotaprimenumber\n",n) 四、函数调用的条件1、被调函数是库函数或已经存在的自定2、若被调函数是库函数,需在文件开头将其头文件到本文件TC2.0例外:调用scanf函数和printf函数时#include 或者:函数类型名函数名(形参类型表);举例:intmax(intx,intint例外:若被调函数定 、调用在后,则可不加函数原 函数原 方1、在主调函数内 函数原 举#includevoidmain({floata,b,cfloatsub(floatx,floaty)scanf("%f,%f",&a,&b
例在执行语句之对原型函c=sub(a,bprintf(“subis%f\n",
函数调floatsub(floatx,floaty{floatz;z=x-yreturn(z)
函数定义的格式有什么的格式有什么区函数的五、形式参数与实际参数号不能省略,如fun()。如函数原intmax(intx,int函数调max3x1+5maxa[ib[i 数组元素a[i],b[i]C语言实参与形参相互作用的特点:实 形即改变形参的值不会使实参的值发生“值传递”又分为“数值传递”和“地址传递”例
函数调用中的参数#includeintmult(intn{return(n);voidmain({int
时,n不 单元 调用前:n ,result);,number
形参 调用时#includeintmult(intmult(intn{ return}调用中:voidmain({intnumber,result;
n所占 单元被 放,实参number调用后放,实参number
实 数
简单
单向数值举例写函数对两个数按降序排列以下程序能实现a和b两个变量的交换吗swap(intx,int{intt;}调swap(intx,int{intt;}9595595959595595959955 #include voidmain({int if(a<b)swap(a,b);}
改变形参变量的值无法现a和b两个变量的交换指针变量作函数实 形单向值若指针作为函数参指针类型
地址
指针类型单向地址举例写函数对两个数按降序排列调swap(int*p1,intint调swap(int*p1,intint*t/*不能用int}59形参指针
#includevoidmain({intint*pointer1,*pointer2;
tt改
无法实现a和b个变量的交换 举例写函数对两个数按降序排列swap(int*p1,intswap(int*p1,intintt/*不能用}#includevoidmain({intint*pointer1,*pointer2;
改
形参单if(a<b)swap(pointer1,pointer2);
指针变量作函数参数欲通过函数调用得到n被调函设置n个指针变量p1,p2,…作为形函数调调函数以a1,a2,…的地址为实参,于是形参p1,p2,…指向a1,a2,…,被调函数改变*p1,*p2,…的值实际上就是改变因此,函数调用指针变量作函数#include<stdio.h>voidfun(int#include<stdio.h>voidfun(int*p,int*q){}{intx=55,y=66;}
数组作函数数组元素作函数同于简单变量作函数参数,数组名作函数同于指针变量作函数参数一、数组元素作函数例7.15:应组素个例7.15:应组素个较如数a的素数中元素大次则大数反数于数组,如果两组素于方元次相,则两数组相等。 ──通过调用lage函数实现large(intx,inty{intflagif(x>y)flag=1large(intx,inty{intflagif(x>y)flag=1elseif(x==y)flag=0;elseflag=-1;return(flag)}例例7.15{inta[10],b[10],i,n=0,k=0for(i=0;i<10;i++)scanf("%d",&a[i])for(i=0;i<10;i++)scanf("%d",&b[i])for(i=0;i<10;i++iflarge(a[i],b[i])==1) /*累计a[i]>b[i]的次数elseiflarge(a[ib[i])==-1k/*累计a[i]<b[i]的次数if(n>kprintf("arrayaislargerthanarrayb\n")elseif(n<kprintf("arraybislargerthanarraya\n");printf("arrayaisequaltoarrayb\n")}实参数组首地 地voidfun(intint{……intvoid{int 实参
形参数组名或指针注注意:形参是数组名而不是形一一维数组等指指针变形参x一维数组名作函数定义函数时,形参数组不占用的空间。实参调用形参x对形参数组的操作,也就是对实参数组的一维数组名作函数实参数组首地 地实
形参数组名或指针形一维数一维数组等指向一维数组的指针变指指针变4种等价形式:(1)形参、实参都用数形参、实形参用形参用数组名、实参用指针变例
举例编写函数统计一维数组中非0intsolve(intsolve(intb[ {intsum=0,ifor(i=0;i<10;i++if(b[i]!=0)sum++return voidmain({inta[10],num,i;for(i=0;scanf("%d",&a[i]);num=solve(a);printf("num=%d\n",num) 举例编写函数统计一维数组中非0例 改进程intsolve{intintsolve{intsum=0,ifor(i=0;i<n;i++if(b[i]!=0)sum++return intb[],int {inta[10],num,i思考:将实参数组定义a[20]思考:将实参数组定义a[20]行吗num=solve(a,10) printf("num=%d\n",num) 写函数实现数组逆置类例7.19:形参和实参均voidvoidfun(intx[],int{intfor(i=0,j=n-1;i<j;i++,j--{t=x[i];x[i]=x[j];x[j]=t;}#include<stdio.h>voidmain(){intprintf("Theoriginalfori=0;i<10;i+printf("%3d",a[i]/*出原始数组a
/*用函数fun置数组aprintf("Thearrayhasbeen
/*出逆后的数组a 写函数实现数组逆置voidfun(int*x,intvoidfun(int*x,int{intt,*i,*j,m=(n-{t=*i;*i=*j;*j=t;}voidmain(){intprintf("Theoriginalfor(i=0;i<10;i++)
/*用函数fun逆置数组aprintf("Thearrayhasbeenfor(i=0;i<10;i++)printf("%3d",a[i]);写函数实现数组逆置形参为数组名,实voidvoidfun(intx[],int{intt,i,j,m=(n-1)/2;for{j=n-i-1;t=x[i];x[i]=x[j];x[j]=t;}voidmain(){intprintf("Theoriginalfor(i=0;i<10;i++)p=a;
/*调用函数fun()逆置数组printf("Thearrayhasbeenfor(i=0;i<10;i++) 写函数实现数组逆置voidfun(int*x,intvoidfun(int*x,int{intt,*i,*j,m=(n-{t=*i;*i=*j;*j=t;}#includevoidmain({intprintf("Theoriginalfor(i=0;i<10;i++)printf("%3d",a[i]);p=a;
/*用函数fun逆置数组printf("Thearrayhasbeenfor(i=0;i<10;i++)printf("%3d",a[i]);例例#includevoidvoidselect(int*a,int{intfor(i=0;i<n-1;i++{k=ifor(j=i+1;j<n;j++if(a[j]<a[k])k=jif(k!=i){temp=a[k];a[k]=a[i];a[i]=temp;voidmain({inta[10],inti;printf("Enterthearray:\n");
select(a,10printf("thesortedarray:for(i=0;i<10;i++)printf("%d 三 数组名作函数参数实 形二维数组二维数组等 等行指行指行指针元素元素元素指针例
或:intmax_valueint(*a)[4#includeintmax_valueinta[4])形参二维数组的{inti,j,maxmax=a[0][0]for(i=0;i<3;i++for(j=0;j<4;j++
可以加一个形参n传递第一维的if(可以加一个形参n传递第一维的return(max)}voidmain({inta[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}}printf("max=%d\n",max_value(a)) 实 形一维字一维字一维字等 等字符字符指字符指针例
到串voidstringcopyvoidstringcopy(chars[],char*t{inti=0;while(*t!='\0'){i++;例7.25改用两个voidstringcopy while(针变量作r*p,char+)!='\0');}voidmain({charstr1[]="Ilovechar*str2="Ilovestringcopy
调用函 将串voidcopysubstringvoidcopysubstring(char*s1,char*s2,int{s1=s1+k-1; while(*s1!='\0')*s2}举例从(若不足n个,取所有后续字符voidcopysubstring(char*s1,char*s2,intk,int{s1=s1+k-while(n>0&&*s1!='\0'{*s2++=*s1++;n--;*s2 函数的嵌套调用和递函数的嵌套main()函 fun1()函 fun2()函 ① 调用函数
调用函数 结从什么地方调用函数,就返回到什么地函数的嵌套调用举例—求组合数cn#includevoidmain({intm,n,t;floatc(int,if(n>m)printf("Inputelseprintf("%.0f\n",c(m,n)函数函数C:求
调用c函数floatc(intm,int{ f,fac(int)f=fac(m)/(fac(n)*fac(m-n)
在c函数中三return(f)floatfac(intfloatfac(int{inti;floatfor(i=1;i<=t;i++)函数fac:求
return(s)}函数的递归inta(int{int……
}递归函数两要 递归调使递归结束的递归函数应用举例 问P233例 age(n-1)+2 析
递归调结束递归的条intage(intn{int
intage(intn{intage(intn{if(n==1)returnelsereturnage(n-1)+2}}#include<stdio.h>voidmain(){printf("%d\n",age(5)) 递归函数应用举例 问
例
递归函数应用举例2—求阶 析
n*fac(n-1)
结束递归的条递归调floatfloatfacintn /*求阶乘函数{floatfif(n==0||n==1)f=1;elsef=n*fac(n-1);return(f); #includevoidmain({intif(n<0)printf("n<10,dataelseprintf("%d!=%15.0f\n",n,fac(n));递归函数的优递归优点:程序简洁;有时能解决非递归方法递归函数会带来大量的重复计算,例如程序,每一次递归函数调用都会带来前面的重函数的每一次调参数以及恢复现函数的返回值为返回指针的函数的{……int*f(intm,int{……举例返回新函数功能:从串s去所有的空格,返回删去空格后的schar*delspace(char*delspace(char{intif(*p1=='')}{char*delspace(char*);chars[100];}变量的作用域 类变量按照其作用范围分为局部变量和全局变量(外部变量类作用(有效范围函数形本复合语变两点说①不同函数两点说①不同函数中的局部变量可以同名,全局变量与局部变间间空inta=3,b=5intmax(inta,intb
全局变量a、max()的局部变量a、{intc
max()的局部变量c=a>b?a:b;return(c);}voidmain()
使用max()的局部变量a、程序运行{inta=8
main()的局部变量printf("%d\n",max(a,b)) 实参a是main()的局部变量(8),实参b是全局变量全局变量应用P243例7.40有一个一维数组,内放10个学生的成绩,写一个函#includefloatMax,Min定#includefloatMax,Min定义全局变量在所有函数floataverage(floatarray[],intn{inti;floataver,sum=array[0]Max=Min=array[0]for(i=1;i<n;i++{if(array[i]>Max)Max=array[i];elseif(array[i]<Min)Min=array[i];sum=sum+array[i];} return(aver);voidmain({floatave flo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论