c语言程序设计课件 函数_第1页
c语言程序设计课件 函数_第2页
c语言程序设计课件 函数_第3页
c语言程序设计课件 函数_第4页
c语言程序设计课件 函数_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

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

文档简介

注汰法:英诀:女:沐逐沐美沐沐泱沐米淡淡沐诀族&*浜逐涣逐法涨沐逐淡:涣沐沐差二:4

第一章

第二章C语言概述

第三章数据类型、运算符与表达式

第四章最简单的C程序设计

第五章逻辑运算和判断选取控制

章循环控制

第六

第七数组

第八函数

第九编译预处理

第十指针

第十章结构体与共用体

第十三章文件的基本操作

位运算

§7.1概述

C程序由一个main和任意个函数组成。

1)除main外,其它为系统函数、自编函数,

系统函数:由系统提供,放在不同的头文

件中,用户可调用。

自编函数:由用户按语法规则编写。

2)除main函数外淇它函数可相互调用

3)函数不可嵌套定义,但可以嵌套调用。

4)函数分为有参与无参函数

5)程序从main开始执行,最后又回到main函

数结束。

语言程停过苜

§7.2定义与调用

i.无参函数

*定义形式

[存储类型符H返回类型符]函数名()

{说明部分

语句

、一)

注意:

存储类型符有两种:static型和缺省型。

返回类型符表示函数的返回值类型。

cissssmt

*调用方式

第1种:变量=函数名();

注:变量名的类型与函数返回值的类型必须相同.

第2种:函数名();

C谓言握停过计

2.有参函数

*定义形式

[存储类型符]类型标识符函数名(形参表列)

形参说明

