计算机软件基础自考本科函数_第1页
计算机软件基础自考本科函数_第2页
计算机软件基础自考本科函数_第3页
计算机软件基础自考本科函数_第4页
计算机软件基础自考本科函数_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机软件基础第一篇C语言程序设计基础第四章函数一、函数的概念1.函数:是一个能独立完成一定功能的程序段。2.函数的种类:库函数和用户自定义函数。库函数名类型函数#include<stdio.h>输入、输出类getchar(),putchar();scanf(),printf();

gets(),puts()等函数。#include<string.h>字符串处理类strlen(),strcat(),strcmp(),strcpy()等函数。#include<math.h>数学类fabs(),sqrt(),sin(),cos()等函数。一、函数的概念例4-1求s=2!+3!+7!main(){inti,p,q,r,s;p=1;for(i=1;i<=2;i++)p=p*i;q=1;for(i=1;i<=3;i++)q=q*i;r=1;for(i=1;i<=7;i++)r=r*i;s=p+q+r;printf("s=%d\n",s);}一、函数的概念例4-1

求s=2!+3!+7!intf1(intn)

/*fl函数的首部*/{intx=1,i;

/*函数体中的说明部分*/for(i=1;i<=n;i++)

/*以下为函数体的语句部*/x=x*i;return(x);

/*返回计算结果x的值*/}main()

/*程序由此开始*/{ints;

/*函体中变量定义*/s=f1(2)+f1(3)+f1(7);

/*调用fl函数,计算2!+3!+7!的值*/printf("2!+3!+7!=%d\n",s);

/*输出结果*/}

/*程序到此结束*/一、函数的概念3.函数的定义:由函数首部和函数体两部分组成。函数定义一般形式:函数类型函数名(形式参数表列){说明部分;语句部分;}注意:函数体中说明部分包括:(1)函数体中所用量的说明;(2)对将要调用函数的说明。一、函数的概念函数定义说明:(1)函数类型是函数执行完后返回值的类型;(2)函数名是由用户自己命名的标识符;(3)形式参数类似于数学函数中的自变量;(4)定义形参的两种方法:a.在形参表列中逐个指明形参的类型,形式为:(类型1形参1,类型2形参2,…)如:intsum(floatx,floaty,floatz)b.在括号内只写形参名,在括号外单独定义其类型,如:intsum(x,y,z)floatx,y;intz;二、C程序的结构1.C程序结构:(1)一个C程序必须有而且只能有1个主函数;(2)C程序的执行总是从主函数开始到主函数结束;(3)函数定义不能嵌套;(4)函数调用可以嵌套,但只能是主函数调用子函数,子函数不能调用主函数。二、C程序的结构2.书写顺序:若A函数调用B函数,则其书写顺序要求:(1)一般情况下,B函数写在A函数的前面;(2)B函数的类型为int或char时,B可以放在A后面;(3)如果B函数的类型不为int或char,但又想将B放在A后边,则必须在A函数体的说明部分对B函数进行声明,声明形式为:函数B的类型B函数名(类型1形参1,类型2形参2)或函数B的类型B函数名(类型1,类型2)注意:对调用的函数声明时,其形参名可以和定义时的形参名不同。(1)floatfa(intx,inty){……}main(){……fa(1,3);……}

(2)main(){floatfa(intx,inty);……fa(1,3);……}

floatfa(intx,inty){……}(3)main(){floatfa(int,int);……fa(1,3);……}

floatfa(intx,inty){……}(4)main(){……fa(1,3);……}

intfa(intx,inty){……}三、函数的参数和返回值1.函数的参数——定义定义示例形参:在函数定义的首部出现的参数,称为形参。main(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Maxis%d“,c);}max(intx,inty){intz;z=x>y?x:y;renturn(z);}

实参:在调用函数时使用的参数,称为实参。形参实参一、函数的概念例4-2求两整数之和的程序如下:intsum(intx,inty)

/*定义含两个形参的sum函数*/{intz;

/*函数体中z变量定义*/z=x+y;return(z);

/*返回两整数之和*/}main()

/*程序由此开始*/{inta,b,c;scanf("%d,%d",&a,&b);/*输入a、b两变量的值*/c=sum(a,b);

/*调用函数sum,其中a、b为实参*/printf("sum=%d\n",c);

/*输出sum函数调用结果*/}

