C语言函数知识详解文档格式.docx

上传人:b****8 文档编号:22437775 上传时间:2023-02-04 格式:DOCX 页数:22 大小:24.41KB
下载 相关 举报
C语言函数知识详解文档格式.docx_第1页
第1页 / 共22页
C语言函数知识详解文档格式.docx_第2页
第2页 / 共22页
C语言函数知识详解文档格式.docx_第3页
第3页 / 共22页
C语言函数知识详解文档格式.docx_第4页
第4页 / 共22页
C语言函数知识详解文档格式.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

C语言函数知识详解文档格式.docx

《C语言函数知识详解文档格式.docx》由会员分享,可在线阅读,更多相关《C语言函数知识详解文档格式.docx(22页珍藏版)》请在冰豆网上搜索。

C语言函数知识详解文档格式.docx

二、函数的定义和返回值

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 中职中专

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1