c語言程序設(shè)計(jì)課件 函數(shù)_第1頁
c語言程序設(shè)計(jì)課件 函數(shù)_第2頁
c語言程序設(shè)計(jì)課件 函數(shù)_第3頁
c語言程序設(shè)計(jì)課件 函數(shù)_第4頁
c語言程序設(shè)計(jì)課件 函數(shù)_第5頁
已閱讀5頁,還剩66頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

注汰法:英訣:女:沐逐沐美沐沐泱沐米淡淡沐訣族&*浜逐渙逐法漲沐逐淡:渙沐沐差二:4

第一章

第二章C語言概述

第三章數(shù)據(jù)類型、運(yùn)算符與表達(dá)式

第四章最簡單的C程序設(shè)計(jì)

第五章邏輯運(yùn)算和判斷選取控制

章循環(huán)控制

第六

第七數(shù)組

第八函數(shù)

第九編譯預(yù)處理

第十指針

第十章結(jié)構(gòu)體與共用體

第十三章文件的基本操作

位運(yùn)算

§7.1概述

C程序由一個(gè)main和任意個(gè)函數(shù)組成。

1)除main外,其它為系統(tǒng)函數(shù)、自編函數(shù),

系統(tǒng)函數(shù):由系統(tǒng)提供,放在不同的頭文

件中,用戶可調(diào)用。

自編函數(shù):由用戶按語法規(guī)則編寫。

2)除main函數(shù)外淇它函數(shù)可相互調(diào)用

3)函數(shù)不可嵌套定義,但可以嵌套調(diào)用。

4)函數(shù)分為有參與無參函數(shù)

5)程序從main開始執(zhí)行,最后又回到main函

數(shù)結(jié)束。

語言程停過苜

§7.2定義與調(diào)用

i.無參函數(shù)

*定義形式

[存儲(chǔ)類型符H返回類型符]函數(shù)名()

{說明部分

語句

、一)

注意:

存儲(chǔ)類型符有兩種:static型和缺省型。

返回類型符表示函數(shù)的返回值類型。

cissssmt

*調(diào)用方式

第1種:變量=函數(shù)名();

注:變量名的類型與函數(shù)返回值的類型必須相同.

第2種:函數(shù)名();

C謂言握停過計(jì)

2.有參函數(shù)

*定義形式

[存儲(chǔ)類型符]類型標(biāo)識符函數(shù)名(形參表列)

形參說明

{說明部分

語句

*調(diào)用方式

變量名=函數(shù)名(實(shí)參表列);

C語言耗停汽苜

例:求二數(shù)之最大值或:

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語句,返回函數(shù)的值。

c語言程序汽共

3.形參與實(shí)參

實(shí)參:出現(xiàn)在調(diào)用函數(shù)中,形參:出現(xiàn)被調(diào)用函數(shù)中。

調(diào)用時(shí):實(shí)參值)單向總,形參。

函數(shù)被調(diào)用時(shí),臨時(shí)分配單元給形參,調(diào)用完

畢,這些單元被釋放。

注:*實(shí)參可為表達(dá)式,只傳遞表達(dá)式的值。

*實(shí)參、形參類型一致。

?可在形參表列中對形參說明。

C語言凝停直苜

4.函數(shù)返回值

return(表達(dá)式的值);

t

變量的值

通過return語句將流程返回主調(diào)函數(shù)。

C語言耗停直苜

5.函數(shù)聲明:

一般的函數(shù)被調(diào)用之前必須做出說明:

說明格式:類型符函數(shù)名0;

例1:求二實(shí)數(shù)之和

#include<stdio.h>

main()

