




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
項目五函數(shù)——小孩分糖任務(wù)一了解函數(shù)任務(wù)二函數(shù)的實現(xiàn)任務(wù)三實例體驗任務(wù)四算法歸納任務(wù)五畫流程圖任務(wù)六項目實現(xiàn)任務(wù)七知識擴(kuò)展思考與練習(xí)
任務(wù)一了解函數(shù)
1.概述函數(shù)是一個自我包含的完成一定相關(guān)功能的執(zhí)行代碼段。我們可以把函數(shù)看成一個“黑盒子”,只要將數(shù)據(jù)送進(jìn)去就能得到結(jié)果,而函數(shù)內(nèi)部究竟是如何工作的,外部程序是不知道的。外部程序所知道的僅限于函數(shù)輸入什么以及函數(shù)輸出什么。
C語言程序是由函數(shù)組成的。其中,函數(shù)的數(shù)目是沒有限制的。
用戶可把自己的算法編成一個個相對獨立的函數(shù)模塊,然后用調(diào)用的方法來使用函數(shù)??梢哉fC語言程序的全部工作都是由各式各樣的函數(shù)完成的,所以也把C語言稱為函數(shù)式語言。
C語言程序鼓勵和提倡人們把一個大問題劃分成若干個子問題,對應(yīng)于解決一個子問題編制一個函數(shù),因此,C語言程序一般是由大量的小函數(shù)而不是由少量大函數(shù)構(gòu)成的,即所謂“小函數(shù)構(gòu)成大程序”。這樣的好處是讓各部分相互充分獨立,并且任務(wù)單一。因而這些充分獨立的小模塊也可以作為一種固定規(guī)格的小“構(gòu)件”,用來構(gòu)成新的大程序。
2.函數(shù)定義的一般形式
函數(shù)定義的一般形式為
類型標(biāo)識符函數(shù)名(形式參數(shù)列表)
{
聲明部分
語句
}
其中類型標(biāo)識符和函數(shù)名稱為函數(shù)頭。類型標(biāo)識符指明了函數(shù)返回值的類型。若函數(shù)沒有返回值,則類型標(biāo)識符可以寫為?void。函數(shù)名是由用戶定義的標(biāo)識符,函數(shù)名后有一個括號,括號里是形式參數(shù)列表(簡稱形參表)。在形參表中給出的參數(shù)稱為形式參數(shù)(簡稱形參),它們可以是各種類型的變量,各參數(shù)之間用逗號間隔。在進(jìn)行函數(shù)調(diào)用時,主調(diào)函數(shù)將賦予這些形式參數(shù)實際的值。形參既然是變量,必須在形參表中給出形參的類型說明。
在本項目中,我們需要自定義兩個函數(shù):一個函數(shù)名為judge,其功能為判斷每個孩子手中的糖是否相同;其定義如下:
intjudge(intc[])
{
聲明部分
語句
}
這里的int表明該函數(shù)返回值的類型為整型,judge為該函數(shù)的函數(shù)名,括號中的intc[]為形式參數(shù)。
另一個函數(shù)名為print,其功能是輸出當(dāng)前每個孩子手中的糖數(shù)。其定義如下:
voidprint(ints[])
{
聲明部分
語句
}
這里的void表明該函數(shù)無返回值,print為該函數(shù)的函數(shù)名,括號中的ints[]為形式參數(shù)。
3.函數(shù)的聲明
在主調(diào)函數(shù)中調(diào)用某函數(shù)之前應(yīng)對該被調(diào)函數(shù)進(jìn)行聲明,這與使用變量之前要先進(jìn)行變量說明是一樣的。在主調(diào)函數(shù)中對被調(diào)函數(shù)作說明的目的是使編譯系統(tǒng)知道被調(diào)函數(shù)返回值的類型,以便在主調(diào)函數(shù)中按此種類型對返回值作相應(yīng)的處理。
其一般形式為
類型說明符被調(diào)函數(shù)名(類型形參,類型形參……);
或為
類型說明符被調(diào)函數(shù)名(類型,類型……);
括號內(nèi)給出了形參的類型和形參名,或只給出形參類型,這便于編譯系統(tǒng)進(jìn)行檢錯,以防止可能出現(xiàn)的錯誤。
本項目中,用戶定義兩個函數(shù)的聲明如下:
intjudge(intc[]);或intjudge(int);
voidprint(ints[]);或voidprint(int);
C語言中規(guī)定在以下幾種情況時可以省去主調(diào)函數(shù)中對被調(diào)函數(shù)的函數(shù)說明。
(1)如果被調(diào)函數(shù)的返回值是整型或字符型,可以不對被調(diào)函數(shù)作說明,而直接調(diào)用。這時系統(tǒng)將自動對被調(diào)函數(shù)返回值按整型處理。
(2)當(dāng)被調(diào)函數(shù)的函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前時,在主調(diào)函數(shù)中也可以不對被調(diào)函數(shù)再作說明而直接調(diào)用。
(3)如在所有函數(shù)定義之前,在函數(shù)外預(yù)先說明了各個函數(shù)的類型,則在以后的各主調(diào)函數(shù)中,可不再對被調(diào)函數(shù)作說明。
(4)對庫函數(shù)的調(diào)用不需要再作說明,但必須把該函數(shù)的頭文件用#include命令包含在源文件前部。
4.函數(shù)的返回值
函數(shù)的返回值是指函數(shù)被調(diào)用之后,執(zhí)行函數(shù)體中的程序段所取得的并返回給主調(diào)函數(shù)的值。對函數(shù)返回值有以下一些說明。
(1)函數(shù)的返回值只能通過return語句返回主調(diào)函數(shù)。
return語句的一般形式為
return表達(dá)式;或者為return(表達(dá)式);
該語句的功能是計算表達(dá)式的值,并返回給主調(diào)函數(shù)。在函數(shù)中允許有多個?return語句,但每次調(diào)用只能有一個return語句被執(zhí)行,因此只能返回一個函數(shù)值。
(2)函數(shù)返回值的類型和函數(shù)定義中函數(shù)的類型應(yīng)保持一致。如果兩者不一致,則以函數(shù)類型為準(zhǔn),自動進(jìn)行類型轉(zhuǎn)換。
(3)如函數(shù)返回值為整型,在函數(shù)定義時可以省去類型說明。
(4)不返回函數(shù)值的函數(shù),可以明確定義為“空類型”,類型說明符為“void”。為了使程序有良好的可讀性并減少出錯,凡不要求返回值的函數(shù)都應(yīng)定義為空類型。
5.函數(shù)的調(diào)用
在程序中是通過對函數(shù)的調(diào)用來執(zhí)行函數(shù)體的,其過程與其他語言的子程序調(diào)用相似。
C語言中,函數(shù)調(diào)用的一般形式為
函數(shù)名(實際參數(shù)表)
對無參函數(shù)調(diào)用時則無實際參數(shù)表。實際參數(shù)表中的參數(shù)可以是常數(shù)、變量或其他構(gòu)造類型的數(shù)據(jù)及表達(dá)式,各實參之間用逗號分隔。
在本項目中,函數(shù)的調(diào)用如下:
print(sweet);
judge(sweet);
任務(wù)二函數(shù)的實現(xiàn)
本項目中定義了兩個函數(shù)print和judge。其中,函數(shù)print的主要功能是打印出當(dāng)前每個小孩手里糖果的數(shù)目。具體實現(xiàn)如下。
這里的數(shù)組s[]是存儲每個小孩手里糖果的數(shù)目,整型變量j存儲的是分糖的次數(shù)。
另一個函數(shù)judge的主要功能是判斷每個小孩手里糖果的數(shù)目是否一致,如果不一致則返回1;一致則返回0。具體實現(xiàn)如下。
任務(wù)三實例體驗
在設(shè)計完整的項目之前,我們先演示一下分糖的過程,這樣大家可以體會本項目的處理過程。這種思想可以應(yīng)用到更多的問題和應(yīng)用上,總結(jié)起來,就是“數(shù)據(jù)驅(qū)動,手腦并用,步步模擬,豁然貫通”。
當(dāng)老師最初分給第一個小孩10塊,第二個小孩2塊,第三個小孩8塊,第四個小孩22塊,第五個小孩16塊,第六個小孩4塊,第七個小孩10塊,第八個小孩6塊,第九個小孩14塊,第十個小孩20塊,然后所有的小孩同時將手中的糖分一半給右邊的小孩;糖塊數(shù)為奇數(shù)的人可向老師要一塊。其步驟如下。
任務(wù)四算法歸納
根據(jù)任務(wù)一細(xì)化的功能和任務(wù)四中的實例,設(shè)計以下幾步實現(xiàn)功能,這些步驟即可稱為算法。
任務(wù)五畫流程圖
用流程圖的方式表示上述算法,如圖5.1所示。圖5.1流程圖
任務(wù)六項目實現(xiàn)
運行結(jié)果如圖5.2所示。
圖5.2運行結(jié)果
任務(wù)七知識擴(kuò)展
1.函數(shù)的嵌套調(diào)用
C語言中不允許作嵌套的函數(shù)定義,因此各函數(shù)之間是平行的,不存在上一級函數(shù)和下一級函數(shù)的問題。但是C語言允許在一個函數(shù)的定義中出現(xiàn)對另一個函數(shù)的調(diào)用,這樣就出現(xiàn)了函數(shù)的嵌套調(diào)用,即在被調(diào)函數(shù)中又調(diào)用其他函數(shù)。這與其他語言子程序嵌套的情形是類似的。其關(guān)系可由圖5.3表示。圖5.3函數(shù)的嵌套調(diào)用
圖5.2表示了兩層嵌套的情形。其執(zhí)行過程是:執(zhí)行main函數(shù)中調(diào)用a函數(shù)的語句時,即轉(zhuǎn)去執(zhí)行a函數(shù),在a函數(shù)中調(diào)用b函數(shù)時,又轉(zhuǎn)去執(zhí)行b函數(shù),b函數(shù)執(zhí)行完畢返回a函數(shù)的斷點繼續(xù)執(zhí)行,a函數(shù)執(zhí)行完畢返回main函數(shù)的斷點繼續(xù)執(zhí)行。
2.函數(shù)的遞歸調(diào)用
一個函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身稱為遞歸調(diào)用,這種函數(shù)稱為遞歸函數(shù)。C語言允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中,主調(diào)函數(shù)又是被調(diào)函數(shù)。執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身,每調(diào)用一次就進(jìn)入新的一層。
例如有函數(shù)f如下:
intf(intx)
{
inty;
z=f(y);
returnz;
}
這個函數(shù)是一個遞歸函數(shù),但是運行該函數(shù)將無休止地調(diào)用其自身,這當(dāng)然是不正確的。為了防止遞歸調(diào)用無終止地進(jìn)行,必須在函數(shù)內(nèi)有終止遞歸調(diào)用的手段。常用的辦法是加條件判斷,滿足某種條件后就不再作遞歸調(diào)用,然后逐層返回。下面舉例說明遞歸調(diào)用的執(zhí)行過程。
【例5-1】用遞歸法計算n!。
用遞歸法計算n!可用下述公式表示:
按公式可編程如下:
程序中給出的函數(shù)ff是一個遞歸函數(shù)。主函數(shù)調(diào)用ff后即進(jìn)入函數(shù)ff執(zhí)行,無論n<0,n=0或n=1都將結(jié)束函數(shù)的執(zhí)行,否則就遞歸調(diào)用ff函數(shù)自身。每次遞歸調(diào)用的實參為n-1,即把n-1的值賦予形參n,最后當(dāng)n-1的值為1時再作遞歸調(diào)用,形參n的值也為1,將使遞歸終止。然后可逐層退回。
下面我們再舉例說明該過程。設(shè)執(zhí)行本程序時輸入為5,即求5!。在主函數(shù)中的調(diào)用語句即為y=ff(5),進(jìn)入ff函數(shù)后,由于n=5,不等于0或1,故應(yīng)執(zhí)行f=ff(n-1)*n,即f=ff(5-1)*5。該語句對ff作遞歸調(diào)用即ff(4)。
進(jìn)行4次遞歸調(diào)用后,ff函數(shù)形參取得的值變?yōu)?,故不再繼續(xù)遞歸調(diào)用而開始逐層返回主調(diào)函數(shù)。ff(1)的函數(shù)返回值為1,ff(2)的返回值為1*2=2,ff(3)的返回值為2*3=6,ff(4)的返回值為6*4=24,最后ff(5)的返回值為24*5=120。
也可以不用遞歸的方法來完成。如可以用遞推法,即從1開始乘以2,再乘以3…直到n。遞推法比遞歸法更容易理解和實現(xiàn)。
思?考?與?練?習(xí)
一、選擇題
1.若調(diào)用一個函數(shù),且此函數(shù)中沒有return語句,則關(guān)于該函數(shù)的說法正確的是()。
A.沒有返回值
B.返回若干個系統(tǒng)默認(rèn)值
C.能返回一個用戶所希望的函數(shù)值
D.返回一個不確定的值
2.在C語言中,以下不正確的說法是()。
A.實參可以是常量、變量或表達(dá)式
B.形參可以是常量、變量或表達(dá)式
C.實參可以是任意類型
D.實參與其對應(yīng)的形參類型一致
3.有以下函數(shù)定義:
viodfun(intn,doublex){........}
若以下選項中的變量都已經(jīng)正確定義并賦值,則對函數(shù)fun的正確調(diào)用語句是()。
A.fun(inty,doublem);
B.k=fun(10,12.5);
C.fun(x,n); D.voidfun(n,x);
4.以下程序運行后,輸出結(jié)果是()。
A.84 B.99 C.95 D.44
5.若程序中定義了以下函數(shù):
doublemyadd(doublea,doubleb){
return(a+b);
}
并將其放在調(diào)用語句之后,則在調(diào)用之前應(yīng)該對該函數(shù)進(jìn)行說明,以下選項中的錯誤說明是()。
A.doublemyadd(doublea,b);
B.doublemyadd(double,double);
C.doublemyadd(doubleb,doublea);
D.doublemyadd(doublex,doubley);
6.以下函數(shù)的類型是()。
fff(floatx){
printf("%d\n",x*x);
}
A.與參數(shù)x的類型相同 B.void類型
C.int類型 D.無法確定
7.有如下函數(shù)調(diào)用語句,則該函數(shù)調(diào)用語句中,含有的實參個數(shù)是()。
fuc(rec1,rec2+rec3,(rec4,rec5));
A.3個
B.4個 C.5個D.無法確定
8.若函數(shù)的形參為一維數(shù)組,則下列說法中正確的是()。
A.調(diào)用函數(shù)時的對應(yīng)實參必為數(shù)組名
B.形參數(shù)組可以不指定大小
C.形參數(shù)組的元素個數(shù)必須等于實參數(shù)組的元素個數(shù)
D.形參數(shù)組的元素個數(shù)必須多于實參數(shù)組的元素個數(shù)
9.若用數(shù)組名作為函數(shù)調(diào)用的實參,傳遞給形參的是()。
A.?dāng)?shù)組的首地址 B.?dāng)?shù)組第一個元素的值
C.?dāng)?shù)組中全部元素的值
D.?dāng)?shù)組元素的個數(shù)
10.一個函數(shù)返回值的類型是由()。
A.return語句中的表達(dá)式類型決定的
B.定義函數(shù)時所指定的函數(shù)類型決定的
C.調(diào)用該函數(shù)的主調(diào)函數(shù)的類型決定的
D.在調(diào)用函數(shù)時臨時指定的
二、填空題
1.下面程序的運行結(jié)果是________。
2.下列程序在數(shù)組中同時查找最大元素和最小元素的下標(biāo),分別存放在main()函數(shù)的max和min中,請?zhí)羁铡?/p>
3.下列程序用于求數(shù)組a中所有元素之和。prime()用來判斷自變量是否是素數(shù),請?zhí)羁铡?/p>
4.以下程序中函數(shù)huiwen的功能是檢查一個字符串是否為回文。當(dāng)字符串是回文時,函數(shù)返回字符串:yes!;否則返回字符串:no!,并在主函數(shù)中輸出。所謂回文即正向與反向的拼寫都一樣,例如,12321就是回文。請?zhí)羁铡?/p>
#include<stdio.h>
三、編程題
1.寫出一個函數(shù):將某已知數(shù)組的奇數(shù)項組合成一個新的數(shù)組。在主函數(shù)中調(diào)用該函數(shù),并循環(huán)輸出新數(shù)組的內(nèi)容。要求:
(1)主函數(shù)定義一個初始化的數(shù)組,該數(shù)組的值為:1,2,3,4,5,6,7,8,9,10,11。
(2)寫出一個函數(shù),該函數(shù)的函數(shù)名為OddArray,函數(shù)需要的參數(shù)個數(shù)為一個,參數(shù)數(shù)據(jù)類型為數(shù)組,函數(shù)的返回值為數(shù)組。函數(shù)體實現(xiàn)功能:將參數(shù)數(shù)組中的奇數(shù)項存入另外一個數(shù)組,并返回該數(shù)組到主函數(shù)中。
(3)在主函數(shù)中定義一個新的數(shù)組,用于取得函數(shù)OddArray的返回值,然后循環(huán)顯示數(shù)組的值。(顯示出來1,3,5,7,9,11)
2.利用遞歸方法求5!。
用遞歸方式求出階乘的值。遞歸的方式為:
5!=4!*5
4!=3!*4
3!=2!*3
2!=1!*2
1!=1
即要求出5!,先求出4!,要求出4!,先求出3!……以此類推。要求:
(1)定義一個函數(shù),用于求階乘的值。
(2)在主函數(shù)中調(diào)用該遞歸函數(shù),求出5的階乘,并輸出結(jié)果。
3.利用求n!的方法計算2!+3!+4!+5!的值。要求:
分別利用遞歸和非遞歸方法實現(xiàn)求n!。
4.請編寫函數(shù)FUN,其功能是:將兩個兩位數(shù)的正整數(shù)A、B合并形成一個整數(shù)放在C中。合并的方式是:將A數(shù)的十位和個位數(shù)依次放在C數(shù)的個位和十位上,B數(shù)的十位和個位數(shù)依次放在C數(shù)的百位和千位上。例如,當(dāng)A=16,B=35,調(diào)用該函數(shù)后,C=5361。
5.打印出2~99的同構(gòu)數(shù)。同構(gòu)數(shù)是指這個數(shù)為該數(shù)平方的尾數(shù),如5的平方為25,6的平方為36,25的平方為625。要求:
調(diào)用帶有一個輸入?yún)?shù)的方法或函數(shù)實現(xiàn),此方法或函數(shù)用于判斷某個整數(shù)是否為同構(gòu)數(shù),輸入?yún)?shù)為一個整型參數(shù),返回值為布爾型。
6.編程實現(xiàn)判斷一個整數(shù)是否為素數(shù)。要求:
用帶有一個輸入?yún)?shù)的函數(shù)實現(xiàn),返回值為布爾類型。
7.當(dāng)n=5時,求表達(dá)式:1/1!+1/2!+1/3!+…+1/N!的值,保留4位小數(shù)位。要求:
用函數(shù)(遞歸)實現(xiàn)、Round函數(shù)調(diào)用。
8.隨著城市的發(fā)展,公交車變成了人們?nèi)粘I钪胁豢扇鄙俚慕煌üぞ?,而在高?/p>
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 苗木節(jié)能減排保障措施
- 【真題】人教版三年級下冊期末考試數(shù)學(xué)試卷(含解析)2024-2025學(xué)年江西省贛州市尋烏縣
- 垃圾填埋場滲濾液穩(wěn)定化運營措施
- 2025年春季學(xué)校行政后勤協(xié)調(diào)計劃
- 六年級第二學(xué)期班主任學(xué)困生幫扶計劃
- 以形啟思:初中幾何圖形分析導(dǎo)向的變式教學(xué)應(yīng)用探索
- 以小見大:秦皇島市青云里小學(xué)學(xué)生行為習(xí)慣養(yǎng)成教育探究
- 以圖式為翼破聽力之繭:高中英語聽力教學(xué)新探索
- 2025年度電商數(shù)據(jù)隱私保護(hù)計劃
- 通信行業(yè)技術(shù)負(fù)責(zé)人職責(zé)聚焦
- 照明組裝生產(chǎn)車間試題帶答案
- 江蘇南京金陵中學(xué)2024~2025學(xué)年高一下冊期末考試數(shù)學(xué)試題學(xué)生卷
- 福建福州第八中學(xué)2024~2025學(xué)年高一下冊期末數(shù)學(xué)試題
- 生產(chǎn)工藝流程控制考核試卷
- 交通執(zhí)法培訓(xùn)課件新
- l輻射安全管理制度
- 健康評估(第3版)課件6-2 泌尿系統(tǒng)常見癥狀評估
- 餐廚廢棄食用油脂管理制度
- 2025年云南省時事政治考試試卷帶解析附完整答案(考點梳理)
- 貴州省黔東南州2024-2025學(xué)年高二下冊期末教學(xué)質(zhì)量檢測數(shù)學(xué)試卷(附答案)
- 武漢大學(xué)2020年強(qiáng)基計劃物理試題(解析版)
評論
0/150
提交評論