《计算机软件基础(自考本科函数).ppt》由会员分享,可在线阅读,更多相关《计算机软件基础(自考本科函数).ppt(51页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、计算机计算机 软件基础软件基础第一篇第一篇C语言程序设计基础语言程序设计基础第四章函数第四章函数第四章函数第四章函数一、函数的概念一、函数的概念1.函数:是一个能独立完成一定功能的程序段。函数:是一个能独立完成一定功能的程序段。2.函数的种类:函数的种类:库函数库函数和和用户自定义函数用户自定义函数。库函数名库函数名类型类型函数函数#include输入、输入、输出类输出类getchar(),putchar();scanf(),printf();gets(),puts()等函数。等函数。#include字符串字符串处理类处理类strlen(),strcat(),strcmp(),strcpy()
2、等函数。等函数。#include数学类数学类fabs(),sqrt(),sin(),cos()等函数。等函数。一、函数的概念一、函数的概念例例4-1求求s=2!+3!+7!main()int i,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=%dn,s);一、函数的概念一、函数的概念例例4-1 求求s=2!+3!+7!int f1(int n)/*fl函数的首部函数的首部*/int x=1,i;/*函数体中的说明部分函数体中的说明部分*/fo
3、r(i=1;i y?x:y;renturn(z);实参:实参:在调用函数时使用在调用函数时使用的参数,称为实参。的参数,称为实参。形参形参形参形参实参实参实参实参一、函数的概念一、函数的概念例例4-2求两整数之和的程序如下:求两整数之和的程序如下:int sum(int x,int y)/*定义含两个形参的定义含两个形参的sum函数函数*/int z;/*函数体中函数体中z变量定义变量定义*/z=x+y;return(z);/*返回两整数之和返回两整数之和*/main()/*程序由此开始程序由此开始*/int a,b,c;scanf(%d,%d,&a,&b);/*输入输入a、b两变量的值两变量
4、的值*/c=sum(a,b);/*调用函数调用函数sum,其中其中a、b为实参为实参*/printf(sum=%dn,c);/*输出输出sum函数调用结果函数调用结果*/*程序到此结束程序到此结束*/三、函数的参数和返回值三、函数的参数和返回值1.函数的参数函数的参数形参与实参之间的关系形参与实参之间的关系相同点相同点不同点不同点个数个数相等相等实参必须有确定的数值实参必须有确定的数值顺序顺序一致一致形参必须指定类型形参必须指定类型类型类型相符相符注意:注意:如果形参与实参的类型不一如果形参与实参的类型不一致,则在调用函数时,则自动按形致,则在调用函数时,则自动按形参类型转换。参类型转换。形参
5、在函数被调用之前不占内参;形参在函数被调用之前不占内参;函数调用时为形参分配内存;函数调用时为形参分配内存;调用结束时,所分配的内存自动释调用结束时,所分配的内存自动释放。放。三、函数的参数和返回值三、函数的参数和返回值2.函数的返回值函数的返回值没有返回值的函数没有返回值的函数有返回值的函数有返回值的函数 若函数中,若函数中,renturnrenturn语语句后面无表达式,这时函数句后面无表达式,这时函数没有返回值。没有返回值。没有返回值的函数,其没有返回值的函数,其定义类型为定义类型为空类型空类型,用类型用类型名名voidvoid表示。表示。若函数中,若函数中,returnreturn语句
6、后面有表达式,语句后面有表达式,则该函数一定有返回值。则该函数一定有返回值。return return后面表达式值的类型以所在函后面表达式值的类型以所在函数的类型为准。数的类型为准。当函数类型为当函数类型为intint时,函数类型名时,函数类型名intint可以不写,系统默认为可以不写,系统默认为intint。四、函数的调用四、函数的调用1.函数调用的两种情况函数调用的两种情况没有返回值的调用没有返回值的调用有返回值的调用有返回值的调用调用格式调用格式函数名函数名 (实参表列);(实参表列);函数名函数名 (实参表列);(实参表列);说说 明明(1 1)这种调用是语句的)这种调用是语句的调用,
7、没有返回值;调用,没有返回值;(2 2)被调函数执行完后,)被调函数执行完后,返回带主调函数中调用返回带主调函数中调用语句的下一条语句继续语句的下一条语句继续执行。执行。(1 1)这种调用为表达式调用,只能出)这种调用为表达式调用,只能出现在表达式所能出现的地方;现在表达式所能出现的地方;(2 2)被调函数中一定有)被调函数中一定有“return return 表表达式;达式;”语句,被调函数调用完后执语句,被调函数调用完后执行行renturnrenturn语句,将表达式的值返回到语句,将表达式的值返回到调用表达式处参加运算;调用表达式处参加运算;四、函数的调用四、函数的调用例例4-3下面是求
8、两个数最大值的程序。下面是求两个数最大值的程序。main()/*程序由此开始程序由此开始*/void max(int,int);/*对被调空类型函数对被调空类型函数max的声明的声明*/int a,b;scanf(%d,%d,&a,&b);max(a,b);/*用语句调用用语句调用max函数函数*/*程序到此结束程序到此结束*/void max(int x,int y)/*被调函数是空类型被调函数是空类型,无返回值无返回值*/int z;z=xy?x:y;printf(max=%dn,z);/*返回主调函数返回主调函数main中调用语句中调用语句max(a,b);的下一句的下一句*/四、函数的
9、调用四、函数的调用例例4-4将例将例4-3求两数最大值改为表达式调用。求两数最大值改为表达式调用。main()int a,b;scanf(%d,%d,&a,&b);printf(max=%dn,max(a,b);/*输出输出max调用结果调用结果,max(a,b)是调用表达式是调用表达式*/int max(int x,int y)/*max为整型函数为整型函数*/int z;z=xy?x:y;return z;四、函数的调用四、函数的调用2.函数调用时的数据传递函数调用时的数据传递之一之一:单向值传递方式:单向值传递方式定义:调用函数时,将实参计算出来,赋给形参,即:定义:调用函数时,将实参计
10、算出来,赋给形参,即:数据只能从实参单向传递给形参。数据只能从实参单向传递给形参。特点:特点:(2)函数中对形参的操作不会影响到主调用函数中)函数中对形参的操作不会影响到主调用函数中的实参;的实参;(3)单向传递时,实参可以是常数,已有值的变量或)单向传递时,实参可以是常数,已有值的变量或表达式。而形参一般是变量。表达式。而形参一般是变量。(1)函数调用时,为形参临时分配一个存储空间,)函数调用时,为形参临时分配一个存储空间,而且调用结束后,将所分配的临时存储空间收回;而且调用结束后,将所分配的临时存储空间收回;四、函数的调用四、函数的调用例例4-5分析程序分析程序,写出运算结果。写出运算结果
11、。main()void f2(int,int);/*对将要调用的空类型函数对将要调用的空类型函数f2的声明的声明*/int a=2,b=8;f2(a,b);/*用语句调用用语句调用f2函数函数*/printf(a=%d,b=%dn,a,b);/*语句调用完后返回到该语句语句调用完后返回到该语句*/void f2(x,y)/*f2函数为空类型函数为空类型*/int x,y;/*形参类型说明形参类型说明*/int m;m=x;x=y;y=m;/*x,y两变量交换值两变量交换值*/printf(x=%d,y=%dn,x,y);return;四、函数的调用四、函数的调用2.函数调用时的数据传递函数调用
12、时的数据传递之二之二:地址传递方式:地址传递方式定义:调用函数时,传递的相应参数是一个地址,即定义:调用函数时,传递的相应参数是一个地址,即变量的存储地址,对这个地址内的数据进行访问或修变量的存储地址,对这个地址内的数据进行访问或修改会影响到实参。改会影响到实参。特点:特点:(1)函数调用时,不会为形参分配存储空间;)函数调用时,不会为形参分配存储空间;(2)形参所指向的是存放实参的存储地址;)形参所指向的是存放实参的存储地址;(3)对形参的修改,相当于在对实参进行修改。)对形参的修改,相当于在对实参进行修改。四、函数的调用四、函数的调用例例4-6编写将数组编写将数组a中最大数和最小数对调的程
13、序中最大数和最小数对调的程序#define M 6 /*程序中凡是出现程序中凡是出现M的地方的地方,均用均用6替换替换*/main()/*程序由此开始程序由此开始*/void f3(int x);/*对将要调用的空类型函数对将要调用的空类型函数f3声明声明*/int aM,i;for(i=0;iM;i+)scanf(%d,&ai);/*输入输入a数组各元素值数组各元素值*/f3(a);/*语句调用语句调用,f3函数调用完后返回到下一句函数调用完后返回到下一句*/for(i=0;iM;i+)printf(%4d,ai);/*输出对调后的输出对调后的a数组值数组值*/printf(n);/*程序到
14、此结束程序到此结束*/四、函数的调用四、函数的调用void f3(int x)int max,maxi,min,mini,i,w;max=min=x0;maxi=mini=0;for(i=1;imax)/*求最大值求最大值max及它的序号及它的序号maxi*/max=xi;maxi=i;if(ximin)/*求最小值求最小值min及它的序号及它的序号mini*/min=xi;mini=i;w=xmaxi;xmaxi=xmini;/*最大值最大值,最小值交换位置最小值交换位置*/xmini=w;/*返回到返回到main主调函数中主调函数中f3(a);语句的下一句语句的下一句*/四、函数的调用四、
15、函数的调用例例4-7把把Ann二维数组对角线元素置二维数组对角线元素置l,并求其余元素并求其余元素之和之和,要求用函数完成。要求用函数完成。四、函数的调用四、函数的调用main()/*程序由此开始程序由此开始*/int a44,i,j,s;for(i=0;i4;i+)for(j=0;j4;j+)scanf(%d,&aij);/*输入数组各元素值输入数组各元素值*/s=f4(a);/*s中存放除对角线元素外其余元素之和中存放除对角线元素外其余元素之和*/for(i=0;i4;i+)for(j=0;j4;j+)printf(%4d,aij);/*输出对角线元素置输出对角线元素置1后的数组后的数组*
16、/printf(n);四、函数的调用四、函数的调用int f4(int x4)int sum=0,i,j;for(i=0;i4;i+)for(j=0;j4;j+)if(i=j|i+j=3)/*对角线元素包含主对角及副对角元素对角线元素包含主对角及副对角元素*/xij=1;/*置置l*/else sum=sum+xij;/*其余元素求和其余元素求和*/return(sum);/*返回给主调函数中返回给主调函数中S变量变量*/四、函数的调用四、函数的调用3.函数调用时的数据传递函数调用时的数据传递之三之三:返回值传递方式:返回值传递方式定义:使用定义:使用“return 表达式表达式;”语句,将值
17、回传到主调语句,将值回传到主调函数。函数。特点:特点:(1)使用)使用“return 表达式表达式;”语句,来回传值;语句,来回传值;(2)使用)使用“返回值类型返回值类型 函数名函数名(参数列表)(参数列表)”形式,形式,来定义函数。来定义函数。五、局部变量和全局变量五、局部变量和全局变量局部变量局部变量全局变量全局变量概念概念在函数内部定义的变量在函数内部定义的变量在函数外部定义的变量在函数外部定义的变量作用域作用域所在的函数所在的函数整个程序整个程序说明说明不同函数不同函数中可以使用中可以使用相同的相同的变量变量名,但它们是不同的量,名,但它们是不同的量,相互不干扰。相互不干扰。(1 1
18、)全局变量在程序执行过程中,)全局变量在程序执行过程中,一直占用存储空间,降低了空间利一直占用存储空间,降低了空间利用率;用率;(2 2)全局变量牵制了各个函数,)全局变量牵制了各个函数,降低了各函数之间的相对对立性;降低了各函数之间的相对对立性;(3 3)各函数执行时,都可能改变)各函数执行时,都可能改变全局变量的值,程序容易出错。全局变量的值,程序容易出错。四、函数的调用四、函数的调用例例4-8int f5(int a,int b)/*函数函数f5*/a=a+b;b=a+b;printf(al=%d,bl=%dn,a,b);main()/*程序由此开始程序由此开始*/int a=5,b=8
19、;f5(a,b);printf(a2=%d,b2=%dn,a,b);/*程序到此结束程序到此结束*/四、函数的调用四、函数的调用例例4-9main()int a=1,b=2,c=3;a+;c+=b;int b=4,c;c=2*b;a+=c;printf(al=%d,bl=%d,cl=%dn,a,b,c);printf(a2=%d,b2=%d,c2=%dn,a,b,c);四、函数的调用四、函数的调用例例4-10输出输出l4的阶乘值的阶乘值int f7(int n)/*函数函数f7*/int i,s=1;for(i=1;i=n;i+)s=s*i;return s;main()/*主函数主函数*/i
20、nt i;for(i=1;i=4;i+)printf(%1d!=%dn,i,f7(i);四、函数的调用四、函数的调用例例4-11编写求编写求N个数的最大数、最小数及个数的最大数、最小数及N个数的平均个数的平均值的程序。要求主函数中输入这值的程序。要求主函数中输入这N个数个数,输出上述三个输出上述三个结果结果,f81函数中求最大值、最小值函数中求最大值、最小值,f82函数中求平均值。函数中求平均值。#define N 5float max,min;/*定义定义max,min为全局变量为全局变量*/void f81(float x,int n)int i;for(i=0;imax)max=xi;i
21、f(ximin)min=xi;float f82(float x,int n)float s=0.0;int i;for(i=0;i=n;i+)s=s+xi;s=s/(n+1);return s;main()/*程序由此开始程序由此开始*/float aN,ave;int i;for(i=0;i=N;i+)scanf(%f,&ai);max=min=a0;f81(a,N);ave=f82(a,N);printf(max=%f,min=%f,ave=%fn,max,min,ave);四、函数的调用四、函数的调用例例4-12int x=3,y=8;/*定义定义x,y为全局变量为全局变量*/f9(i
22、nt x,int y)/*形参形参x、y为局部变量为局部变量,仅在仅在f9函数中有效函数中有效*/int m;m=x+y;/*m、x、y有效范围有效范围*/return(m);main()int y=10;/*局部变量局部变量y仅在主函数中有效仅在主函数中有效*/printf(%dn,f9(x,y);/*全局变量全局变量x=3仅在主函数中有效仅在主函数中有效*/无分号无分号无分号无分号六、用六、用staticstatic声明的局部变量声明的局部变量autoautoregisterregisterstaticstatic类类 型型自动型自动型寄存器型寄存器型静态型静态型存储区存储区内存的堆栈区内
23、存的堆栈区CPUCPU的寄存器区的寄存器区内存的数据区内存的数据区特特 点点在调用函数时在调用函数时,分分配一个临时的存配一个临时的存储空间,而且调储空间,而且调用结束时将所分用结束时将所分配的临时存储空配的临时存储空间收回;如果不间收回;如果不赋初值,则其中赋初值,则其中是一个不确定的是一个不确定的值。值。访问效率高;访问效率高;调用函数结束时,调用函数结束时,所占用的寄存器被所占用的寄存器被回收。回收。函数调用结束时,所占函数调用结束时,所占用的存储区不会被回收,用的存储区不会被回收,即变量的值不会因为函即变量的值不会因为函数调用结束而消失。数调用结束而消失。四、函数的调用四、函数的调用例
24、例4-13计算并输出计算并输出14的阶乘的阶乘main()int i;for(i=1;i=4;i+)printf(%1d!=%dn,i,fl0(i);int fl0(int n)static int f=1;f=f*n;return(f);四、函数的调用四、函数的调用例例4-14main()int k=4,m=1,p;p=f11(k,m);printf(%d,p);p=f11(k,m);printf(%d,p);f11(a,b)int a,b;static int m,i=2;i*=m+2;m=i+a+b;return(m);七、七、函数的递归调用函数的递归调用函数的递归调用函数的递归调用程序
25、设计中常常要用到递归的方法程序设计中常常要用到递归的方法,递归过程结构清晰递归过程结构清晰,思路明了思路明了,程序易读。程序易读。如果在一个函数的定义中又引用了自身如果在一个函数的定义中又引用了自身,那么这个函数那么这个函数称为是递归定义的。称为是递归定义的。例如例如自然数的集合可递归定义为:自然数的集合可递归定义为:1)1是自然数。是自然数。2)一个自然数的后继仍为一个自然数。一个自然数的后继仍为一个自然数。又比如又比如n!的递归定义为:的递归定义为:七、七、函数的递归调用函数的递归调用函数的递归调用函数的递归调用 例例4-15采用归递方法采用归递方法,编程将一个正整数逆序输出。例编程将一个
26、正整数逆序输出。例如如,若输入若输入1234,则输出则输出4321。void f12(int n)if(n10)printf(%1d,n);/*余下余下1位数输出位数输出,函数执行完毕函数执行完毕*/else printf(%ld,n%10);/*输出右边的数输出右边的数*/f12(n/10);/*去掉右边数后余下的数去掉右边数后余下的数,直接调用本函数直接调用本函数fl2*/*返回返回*/main()/*主程序开始主程序开始*/int n;scanf(%d,&n);/*输入整数输入整数*/f12(n);/*调用调用f12函数函数*/七、七、函数的递归调用函数的递归调用函数的递归调用函数的递归
27、调用例例4-16编写求编写求n!的递归程序。的递归程序。七、七、函数的递归调用函数的递归调用函数的递归调用函数的递归调用float f13(int n)if(n=0|n=1)return(1.0);else return(n*f13(n-1);main()int n;float w;scanf(%d,&n);w=f13(n);printf(%d!=%fn,n,w);七、七、函数的递归调用函数的递归调用函数的递归调用函数的递归调用例例4-17用梯形法计算用梯形法计算七、七、函数的递归调用函数的递归调用函数的递归调用函数的递归调用七、七、函数的递归调用函数的递归调用函数的递归调用函数的递归调用例例
28、4-17用梯形法计算用梯形法计算float f14(float x)float y;y=2.0*x*x+3.0*x+1.0;return(y);main()float a,b,h,w,s=0.0,y1,y2;int i,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个梯形的面积个梯形
29、的面积*/s=s+w;/*梯形面积累加梯形面积累加*/y1=y2;/*第第i个梯形的下底为第个梯形的下底为第i+1个梯形的上底个梯形的上底*/printf(s=%fn,s);七、七、函数的递归调用函数的递归调用函数的递归调用函数的递归调用例例4-18输入三个整数分别赋予变量输入三个整数分别赋予变量a、b、c。判断它们是否能成。判断它们是否能成为三角形的三边为三角形的三边,若可以若可以,则计算其面积并输出结果。要求输入数则计算其面积并输出结果。要求输入数据的合理性及求面积均使用函数。据的合理性及求面积均使用函数。#include /*程序中用到了数学系统函数程序中用到了数学系统函数*/int a
30、,b,c,w;/*a、b、c、w为全局变量为全局变量*/float s;/*面积面积S为全局变量为全局变量*/main()int enter();/*合理性判断函数的声明合理性判断函数的声明*/float area(int,int,int);/*计算面积函数的声明计算面积函数的声明*/w=enter();/*调用合理性判断函数调用合理性判断函数*/if(w)/*若若a、b、e为三角形三边为三角形三边*/s=area(a,b,c);/*调用计算面积函数调用计算面积函数*/printf(s=%fn,s);else /*若若a、b、c不为三角形三边不为三角形三边*/printf(Bad input!
31、n);七、七、函数的递归调用函数的递归调用函数的递归调用函数的递归调用 int enter()/*合理性判断函数合理性判断函数*/scanf(%d,%d,%d,&a,&b,&c);/*输入输入a、b、c值值*/if(a0&b0&c0&a+bc&b+ca&a+cb)return(1);/*可以构成三角形三边可以构成三角形三边*/else return(0);/*不可以构成三角形三边不可以构成三角形三边*/float area(int a,int b,int c)/*计算面积函数计算面积函数*/float L,s;L=(a+b+c)/2.0;/*计算半周长计算半周长*/s=sqrt(L*(L-a)
32、*(L-b)*(L-c);/*求面积求面积*/return(s);历年真题演练历年真题演练1.(2010.4单选)执行下列单选)执行下列C程序,输出结果是(程序,输出结果是()int t=1;int t=1;void sum(int p)void sum(int p)int t=10;int t=10;t+=p+;t+=p+;printf(%d,t);printf(%d,t);main()main()int m=5;int m=5;sum(m);sum(m);t+=m+;t+=m+;printf(,%dn,t);printf(,%dn,t);A 15,6 B 16,6C 17,6 D 17,7
33、历年真题演练历年真题演练2.(2010.4填空)用数组元素作为实参,则实参向形参填空)用数组元素作为实参,则实参向形参传递的是传递的是 。3.(2010.4程序设计)编写程序设计)编写C语言函数语言函数f(float x),并用,并用主函数调用该函数,输出计算结果。主函数调用该函数,输出计算结果。历年真题演练历年真题演练第第3题答案:题答案:#include#includefloat f(float x)float f(float x)float y;float y;if(x10)if(x10)y=sin(x)*sin(x)+3*cos(x);y=sin(x)*sin(x)+3*cos(x);
34、if(fabs(x)=10)if(fabs(x)=10)y=3*x*x-fabs(x);y=3*x*x-fabs(x);if(x-10)if(x-10)y=sqrt(x*x+1);y=sqrt(x*x+1);return(y);return(y);main()main()float x;float x;scanf(%f,&x);scanf(%f,&x);printf(x=%f,f(x)=%fn,x,f(x);printf(x=%f,f(x)=%fn,x,f(x);同步跟踪测评同步跟踪测评1.已知有如下程序代码:已知有如下程序代码:#include#includevoid printflag(i
35、nt itype)void printflag(int itype)if(itype=0)if(itype=0)printf(printf(*r);*r);else if(itype=1)else if(itype=1)printf(printf(#r);#r);main()main()printflag(0);printflag(0);printflag(1);printflag(1);该程序中,在函数该程序中,在函数printflag中的数据传递方式是中的数据传递方式是()A 单值传递方式单值传递方式 B 地址传递方式地址传递方式C 返回值传递方式返回值传递方式 D 全局变量传递方式全局变
36、量传递方式同步跟踪测评同步跟踪测评2.已知有如下程序代码:已知有如下程序代码:该程序中,没有使用下列该程序中,没有使用下列哪种值传递方式是哪种值传递方式是()。A 单值传递方式单值传递方式 B 地址传递方式地址传递方式C 返回值传递方式返回值传递方式 D 全局变量传递方式全局变量传递方式#include#includeint setFlag(char str,int iArrLen)int setFlag(char str,int iArrLen)int i;int i;int iCnt=0;int iCnt=0;for(i=0;iiArrLen;+i)for(i=0;iiArrLen;+i)
37、if(stri=#)if(stri=#)stri=*;stri=*;iCnt+;iCnt+;return iCnt;return iCnt;main()main()char str=123#456;char str=123#456;int iCnt=setFlag(str,strlen(str);int iCnt=setFlag(str,strlen(str);printf(%d,iCnt);printf(%d,iCnt);同步跟踪测评同步跟踪测评3.已知有如下程序代码:已知有如下程序代码:下列描述正确的是下列描述正确的是()。A ARR-MAX-LEN是一是一个全局变量个全局变量 B iAr
38、r是一个全局变量是一个全局变量C iMax是一个全局变量是一个全局变量 D 以上都对以上都对#include#include#define ARR_MAX_LEN 5#define ARR_MAX_LEN 5int iMAX=0;int iMAX=0;getMax(int iArr)getMax(int iArr)int i;int i;for(i=0;iARR_MAX_LEN;+i)for(i=0;iARR_MAX_LEN;+i)if(iMaxiArri)if(iMaxiArri)iMax=iArri;iMax=iArri;main()main()char char iArrARR_MAX_LEN=5,9,6,4,12;iArrARR_MAX_LEN=5,9,6,4,12;printf(%d,iMax);printf(%d,iMax);