/*程序到此结束*/三、函数的参数和返回值1.函数的参数——形参与实参之间的关系相同点不同点个数相等实参必须有确定的数值顺序一致形参必须指定类型类型相符注意:如果形参与实参的类型不一致,则在调用函数时,则自动按形参类型转换。形参在函数被调用之前不占内参;函数调用时为形参分配内存;调用结束时,所分配的内存自动释放。三、函数的参数和返回值2.函数的返回值没有返回值的函数有返回值的函数

若函数中,renturn语句后面无表达式,这时函数没有返回值。

没有返回值的函数,其定义类型为空类型,用类型名void表示。若函数中,return语句后面有表达式,则该函数一定有返回值。return后面表达式值的类型以所在函数的类型为准。当函数类型为int时,函数类型名int可以不写,系统默认为int。四、函数的调用1.函数调用的两种情况没有返回值的调用有返回值的调用调用格式函数名(实参表列);函数名(实参表列);说明(1)这种调用是语句的调用,没有返回值;(2)被调函数执行完后,返回带主调函数中调用语句的下一条语句继续执行。(1)这种调用为表达式调用,只能出现在表达式所能出现的地方;(2)被调函数中一定有“return表达式;”语句,被调函数调用完后执行renturn语句,将表达式的值返回到调用表达式处参加运算;四、函数的调用例4-3下面是求两个数最大值的程序。main()/*程序由此开始*/{voidmax(int,int);/*对被调空类型函数max的声明*/inta,b;scanf("%d,%d",&a,&b);max(a,b);/*用语句调用max函数*/}/*程序到此结束*/voidmax(intx,inty)/*被调函数是空类型,无返回值*/{intz;z=x>y?x:y;printf("max=%d\n",z);}/*返回主调函数main中调用语句"max(a,b);"的下一句*/四、函数的调用例4-4将例4-3求两数最大值改为表达式调用。main(){inta,b;scanf("%d,%d",&a,&b);printf("max=%d\n",max(a,b));/*输出max调用结果,"max(a,b)"是调用表达式*/}intmax(intx,inty)/*max为整型函数*/{intz;z=x>y?x:y;returnz;}四、函数的调用2.函数调用时的数据传递之一:单向值传递方式定义:调用函数时,将实参计算出来,赋给形参,即:数据只能从实参单向传递给形参。特点:(2)函数中对形参的操作不会影响到主调用函数中的实参;(3)单向传递时,实参可以是常数,已有值的变量或表达式。而形参一般是变量。(1)函数调用时,为形参临时分配一个存储空间,而且调用结束后,将所分配的临时存储空间收回;四、函数的调用例4-5分析程序,写出运算结果。main(){voidf2(int,int);/*对将要调用的空类型函数f2的声明*/inta=2,b=8;f2(a,b);/*用语句调用f2函数*/printf("a=%d,b=%d\n",a,b);/*语句调用完后返回到该语句*/}voidf2(x,y)/*f2函数为空类型*/intx,y;/*形参类型说明*/{intm;m=x;x=y;y=m;/*x,y两变量交换值*/printf("x=%d,y=%d\n",x,y);return;}四、函数的调用2.函数调用时的数据传递之二:地址传递方式定义:调用函数时,传递的相应参数是一个地址,即变量的存储地址,对这个地址内的数据进行访问或修改会影响到实参。特点:(1)函数调用时,不会为形参分配存储空间;(2)形参所指向的是存放实参的存储地址;(3)对形参的修改,相当于在对实参进行修改。四、函数的调用例4-6编写将数组a中最大数和最小数对调的程序#defineM6/*程序中凡是出现M的地方,均用6替换*/main()/*程序由此开始*/{voidf3(intx[]);/*对将要调用的空类型函数f3声明*/inta[M],i;for(i=0;i<M;i++)scanf("%d",&a[i]);/*输入a数组各元素值*/f3(a);/*语句调用,f3函数调用完后返回到下一句*/for(i=0;i<M;i++)printf("%4d",a[i]);/*输出对调后的a数组值*/printf("\n");}/*程序到此结束*/四、函数的调用voidf3(intx[]){intmax,maxi,min,mini,i,w;max=min=x[0];maxi=mini=0;for(i=1;i<M;i++){if(x[i]>max)/*求最大值max及它的序号maxi*/{max=x[i];maxi=i;}if(x[i]<min)/*求最小值min及它的序号mini*/{min=x[i];mini=i;}}w=x[maxi];x[maxi]=x[mini];/*最大值,最小值交换位置*/x[mini]=w;}/*返回到main主调函数中"f3(a);"语句的下一句*/四、函数的调用例4-7把A[n][n]二维数组对角线元素置l,并求其余元素之和,要求用函数完成。四、函数的调用main()/*程序由此开始*/{inta[4][4],i,j,s;for(i=0;i<4;i++)for(j=0;j<4;j++)scanf("%d",&a[i][j]);/*输入数组各元素值*/s=f4(a);/*s中存放除对角线元素外其余元素之和*/for(i=0;i<4;i++){for(j=0;j<4;j++)printf("%4d",a[i][j]);/*输出对角线元素置1后的数组*/printf("\n");}四、函数的调用intf4(intx[][4]){intsum=0,i,j;for(i=0;i<4;i++)for(j=0;j<4;j++)if(i==j||i+j==3)/*对角线元素包含主对角及副对角元素*/x[i][j]=1;/*置l*/elsesum=sum+x[i][j];/*其余元素求和*/return(sum);/*返回给主调函数中S变量*/}四、函数的调用3.函数调用时的数据传递之三:返回值传递方式定义:使用“return表达式;”语句,将值回传到主调函数。特点:(1)使用“return表达式;”语句,来回传值;(2)使用“返回值类型函数名(参数列表)”形式,来定义函数。五、局部变量和全局变量局部变量全局变量概念在函数内部定义的变量在函数外部定义的变量作用域所在的函数整个程序说明不同函数中可以使用相同的变量名,但它们是不同的量,相互不干扰。(1)全局变量在程序执行过程中,一直占用存储空间,降低了空间利用率;(2)全局变量牵制了各个函数,降低了各函数之间的相对对立性;(3)各函数执行时,都可能改变全局变量的值,程序容易出错。四、函数的调用例4-8intf5(inta,intb)/*函数f5*/{a=a+b;b=a+b;printf("al=%d,bl=%d\n",a,b);}main()/*程序由此开始*/{inta=5,b=8;f5(a,b);printf("a2=%d,b2=%d\n",a,b);}/*程序到此结束*/四、函数的调用例4-9main(){inta=1,b=2,c=3;a++;c+=b;{intb=4,c;c=2*b;a+=c;printf("al=%d,bl=%d,cl=%d\n",a,b,c);}printf("a2=%d,b2=%d,c2=%d\n",a,b,c);}四、函数的调用例4-10输出l~4的阶乘值intf7(intn)/*函数f7*/{inti,s=1;for(i=1;i<=n;i++)s=s*i;returns;}main()/*主函数*/{inti;for(i=1;i<=4;i++)printf("%1d!=%d\n",i,f7(i));}