{说明部分

语句

*调用方式

变量名=函数名(实参表列);

C语言耗停汽苜

例:求二数之最大值或:

intmax(x,y)intmax(intx,inty)

intx,y;{intz;

{intz;z=x>y?x:y;

z=x>y?x:y;return(z);

return(z);

)

用return语句,返回函数的值。

c语言程序汽共

3.形参与实参

实参:出现在调用函数中,形参:出现被调用函数中。

调用时:实参值)单向总,形参。

函数被调用时,临时分配单元给形参,调用完

毕,这些单元被释放。

注:*实参可为表达式,只传递表达式的值。

*实参、形参类型一致。

♦可在形参表列中对形参说明。

C语言凝停直苜

4.函数返回值

return(表达式的值);

t

变量的值

通过return语句将流程返回主调函数。

C语言耗停直苜

5.函数声明:

一般的函数被调用之前必须做出说明:

说明格式:类型符函数名0;

例1:求二实数之和

#include<stdio.h>

main()

{floatadd();/*函数说明*/

floata,b,c;

6

scanff%f9%f\&a9&b);

c=add(a9b);/*函数调用*/

printf("sum=%P;c);

C语言耗停直苜

floatadd(floatx,floaty);/*函数定义*/

{floatz;

z=x+y;

returnz;

}

若函数的定义放在main()函数之前可省

略函数说明。

C捂黑辞停汽计

例2:求二实数之和(将例1程序改写如下:)

#include<stdio.h>

floatadd(floatx,floaty);/*函数定义*/

{floatz;

z=x+y;

returnz;

}

main()

{floata,b,c;

6

scanfC%f,%f\&a9&b);

c=add(a,b);/*函数调用*/

printf(nsum=%f!;c);

C语言辞停过H

6.调用系统函数,需根据系统提供的库函数手册而

确定加上预编译命令,如:要调用getchar()函

数,需要加上:

#include"stdio.h"

所有系统提供的库函数都放在头文件.h中

C语言耗停汽苜

§7.3嵌套调用

函数不能嵌套定义,但可以嵌套调用。

c语言耗停汽苜

例1:/*---exp81.c---*/

#include<stdio.h>

intfunl(intx,inty);

charfun2(intt)

inta,b;

main()

{intu;

a=24;b=42;

printf(nmain(l)——a=%d,b=%d\n",a,b);

u=fiml(a,b);

printf(nmain(2)——a=%d,b=%d,u=%d\n\a,b,u);

9^c髓程停过计

intfiinl(intc,inty)

{intz;

charch;

z=x+y;

ch=fun2(z);

printf(nfunl-------ch=%c\n",ch);

return(z);

}

charfun2(intt)

{t=a+b;

n

printf(fun2-------t=%d,t=%c\n",t91);

return(z);

c捂舌盘停得计

运行结果:

main(1)—a=24,b=42

fun2--------1=66,t=B

funl--------ch=B

main(2)——a=24,b=42u=66

ci吾看程停过计

例2:用弦截法求方程的根。

x3-5x2+16x—80=0

方法如下:

⑴取两个不同点xrX2,如果f(xj和f(X2)符号

相反,则(X],X2)区间内必有一个根。如果f(xj

与f(X2)同符号,则应改变X]、X2,直到f(xj、

f(X2)异号为止。注意Xi、X2的值不应差太大,

以保证(X],X2)区间只有一根。

C捂言握停直计

(2)连接f(X1)和f(X2)两点,此线(即弦)交X轴于X,见

图76

x点坐标可用下式求出:

/(%2)一/(%1)

再从X求出f(x)o

3鸵/

(3)若f(x)与f(x。同符号,则根必在(X,X2)区间内,

此时将X作为新的X-如果f(x)与f(X2)同符号,

则表示根在(X»X2)区间内,将X作为新的X2.

(4)重复步骤(2)和(3),直到|f(x)|q为止,g为一个

很小的数,例如10—6。此时认为f(x户0.

C语言程停过计

根据上述思路画出n-s流程图,见图7.7

输入xl、x2,求f(xl)、f(x2)

直到f(x1)与f(x2)异号

求f(xl)与f(x2)连线与x轴

的交点X

y=-x),y=f(xl)

root函数

xl=xx2=x

yl=yy2=y

直到|f(x)|<£

root=x输出root图7.7名

其程序由若干个函数构成,

#includenmath.hn

floatf(x)/*函数1定义,计算f(x)=x3—5x2+16x—80*/

floatx;

{floaty;

y=((x—5.0)*x+16.0)*x—80.0;

return(y);

)

floatxpoint(xl,x2)/*函数2定义,求出弦与x轴交点*/

floatxl?x2;

{floaty;

y=(x1*f(x2)-x2*f(x1)/(f(x2)—f(xl);

return(y);

}心情言一界―

floatroot(xl9x2);/*函数3定义,求近似根。*/

floatxl9x2;

{inti;

floatx9y,yl;

yl=f(xl);

do

x=xpoint(xl9x2);/*函数2调用*/

y=f(x);

if(y*yl>0)/*f(x)与f(xl)同符号*/

,yi=y;

xl=x;}

else

x2=x;

}while(fabs(y)>=0.0001);C;U片

return(x);

)

main()/*主函数*/

{floatxl9x2,fl,2x;

do

{printff'inputx1,x2:\n’‘);

scanf(%f,%f,&xl,&x2);

fl=f(xl);/*函数1调用*/

f2=f(x2);/*函数1调用*/

)

while(fl*如>=0);

x=root(xl9x2);/*函数3调用*/

printf(nArootofequationis%8.4f\x);

C语言耗停汽苜

程序运行结果如下:

inputx1,x2:

2,6J

Arootofequationis5.000

谓言辞

§7.4递归调用

递归:一个函数直接或间接地调用自身。

1.直接递归调用:函数直接调用本身

2.间接递归调用:函数间接调用本身

c语言程停过H

以下表示了递归的概念.

直接调用:间接调用:

intf(x)int1(x)/ntf(t)

飞2

intx;intx;intt;

{inty9z;{inty,z;{inta,b;

*

Z=f⑵;z=0(y)/'a=L(b);

语舌程停过it

显然:上述例子会无限递归(无限执行)。所以,在递

归调用时都必须有条件限制。

当条件成立,调用递归,否则结束。

例1:求n!

1.从数学上定义

j1(n=051)

n1n*(n-l)!(n>l)

c语言程序过计

2.程序:

#include<stdio.h>

longfac(intn)/*函数定义,计算n!*/

{longf;

if(n<0)

printf(ninputerror!\nn);

elseif(n==0[[n==1)

f=l;

elsef=n*fac(n—1);

return(f);

)

CSSSBan

main()

{intn;

longy;

printf(ninputainteger!n)

scanf("%d;&n);

y=fac(n);/*函数调用,计算n!*/

printf("%d!=%151d",n,y);

C语者凝停直苜

3.执行过程:设:输入5」(n=5)

第一次调用:y=fac(5)-----返回:y=5fac(4)

fac(l)

(

*

qf(l);

*

returnf;

}

C语言凝停汽it

简化表示为:

当变成机器代码时,将其拉成直线(线性程

序代码)。

例2:汉诺塔(Hanoi)问题

问题:将A塔上n个盘子移至C(借助于B)。移动时,

保证三个塔始终是大盘在下,小盘在上。

B

n个盘子

港言程浮过计

必须用递归方式解决

1)先将A塔n-1个盘子借助于C移至B上

2)将A上剩下的一个移至C上.

3)将B上n-1个盘子借助于A移至C上.

可以看到:

1)、3)为同一问题,都为n-1个盘子借助于一个

空塔移至另一塔上。

C语言辞掷汽"

程序如下:

#include<stdio.h>

voidmove(chargetone9charputone)/*函数定义*/

{printf^%c——>%c\n",getone,putone);

}.

voidhanoi(intn,charone,chartwo,charthree)

/*将n个盘从one借助two,移到three*/

{if(n==1)

move(one,three);

else

hanoi(n-l5one,three,two);

move(one?three);/*函数调用*/

hanoi(n-l5two,one,three);}

}c语言盘停过日

main()

{intm;

printf("inputthenumberofdiskes"

scanf(n%d”,&m);

print/'Thesteptomoving%3ddiskes:\n",m);

hanoi(m「A'JB'JC');/*函数调用*/

C语言耗停汽苜

运行情况如下:

inputthenumberofdiskes:3J

Thesteptomoving3diskes:

A—〉C

A—>B

C—>B

A—>C

B—>A

B—>C

A—〉C

C语言耗停汽苜

在程序中有两个函数:

*move(getone,putone)

表示从getone塔移一个盘子至putone塔

hanoi(n,one,two,three)

表示n个盘子从one塔借助于two塔(空)移至three塔。

调用时塔用字符常量A「B/C,表示。

C语言耗停直苜

§7.6局部变量与全局变量

一、局部变量

凡在函数(含main函数)内部定义的变量称为

局部变量。

局部性:局部变量仅在函数内部有效。

1.不同的函数可具有同名的变量,它们占不同的内

存单元,互不影响。

2.形参为局部变量。

3.在复合语句中可定义仅复合语句中有效的临时

变量。

捂看程停及计

二、全局变量

一个源文件中,在所有函数之外定义的变量为

全局变量。

有效性:自定义位置开始至文件结尾全部有效。

例:intp=l,q=5;

floatfl(a)

inta;p,q的作用范围

{intb,c;

charcl,c2;—

❶的作用范圜...…

IclRir

charf2(x,y);

intc,y;

{intij;

main()

情言:震

1.全局变量所作用到的函数,相当于这些函数的公

共变量。于是,当一个函数对其值进行改变后,另

一个函数使用该变量的值亦相应改变。好处:函

数之间值传递。

2.不要随意使用全局变量。一是始终占据内存单

元;二是由于函数依赖于外部定义的变量,减

少了通用性。

3.不在作用域内函数。若使用全局(外)变量,需在

函数体内加上extern保留字。

4.全局和局部变量同名时,局部变量有效。

floatfl(x)

intx;

{externinta,b;

inta=0;b=-1

main()

a,b作用域

ifi妄四

彳歹ij./*―-exp81.c-・・・*/

#include<stdio.h>

intfunl(intx,inty);

inta,b,z;

main()

{intu,m=0;

a=24;b=42;

printf(n(l)---------a=%d,b=%d,m=%d\n'',a,b,m);

m=m+10;

u=funl(a,b);

printf(n(2)---------a=%d,b=%d,u=%d,m=%d\n'',a,b,u,m);

m=m+10;

a=z-a;b=z-b;

u=funl(a,b);

printf(n(3)---------a=%d,b=%d,u=%d,m=%d\nn,a,b,u,m);

}ci悟言起舁汽it

intfunl(intx,inty)

{intm;

m=x+y;

a=a+10;b=b+20;

z=x+y;

printf(nchanga&b:—a=%d,b=%d,z=%d,m=%d\n”,

a,b,z,m);

return(z);

}

C语言耗停汽苜

运行结果:

(1)----------a=24,b=42,m=0

changa&b:---a=34,b=62,z=66,m=66

(2)----------a=34,b=62,u=66,m=10

changa&b:---a=42,b=24,u=36,m=36

(3)----------a=42,b=24,u=36,m=20

C语言凝停过H

注意:

*上面程序中a,b,z是全局变量,u,m为局部

变量;

来若将inta,b,z;语句放入main()函数中,情

况会怎样?

C语言程建冏注

§7.7动态存储变量与静态存储变量

一、变量的存储类别

表达了一个变量存在的空间、时间。

程序区

内存分配静态存储区〕

动态存储区'数据,变量存放

c谓言程停过甘

静态存储变量:存放于静态存储区,在.少岁?建行

过程中,始终占据固定的内存单兀。

数J

动态存储变量:函

态[zHr

I

I

的□:2

且)w

固­O

语言盘停及计

变量又可分为四种具体形式

1.自动型变量(auto)

2.静态(static)变量

3.寄存器型变量

4.外部(extern)变量

前面学习的局部、全局变量均以上述方式中

的一种形式存储。

C语言辞停过计

二、局部变量

局部变量既可以静态方式,又可以动态方式存储。

动态方式:autointa?b;

贝U:a,b为自动型,存入动态区。在该函数被

调用时才分配单元,函数调用结束时释放。

auto一般省略。以前用到的变量均为auto型,除

static夕卜。

C语言凝停直苜

静态方式:staticinta,b;

则:a,b存入静态区。函数中的a,b始终占据固定

存储单元。

*若定义时赋初值,则程序运行中仅在第一次调用

时赋初值,第二次调用不再赋初值,而是使用上

一次调用的值。

例:求n!

#include<stdio.h>

intfac(n)/*函数定义*/

intn;

{staticintf=l;

f=f*n;

return(f);

}.

main()

{inti;

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

printf("%d!=%d\n”,i,fac(i));

C语言耗停汽苜

运行结果为:

1=1

2=2

3=6

4=24

5=120

每一次调用fac⑴,打印一个i!,同时保留

这个i!的值以便下次再乘(i+1)。

C语言耗停直苜

*若不赋初值,则系统置初值0,而动态变量不赋初值

则值不确定。

当动态局部变量在一个函数中反复被用达到数

百次以上,为了提高效率,可将其存入寄存器中

(有限个),不存入内存的动态区中。

说明方式registerintij=l;

*不可太多,一般1—3个

来必要时使用。

C语善混殍过言

三、全局变量

在函数外部中定义,它们一定存放在静态存

贮区中。

全局变量即可被本文件中各函数用,亦可被其

它源文件中的函数引用。

1.只被本文件中的函数引用

全局变量本身一定是存放在静态区的。但若加

上staic.即:

staticinta,b;

则表明a,b只被本文件

floatfl(x)

中各函数引用,即使

intx

与其它文件中的全局

变量同名,也互不影

响。

C诵言辞停过甘

2,可被其它文件中的函数引用

externinta;

inta;\fac(x)

main()intx

I文件2c

卜文件fl.c(::用到fl.c

z=a东…中的a

j

J

f2c中的extern在函数外说明,在函数内说明

已叙述过。C语言震停过甘

总结见表7.2

函数内函数外

存储类别

作用域存在性作用域存在性

autoXX

registerqXX

11

static局部yXX

static外部X1X1本文件1

不加staticI

AJA1

全局(外部)、7

C语言

温馨提示

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

评论

0/150

提交评论