《C語言程序設(shè)計 》課件-第5章_第1頁
《C語言程序設(shè)計 》課件-第5章_第2頁
《C語言程序設(shè)計 》課件-第5章_第3頁
《C語言程序設(shè)計 》課件-第5章_第4頁
《C語言程序設(shè)計 》課件-第5章_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

項目五函數(shù)——小孩分糖任務(wù)一了解函數(shù)任務(wù)二函數(shù)的實現(xiàn)任務(wù)三實例體驗任務(wù)四算法歸納任務(wù)五畫流程圖任務(wù)六項目實現(xiàn)任務(wù)七知識擴展思考與練習

任務(wù)一了解函數(shù)

1.概述函數(shù)是一個自我包含的完成一定相關(guān)功能的執(zhí)行代碼段。我們可以把函數(shù)看成一個“黑盒子”,只要將數(shù)據(jù)送進去就能得到結(jié)果,而函數(shù)內(nèi)部究竟是如何工作的,外部程序是不知道的。外部程序所知道的僅限于函數(shù)輸入什么以及函數(shù)輸出什么。

C語言程序是由函數(shù)組成的。其中,函數(shù)的數(shù)目是沒有限制的。

用戶可把自己的算法編成一個個相對獨立的函數(shù)模塊,然后用調(diào)用的方法來使用函數(shù)。可以說C語言程序的全部工作都是由各式各樣的函數(shù)完成的,所以也把C語言稱為函數(shù)式語言。

C語言程序鼓勵和提倡人們把一個大問題劃分成若干個子問題,對應于解決一個子問題編制一個函數(shù),因此,C語言程序一般是由大量的小函數(shù)而不是由少量大函數(shù)構(gòu)成的,即所謂“小函數(shù)構(gòu)成大程序”。這樣的好處是讓各部分相互充分獨立,并且任務(wù)單一。因而這些充分獨立的小模塊也可以作為一種固定規(guī)格的小“構(gòu)件”,用來構(gòu)成新的大程序。

2.函數(shù)定義的一般形式

函數(shù)定義的一般形式為

類型標識符函數(shù)名(形式參數(shù)列表)

{

聲明部分

語句

}

其中類型標識符和函數(shù)名稱為函數(shù)頭。類型標識符指明了函數(shù)返回值的類型。若函數(shù)沒有返回值,則類型標識符可以寫為?void。函數(shù)名是由用戶定義的標識符,函數(shù)名后有一個括號,括號里是形式參數(shù)列表(簡稱形參表)。在形參表中給出的參數(shù)稱為形式參數(shù)(簡稱形參),它們可以是各種類型的變量,各參數(shù)之間用逗號間隔。在進行函數(shù)調(diào)用時,主調(diào)函數(shù)將賦予這些形式參數(shù)實際的值。形參既然是變量,必須在形參表中給出形參的類型說明。

在本項目中,我們需要自定義兩個函數(shù):一個函數(shù)名為judge,其功能為判斷每個孩子手中的糖是否相同;其定義如下:

intjudge(intc[])

{

聲明部分

語句

}

這里的int表明該函數(shù)返回值的類型為整型,judge為該函數(shù)的函數(shù)名,括號中的intc[]為形式參數(shù)。

另一個函數(shù)名為print,其功能是輸出當前每個孩子手中的糖數(shù)。其定義如下:

voidprint(ints[])

{

聲明部分

語句

}

這里的void表明該函數(shù)無返回值,print為該函數(shù)的函數(shù)名,括號中的ints[]為形式參數(shù)。

3.函數(shù)的聲明

在主調(diào)函數(shù)中調(diào)用某函數(shù)之前應對該被調(diào)函數(shù)進行聲明,這與使用變量之前要先進行變量說明是一樣的。在主調(diào)函數(shù)中對被調(diào)函數(shù)作說明的目的是使編譯系統(tǒng)知道被調(diào)函數(shù)返回值的類型,以便在主調(diào)函數(shù)中按此種類型對返回值作相應的處理。

其一般形式為

類型說明符被調(diào)函數(shù)名(類型形參,類型形參……);

或為

類型說明符被調(diào)函數(shù)名(類型,類型……);

括號內(nèi)給出了形參的類型和形參名,或只給出形參類型,這便于編譯系統(tǒng)進行檢錯,以防止可能出現(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)當被調(diào)函數(shù)的函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前時,在主調(diào)函數(shù)中也可以不對被調(diào)函數(shù)再作說明而直接調(diào)用。

(3)如在所有函數(shù)定義之前,在函數(shù)外預先說明了各個函數(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表達式;或者為return(表達式);

該語句的功能是計算表達式的值,并返回給主調(diào)函數(shù)。在函數(shù)中允許有多個?return語句,但每次調(diào)用只能有一個return語句被執(zhí)行,因此只能返回一個函數(shù)值。

(2)函數(shù)返回值的類型和函數(shù)定義中函數(shù)的類型應保持一致。如果兩者不一致,則以函數(shù)類型為準,自動進行類型轉(zhuǎn)換。

(3)如函數(shù)返回值為整型,在函數(shù)定義時可以省去類型說明。

(4)不返回函數(shù)值的函數(shù),可以明確定義為“空類型”,類型說明符為“void”。為了使程序有良好的可讀性并減少出錯,凡不要求返回值的函數(shù)都應定義為空類型。

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ù)及表達式,各實參之間用逗號分隔。

在本項目中,函數(shù)的調(diào)用如下:

print(sweet);

judge(sweet);

任務(wù)二函數(shù)的實現(xiàn)