四、函数的调用例4-11编写求N个数的最大数、最小数及N个数的平均值的程序。要求主函数中输入这N个数,输出上述三个结果,f81函数中求最大值、最小值,f82函数中求平均值。#defineN5floatmax,min;/*定义max,min为全局变量*/voidf81(floatx[],intn){inti; for(i=0;i<=n;i++){if(x[i]>max)max=x[i];if(x[i]<min)min=x[i];}}floatf82(floatx[],intn){floats=0.0;inti;for(i=0;i<=n;i++)s=s+x[i];s=s/(n+1);returns;}main()/*程序由此开始*/{floata[N],ave;inti;for(i=0;i<=N;i++)scanf("%f",&a[i]);max=min=a[0];f81(a,N);ave=f82(a,N);printf("max=%f,min=%f,ave=%f\n",max,min,ave);}四、函数的调用例4-12intx=3,y=8;/*定义x,y为全局变量*/f9(intx,inty)/*形参x、y为局部变量,仅在f9函数中有效*/{intm;m=x+y;/*m、x、y有效范围*/return(m);}main(){inty=10;/*局部变量y仅在主函数中有效*/printf("%d\n",f9(x,y));/*全局变量x=3仅在主函数中有效*/}无分号六、用static声明的局部变量autoregisterstatic类型自动型寄存器型静态型存储区内存的堆栈区CPU的寄存器区内存的数据区特点在调用函数时,分配一个临时的存储空间,而且调用结束时将所分配的临时存储空间收回;如果不赋初值,则其中是一个不确定的值。访问效率高;调用函数结束时,所占用的寄存器被回收。函数调用结束时,所占用的存储区不会被回收,即变量的值不会因为函数调用结束而消失。四、函数的调用例4-13计算并输出1~4的阶乘main(){inti;for(i=1;i<=4;i++)printf("%1d!=%d\n",i,fl0(i));}intfl0(intn){staticintf=1;f=f*n;return(f);}四、函数的调用例4-14main(){intk=4,m=1,p;p=f11(k,m);printf("%d,",p);p=f11(k,m);printf("%d",p);}

