




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第7講函數(shù)
7.1為什么要用函數(shù)7.2怎樣定義函數(shù)
7.3調(diào)用函數(shù)
7.4對被調(diào)用函數(shù)的聲明和函數(shù)原型
7.5函數(shù)的嵌套調(diào)用7.6函數(shù)的遞歸調(diào)用
7.7數(shù)組作為函數(shù)參數(shù)7.8局部變量和全局變量
7.9變量的存儲方式和生存期
7.10關(guān)于變量的聲明和定義
7.11內(nèi)部函數(shù)和外部函數(shù)
7.1為什么要用函數(shù)
?問題:
?如果程序的功能比較多,規(guī)模比較大,把所有代
碼都寫在main函數(shù)中,就會使主函數(shù)變得龐雜、
頭緒不清,閱讀和維護變得困難
?有時程序中要多次實現(xiàn)某一功能,就需要多次重
復(fù)編寫實現(xiàn)此功能的程序代碼,這使程序冗長,
不精煉
7.1為什么要用函數(shù)
A解決的方法:用模塊化程序設(shè)計的思路
?采用“組裝”的辦法簡化程序設(shè)計的過程
?事先編好一批實現(xiàn)各種不同功能的函數(shù)
?把它們保存在函數(shù)庫中,需要時直接用
7.1為什么要用函數(shù)
A解決的方法:用模塊化程序設(shè)計的思路
?函數(shù)就是功能
?每一個函數(shù)用來實現(xiàn)一個特定的功能
?函數(shù)的名字應(yīng)反映其代表的功能
7.1為什么要用函數(shù)
?在設(shè)計一個較大的程序時,往往把它分為若干個
程序模塊,每一個模塊包括一個或多個函數(shù),每
個函數(shù)實現(xiàn)一個特定的功能
>C程序可由一個主函數(shù)和若干個其他函數(shù)構(gòu)成
A主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用
>同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次
7.1為什么要用函數(shù)
7.1為什么要用函數(shù)
?可以使用庫函數(shù)
?可以使用自己編寫的函數(shù)
?在程序設(shè)計中要善于利用函數(shù),可以減少
重復(fù)編寫程序段的工作量,同時可以方便
地實現(xiàn)模塊化的程序設(shè)計
7.1為什么要用函數(shù)
例7.1輸出以下的結(jié)果,用函數(shù)調(diào)用實現(xiàn)。
******************
Howdoyoudo!
******************
7.1為什么要用函數(shù)
?解題思路:
[?在輸出的文字上下分別有一行“*”號,顯然不必
重復(fù)寫這段代碼,用一個函數(shù)print_star來實
現(xiàn)輸出一行“*”號的功能。
?再寫一個print_message函數(shù)來輸出中間一
行文字信息
?用主函數(shù)分別調(diào)用這兩個函數(shù)
#include<stdio.h>
intmain()
{voidprint_star();
voidprint_message();
print_star();print_message();
print_star();
return0;輸出16個*
)
voidprint_star()
**********;*******、)
{printf(ucf.}
voidprint.messageoit^^
{printf("Howdoyoudo!\n");}
include<stdio.h>
聲明函數(shù)
intmain()
{voidprint_star();
voidprintmessage();
print_star();print_message();
print_star();
return0;定義函數(shù)
)
voidprint_star()
******************
printf(n");}
voidprint_message()
{printf("Howdoyoudo!\n");
#include<stdio.h>
intmain()
{voidprint_star();
voidprint_message();
print_star();print_message();
print_star();
return0;
)
voidprint_star()
{printf(u******************\n,J),}
voidprint_message()
{printf("Howdoyoudo!\n");}
A說明:
(1)一個C程序由一個或多個程序模塊組成,
每一個程序模塊作為一個源程序文件。對較大
的程序,一般不希望把所有內(nèi)容全放在一個文
件中,而是將它們分別放在若干個源文件中,
由若干個源程序文件組成一個C程序。這樣便
于分別編寫、分別編譯,提高調(diào)試效率。一個
源程序文件可以為多個C程序共用。
A說明:
(2)一個源程序文件由一個或多個函數(shù)以及其
他有關(guān)內(nèi)容(如預(yù)處理指令、數(shù)據(jù)聲明與定義
等)組成。一個源程序文件是一個編譯單位,
在程序編譯時是以源程序文件為單位進行編譯
的,而不是以函數(shù)為單位進行編譯的。
Q
A說明:
(3)C程序的執(zhí)行是從main函數(shù)開始的,如
果在main函數(shù)中調(diào)用其他函數(shù),在調(diào)用后流
程返回到main函數(shù),在main函數(shù)中結(jié)束整
個程序的運行。
1
A說明:
(4)所有函數(shù)都是平行的,即在定義函數(shù)時是
分別進行的,是互相獨立的。一個函數(shù)并不從
屬于另一個函數(shù),即函數(shù)不能嵌套定義。函數(shù)
間可以互相調(diào)用,但不能調(diào)用main函數(shù)。
main函數(shù)是被操作系統(tǒng)調(diào)用的。
Q
A說明:
(5)從用戶使用的角度看,函數(shù)有兩種。
?庫函數(shù),它是由系統(tǒng)提供的,用戶不必自己定
義而直接使用它們。應(yīng)該說明,不同的C語言
編譯系統(tǒng)提供的庫函數(shù)的數(shù)量和功能會有一些
不同,當(dāng)然許多基本的函數(shù)是共同的。
?用戶自己定義的函數(shù)。它是用以解決用戶專門
需要的函數(shù)。
Q
?說明:
(6)從函數(shù)的形式看,函數(shù)分兩類。
①無參函數(shù)。無參函數(shù)一般用來執(zhí)行指定的一
組操作。無參函數(shù)可以帶回或不帶回函數(shù)值,
但一般以不帶回函數(shù)值的居多。
②有參函數(shù)。在調(diào)用函數(shù)時,主調(diào)函數(shù)在調(diào)用
被調(diào)用函數(shù)時,通過參數(shù)向被調(diào)用函數(shù)傳遞數(shù)
據(jù),一般情況下,執(zhí)行被調(diào)用函數(shù)時會得到一
個函數(shù)值,供主調(diào)函數(shù)使用。
C
7.2怎樣定義函數(shù)
7.2.1為什么要定義函數(shù)
7.2.2定義函數(shù)的方法
7.2.1為什么要定義函數(shù)
AC語言要求,在程序中用到的所有函
數(shù),必須“先定義,后使用”
A指定函數(shù)名字、函數(shù)返回值類型、函數(shù)
實現(xiàn)的功能以及參數(shù)的個數(shù)與類型,將
這些信息通知編譯系統(tǒng)。
7.2.1為什么要定義函數(shù)
?指定函數(shù)的名字,以便以后按名調(diào)用
A指定函數(shù)類型,即函數(shù)返回值的類型
?指定函數(shù)參數(shù)的名字和類型,以便在調(diào)
用函數(shù)時向它們傳遞數(shù)據(jù)
?指定函數(shù)的功能。這是最重要的,這是
在函數(shù)體中解決的
7.2.1為什么要定義函數(shù)
?對于庫函數(shù),程序設(shè)計者只需用
#inelude指令把有關(guān)的頭文件包含到
本文件模塊中即可
?程序設(shè)計者需要在程序中自己定義想用
的而庫函數(shù)并沒有提供的函數(shù)
722定義函數(shù)的方法
1.定義無參函數(shù)
定義無參函數(shù)的一般形式為:
類型名函數(shù)名()類型名函數(shù)名(void)
{{
L函數(shù)體:,函數(shù)體
包括聲明部分和
,語句部分
7.2£舉函數(shù)的方法
1定義#指定函數(shù)'
?人,q值的類型
定!義無產(chǎn)或》中式為:
類型名函數(shù)名()類型名函數(shù)名(void)
函數(shù)體函數(shù)體
}}
722定義函數(shù)的方法
2.定義有參函數(shù)
定義有參函數(shù)的一般形式為:
類型名函數(shù)名(形式參數(shù)表列)
函數(shù)體
7.2.2定義函數(shù)的方法
3.定義空函數(shù)
定義空函數(shù)的一般形式為:
類型名函數(shù)名()
{}
?先用空函數(shù)占一個位置,以后逐步擴充
?好處:程序結(jié)構(gòu)清楚,可讀性好,以后
擴充新功能方便,對程序結(jié)構(gòu)影響不大
7.3調(diào)用函數(shù)
7.3.1函數(shù)調(diào)用的形式
7.3.2函數(shù)調(diào)用時的數(shù)據(jù)傳遞
7.3.3函數(shù)調(diào)用的過程
7.3.4函數(shù)的返回值
Q
7.3,1函數(shù)調(diào)用的形式
?函數(shù)調(diào)用的一般形式為:
函數(shù)名(實參表列)
?如果是調(diào)用無參函數(shù),則“實參表列”可
以沒有,但括號不能省略
A如果實參表列包含多個實參,則各參數(shù)
間用逗號隔開
7.3,1函數(shù)調(diào)用的形式
A按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置
來分,可以有以下3種函數(shù)調(diào)用方式:
1.函數(shù)調(diào)用語句
A把函數(shù)調(diào)用單獨作為一個語句
如printf_star();
A這時不要求函數(shù)帶回值,只要求函數(shù)完
成一定的操作
7.3,1函數(shù)調(diào)用的形式
A按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置
來分,可以有以下3種函數(shù)調(diào)用方式:
2.函數(shù)表達式
A函數(shù)調(diào)用出現(xiàn)在另一個表達式中
^Dc=max(a,b);
A這時要求函數(shù)帶回一個確定的值以參加
表達式的運算
7.3,1函數(shù)調(diào)用的形式
A按函數(shù)調(diào)用在程序中出現(xiàn)的形式和位置
來分,可以有以下3種函數(shù)調(diào)用方式:
3.函數(shù)參數(shù)
?函數(shù)調(diào)用作為另一函數(shù)調(diào)用時的實參
如m=max(a,max(b,c));
A其中max(b,c)是一次函數(shù)調(diào)用,它的
值作為max另一次調(diào)用的實參
7.3.2函數(shù)調(diào)用時的數(shù)據(jù)傳遞
1.形式參數(shù)和實際參數(shù)
?在調(diào)用有參函數(shù)時,主調(diào)函數(shù)和被調(diào)用函
數(shù)之間有數(shù)據(jù)傳遞關(guān)系
?定義函數(shù)時函數(shù)名后面的變量名稱為“形式
參數(shù)”(簡稱“形參”)
?主調(diào)函數(shù)中調(diào)用一個函數(shù)時,函數(shù)名后面
參數(shù)稱為“實際參數(shù)”(簡稱“實參”)
?實際參數(shù)可以是常量、變量或表達式
7.3.2函數(shù)調(diào)用時的數(shù)據(jù)傳遞
2.實參和形參間的數(shù)據(jù)傳遞
?在調(diào)用函數(shù)過程中,系統(tǒng)會把實參的值傳
遞給被調(diào)用函數(shù)的形參
?或者說,形參從實參得到一個值
?該值在函數(shù)調(diào)用期間有效,可以參加被調(diào)
函數(shù)中的運算
7.3.2函數(shù)調(diào)用時的數(shù)據(jù)傳遞
例7.2輸入兩個整數(shù),要求輸出其中值較
大者。要求用函數(shù)來找到大數(shù)。
?解題思路:
(1)函數(shù)名應(yīng)是見名知意,今定名為max
(2)由于給定的兩個數(shù)是整數(shù),返回主調(diào)函數(shù)的
值(即較大數(shù))應(yīng)該是整型
(3)max函數(shù)應(yīng)當(dāng)有兩個參數(shù),以便從主函數(shù)接
收兩個整數(shù),因此參數(shù)的類型應(yīng)當(dāng)是整型
7.3.2函數(shù)調(diào)用時的數(shù)據(jù)傳遞
I先編寫max函數(shù):
intmax(intxjnty)
intz;
z=x>y?x:y;
return(z);
7.3.2函數(shù)調(diào)用時的數(shù)據(jù)傳遞
在max函數(shù)上面,再編寫主函數(shù)
#include<stdio.h>
intmain()
{intmax(intx,inty);inta5b,c;
printf(£ttwointegernumbers:");
scant(%d,%d5,,&a,&b);
c=max叵功;實參可以是常量、變量或表達式
printf(umaxis%d\n",c);
}tuointegerounbers:12,-34
|maxis12
7.3.2函數(shù)調(diào)用時的數(shù)據(jù)傳遞
c=max(a5b);(main函數(shù))
intmax(intx,inty)(max函數(shù))
intz;
z=x>y?x:y;
return(z);
7.3.3函數(shù)調(diào)用的過程
在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)
調(diào)用時,它們并不占內(nèi)存中的存儲單元。
在發(fā)生函數(shù)調(diào)用時,函數(shù)max的形參被臨
時分配內(nèi)存單元。
7.3.3函數(shù)調(diào)用的過程
A調(diào)用結(jié)束,形參單元被釋放
?實參單元仍保留并維持原值,沒有改變
A如果在執(zhí)行一個被調(diào)用函數(shù)時,形參的值
發(fā)生改變,不會改變主調(diào)函數(shù)的實參的值
7.3.4.函數(shù)的返回值
A通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得
到一個確定的值,這就是函數(shù)值(函數(shù)的返
回值)
(1)函數(shù)的返回值是通過函數(shù)中的return語
句獲得的。
?一個函數(shù)中可以有一個以上的return語句,
執(zhí)行到哪一個return語句,哪一個就起作用
?return語句后面的括號可以不要
7.3.4.函數(shù)的返回值
A通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得
到一個確定的值,這就是函數(shù)值(函數(shù)的返
回值)
(2)函數(shù)值的類型。應(yīng)當(dāng)在定義函數(shù)時指定
函數(shù)值的類型
7.3.4.函數(shù)的返回值
A通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得
到一個確定的值,這就是函數(shù)值(函數(shù)的返
回值)
(3)在定義函數(shù)時指定的函數(shù)類型一般應(yīng)該
和return語句中的表達式類型一致
?如果函數(shù)值的類型和return語句中表達式的
值不一致,則以函數(shù)類型為準(zhǔn)
7.3.4.函數(shù)的返回值
例7.3將例7.2稍作改動,將在max函數(shù)中定
義的變量z改為float型。函數(shù)返回值的類型
與指定的函數(shù)類型不同,分析其處理方法。
A解題思路:如果函數(shù)返回值的類型與指定
的函數(shù)類型不同,按照賦值規(guī)則處理。
#include<stdio.h>
intmain()
{intmax(floatx,floaty);
floata,b;intc;
scanf(n%f,%f,\&a,&b);「?5,2.6
c=|max(a、b)|變?yōu)?[maxis2
printf(maxis%d\n",c);
return0;26
intmax(floatx,floaty)
{floatz;
z=x>y?x:y;
return(z);
}亢l=±>2
7.4對被調(diào)用函數(shù)的聲明和函數(shù)原型
A在一個函數(shù)中調(diào)用另一個函數(shù)需要具備如
下條件:
(1)被調(diào)用函數(shù)必須是已經(jīng)定義的函數(shù)(是庫
函數(shù)或用戶自己定義的函數(shù))
(2)如果使用庫函數(shù),應(yīng)該在本文件開頭加相
應(yīng)的#include指令
(3)如果使用自己定義的函數(shù),而該函數(shù)的位
置在調(diào)用它的函數(shù)后面,應(yīng)該聲明_
7.4對被調(diào)用函數(shù)的聲明和函數(shù)原型
例7.4輸入兩個實數(shù),用一個函數(shù)求出它
們之和。
A解題思路:用add函數(shù)實現(xiàn)。首先要定義
■add函數(shù),它為float型,它應(yīng)有兩個參
數(shù),也應(yīng)為float型。特別要注意的是:
要對add函數(shù)進行聲明。
7.4對被調(diào)用函數(shù)的聲明和函數(shù)原型
A分別編寫add函數(shù)和main函數(shù),它們組
成一個源程序文件
Amain函數(shù)的位置在add函數(shù)之前
A在main函數(shù)中對add函數(shù)進行聲明
#include<stdio.h>=
對adch
intmain()I「―
{floatadd(floatx,floaty);
floata,b,c;
printf("Pleaseenteraandb:H);
nn
scanf(%f,%f,&a5&b);
c=add(a,b);
printf("sumis%f\n",c);
return0;
floatadd(floatx,floaty)
{floatz;
求兩個實數(shù)之和,z=x+y;
函數(shù)值也是實型return(z);
#include<stdio.h>廠只差一個分號一
intmain()'----------
{floatadd(floatx,floaty);
floata,b,c;
printf("Pleaseenteraandb:H);
scanf(n%f,%fn,&a,&b);
c=add(a,b);
printf("sumis%f\n",c);
return0;
floatadd(floatx,floaty)
){floatz;
z=x+y;
return(z);?
Pleaseenteraandb:3.6^6.5
includesunis10.100000
intmain
{floatadd(floatx,floaty);
floata,b,c;
printf("Pleaseenteraandb:H);
scanf(n%f,%f",&a,&b);1——
c=add(a.b):調(diào)用add函數(shù)
printf("sumis%f\n",c);
return0;
floatadd(floatx,floaty)
){floatz;
r..........-z=x+y;
定義add函數(shù)return(z);
)c
?函數(shù)原型的一般形式有兩種:
如floatadd(floatx,floaty);
floatadd(float,float);
?原型說明可以放在文件的開頭,這時所有
函數(shù)都可以使用此函數(shù)
Q
7.5函數(shù)的嵌套調(diào)用
AC語言的函數(shù)定義是互相平行、獨立的
?即函數(shù)不能嵌套定義
?但可以嵌套調(diào)用函數(shù)
?即調(diào)用一個函數(shù)的過程中,又可以調(diào)用另
一個函數(shù)
7.5函數(shù)的嵌套調(diào)用
main函數(shù)a函數(shù)b函數(shù)
結(jié)束
7.5函數(shù)的嵌套調(diào)用
例7.5輸入4個整數(shù),找出其中最大的數(shù)。
用函數(shù)的嵌套調(diào)用來處理。
?解題思路:
?main中調(diào)用max4函數(shù),找4個數(shù)中最大者
?max4中再調(diào)用max2,找兩個數(shù)中的大者
?max4中多次調(diào)用max2,可找4個數(shù)中的大
者,然后把它作為函數(shù)值返回main函數(shù)
?main函數(shù)中輸出結(jié)果1
主函數(shù)
#include<stdio.h>[勺max4函數(shù)聲明一
intmain()
{intmax4(inta,intb,intc,intd);
inta,b3c3d,max;
printf(£<4intergernumbers:");
scant("%d%d%d%d",&a,&b,&c,&d);
max=max4(a3b5c,d);
printf("max=%d\nH,max);
return0;
主函數(shù)
#include<stdio.h>
intmain()
{intmax4(inta,intb,intc,intd);
inta,b3c5d,max;「輸入4個整數(shù)
printf(£<4intergernumb
scant("%d%d%d%d",&a,&b,&c,&d);
max=max4(a3b5c,d);
printf("max=%d\nH,max);
return0;
主函數(shù)
#include<stdio.h>
intmain()
{intmax4(inta,intb,intc,intd);
inta,b,c,f斕用后肯定是4、
Prmtf(“4個數(shù)中最大者ers:");
scant("%df;
max=max4(a3b5c,d);
printf("max=%d\nH,max);
return0;j"\
1[輸出最大者
max4函數(shù)
intmax4(inta,intb,intcjntd)
{intmax2(inta,intb);
intm;_
m=max2(a,b);「^max2函數(shù)聲明
m=max2(m,c);
m=max2(m,d);
return(m);
)
c
max4函數(shù)
intmax4(inta,intb,intcjntd)
{intmax2(inta,intb);
intm;___________
m=max2(a,b);中較大者]
m=max2(m,c);中較大者一
m=max2(m,d);—Ja‘b’c’d中最大者
return(m);
)
c
max4函數(shù)
intmax4(inta,intb,intcjntd)
{intmax2(inta,intb);
intm;
m=max2(a5b);
m=max2(m,c);max2函數(shù)
m=max2(m,d);
intmax2(inta,intb)
return(m);{if(a>=b)
returna;
else
returnb;
max4函數(shù)
intmax4(inta,intb,intcjntd)
{intmax2(inta,intb);
intm;
m=max2(a5b);
m=max2(m,c);max2函數(shù)
m=max2(m,d);
intmax2(inta,intb)
return(m);{if(a>=b)
)/returna;
else
returnb;
return(a>b?a:b);
max4函數(shù)
intmax4(inta,intb,intcjntd)
{intmax2(inta,intb);
intm;
m=max2(a5b);
m=max2(m,c);
m=max2(m,d);
return(m);
}
intmax2(inta,intb)
{return(a>b?a:b);}
max4函數(shù)
intmax4(inta,intb,intcjntd)
{intmax2(inta,intb);
intm;m=max2(max2(a5b),c);
m=max2(a,b);;J
m=max2(m,c);
m=max2(m,d);
return(m);
)
intmax2(inta,intb)
{return(a>b?a:b);}
max4函數(shù)
intmax4(inta,intb,intcjntd)
—
{intmax2(m=max2(max2(max2(a,b),c),d);
intm;J
m=max2(a,b);
m=max2(m,c);
m=max2(m,d);
return(m);
)
intmax2(inta,intb)
{return(a>b?a:b);}
max4函數(shù)
intmaxruturnmax2(max2(max2(ajb),c),d);
{int
intm;
m=max2(a,b);
m=max2(m,c);
m=max2(m,d);
return(m);
}I
intmax2(inta,intb)
{return(a>b?a:b);}
#includ駕84intergernumbers:1245—689
|fnax=89
intmain眄
}…max=彳max4(a5b5c5d);
intmax4yinta,intb,intc,intd)
{intma/<2(intajntb);
ruturnmax2(max2(max2(a,b),c)5d)5
intmax2(intajntN^/
{return(a>b?a:b);}
7.6函數(shù)的遞歸調(diào)用
?在調(diào)用一個函數(shù)的過程中又出現(xiàn)直接或間
接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)
用。
>C語言的特點之一就在于允許函數(shù)的遞歸
調(diào)用。
7.6函數(shù)的遞歸調(diào)用
intf(intx)f函數(shù)
I
,直接調(diào)用本函數(shù)
調(diào)用f函數(shù)
z=f(y);---------------------------
returrk(2*z)if1函數(shù)f2函數(shù)
}[間接調(diào)用本函數(shù)廠|
廣\調(diào)用f2函數(shù)調(diào)用f1函數(shù)一
應(yīng)使用if語句控制結(jié)束調(diào)用…」C
7.6函數(shù)的遞歸調(diào)用
例7.6有5個學(xué)生坐在一起
?問第5個學(xué)生多少歲?他說比第4個學(xué)生大2歲
?問第4個學(xué)生歲數(shù),他說比第3個學(xué)生大2歲
?問第3個學(xué)生,又說比第2個學(xué)生大2歲
?問第2個學(xué)生,說比第1個學(xué)生大2歲
?最后問第1個學(xué)生,他說是10歲
?請問第5個學(xué)生多大
7.6函數(shù)的遞歸調(diào)用
A解題思路:
?要求第5個年齡,就必須先知道第4個年齡
?要求第4個年齡必須先知道第3個年齡
?第3個年齡又取決于第2個年齡
?第2個年齡取決于第1個年齡
?每個學(xué)生年齡都比其前1個學(xué)生的年齡大2
7.6函數(shù)的遞歸調(diào)用
?解題思路:
age(5)=age(4)+21
age(4)=age(3)+2
age(3)=age(2)+2-
age(2)=age(1)+2
age(1)=10
age(n)=10(〃=D
age(n)=age(n-1)+25>1)?
age(5)age(5)
=age(4)+2=18
\
age(4)
=age(3)+2=16
\
age(3)京)
=age(2)+2一14
\
age(2)
=age(1)+212
回溯階段遞推階段
=10
age(5)age(5)
=age(4)+2=18
age(4)
age(3)+2=16
age(3)京)
=age(2)^彳=14
結(jié)束遞歸的條件
遞推階段
#inelude<stdio.h>
intmain()
{intage(intn);
printf("N0.5,age:%d\nH,age(5));
return0;
)
intage(intn)
{intc;
if(n==1)c=10;
elsec=age(n-1)+2;
return(c);
[NO.5,age
)
age函數(shù)age函數(shù)
mainn=5n=4
age(5)
c=age£4)+2c=age(3)+2
輸出age(5)
18age(5)=18agd(4JV16
age函數(shù)age函數(shù)
n=1n=2n=3
c=10c=ajge(1)+2c=age(2)+2
age(1)=10age(2)=12age(3)=14應(yīng)
例7.7用遞歸方法求n!o
A解題思路:
?求n!可以用遞推方法:即從1開始,乘2,
再乘3...一直乘到no
?遞推法的特點是從一個已知的事實(如1!=1)
出發(fā),按一定規(guī)律推出下一個事實(如
2!=1!*2),再從這個新的已知的事實出發(fā),
再向下推出一個新的事實(3!=3*2!)。
n!=n*(n-1)!。
Q
例7.7用遞歸方法求n!o
A解題思路:
?求n!也可以用遞歸方法,即5!等于4!X
5,而4!=3!義4,一,1!=1
?可用下面的遞歸公式表示:
(nl=1(〃=0,1)
〃!=1
孔?(幾一1)(〃>1)
Q
#include<stdio.h>
intmain()
{intfac(intn);
intn;inty;
printf("inputanintegernumber:'1
scant("%d"3&n);
y=fac(n);
printf("%d!=%d\n"5n,y);
return0;
intfac(intn)
intf;
if(n<0)
printf("n<0,dataerror!");
elseif(n==0||n==1)
f=1;
elsef=fac(n-1)
return(f);
Li,.?'工r
)inputanintegernumber:31
□1?=738197504
fac函數(shù)fac函數(shù)
mainn=5n=4
fac(5)
福而京(5)f=fac(4)X5f=faQ(3)X4
120fac(5)=120fac")、24
fac函數(shù)fac函數(shù)fac函婁
n=1n=2n=3
f=fac(1)X2f=fac(2)X3
fac(1)=1fac(2)=2fac(3)=6r-
例7.8Hanoi(漢諾)塔問題。古代有一
個梵塔,塔內(nèi)有3個座A、B、C,開始時
A座上有64個盤子,盤子大小不等,大的
在下,小的在上。有一個老和尚想把這64
個盤子從A座移到C座,但規(guī)定每次只允
許移動一個盤,且在移動過程中在3個座上
都始終保持大盤在下,小盤在上。在移動
過程中可以利用B座。要求編程序輸出移動
一盤子的步驟。
C
o
co
<
A解題思路:
?要把64個盤子從A座移動到C座,需要移動大
約264次盤子。一般人是不可能直接確定移動
盤子的每一個具體步驟的
?老和尚會這樣想:假如有另外一個和尚能有辦
法將上面63個盤子從一個座移到另一座。那
么,問題就解決了。此時老和尚只需這樣做:
A解題思路:
(1)命令第2個和尚將63個盤子從A座移到B座
(2)自己將1個盤子(最底下的、最大的盤子)
從A座移到C座
(3)再命令第2個和尚將63個盤子從B座移到C
座
c
第1個和尚的做法
將63個從A到B
ABC
第1個和尚的做法
將63個從A到B
ABC
第1個和尚的做法
將1個從A到C
ABC
第1個和尚的做法
(
第1個和尚的做法
將63個從B到C
ABC
第1個和尚的做法
將63個從B到C
AB
第2個和尚的做法
將62個從A至UC
ABC
第2個和尚的做法
ABC
第2個和尚的做法
將1個從A到B
ABC
第2個和尚的做法
將1個從A到B
AB
1
第2個和尚的做法
將62個從C至UB
ABC
第2個和尚的做法
將62個從C至UB
ABC
第3個和尚的做法
第4個和尚的做法
第5個和尚的做法
第6個和尚的做法
第7個和尚的做法
第63個和尚的做法
第64個和尚僅做:將1個從A移到C
將3個盤子從A移到C的全過程
將2個盤子從A移到B
ABC
將3個盤子從A移到C的全過程
將2個盤子從A移到B
ABC
將3個盤子從A移到C的全過程
將1個盤子從A移到C
ABC
將3個盤子從A移到C的全過程
將1個盤子從A移到C
ABC
Q
將3個盤子從A移到C的全過程
將2個盤子從B移到C
ABC
Q
將3個盤子從A移到C的全過程
將2個盤子從B移到C
ABC
將2個盤子從A移到B的過程
將1個盤子從A移到C
ABC
將2個盤子從A移到B的過程
將1個盤子從A移到C
ABC
將2個盤子從A移到B的過程
將1個盤子從A移到B
將2個盤子從A移到B的過程
將1個盤子從A移到B
AB
Q
將2個盤子從A移到B的過程
將1個盤子從C移到B
AB
Q
將2個盤子從A移到B的過程
將1個盤子從C移到B
ABC
將2個盤子從B移到C的過程
ABC
將2個盤子從B移到C的過程
ABC
將2個盤子從B移到C的過程
ABC
將2個盤子從B移到C的過程
ABC
A由上面的分析可知:將n個盤子從A座移
至IJC座可以分解為以下3個步驟:
(1)將A上n-1個盤借助C座先移到B座上
(2)把A座上剩下的一個盤移到C座上
(3)將n-1個盤從B座借助于A座移到C座上
?可以將第(1)步和第(3)步表示為:
?將“one”座上n-1個盤移到“two”座(借
助“three”座)。
?在第(1)步和第(3)步中,one、two、
three和A、B、C的對應(yīng)關(guān)系不同。
?對第(1)步,對應(yīng)關(guān)系是one對應(yīng)A,two
對應(yīng)B,three對應(yīng)C。
?對第(3)步,對應(yīng)關(guān)系是one對應(yīng)B,two
對應(yīng)C,three對應(yīng)A。
>把上面3個步驟分成兩類操作:
(1)將n-1個盤從一個座移到另一個座上(n
>1)O這就是大和尚讓小和尚做的工作,
它是一個遞歸的過程,即和尚將任務(wù)層層下
放,直到第64個和尚為止。
(2)將1個盤子從一個座上移到另一座上。這
是大和尚自己做的工作。
?編寫程序。
?用hanoi函數(shù)實現(xiàn)第1類操作(即模擬小和
尚的任務(wù))
?用move函數(shù)實現(xiàn)第2類操作(模擬大和尚
自己移盤)
?函數(shù)調(diào)用hanoi(n,one』wo.three)表示
將n個盤子從“one"座移到"three55座的過
程(借助“two”座)
?函數(shù)調(diào)用move(x,y)表示將1個盤子從x座
移到y(tǒng)座的過程。x和y是代表A、B、C座之
一,根據(jù)每次不同情況分別取A、B、C代入
#include<stdio.h>
intmain()
{voidhanoi(intn,charone,
chartwo,charthree);
intm;
printf(uthenumberofdiskes:");
scant("%d",&m);
printf("move%ddiskes:\n",m);
hanoi(m,,A,,,B,,,C,);
}
(
voidhanoi(intn,charone,chartwo,
charthree)
{voidmove(charx,chary);
if(n==1)
move(one,three);
else
{hanoi(n-1,one,three5two);
move(one5three);
hanoi(n-1,two,one5three);
voidmove(charx5chary)
printf("%c-->%c\nH,x,y);
thenumberofdiskes:3
noue3diskes:
A—>C
A—>B
C—>B
A—>C
B-〉A(chǔ)
B—>C
A—>C
7.7數(shù)組作為函數(shù)參數(shù)
7.7.1數(shù)組元素作函數(shù)實參
7.7,2數(shù)組名作函數(shù)參數(shù)
7.7.3多維數(shù)組名作函數(shù)參數(shù)
77J數(shù)組元素作函數(shù)實參
例7.9輸入10個數(shù),要求輸出其中值
最大的元素和該數(shù)是第幾個數(shù)。
7.7J數(shù)組元素作函數(shù)實參
?解題思路:
?定義數(shù)組a,用來存放10個數(shù)
?設(shè)計函數(shù)max,用來求兩個數(shù)中的大者
?在主函數(shù)中定義變量m,初值為a[0],
每次調(diào)用max函數(shù)后的返回值存放在m中
?用“打擂臺”算法,依次將數(shù)組元素a[1]
到2[9]與m比較,最后得到的m值就是
10個數(shù)中的最大者
#include<stdio.h>
intmain()
{intmax(intxjnty);
inta[10],m,nJ;
printf(u10integernumbers:\n");
for(i=0;i<10;i++)
scant("%d",&a[i]);
printf("\n");
10integernumbers:
470-343467-4231-76
for(i=1,m=a[0],n=0;i<10;i++)
{if(max(m,a[i])>m)
{m=max(m,a[i]);
n=i;
largestnumberis67
)7thnunber.
)
printf(largestnumberis%d\n",m);
printf(u%dthnumber.\n\n+1);
}
intmax(intx,inty)
{return(x>y?x:y);}
7?7?2數(shù)組名作函數(shù)參數(shù)
A除了可以用數(shù)組元素作為函數(shù)參數(shù)外
,還可以用數(shù)組名作函數(shù)參數(shù)(包括實
I參和形參)
?用數(shù)組元素作實參時,向形參變量傳
遞的是數(shù)組元素的值
A用數(shù)組名作函數(shù)實參時,向形參傳遞
的是數(shù)組首元素的地址
7?7?2數(shù)組名作函數(shù)參數(shù)
例7.10有一個一維數(shù)組score,內(nèi)放
]110個學(xué)生成績,求平均成績。
A解題思路:
I?用函數(shù)average求平均成績,用數(shù)組名
I作為函數(shù)實參,形參也用數(shù)組名
?在average函數(shù)中引用各數(shù)組元素,求
平均成績并返回main函數(shù)
#include<stdio.h><-
定義實參數(shù)組
intmain()
{floataveragearray[10]);
floatscore[10]5aver;inti;
printf("input10scores:\n");
for(i=0;i<10;i++)
H
scant("%f5&score[i]);
printf("\n");
aver=average(score);
printf("%5.2f\n",aver);
return0;
定義形參數(shù)組
floataverage(floatarray[10])
{inti;
floataver,sum=array[0];
for(i=1;i<10;i++)tl^^score[0]
sum=sum+array[i];L----------------
aver=sum/10;-----------
return(aver);[相當(dāng)于score。]]
input10scores:
10056789867.5995488.57658
77.50
例7.11有兩個班級,分別有35名和30
名學(xué)生,調(diào)用一個average函數(shù),分別求
這兩個班的學(xué)生的平均成績。
?解題思路:
?需要解決怎樣用同一個函數(shù)求兩個不同長度的
數(shù)組的平均值的問題
?定義average函數(shù)時不指定數(shù)組的長度,在
形參表中增加一個整型變量i
?從主函數(shù)把數(shù)組實際長度從實參傳遞給形參i
?這個i用來在average函數(shù)中控制循環(huán)的次數(shù)
?為簡化,設(shè)兩個班的學(xué)生數(shù)分別為5和10
#include<stdio.h>
intmain()
{floataverage(floatarray[],intn);
floatscorel[5]={98.5,97,91.5,60,55);
floatscore2[10]={67.5,89.5,99,69.5,
77,89.5,76.5,54,60,99.5};
printf(u%6.2f\rT,average(scorel⑸);
printf("%6.2f\n5J,average(score2,10));
return0;
)
調(diào)用形式為average(scorel,5)時
floataverage(floatarray[],intn)
{inti;相當(dāng)于5
floataveum=array[0];
for(i=1;i<n;i++)
相當(dāng)于score1[0]
sum=sum+array[i];
aver=sum/n;
相當(dāng)于scorel[i]
return(aver);
調(diào)用形式為average(score2,10)時
floataverage(floatarray[],intn)
{inti;1相當(dāng)于10;
floatavehx/Urn^array[0];
for(i=1;i<n;i++)^^=Fscore2[0]
sum=sum+array[i]S---------------------
aver=sum/n;---------------
return(aver);[相當(dāng)于score2[i]」
}80.40
?8.20
例7.12用選擇法對數(shù)組中10個整數(shù)按由
小到大排序。
A解題思路:
I?所謂選擇法就是先將10個數(shù)中最小的數(shù)與
a[0]對換;再將a[1]到a[9]中最小的數(shù)與
a[1]對換....每比較一輪,找出一個未經(jīng)排
序的數(shù)中最小的一個
?共比較9輪
小到大排序
#include<stdio.h>
intmain()
{voidsort(intarray[],intn);
inta[10]J;
printf("enterarray:\n");
for(i=0;i<10;i++)scant("%d",&a[i]);
sort(a,10);
printf("Thesortedarray:\n");
for(i=0;i<10;i++)printf("%dn,a[i]);
printf("\n");
return0;
voidsort(intarray[],intn)
{inti,j,k,t;P^sort[i]?sort[9]中,
for(i=0;i<n-1;i++)最小數(shù)Ksort[i]對換
{k=i;------
for(j=i+1;jvn;j++)
if(array[j]<array[k])k=j;
t=array[k];
array[k]=array[i];
tenterarray:
45290-3541256633
Thesortedarray:
-302591233455466
7?7.3多維數(shù)組名作函數(shù)參數(shù)
[例7.13有一個3X4的矩陣,求所有
[元素中的最大值。
?解題思路:先使變量max的初值等于
[矩陣中第一個元素的值,然后將矩陣
[中各個元素的值與max相比,每次比
I較后都把“大者”存放在max中,全部
[元素比較完后,max的值就是所有元
素的最大值。
不能省略
#include<stdi形參數(shù)組弟一維大小相同
intmain()一
{intmax_value(intarray[f[4]);
inta[3][4]={{1,35537},{234,658}5
(15,17,34,12));
printf(uMaxvalueis%d\rT,
max_value(a));
return0;
}
要與實參數(shù)組第二維大小相同
intmax_value(intarray[][4])
{intij,max;
max=array[0][0];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(array[i][j]>max)
max=array[i][j];
return(max);
7,8局部變量和全局變量
7.8.1局部變量
7..2全局變量
1
7.8.1局部變量
>定義變量可能有三種情況:
?在函數(shù)的開頭定義
?在函數(shù)內(nèi)的復(fù)合語句內(nèi)定義
?在函數(shù)的外部定義
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學(xué)年四川省雅安市數(shù)學(xué)三下期末達標(biāo)檢測試題含解析
- 懷化學(xué)院《學(xué)前兒童語言教育活動與指導(dǎo)》2023-2024學(xué)年第二學(xué)期期末試卷
- 新疆科信職業(yè)技術(shù)學(xué)院《中國古代史I》2023-2024學(xué)年第二學(xué)期期末試卷
- 寧波大學(xué)科學(xué)技術(shù)學(xué)院《工程設(shè)計與分析》2023-2024學(xué)年第二學(xué)期期末試卷
- 云南省昆明市中華小學(xué)2025屆三年級數(shù)學(xué)第二學(xué)期期末復(fù)習(xí)檢測模擬試題含解析
- 浙大城市學(xué)院《口腔微生物學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 河北勞動關(guān)系職業(yè)學(xué)院《社會醫(yī)療保險學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年02月普洱市事業(yè)單位工作人員(1206人)筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 透水磚供貨合同范本
- 石化行業(yè)合同范本
- 《鐵道概論(第二版)》 課件 第8章 鐵路運輸組織
- lng加工合同范例
- 2024解析:第十六章電壓和電阻-基礎(chǔ)練(解析版)
- 湖北聯(lián)投集團2024校園招聘【298人】管理單位遴選500模擬題附帶答案詳解
- 機柜 施工方案
- 設(shè)計質(zhì)量、進度、安全、保密等管理方案及保障措施
- 單片機應(yīng)用技術(shù)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 文藝復(fù)興史學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 產(chǎn)后出血-教學(xué)查房
- 2024年新疆中考數(shù)學(xué)試卷(含答案解析)
- 2025年高考物理二輪復(fù)習(xí)的教學(xué)對策與思考講座
評論
0/150
提交評論