本項目中定義了兩個函數(shù)print和judge。其中,函數(shù)print的主要功能是打印出當前每個小孩手里糖果的數(shù)目。具體實現(xiàn)如下。

這里的數(shù)組s[]是存儲每個小孩手里糖果的數(shù)目,整型變量j存儲的是分糖的次數(shù)。

另一個函數(shù)judge的主要功能是判斷每個小孩手里糖果的數(shù)目是否一致,如果不一致則返回1;一致則返回0。具體實現(xiàn)如下。

任務(wù)三實例體驗

在設(shè)計完整的項目之前,我們先演示一下分糖的過程,這樣大家可以體會本項目的處理過程。這種思想可以應用到更多的問題和應用上,總結(jié)起來,就是“數(shù)據(jù)驅(qū)動,手腦并用,步步模擬,豁然貫通”。

當老師最初分給第一個小孩10塊,第二個小孩2塊,第三個小孩8塊,第四個小孩22塊,第五個小孩16塊,第六個小孩4塊,第七個小孩10塊,第八個小孩6塊,第九個小孩14塊,第十個小孩20塊,然后所有的小孩同時將手中的糖分一半給右邊的小孩;糖塊數(shù)為奇數(shù)的人可向老師要一塊。其步驟如下。

任務(wù)四算法歸納

根據(jù)任務(wù)一細化的功能和任務(wù)四中的實例,設(shè)計以下幾步實現(xiàn)功能,這些步驟即可稱為算法。

任務(wù)五畫流程圖

用流程圖的方式表示上述算法,如圖5.1所示。圖5.1流程圖

任務(wù)六項目實現(xiàn)

運行結(jié)果如圖5.2所示。

圖5.2運行結(jié)果

任務(wù)七知識擴展

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ù)將反復調(diào)用其自身,每調(diào)用一次就進入新的一層。

例如有函數(shù)f如下:

intf(intx)

{

inty;

z=f(y);

returnz;

}

這個函數(shù)是一個遞歸函數(shù),但是運行該函數(shù)將無休止地調(diào)用其自身,這當然是不正確的。為了防止遞歸調(diào)用無終止地進行,必須在函數(shù)內(nèi)有終止遞歸調(diào)用的手段。常用的辦法是加條件判斷,滿足某種條件后就不再作遞歸調(diào)用,然后逐層返回。下面舉例說明遞歸調(diào)用的執(zhí)行過程。

【例5-1】用遞歸法計算n!。

用遞歸法計算n!可用下述公式表示:

按公式可編程如下:

程序中給出的函數(shù)ff是一個遞歸函數(shù)。主函數(shù)調(diào)用ff后即進入函數(shù)ff執(zhí)行,無論n<0,n=0或n=1都將結(jié)束函數(shù)的執(zhí)行,否則就遞歸調(diào)用ff函數(shù)自身。每次遞歸調(diào)用的實參為n-1,即把n-1的值賦予形參n,最后當n-1的值為1時再作遞歸調(diào)用,形參n的值也為1,將使遞歸終止。然后可逐層退回。

下面我們再舉例說明該過程。設(shè)執(zhí)行本程序時輸入為5,即求5!。在主函數(shù)中的調(diào)用語句即為y=ff(5),進入ff函數(shù)后,由于n=5,不等于0或1,故應執(zhí)行f=ff(n-1)*n,即f=ff(5-1)*5。該語句對ff作遞歸調(diào)用即ff(4)。

進行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)。

思?考?與?練?習

一、選擇題

1.若調(diào)用一個函數(shù),且此函數(shù)中沒有return語句,則關(guān)于該函數(shù)的說法正確的是()。

A.沒有返回值

B.返回若干個系統(tǒng)默認值

C.能返回一個用戶所希望的函數(shù)值

D.返回一個不確定的值

2.在C語言中,以下不正確的說法是()。

A.實參可以是常量、變量或表達式

B.形參可以是常量、變量或表達式

C.實參可以是任意類型

D.實參與其對應的形參類型一致

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)用之前應該對該函數(shù)進行說明,以下選項中的錯誤說明是()。

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ù)時的對應實參必為數(shù)組名

B.形參數(shù)組可以不指定大小

C.形參數(shù)組的元素個數(shù)必須等于實參數(shù)組的元素個數(shù)

D.形參數(shù)組的元素個數(shù)必須多于實參數(shù)組的元素個數(shù)

9.若用數(shù)組名作為函數(shù)調(diào)用的實參,傳遞給形參的是()。

A.數(shù)組的首地址 B.數(shù)組第一個元素的值

C.數(shù)組中全部元素的值

D.數(shù)組元素的個數(shù)

10.一個函數(shù)返回值的類型是由()。

A.return語句中的表達式類型決定的

B.定義函數(shù)時所指定的函數(shù)類型決定的

C.調(diào)用該函數(shù)的主調(diào)函數(shù)的類型決定的

D.在調(diào)用函數(shù)時臨時指定的

二、填空題

1.下面程序的運行結(jié)果是________。

2.下列程序在數(shù)組中同時查找最大元素和最小元素的下標,分別存放在main()函數(shù)的max和min中,請?zhí)羁铡?/p>

3.下列程序用于求數(shù)組a中所有元素之和。prime()用來判斷自變量是否是素數(shù),請?zhí)羁铡?/p>

4.以下程序中函數(shù)huiwen的功能是檢查一個字符串是否為回文。當字符串是回文時,函數(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ù)的百位和千位上。例如,當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.當n=5時,求表達式: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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論