C语言函数知识详解文档格式.docx
《C语言函数知识详解文档格式.docx》由会员分享,可在线阅读,更多相关《C语言函数知识详解文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
二、函数的定义和返回值
1、
函数定义的语法
函数首部(main())
函数1
C
语定义说明部分
言
程函数体
序
执行语句部分
函数2
2、C语言函数定义的一般形式如下
1)函数返回值的类型名函数名(类型名形式参数1,类型名形式参数2………..)
/*函数首部*/
{
说明部分/*函数体*/
语句部分
}
intabs(intx)
2)在老的C语言版本中,函数的首部用以下的形式:
函数返回值的类型名函数名(形式参数1,形式参数2………..)
形式参数类型说明;
intabs(x)
int;
3)函数名和形式参数都是由用户命名的标识符。
在同一程序中,函数名必须唯一;
形式参数名只要同一函数中唯一即可,可以与其它函数中的变量同名。
4)C语言规定,不能在同一个函数的内部再定义函数。
5)若在函数的首部省略了函数返回值的类型名,函数首部写成:
函数名(类型名形式参数1,类型名形式参数2……..)
C语言默认返回值类型为int型。
编写求两个双精度之和的函数。
doubleadd(doublea,doubleb)
{doubles;
s=a+b;
returns;
}
6)函数体中,除形参外,用到的其它变量必须在说明部分进行定义,这些变量(包括形参),只在函数被调用时才临时开辟存储单元,当退出函数时,这些临时开辟的存储单元全被释放掉,因此,这种变量只在函数体内部起作用,与其它函数中的变量互不相关,它们可以和其它函数中的变量同名。
3、函数的返回值
1)函数的值通过return语句返回,return语句的形式如下:
return表达式;
或return(表达式);
或return
2)说明
①return语句中的表达式的值就是所求的函数值。
此表达式值的类型必须与函数首部所说明的类型一致。
若类型不一致,则以函数值的类型为准,由系统自动进行转换。
②当程序执行到return语句时,程序的流程式就返回到调用该函数的地方,并带回函数值。
在同一函数内,可以根据需要在多处出现return语句。
③return语句也可以不含表达式,这时它的作用只是使流程返回到调用函数,并没有确定的函数值。
④函数体内可没有return语句,程序的流程就一直执行到函数末尾的”}”,然后返回调用函数,这时也没有确定的函数值带回。
函数的调用和说明
一、函数的两种调用方式:
1、函数的一般调用形式为:
函数名(实在参数表)
实在参数(简称实参)的个数多于一个时,各实在参数之间用逗隔开。
若函数无形参,调用形式为:
函数名()例:
函数名后的一对括号不可少。
fun(intx)
{intj,sum=0;
for(j=1;
j<
=x;
j++)
sum+=j;
returnsum;
main()
{
ints,n;
scanf(“%d”,&
n);
s=fum(intn);
printf(“%d”,s);
可用两种方式调用函数
1)作为表达式出现
y=add(3.0,4.0)
2)作为独立语句出现
printf(“********”);
二、函数调用时的语法要求
1、调用函数时,函数名必须与所调用的函数名字完全一致。
2、实参的个数必须与形式参数的个数一致。
实参可以是表达式,在类型上应按位置与形参一一对应匹配。
如果类型不匹配,C编译程序按赋值兼容进行转换,若实参和形参的类型不赋值兼容,通常不给出出错信息,且程序仍然执行,只是不会得到正确的结果。
因此,应该特别注意实参和形参的类型匹配。
3、C语言规定:
函数必须先定义,后调用(函数的返回值类型为int或char时除外)。
第三节调用函数和被调用函数之间数据的传递
fun(intx)//被调用函数
{……….}
main()
s=fun(n);
Printf(“%d”,s);
C语言中,调用函数被调用函数之间数据可以通过三种方式进行传递
1.实在参数和形式参数之间进行数据传递
2.通过return语句把函数值返回调用函数
3.通过全局变量。
二、在C语言中,数据只能从实参单向按值传递。
也就是说,当简单变量作为实参时,用户不可能在函数中改变对应实参值。
三、例题:
例1:
以下程序例示了函数参数之间的单向传递,请观察程序的执行结果。
{intx=2,y=3,z=0;
printf(“
(1)x=%dy=%d)z=%d\n”,x,y,z);
try(x,y,z);
printf(“(4)x=%dy=%dz=%d\n”,x,y,z);
try(intx,inty,intz)
{printf(“
(2)x=%dy=%dz=%d\n”,x,y,z);
z=x+y;
/*5=2+3
x=x*x;
/*4=2*2
y=y*y;
/*9=3*3
printf(“(3)x=%dy=%dz=%d\n”,x,y,z);
两个数交换
inta,b;
main()
{inta,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(inta,intb)
intt;
printf(“a=%d,b=%d”,a,b);
函数程序举例
例1:
编写函数isprime(inta)用来判断自变量a是否为素数,若是素数,函数返回1,否则返回0。
素数:
只能被1和本身整除的数。
{intx,i;
x);
for(i=2;
i<
x;
i++)
if(x%i==0)break;
//x能被当前的数整除,就跳出循环。
因为它肯定就不是素数,没有必要往要继续判断。
if(i>
=x)printf(“YES”);
//始终没有跳出循环,说明它是素数。
elseprintf(“NO”);
函数方法:
main()
{inta;
if(isprme(a))
printf(“YES”);
elseprintf(“NO”);
isprime(inta)
{inti;
for(i=2;
a;
if(a%i==0)return0;
return1;
例2:
编写函数,验证任意偶数为两个素数之和并输出这两个素数。
分析:
任意输入一个数:
如12
12的因子:
234567891011
2+10=12(2,10不是素数)
3+9=12(3,9不是素数)
4+8=12(4,8不是素数)
5+7=12
6+6=12(6不是素数)
超过一半就不用判断了,因为重复。
intisprime(inta)
if(a%i==0)retrurn0;
voideven(intx)
{inti;
=x/2;
if(isprime(i))
if(isprime(x-i))
printf(“%d=%d+%d”,x,i,x-i);
{intx;
/*当前要判断的偶数*/
if(x%2==0)/*如果为偶数*/
even(x);
/*函数为独立语句调用,没有返回值*/
例3:
编写函数myupper(ch),把ch中的小写字母转换成大写字母作为函数值返回,其它字符不变。
用字符@结束输入。
分析;
dsdDSFDF@
#include“ctype.h”
#include“stdio.h”
charmyupper(charch)
if(islower(ch))ch=ch-32;
else;
returnch;
{charch;
while((ch=getchar())!
=’@’)
ch=myupper(ch);
putchar(ch);
例4:
编写函数统计输入字符的个数
如输入dkjfkd5456遇到非法字符结束。
如ctrl+z
#include“stdio.h”
intfun()
charch;
intx=0;
=EOF)
x++;
returnx;
{intn=0;
/*n用来统计输入的个数*/
n=fun();
printf(“%d”,n);
例5:
编写函数统计输入文本中单词的个数,单词之间用空格符、换行符、跳格符隔开。
分析:
mynameisjinwen
以name为例:
name前一个字符必须是间隔符,当前字符必须为字母,说明n是首字母。
intcountword()
intx=0,state=0;
/*state为标志位。
if(isspace(ch))state=0;
/*0位于单词的外部,1位于单词的内部
elseif(state==0)
state=1;
{intn;
n=countword();
}
例6:
编写函数用以求表达式x2-5x+4,x作为参数传递给函数。
x2-5x+4=x*x-5*x+4
#include“math.h”
doublefun(doublex)
returnx*x-5*x+4;
{doublex,y;
scanf(“%lf”,&
y=fun(x);
printf(“%lf”,y);
例7:
编写函数求1-1/2+1/3-1/4+1/5-1/6+1/7……1/n
doublefun(intx)
{
inti,n=1;
/*n为符号控制变量*/
doubles=0;
for(i=1;
s+=n*(1.0/i);
//s=s+n*(1.0/i)
n=-n;
{doubles;
intn;
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(floatx)
{printf(“%d\n”,x*x);
3、以下函数调用语句中,含有的实参个数是:
A、1B、2C、4D、5
Func((exp1,exp2),(exp3,exp4,exp5))
4、以下程序的输出结果是(A)
A、5.500000B、3.000000C、4.000000D、8.25
doublef(intn)
inti;
doubles;
s=1.0;
=n;
i++)
s+=1.0/i;
{inti,m=3;
floata=0.0;
for(i=0;
m;
a+=f(i);
//a=a+f(i)
printf(“%f\n”,a);
5、以下程序的输出结果是___4_______
fun1(inta,intb)
{intc;
a+=a;
b+=b;
c=fun2(a,b);
returnc*c;
fun2(inta,intb)
c=a*b%3;
returnc;
{intx=11,y=19;
printf(“%d\n”,fun1(x,y));
二>
指向函数的指针变量的定义
1、在C语言中函数名代表该函数的入口地址,因此可以定义一种指向函数的指针来存放这种地址。
2、doublefun(int,int*);
函数说明
double(*p)(intint*);
函数指针
若有p=fun则以上两个等价。
p与fun必须类型名与参数类型一一匹配。
3、例:
doublefun(inta,int*p)
{……………….}
main()
{doulbe(*fp)(int,int*),y;
fp=fun;
……………..
y=(*fp)(56,&
等价于y=fun(56,&
函数名或指向函数的指针变量作为实参
函数名或指向函数的指针变量作为实参是将函数首地址传给形参:
doubletran(double(*)(double),double(*)(double),double);
{doubley,v;
v=6.0*3.1415/180.0;
y=tran(sin,cos,v);
printf(“tan(60)=%10.6f\n”,y);
y=tran(cos,sin,v);
printf(“cot(60)=10.6f\n”,y);
doubletran(double(*f1)(double),double(*f2)(double),doublex)
{return(*f1)(x)/(*f2)(x);
函数的递归调用
基本概念
C语言中的函数可以递归调用,即:
可以直接或间接地自己调用自己。
前者称简单递归,后者称间接递归。
一个问题采用递归方法来解决时,必须符合以下三个条件:
可以把要解的问题转化为一个新的问题,而这个新的问题的解法仍与原来的的解法相同。
可以应用这个转化过程使问题得到解决。
必定要有一个明确的结束递归的条件。
while(不知道同学年纪)
问当前同学年纪
while(不知道第一个同学年纪)
用当前同学年纪加两岁
一、实例应用
1、求n!
如求5!
5*4!
4*3!
3*2!
2*1!
1!
=1
doublefun(intn)
if(n==1)return1;
elsereturnn*fun(n-1);
printf(“%d”,s);
5!
=5*fun(4)5*24
fun(4)=4*fun(3)24
fun(3)=3*fun
(2)6
fun
(2)=2*fun
(1)
2=2*1
2、用递归算法根据以下求平方根的迭代公式,求某数的a的平方根。
x1=1/2(x0+a/x0)
doublemysqrt(doublea,doublex0)
doublex1;
x1=(x0+a/x0)/2.0;
if(fabs(x1-x0)>
0.00001)returnmysqrt(a,x1);
elsereturnx1;
{doublea;
printf(“Thesqrtof%f=%f\n”,a,mysqrt(a,1.0));
3、请写递归函数,把输入的一个整数转换成二进制数输出。
以8为例
88%2=08/2=4
44%2=04/2=2
22%2=02/2=1
11%2=11/2=0
二进制=1000
fun(intx)
{if(x/2==0)return1;
else{printf(“%d”,fun(x/2));
returnx%2;
{intx;
printf(“%d”,fun(x));
fun(8)retunx%20
fun(4)returnx%20
fun
(2)returnx%20
fun
(1)return1
最后结果:
1000
4、请用递归算法,求1+2+3+4+……….n,n由键盘输入
(5)=5+(4)
(4)=4+(3)
(3)=3+
(2)
(2)=2+
(1)
(1)=1
得出公式:
(n)+(n-1)
fun(intn)
elsereturnn+fun(n-1);
ints;
printf(“s=%d\n”,s);
5、请用递归算法,求斐波拉契级数。
求n阶斐波拉契级数的公式如下:
当n=0时F(n)=1
当n=1时F(n)=1
当n>
1时F(n)=F(n-1)+F(n-2)
012345
112358……….
{if(n==0||n==1)return1;
elsereturnfun(x-2)+fun(x-1);
printf(“%d”,fun(n));
fun(4)fun
(2)+fun(3)
52+3
fun(3)fun
(1)+fun
(2)
31+2
fun
(2)fun(0)+fun
(1)
21+1