f11(a,b)inta,b;{staticintm,i=2;i*=m+2;m=i+a+b;return(m);}七、函数的递归调用程序设计中常常要用到递归的方法,递归过程结构清晰,思路明了,程序易读。如果在一个函数的定义中又引用了自身,那么这个函数称为是递归定义的。例如自然数的集合可递归定义为:

1)1是自然数。

2)一个自然数的后继仍为一个自然数。又比如n!的递归定义为:七、函数的递归调用

例4-15采用归递方法,编程将一个正整数逆序输出。例如,若输入1234,则输出4321。voidf12(intn){if(n<10)printf("%1d",n);/*余下1位数输出,函数执行完毕*/else{printf("%ld",n%10);/*输出右边的数*/f12(n/10);}/*去掉右边数后余下的数,直接调用本函数fl2*/}/*返回*/main()/*主程序开始*/{intn;scanf("%d",&n);/*输入整数*/f12(n);/*调用f12函数*/}七、函数的递归调用例4-16编写求n!的递归程序。七、函数的递归调用floatf13(intn){if(n==0||n==1)return(1.0);elsereturn(n*f13(n-1));}main(){intn;

floatw;scanf("%d",&n);w=f13(n);printf("%d!=%f\n",n,w);}七、函数的递归调用例4-17用梯形法计算七、函数的递归调用七、函数的递归调用例4-17用梯形法计算floatf14(floatx){floaty;y=2.0*x*x+3.0*x+1.0;return(y);}main(){floata,b,h,w,s=0.0,y1,y2;inti,n;

scanf("%d,%f,%f",&n,&a,&b);

/*输入等分数n,积分区间下上限a,b*/

h=(b-a)/n;

/*梯形的高*/

y1=f14(a);

/*第一个梯形的上底*/

for(i=1;i<=n;i++)

{y2=f14(a+i*h);

/*第i个梯形的下底*/

w=(y1+y2)*h/2.0;/*第i个梯形的面积*/

s=s+w;

/*梯形面积累加*/

y1=y2;/*第i个梯形的下底为第i+1个梯形的上底*/}

printf("s=%f\n",s);}七、函数的递归调用例4-18输入三个整数分别赋予变量a、b、c。判断它们是否能成为三角形的三边,若可以,则计算其面积并输出结果。要求输入数据的合理性及求面积均使用函数。#include<math.h>

/*程序中用到了数学系统函数*/inta,b,c,w;

/*a、b、c、w为全局变量*/floats;

/*面积S为全局变量*/main(){

intenter();

/*合理性判断函数的声明*/

floatarea(int,int,int);/*计算面积函数的声明*/

w=enter();

/*调用合理性判断函数*/

if(w)

/*若a、b、e为三角形三边*/

{

s=area(a,b,c);/*调用计算面积函数*/

printf("s=%f\n",s);}

else/*若a、b、c不为三角形三边*/

printf("Badinput!\n");}

七、函数的递归调用intenter()

/*合理性判断函数*/{scanf("%d,%d,%d",&a,&b,&c);/*输入a、b、c值*/if(a>0&&b>0&&c>0&&a+b>c&&b+c>a&&a+c>b)return(1);

/*可以构成三角形三边*/elsereturn(0);

/*不可以构成三角形三边*/}floatarea(inta,intb,intc)

/*计算面积函数*/{

floatL,s;

L=(a+b+c)/2.0;

/*计算半周长*/

s=sqrt(L*(L-a)*(L-b)*(L-c));

/*求面积*/

return(s);}历年真题演练1.(2010.4单选)执行下列C程序,输出结果是()intt=1;voidsum(intp){intt=10; t+=p++; printf("%d",t);}main(){intm=5; sum(m); t+=m++; printf(",%d\n",t);}A15,6B16,6C17,6D17,7历年真题演练2.(2010.4填空)用数组元素作为实参,则实参向形参传递的是。3.(2010.4程序设计)编写C语言函数f(floatx),并用主函数调用该函数,输出计算结果。历年真题演练

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论