1、二、函数的定义和返回值1、 函数定义的语法 函数首部(main( ) 函数1C语 定义说明部分言程 函数体 序 执行语句部分 函数22、C语言函数定义的一般形式如下1) 函数返回值的类型名 函数名(类型名 形式参数1,类型名 形式参数2.) /* 函数首部*/ 说明部分 /*函数体*/ 语句部分 int abs(int x) 2) 在老的C语言版本中,函数的首部用以下的形式: 函数返回值的类型名 函数名(形式参数1,形式参数2.) 形式参数类型说明; int abs(x) int; 3)函数名和形式参数都是由用户命名的标识符。在同一程序中,函数名必须唯一;形式参数名只要同一函数中唯一即可,可以
2、与其它函数中的变量同名。4)C语言规定,不能在同一个函数的内部再定义函数。5)若在函数的首部省略了函数返回值的类型名,函数首部写成: 函数名(类型名 形式参数1,类型名 形式参数2.)C语言默认返回值类型为int型。编写求两个双精度之和的函数。 double add(double a, double b) double s; s=a+b; return s;6) 函数体中,除形参外,用到的其它变量必须在说明部分进行定义,这些变量(包括形参),只在函数被调用时才临时开辟存储单元,当退出函数时,这些临时开辟的存储单元全被释放掉,因此,这种变量只在函数体内部起作用,与其它函数中的变量互不相关,它们可
3、以和其它函数中的变量同名。3、函数的返回值1)函数的值通过return语句返回,return语句的形式如下: return 表达式; 或 return(表达式); 或 return2) 说明 return语句中的表达式的值就是所求的函数值。此表达式值的类型必须与函数首部所说明的类型一致。若类型不一致,则以函数值的类型为准,由系统自动进行转换。当程序执行到return语句时,程序的流程式就返回到调用该函数的地方,并带回函数值。在同一函数内,可以根据需要在多处出现return语句。return语句也可以不含表达式,这时它的作用只是使流程返回到调用函数,并没有确定的函数值。函数体内可没有return
4、语句,程序的流程就一直执行到函数末尾的”,然后返回调用函数,这时也没有确定的函数值带回。函数的调用和说明一、函数的两种调用方式:1、 函数的一般调用形式为:函数名(实在参数表)实在参数(简称实参)的个数多于一个时,各实在参数之间用逗隔开。若函数无形参,调用形式为:函数名( ) 例:函数名后的一对括号不可少。 fun(int x)int j,sum=0; for(j=1;j=x;j+) sum+=j; return sum;main( ) int s,n; scanf(“%d”,&n); s=fum(int n); printf(“%d”,s);可用两种方式调用函数1)作为表达式出现y=add(
5、3.0,4.0)2)作为独立语句出现printf(“*”);二、函数调用时的语法要求1、调用函数时,函数名必须与所调用的函数名字完全一致。2、实参的个数必须与形式参数的个数一致。实参可以是表达式,在类型上应按位置与形参一一对应匹配。如果类型不匹配,C编译程序按赋值兼容进行转换,若实参和形参的类型不赋值兼容,通常不给出出错信息,且程序仍然执行,只是不会得到正确的结果。因此,应该特别注意实参和形参的类型匹配。3、C语言规定:函数必须先定义,后调用(函数的返回值类型为int或char时除外)。第三节 调用函数和被调用函数之间数据的传递fun(int x) /被调用函数.main() s=fun( n
6、); Printf(“%d”,s);C语言中,调用函数被调用函数之间数据可以通过三种方式进行传递1.实在参数和形式参数之间进行数据传递2.通过return语句把函数值返回调用函数3.通过全局变量。二、在C语言中,数据只能从实参单向按值传递。也就是说,当简单变量作为实参时,用户不可能在函数中改变对应实参值。三、例题:例1:以下程序例示了函数参数之间的单向传递,请观察程序的执行结果。 int x=2,y=3,z=0; printf(“(1)x=%d y=%d )z=%dn”,x,y,z); try(x,y,z); printf(“(4)x=%d y=%d z=%dn”,x,y,z);try(int
7、 x,int y,int z) printf(“(2)x=%d y=%d z=%dn”,x,y,z); z=x+y; /* 5=2+3 x=x*x; /* 4=2*2y=y*y; /* 9=3*3printf(“(3)x=%d y=%d z=%dn”,x,y,z);两个数交换 int a,b; main()int a,b,t; scanf(“%d%d”,&a,&b); printf(“a=%d,b=%d”,a,b); t=a;a=b;b=t;例2:用函数方法 twr(a,b);twr(int a,int b) int t;printf(“a=%d,b=%d”,a,b);函数程序举例 例1:编写
8、函数isprime(int a)用来判断自变量a是否为素数,若是素数,函数返回1,否则返回0。 素数:只能被1和本身整除的数。 int x,i;x);for(i=2;i=x) printf(“YES”); /始终没有跳出循环,说明它是素数。else printf(“NO”);函数方法: main( ) int a; if(isprme(a) printf(“YES”); else printf(“NO”);isprime(int a) int i; for(i=2;a; if(a%i=0) return 0; return 1; 例2:编写函数,验证任意偶数为两个素数之和并输出这两个素数。 分
9、析:任意输入一个数:如 12 12的因子: 2 3 4 5 6 7 8 9 10 11 2+10=12 (2,10 不是素数) 3+9=12 (3,9不是素数) 4+8=12 (4, 8不是素数) 5+7=12 6+6=12 (6不是素数) 超过一半就不用判断了,因为重复。 int isprime(int a) if(a%i=0) retrurn 0; void even(int x) int i;=x/2; if(isprime(i) if(isprime(x-i) printf(“%d=%d+%d”,x,i,x-i); int x; /*当前要判断的偶数*/ if(x%2=0) /*如果为
10、偶数*/even(x); /*函数为独立语句调用,没有返回值*/ 例3:编写函数myupper(ch),把ch中的小写字母转换成大写字母作为函数值返回,其它字符不变。用字符结束输入。分析; dsdDSFDF#include “ctype.h”#include “stdio.h”char myupper(char ch) if(islower(ch) ch=ch-32; else ; return ch; char ch; while(ch=getchar()!=) ch= myupper(ch); putchar(ch); 例4:编写函数统计输入字符的个数如输入dkjfkd5456 遇到非法字
11、符结束。如ctrl+z #include “stdio.h” int fun( ) char ch; int x=0;=EOF) x+; return x; int n=0; /*n用来统计输入的个数*/ n=fun( ); printf(“%d”,n); 例5:编写函数统计输入文本中单词的个数,单词之间用空格符、换行符、跳格符隔开。分析: my name is jinwen以name为例:name前一个字符必须是间隔符,当前字符必须为字母,说明n是首字母。int countword( ) int x=0,state=0; /*state为标志位。 if(isspace(ch) state=0
12、; /*0位于单词的外部,1位于单词的内部 else if(state=0) state=1; int n; n=countword( ); 例6:编写函数用以求表达式x2-5x+4,x作为参数传递给函数。 x2-5x+4=x*x-5*x+4 #include “math.h” double fun(double x) return x*x-5*x+4; double x,y; scanf(“%lf”,& y=fun(x); printf(“%lf”,y);例7:编写函数求1-1/2+1/3-1/4+1/5-1/6+1/71/ndouble fun(int x) int i,n=1; /*n为
13、符号控制变量*/ double s=0; for(i=1; s+=n*(1.0/i); / s=s+n*(1.0/i) n=-n; double s; int n; s=fun(n); printf(“%lf”,s);习题练习1:以下叙述中正确的是:A、C语言程序总是从第一个定义的函数开始执行。B、在C语言程序中,要调用的函数必须在main函数中定义。C、C语言程序总是从main函数开始执行。D、C语言程序中的main函数必须放在程序的开始部分。2、以下函数的类型是 A、与参数x的类型相同 B、void类型 C、int类型 D、无法确定fff(float x) printf(“%dn”,x*x
14、);3、以下函数调用语句中,含有的实参个数是: A、1 B、2 C、 4 D、 5 Func(exp1,exp2),(exp3,exp4,exp5) 4、以下程序的输出结果是(A) A、5.500000 B、3.000000 C、4.000000 D、8.25 double f(int n)int i; double s; s=1.0;=n;i+) s+=1.0/i; int i,m=3;float a=0.0; for(i=0;m; a+=f(i); /a=a+f(i)printf(“%fn”,a);5、以下程序的输出结果是_4_ fun1(int a,int b) int c; a+=a;
15、 b+=b; c=fun2(a,b); return c*c; fun2(int a,int b) c=a*b%3; return c; int x=11,y=19; printf(“%dn”,fun1(x,y);二指向函数的指针变量的定义1、在C语言中函数名代表该函数的入口地址,因此可以定义一种指向函数的指针来存放这种地址。2、double fun(int ,int*); 函数说明 double (*p) (int int*); 函数指针若有p=fun则以上两个等价。p与fun必须类型名与参数类型一一匹配。3、例: double fun(int a,int *p) . main( ) dou
16、lbe (*fp) (int ,int*),y; fp=fun; . y=(*fp)(56,& 等价于 y=fun(56,&函数名或指向函数的指针变量作为实参 函数名或指向函数的指针变量作为实参是将函数首地址传给形参: double tran(double (*)(double),double (*)(double), double); double y,v; v=6.0*3.1415/180.0; y=tran(sin,cos,v);printf(“tan(60)=%10.6fn”,y);y=tran(cos,sin,v);printf(“cot(60)=10.6fn”,y); double
17、 tran(double (*f1)(double),double (*f2) (double),double x) return (*f1)(x)/(*f2)(x);函数的递归调用基本概念C语言中的函数可以递归调用,即:可以直接或间接地自己调用自己。前者称简单递归,后者称间接递归。一个问题采用递归方法来解决时,必须符合以下三个条件:可以把要解的问题转化为一个新的问题,而这个新的问题的解法仍与原来的的解法相同。可以应用这个转化过程使问题得到解决。必定要有一个明确的结束递归的条件。while(不知道同学年纪) 问当前同学年纪while(不知道第一个同学年纪) 用当前同学年纪加两岁一、 实例应用1
18、、 求n!如求5! 5*4! 4*3! 3*2! 2*1! 1!=1double fun(int n) if(n=1) return 1; else return n*fun(n-1);printf(“%d”,s);5!=5*fun(4) 5*24fun(4)=4*fun(3) 24fun(3)=3*fun(2) 6 fun(2)=2*fun(1) 2=2*12、用递归算法根据以下求平方根的迭代公式,求某数的a的平方根。x1=1/2(x0+a/x0)double mysqrt(double a,double x0) double x1; x1=(x0+a/x0)/2.0; if(fabs(x1
19、-x0)0.00001) return mysqrt(a,x1); else return x1; double a; printf(“The sqrt of %f=%fn”,a,mysqrt(a,1.0);3、请写递归函数,把输入的一个整数转换成二进制数输出。以8为例 8 8%2=0 8/2=44 4%2=0 4/2=22 2%2=0 2/2=11 1%2=1 1/2=0 二进制1000fun(int x) if(x/2=0) return 1; else printf(“%d”,fun(x/2); return x%2; int x; printf(“%d”,fun(x);fun(8) r
20、etun x%2 0fun(4) return x%2 0fun(2) return x%2 0 fun(1) return 1 最后结果:10004、请用递归算法,求1+2+3+4+.n,n由键盘输入(5)5+(4) (4)4+(3) (3)3+(2) (2)2+(1) (1)1得出公式:(n)+(n-1)fun(int n) else return n+fun(n-1); int s; printf(“s=%dn”,s);5、请用递归算法,求斐波拉契级数。求n阶斐波拉契级数的公式如下:当n=0时 F(n)=1当n=1时 F(n)=1当n1时 F(n)=F(n-1)+F(n-2) 0 1 2 3 4 5 1 1 2 3 5 8. if(n=0|n=1) return 1; else return fun(x-2)+fun(x-1); printf(“%d”,fun(n);fun(4) fun(2)+fun(3) 5 2+3 fun(3) fun(1)+fun(2) 3 1+2 fun(2) fun(0)+fun(1) 2 1+1
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1