{floatadd();/*函數(shù)說明*/

floata,b,c;

6

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

c=add(a9b);/*函數(shù)調(diào)用*/

printf("sum=%P;c);

C語言耗停直苜

floatadd(floatx,floaty);/*函數(shù)定義*/

{floatz;

z=x+y;

returnz;

}

若函數(shù)的定義放在main()函數(shù)之前可省

略函數(shù)說明。

C捂黑辭停汽計(jì)

例2:求二實(shí)數(shù)之和(將例1程序改寫如下:)

#include<stdio.h>

floatadd(floatx,floaty);/*函數(shù)定義*/

{floatz;

z=x+y;

returnz;

}

main()

{floata,b,c;

6

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

c=add(a,b);/*函數(shù)調(diào)用*/

printf(nsum=%f!;c);

C語言辭停過H

6.調(diào)用系統(tǒng)函數(shù),需根據(jù)系統(tǒng)提供的庫函數(shù)手冊而

確定加上預(yù)編譯命令,如:要調(diào)用getchar()函

數(shù),需要加上:

#include"stdio.h"

所有系統(tǒng)提供的庫函數(shù)都放在頭文件.h中

C語言耗停汽苜

§7.3嵌套調(diào)用

函數(shù)不能嵌套定義,但可以嵌套調(diào)用。

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髓程停過計(jì)

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捂舌盤停得計(jì)

運(yùn)行結(jié)果:

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

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

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

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

ci吾看程停過計(jì)

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

x3-5x2+16x—80=0

方法如下:

⑴取兩個(gè)不同點(diǎn)xrX2,如果f(xj和f(X2)符號

相反,則(X],X2)區(qū)間內(nèi)必有一個(gè)根。如果f(xj

與f(X2)同符號,則應(yīng)改變X]、X2,直到f(xj、

f(X2)異號為止。注意Xi、X2的值不應(yīng)差太大,

以保證(X],X2)區(qū)間只有一根。

C捂言握停直計(jì)

(2)連接f(X1)和f(X2)兩點(diǎn),此線(即弦)交X軸于X,見

圖76

x點(diǎn)坐標(biāo)可用下式求出:

/(%2)一/(%1)

再從X求出f(x)o

3鴕/

(3)若f(x)與f(x。同符號,則根必在(X,X2)區(qū)間內(nèi),

此時(shí)將X作為新的X-如果f(x)與f(X2)同符號,

則表示根在(X?X2)區(qū)間內(nèi),將X作為新的X2.

(4)重復(fù)步驟(2)和(3),直到|f(x)|q為止,g為一個(gè)

很小的數(shù),例如10—6。此時(shí)認(rèn)為f(x戶0.

C語言程停過計(jì)

根據(jù)上述思路畫出n-s流程圖,見圖7.7

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

直到f(x1)與f(x2)異號

求f(xl)與f(x2)連線與x軸

的交點(diǎn)X

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

root函數(shù)

xl=xx2=x

yl=yy2=y

直到|f(x)|<£

root=x輸出root圖7.7名

其程序由若干個(gè)函數(shù)構(gòu)成,

#includenmath.hn

floatf(x)/*函數(shù)1定義,計(jì)算f(x)=x3—5x2+16x—80*/

floatx;

{floaty;

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

return(y);

)

floatxpoint(xl,x2)/*函數(shù)2定義,求出弦與x軸交點(diǎn)*/

floatxl?x2;

{floaty;

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

return(y);

}心情言一界―

floatroot(xl9x2);/*函數(shù)3定義,求近似根。*/

floatxl9x2;

{inti;

floatx9y,yl;

yl=f(xl);

do

x=xpoint(xl9x2);/*函數(shù)2調(diào)用*/

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()/*主函數(shù)*/

{floatxl9x2,fl,2x;

do

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

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

fl=f(xl);/*函數(shù)1調(diào)用*/

f2=f(x2);/*函數(shù)1調(diào)用*/

)

while(fl*如>=0);

x=root(xl9x2);/*函數(shù)3調(diào)用*/

printf(nArootofequationis%8.4f\x);

C語言耗停汽苜

程序運(yùn)行結(jié)果如下:

inputx1,x2:

2,6J

Arootofequationis5.000

謂言辭

§7.4遞歸調(diào)用

遞歸:一個(gè)函數(shù)直接或間接地調(diào)用自身。

1.直接遞歸調(diào)用:函數(shù)直接調(diào)用本身

2.間接遞歸調(diào)用:函數(shù)間接調(diào)用本身

c語言程停過H

以下表示了遞歸的概念.

直接調(diào)用:間接調(diào)用:

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

飛2

intx;intx;intt;

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

*

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

語舌程停過it

顯然:上述例子會(huì)無限遞歸(無限執(zhí)行)。所以,在遞

歸調(diào)用時(shí)都必須有條件限制。

當(dāng)條件成立,調(diào)用遞歸,否則結(jié)束。

例1:求n!

1.從數(shù)學(xué)上定義

j1(n=051)

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

c語言程序過計(jì)

2.程序:

#include<stdio.h>

longfac(intn)/*函數(shù)定義,計(jì)算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);/*函數(shù)調(diào)用,計(jì)算n!*/

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

C語者凝停直苜

3.執(zhí)行過程:設(shè):輸入5」(n=5)

第一次調(diào)用:y=fac(5)-----返回:y=5fac(4)

fac(l)

(

*

qf(l);

*

returnf;

}

C語言凝停汽it

簡化表示為:

當(dāng)變成機(jī)器代碼時(shí),將其拉成直線(線性程

序代碼)。

例2:漢諾塔(Hanoi)問題

問題:將A塔上n個(gè)盤子移至C(借助于B)。移動(dòng)時(shí),

保證三個(gè)塔始終是大盤在下,小盤在上。

B

n個(gè)盤子

港言程浮過計(jì)

必須用遞歸方式解決

1)先將A塔n-1個(gè)盤子借助于C移至B上

2)將A上剩下的一個(gè)移至C上.

3)將B上n-1個(gè)盤子借助于A移至C上.

可以看到:

1)、3)為同一問題,都為n-1個(gè)盤子借助于一個(gè)

空塔移至另一塔上。

C語言辭擲汽"

程序如下:

#include<stdio.h>

voidmove(chargetone9charputone)/*函數(shù)定義*/

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

}.

voidhanoi(intn,charone,chartwo,charthree)

/*將n個(gè)盤從one借助two,移到three*/

{if(n==1)

move(one,three);

else

hanoi(n-l5one,three,two);

move(one?three);/*函數(shù)調(diào)用*/

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

}c語言盤停過日

main()

{intm;

printf("inputthenumberofdiskes"

scanf(n%d”,&m);

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

hanoi(m「A'JB'JC');/*函數(shù)調(diào)用*/

C語言耗停汽苜

運(yùn)行情況如下:

inputthenumberofdiskes:3J

Thesteptomoving3diskes:

A—〉C

A—>B

C—>B

A—>C

B—>A

B—>C

A—〉C

C語言耗停汽苜

在程序中有兩個(gè)函數(shù):

*move(getone,putone)

表示從getone塔移一個(gè)盤子至putone塔

hanoi(n,one,two,three)

表示n個(gè)盤子從one塔借助于two塔(空)移至three塔。

調(diào)用時(shí)塔用字符常量A「B/C,表示。

C語言耗停直苜

§7.6局部變量與全局變量

一、局部變量

凡在函數(shù)(含main函數(shù))內(nèi)部定義的變量稱為

局部變量。

局部性:局部變量僅在函數(shù)內(nèi)部有效。

1.不同的函數(shù)可具有同名的變量,它們占不同的內(nèi)

存單元,互不影響。

2.形參為局部變量。

3.在復(fù)合語句中可定義僅復(fù)合語句中有效的臨時(shí)

變量。

捂看程停及計(jì)

二、全局變量

一個(gè)源文件中,在所有函數(shù)之外定義的變量為

全局變量。

有效性:自定義位置開始至文件結(jié)尾全部有效。

例:intp=l,q=5;

floatfl(a)

inta;p,q的作用范圍

{intb,c;

charcl,c2;—

?的作用范圜...…

IclRir

charf2(x,y);

intc,y;

{intij;

main()

情言:震

1.全局變量所作用到的函數(shù),相當(dāng)于這些函數(shù)的公

共變量。于是,當(dāng)一個(gè)函數(shù)對其值進(jìn)行改變后,另

一個(gè)函數(shù)使用該變量的值亦相應(yīng)改變。好處:函

數(shù)之間值傳遞。

2.不要隨意使用全局變量。一是始終占據(jù)內(nèi)存單

元;二是由于函數(shù)依賴于外部定義的變量,減

少了通用性。

3.不在作用域內(nèi)函數(shù)。若使用全局(外)變量,需在

函數(shù)體內(nèi)加上extern保留字。

4.全局和局部變量同名時(shí),局部變量有效。

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語言耗停汽苜

運(yùn)行結(jié)果:

(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()函數(shù)中,情

況會(huì)怎樣?

C語言程建冏注

§7.7動(dòng)態(tài)存儲(chǔ)變量與靜態(tài)存儲(chǔ)變量

一、變量的存儲(chǔ)類別

表達(dá)了一個(gè)變量存在的空間、時(shí)間。

程序區(qū)

內(nèi)存分配靜態(tài)存儲(chǔ)區(qū)〕

動(dòng)態(tài)存儲(chǔ)區(qū)'數(shù)據(jù),變量存放

c謂言程停過甘

靜態(tài)存儲(chǔ)變量:存放于靜態(tài)存儲(chǔ)區(qū),在.少歲?建行

過程中,始終占據(jù)固定的內(nèi)存單兀。

區(qū)

儲(chǔ)

態(tài)

動(dòng)

時(shí)

數(shù)J

動(dòng)態(tài)存儲(chǔ)變量:函

態(tài)[zHr

I

I

的□:2

且)w

固-O

語言盤停及計(jì)

變量又可分為四種具體形式

1.自動(dòng)型變量(auto)

2.靜態(tài)(static)變量

3.寄存器型變量

4.外部(extern)變量

前面學(xué)習(xí)的局部、全局變量均以上述方式中

的一種形式存儲(chǔ)。

C語言辭停過計(jì)

二、局部變量

局部變量既可以靜態(tài)方式,又可以動(dòng)態(tài)方式存儲(chǔ)。

動(dòng)態(tài)方式:autointa?b;

貝U:a,b為自動(dòng)型,存入動(dòng)態(tài)區(qū)。在該函數(shù)被

調(diào)用時(shí)才分配單元,函數(shù)調(diào)用結(jié)束時(shí)釋放。

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

static夕卜。

C語言凝停直苜

靜態(tài)方式:staticinta,b;

則:a,b存入靜態(tài)區(qū)。函數(shù)中的a,b始終占據(jù)固定

存儲(chǔ)單元。

*若定義時(shí)賦初值,則程序運(yùn)行中僅在第一次調(diào)用

時(shí)賦初值,第二次調(diào)用不再賦初值,而是使用上

一次調(diào)用的值。

例:求n!

#include<stdio.h>

intfac(n)/*函數(shù)定義*/

intn;

{staticintf=l;

f=f*n;

return(f);

}.

main()

{inti;

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

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

C語言耗停汽苜

運(yùn)行結(jié)果為:

1=1

2=2

3=6

4=24

5=120

每一次調(diào)用fac⑴,打印一個(gè)i!,同時(shí)保留

這個(gè)i!的值以便下次再乘(i+1)。

C語言耗停直苜

*若不賦初值,則系統(tǒng)置初值0,而動(dòng)態(tài)變量不賦初值

則值不確定。

當(dāng)動(dòng)態(tài)局部變量在一個(gè)函數(shù)中反復(fù)被用達(dá)到數(shù)

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

(有限個(gè)),不存入內(nèi)存的動(dòng)態(tài)區(qū)中。

說明方式registerintij=l;

*不可太多,一般1—3個(gè)

來必要時(shí)使用。

C語善混殍過言

三、全局變量

在函數(shù)外部中定義,它們一定存放在靜態(tài)存

貯區(qū)中。

全局變量即可被本文件中各函數(shù)用,亦可被其

它源文件中的函數(shù)引用。

1.只被本文件中的函數(shù)引用

全局變量本身一定是存放在靜態(tài)區(qū)的。但若加

上staic.即:

staticinta,b;

則表明a,b只被本文件

floatfl(x)

中各函數(shù)引用,即使

intx

與其它文件中的全局

變量同名,也互不影

響。

C誦言辭停過甘

2,可被其它文件中的函數(shù)引用

externinta;

inta;\fac(x)

main()intx

I文件2c

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

z=a東…中的a

j

J

f2c中的extern在函數(shù)外說明,在函數(shù)內(nèi)說明

已敘述過。C語言震停過甘

總結(jié)見表7.2

函數(shù)內(nèi)函數(shù)外

存儲(chǔ)類別

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

autoXX

registerqXX

11

static局部yXX

static外部X1X1本文件1

不加staticI

AJA1

全局(外部)、7

C語言

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論