




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、程序設(shè)計(jì)技術(shù),程序設(shè)計(jì)語(yǔ)言和算法描述 C程序設(shè)計(jì)入門(mén) C程序的控制結(jié)構(gòu) 函數(shù)與程序結(jié)構(gòu) 指針與函數(shù) 構(gòu)造數(shù)據(jù)類(lèi)型與指針 位運(yùn)算 文件 C語(yǔ)言應(yīng)用,第四章模塊化程序設(shè)計(jì)基礎(chǔ),4.1 模塊化基本概念 4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法 4.3 程序設(shè)計(jì)中標(biāo)識(shí)符的作用域和生存期 4.4 遞歸方法的實(shí)現(xiàn),4.1 模塊化基本概念,模塊化概念 模塊化就是將一個(gè)大的復(fù)雜的程序根據(jù)“分而治之, 各個(gè)擊破”的原則劃分成為若干個(gè)模塊,每個(gè)模塊完 成一個(gè)相對(duì)獨(dú)立的子功能,將這些模塊按某種方式搭 接起來(lái)就構(gòu)成了解決總體問(wèn)題的程序。,4.1 模塊化基本概念,對(duì)軟件進(jìn)行模塊化可以得到如下好處: (1)軟件具有模塊化結(jié)構(gòu),
2、所有軟件開(kāi)發(fā)工作可以如同搭積木 那樣,把各個(gè)功能模塊進(jìn)行組合。模塊相對(duì)獨(dú)立,任一模塊中 的錯(cuò)誤不易擴(kuò)散到其他模塊中去,從而提高了軟件開(kāi)發(fā)的效率 和軟件的可靠性。 (2)由于模塊的功能是單一完整、相對(duì)獨(dú)立的,所以每個(gè)模塊都可以單獨(dú)地設(shè)計(jì)它的算法,單獨(dú)進(jìn)行編寫(xiě)和調(diào)試。對(duì)于大型軟件的開(kāi)發(fā),采用模塊化結(jié)構(gòu),可以由多個(gè)程序設(shè)計(jì)人員參與進(jìn)行集體性開(kāi)發(fā),從而加快軟件開(kāi)發(fā)速度、縮短軟件開(kāi)發(fā)周期。 (3)采用模塊化程序設(shè)計(jì)技術(shù)開(kāi)發(fā)的計(jì)算機(jī)軟件投入運(yùn)行后,在進(jìn)行軟件維護(hù)時(shí),能夠進(jìn)行整個(gè)系統(tǒng)的調(diào)試,也可以進(jìn)行單一模塊的調(diào)試。對(duì)單一模塊的調(diào)試和修改不會(huì)影響到其它模塊的功能。當(dāng)軟件系統(tǒng)需要擴(kuò)充時(shí),只需增加相應(yīng)功能模塊,
3、而不會(huì)涉及到整個(gè)軟件系統(tǒng)。因此,采用模塊化程序設(shè)計(jì)技術(shù)開(kāi)發(fā)的計(jì)算機(jī)軟件具有良好的維護(hù)性。,4.1 模塊化基本概念,信息隱蔽和局部化概念 信息的隱蔽指的是在設(shè)計(jì)和確定模塊時(shí),應(yīng)該使得模塊內(nèi)包含的所有信息(數(shù)據(jù)和執(zhí)行代碼)對(duì)于那些不需要這些信息的其他模塊來(lái)說(shuō)是不可訪(fǎng)問(wèn)的。也就是說(shuō),應(yīng)該將模塊與模塊之間的關(guān)系盡可能限制在最小的范圍之內(nèi)。 信息的局部化指的是在劃分和確定模塊時(shí),將那些關(guān)系密切的軟件元素在物理位置上盡可能靠近。例如,在程序設(shè)計(jì)對(duì)數(shù)據(jù)元素的局部化以保證數(shù)據(jù)元素只能在程序的局部范圍內(nèi)使用。,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,#includestdio.h void main() int a
4、,b; int fac(int); for(a=1;a=5;a+) b=fac(a);printf(%d!=%dn,a,b); ,int fac(int c) int m,s; s=1; for(m=1;m=c;m+) s=s*m; return(s); ,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,一、函數(shù)的定義和聲明 C語(yǔ)言函數(shù)定義的現(xiàn)代風(fēng)格形式如下: 返回值類(lèi)型說(shuō)明符 函數(shù)名(形式參數(shù)表及其說(shuō)明) 函數(shù)的操作對(duì)象(數(shù)據(jù))定義和說(shuō)明部分 函數(shù)的執(zhí)行語(yǔ)句部分 ,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,類(lèi)型名 函數(shù)名(類(lèi)型名 形參1,類(lèi)型名 形參2,) 說(shuō)明語(yǔ)句; 執(zhí)行語(yǔ)句; ,函數(shù)體:中的內(nèi)容,包括說(shuō)明
5、語(yǔ)句和執(zhí)行語(yǔ)句。 空函數(shù):函數(shù)體為空的函數(shù),例,便于擴(kuò)充和細(xì)化程序。 注:(1)函數(shù)的定義是平行的,不允許在一個(gè)函數(shù)的內(nèi)部再定義一個(gè)函數(shù)。 (2)函數(shù)值的類(lèi)型為int或char時(shí),可省略;不需返回函數(shù)值時(shí),可用類(lèi)型名void。 (3)多個(gè)形參以逗號(hào)分隔。 (4)不同函數(shù)中的局部變量可以同名。,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,從上面例子可以看出函數(shù)的定義內(nèi)容為: 1 函數(shù)類(lèi)型(既函數(shù)值類(lèi)型) 2 函數(shù)名 3 形式參數(shù)的數(shù)目、類(lèi)型 4 函數(shù)體內(nèi)容,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,函數(shù)的返回值類(lèi)型說(shuō)明符規(guī)定了函數(shù)返回值的數(shù)據(jù)類(lèi)型。例如,上面例子中double數(shù)據(jù)類(lèi)型說(shuō)明了函數(shù)fac被執(zhí)行后可
6、以得到一個(gè)double數(shù)據(jù)類(lèi)型的數(shù)據(jù)。 C語(yǔ)言規(guī)定,如函數(shù)的返回值是整型(int)或者是字符型(char )時(shí),函數(shù)的返回值類(lèi)型說(shuō)明符可以缺??;如果所定義的函數(shù)沒(méi)有(或不需要有)返回值,則函數(shù)的返回值類(lèi)型為void(空類(lèi)型)。,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,函數(shù)名 函數(shù)名是為所定義的函數(shù)取的名字,函數(shù)名是C語(yǔ)言中 合法的標(biāo)識(shí)符。函數(shù)名后的圓括號(hào)是函數(shù)的標(biāo)志,即 使函數(shù)沒(méi)有形式參數(shù)也不能省略。除主函數(shù)main() 外,其余的函數(shù)名均可以由用戶(hù)自己取名,但在同一 程序的各個(gè)源文件中的函數(shù)不能重名。,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,形式參數(shù) 函數(shù)定義時(shí)填入的參數(shù)我們稱(chēng)之為形式參數(shù),簡(jiǎn)稱(chēng)形參
7、,它們同函數(shù)內(nèi)部的局部變量作用相同。形式參數(shù)寫(xiě)在函數(shù)名后面的一對(duì)圓括號(hào)內(nèi),它主要有兩個(gè)作用: (1) 表示將從主調(diào)函數(shù)中接收的信息。函數(shù)的形式參數(shù)及其說(shuō)明表是為函數(shù)接收外來(lái)數(shù)據(jù)提供變量名稱(chēng)以便在函數(shù)中使用,它規(guī)定了傳遞數(shù)據(jù)的類(lèi)型和數(shù)目。如:int f(int a,float b)表示將從主調(diào)函數(shù)中接收一個(gè)int型和一個(gè)float型數(shù)據(jù)。形式參數(shù)之間應(yīng)以調(diào)號(hào)相隔。無(wú)形式參數(shù)時(shí),圓括號(hào)可以為空,也可以使用void聲明它為空。如 int f( )與 int f(void)兩者完全等價(jià),但是圓括號(hào)不能省掉。 (2)在函數(shù)體中形式參數(shù)是可以被引用的,可以輸入、輸出、被賦以新值或參與運(yùn)算。,4.2 程序設(shè)
8、計(jì)中實(shí)現(xiàn)模塊化的方法,函數(shù)體 函數(shù)體是由變量定義部分和C語(yǔ)句組成。在函數(shù)體中定義的變量 只有在執(zhí)行該函數(shù)時(shí)才存在。函數(shù)體中也可以不定義變量,而 只有語(yǔ)句。也可以二者皆無(wú)。如: void nothing() 這是一個(gè)空函數(shù),調(diào)用它不產(chǎn)生任何有效操作,但卻是一個(gè)符 合C語(yǔ)言語(yǔ)法的合法函數(shù)。,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,函數(shù)執(zhí)行的最后一個(gè)操作是返回。函數(shù)返回的基本格式有如下兩種: 第一種即有返回值格式: return ; 第二種即無(wú)返回值格式:(函數(shù)必須定義為void類(lèi)型,也可省略返回語(yǔ)句return) return;,對(duì)于第一種有返回值的語(yǔ)句其執(zhí)行過(guò)程如下: 先計(jì)算出表達(dá)式的值; 若表達(dá)式
9、的類(lèi)型和函數(shù)類(lèi)型不同時(shí),將表達(dá)式的類(lèi)型自動(dòng)轉(zhuǎn)換為函數(shù)類(lèi)型,這種轉(zhuǎn)換是強(qiáng)制性的,可能出現(xiàn)不保值的現(xiàn)象; 將計(jì)算出表達(dá)式的值傳給主調(diào)函數(shù),然后將程序控制權(quán)交給主調(diào)函數(shù)。此時(shí)主調(diào)函數(shù)接管控制權(quán),繼續(xù)執(zhí)行主調(diào)函數(shù)后的語(yǔ)句。,對(duì)于第二種無(wú)返回值的語(yǔ)句其執(zhí)行過(guò)程如下: 當(dāng)被調(diào)函數(shù)執(zhí)行到return;語(yǔ)句時(shí),若無(wú)return語(yǔ)句,在執(zhí)行完函數(shù)的最后一個(gè)語(yǔ)句之后,從概念上講,是遇到了函數(shù)的結(jié)束符“ ”(當(dāng)然這個(gè)花括號(hào)實(shí)際上并不會(huì)出現(xiàn)在目標(biāo)碼中,但我們可以這樣理解),將程序控制權(quán)交回給主調(diào)函數(shù),此時(shí)主調(diào)函數(shù)接管控制權(quán),繼續(xù)執(zhí)行主調(diào)函數(shù)中調(diào)用該被調(diào)函數(shù)的后繼語(yǔ)句。,有時(shí)在函數(shù)中設(shè)立了多個(gè)終止點(diǎn)以簡(jiǎn)化函數(shù)、提高效率
10、。切記,一個(gè)函數(shù)可以有多個(gè)返回語(yǔ)句,但函數(shù)執(zhí)行到任何一個(gè)return語(yǔ)句都會(huì)將程序控制權(quán)交給主調(diào)函數(shù)。此時(shí)主調(diào)函數(shù)接管控制權(quán),繼續(xù)執(zhí)行主調(diào)函數(shù)后的語(yǔ)句。如下所示,函數(shù)在s1、s2相等時(shí)返回1,不相等時(shí)返回- 1。 int find_char (char s 1 ,char s 2 ) if ( s1 = s2 ) return 1; else return -1; ,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,函數(shù)的申明 在主調(diào)函數(shù)中,要對(duì)本函數(shù)將要調(diào)用的函數(shù)的特征事 先進(jìn)行必要的聲明。所謂“聲明”是指向編譯系統(tǒng)提供 必要的信息:函數(shù)名,函數(shù)的返回值的類(lèi)型,函數(shù)參 數(shù)的個(gè)數(shù)、類(lèi)型及排列次序,以便編譯系
11、統(tǒng)對(duì)函數(shù)的 調(diào)用進(jìn)行檢查。例如,檢查形參與實(shí)參類(lèi)型是否一 致,使用函數(shù)返回值的類(lèi)型是否正確。,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,(1)如何申明 系統(tǒng)函數(shù)的申明 使用標(biāo)準(zhǔn)的庫(kù)函數(shù)時(shí),由于系統(tǒng)定義的標(biāo)準(zhǔn)庫(kù)函數(shù)的說(shuō)明都 集中在一些稱(chēng)為“頭文件”的文本文件中,在程序中如果要調(diào)用 系統(tǒng)的標(biāo)準(zhǔn)庫(kù)函數(shù)時(shí),也要在程序的適當(dāng)位置寫(xiě)上:#include 或#include “相應(yīng)頭文件”將調(diào)用有關(guān)庫(kù)函數(shù) 時(shí)的必要信息包含的本源文件中來(lái)。例如: #include 或 #inlcude “stdio.h” 用戶(hù)自定義函數(shù)的申明,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,自定義的函數(shù)其聲明的一般格式為: 類(lèi)型標(biāo)識(shí)符 函數(shù)名
12、(類(lèi)型標(biāo)識(shí)符 形參,類(lèi)型標(biāo)識(shí)符 形參,); 這些信息就是函數(shù)定義中的第一行(稱(chēng)函數(shù)頭)的內(nèi)容,也稱(chēng)函數(shù)模型(或函數(shù)原型)。設(shè)有一函數(shù)的定義為: double funa(double a, int b, float c) 函數(shù)體 ,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,正確完整的函數(shù)聲明應(yīng)為: double funa(double a, int b, float c);(注意末尾的分號(hào)) 這里的形參的名字并不重要,重要的是形參類(lèi)型,故函數(shù)聲明又可以不寫(xiě)形參名,即 double funa(double, int, float); 但不能只寫(xiě)形參名,不寫(xiě)形參的類(lèi)型。如: double funa(a,
13、b, c);(錯(cuò)) 一般也不能不寫(xiě)函數(shù)的類(lèi)型,如: funa(double a, int b, float c);(錯(cuò)) 只有函數(shù)返回值為I n t或char時(shí),函數(shù)標(biāo)識(shí)符才可以省掉。 形參的次序也不能寫(xiě)錯(cuò),如: double funa( int b, float c, double a); (錯(cuò)),4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,例4-1 對(duì)被調(diào)函數(shù)的聲明示例。 #include void main() long fac(int x);/*對(duì)函數(shù)fa c的聲明*/ int n; printf(Input the number n:); scanf(%d, ,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的
14、方法,(2)何時(shí)不對(duì)被調(diào)函數(shù)進(jìn)行聲明: 被調(diào)函數(shù)的返回值數(shù)據(jù)類(lèi)型是整型或字符型時(shí),此時(shí)系統(tǒng)自動(dòng)按整型進(jìn)行隱式聲明; 被調(diào)函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前時(shí),其原因是編譯系統(tǒng)此時(shí)已經(jīng)知道了被調(diào)函數(shù)的所有特征;,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,例4-2 對(duì)被調(diào)函數(shù)不必聲明的示例。 #include long fac(int x)/*函數(shù)fac的定義出現(xiàn)在主調(diào)函數(shù)之前*/ long y; for(y=1;x0;-x) y*=x; return y; void main() int n; printf(Input the number n:); scanf(%d, ,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法
15、,(3)申明的位置 在所有的函數(shù)之前; 在所有函數(shù)的外部; 在調(diào)用函數(shù)的內(nèi)部的說(shuō)明部分;,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,函數(shù)調(diào)用時(shí)的參數(shù)傳遞方式 傳值調(diào)用 傳引用(傳地址值)調(diào)用 傳值調(diào)用方式 傳值方式是一種數(shù)據(jù)復(fù)制的方式,在這種方式下,實(shí)際參數(shù)通過(guò)復(fù)制的方式傳遞給形式參數(shù),因此被傳遞的數(shù)據(jù)在被調(diào)函數(shù)中無(wú)論怎樣變化,都不會(huì)影響該數(shù)據(jù)在主調(diào)函數(shù)中的值。,函數(shù)調(diào)用時(shí)的步驟: 1、建立形式參數(shù)和局部變量 2、實(shí)際參數(shù)拷貝到對(duì)應(yīng)形式參數(shù) 3、控制轉(zhuǎn)到被調(diào)函數(shù)執(zhí)行 4、退出被調(diào)函數(shù)時(shí)撤消其形式參數(shù)和局部變量,二、函數(shù)的調(diào)用和數(shù)據(jù)傳遞,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,例4-3 函數(shù)調(diào)用時(shí)值參數(shù)傳
16、遞示例。 #include int change(int x,int y); void main() int m=10,n=20; printf(m=%d, n=%dn,m,n); printf(%dn,change(m,n); printf(m=%d, n=%dn,m,n); int change(int x,int y) x+,y+; printf(“x=%d,y=%dn”,x,y); return x+y; 程序運(yùn)行的結(jié)果為: m=10, n=20 32 m=10, n=20/*請(qǐng)仔細(xì)分析并回答為什么輸出這個(gè)結(jié)果*/,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,調(diào)用時(shí),圖4.2,4.2 程序設(shè)計(jì)
17、中實(shí)現(xiàn)模塊化的方法,Question? 在語(yǔ)言中,可以用幾種方式調(diào)用函數(shù):,(1)函數(shù)表達(dá)式。函數(shù)作為表達(dá)式的一項(xiàng),出現(xiàn)在表達(dá)式中,以函數(shù)返回值參與表達(dá)式的運(yùn)算。這種方式要求函數(shù)是有返回值的。 (2)函數(shù)語(yǔ)句。C語(yǔ)言中的函數(shù)可以只進(jìn)行某些操作而不返回函數(shù)值,這時(shí)的函數(shù)調(diào)用可作為一條獨(dú)立的語(yǔ)句。 (3)函數(shù)實(shí)參。函數(shù)作為另一個(gè)函數(shù)調(diào)用的實(shí)際參數(shù)出現(xiàn)。這種情況是把該函數(shù)的返回值作為實(shí)參進(jìn)行傳送,因此要求該函數(shù)必須是有返回值的。,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,函數(shù)的調(diào)用應(yīng)注意的幾點(diǎn): (1)調(diào)用函數(shù)時(shí),函數(shù)名稱(chēng)必須與具有該功能的自定義函數(shù)名稱(chēng)完全一致。 (2)實(shí)參在類(lèi)型上按順序與形參,必須一一
18、對(duì)應(yīng)和匹配。如果類(lèi)型不匹配,C編譯程序?qū)促x值兼容的規(guī)則進(jìn)行轉(zhuǎn)換。如果實(shí)參和形參的類(lèi)型不賦值兼容,通常并不給出出錯(cuò)信息,且程序仍然繼續(xù)執(zhí)行,只是得不到正確的結(jié)果。 (3)如果實(shí)參表中包括多個(gè)參數(shù),對(duì)實(shí)參的求值順序隨系統(tǒng)而異。有的系統(tǒng)按自左向右順序求實(shí)參的值,有的系統(tǒng)則相反。Turbo C和MS C是按自右向左的順序進(jìn)行的 。,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,例4-4 編程求出所有的兩位的“絕對(duì)素?cái)?shù)”,所謂“絕對(duì)素?cái)?shù)”是指一個(gè)素?cái)?shù),當(dāng)它的數(shù)字位置對(duì)換后仍然是素?cái)?shù)。,解題思想:對(duì)于任意兩位數(shù)n,首先調(diào)用函數(shù)prime判 斷n是否是素?cái)?shù),如果n是素?cái)?shù),則調(diào)用函數(shù)reverse求 數(shù)字位置對(duì)換后的
19、數(shù),函數(shù)prime判斷其是否是素 數(shù),如果reverse(n)也是素?cái)?shù),n是“絕對(duì)素?cái)?shù)”,輸 出n。 函數(shù)prime()是一個(gè)判斷素?cái)?shù)的通用函數(shù),返回值 為0時(shí)表示非素?cái)?shù),返回值為1時(shí)表示為素?cái)?shù)。其算法 描述如下:,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,算法:prime(a) /*表示prime從主調(diào)函數(shù)接收a */ 算法開(kāi)始 定義標(biāo)志量b,循環(huán)變量k; If(a=2) then 返回值 1; else if(a能被2整除) then 返回值 0; Else b=1, k=3 while(k=a的平方根 并且b=1) if(a能被k整除)then,b=0 k=k+2 返回b; 算法結(jié)束,4.2
20、程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,reverse(int a)函數(shù)是求a各位數(shù)字前后位置對(duì)換后的整數(shù)的通用函數(shù),如12345各位數(shù)字前后位置對(duì)換后轉(zhuǎn)換為54321,其本思路:采用a%10求出a的個(gè)位,然后a=a/10,重復(fù)前面的操作,直到a=0。同時(shí)注意:如12345轉(zhuǎn)換為54321,而54321=(5*10+4)*10+3)*10+2)*10+1。 算法描述如下:,算法:reverse(a)算法開(kāi)始 定義 s=0; while(a0) s= s+a%10,a= a/10 if(a0) then s= s*10 返回s; 算法結(jié)束,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,#include #includ
21、e void main( ) int reverse(int a); int prime(int a); int n; for(n=11;n=99;n+) if(prime(n) ,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,int prime(int a) int b,k; if(a%2=0) return(0); else b=1; k=3; while(k=sqrt(1.0*a) ,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,int reverse(int a) int s=0; while(a!=0) s=s+a%10; a=a/10; if(a) s=s*10; return s; ,4.2 程序設(shè)
22、計(jì)中實(shí)現(xiàn)模塊化的方法,C語(yǔ)言規(guī)定,在C程序中所有的函數(shù)都是平行的,即在C程序中函數(shù)不能嵌套定義。但C語(yǔ)言允許函數(shù)嵌套調(diào)用,即一個(gè)函數(shù)在被調(diào)用的過(guò)程中又調(diào)用了另外的一個(gè)函數(shù)。一個(gè)兩層嵌套函數(shù)調(diào)用的過(guò)程如圖所示:,圖中主函數(shù)在執(zhí)行的過(guò)程中調(diào)用了函數(shù)f1,在函數(shù)f1執(zhí)行的過(guò)程中又調(diào)用了函數(shù)f2;當(dāng)執(zhí)行完函數(shù)f2后,程序控制流程轉(zhuǎn)回函數(shù)f1對(duì)f2調(diào)用語(yǔ)句的后面第一條可執(zhí)行C語(yǔ)句繼續(xù)執(zhí)行;當(dāng)函數(shù)f1執(zhí)行完后,程序控制流程轉(zhuǎn)回主函數(shù)繼續(xù)執(zhí)行。,三、函數(shù)的嵌套調(diào)用,例4-5 問(wèn)題分析:,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,例4.6 計(jì)算s=1k+2k+3k+N k 程序設(shè)計(jì)思路:可以把問(wèn)題分解為兩個(gè)模塊:求
23、冪次 方模塊和求和模塊,在求和模塊中要包含求冪模塊 f1()函數(shù)的參數(shù)為n和k,其返回值是n的k次方 f2()函數(shù)的參數(shù)為n和k,返回值是冪次方的累加和。,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,#include long f1(int n,int k); long power=n; int i; for(i=1;ik;i+) power *= n; return power; long f2(int n,int k) long sum=0; int i; for(i=1;i=n;i+) sum += f1(i, k); return sum; ,void main() int n,k; scan
24、f(“%d,%d”, ,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,遞歸方法的實(shí)現(xiàn) 用“輾轉(zhuǎn)除法”求最大公約數(shù)時(shí)使用了遞推方法,其算 法和C函數(shù)可以描述為: m除以n得到余數(shù)r(0rn)。 若r=0則算法結(jié)束,n為最大公約數(shù)。否則做。 mn,nr,轉(zhuǎn)回到。,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,函數(shù)的遞歸調(diào)用 一個(gè)函數(shù)直接地或間接地自己調(diào)用自己,稱(chēng)為函數(shù)的 遞歸調(diào)用。遞歸調(diào)用可以看成是一種特殊的嵌套調(diào) 用,它與一般的嵌套調(diào)用相比較有以下特點(diǎn): (1)每次嵌套調(diào)用的函數(shù)都是該函數(shù)本身; (2)嵌套調(diào)用不會(huì)無(wú)限制進(jìn)行下去,即調(diào)用總會(huì)在某 種條件下結(jié)束; (3)每次調(diào)用時(shí),本次的函數(shù)體并沒(méi)有執(zhí)行完畢。故 必須
25、依靠系統(tǒng)提供一個(gè)特殊部件(堆棧)存放未完成 的操作,以保證當(dāng)遞歸調(diào)用結(jié)束回溯時(shí)不會(huì)丟失任何 應(yīng)該執(zhí)行而沒(méi)有執(zhí)行操作;,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,一個(gè)問(wèn)題要用遞歸的方法解決,必須滿(mǎn)足3個(gè)條 件: (1)要解決的問(wèn)題可以轉(zhuǎn)換為一個(gè)新的問(wèn)題,而這 個(gè)新的問(wèn)題的解法與原來(lái)問(wèn)題的解法相同,只是處 理的對(duì)象有規(guī)律的變化,一般是遞減。 (2)可以應(yīng)用這個(gè)轉(zhuǎn)換過(guò)程使問(wèn)題得到解決 (3)要有一個(gè)明確的遞歸結(jié)束條件。,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,例 使用遞歸調(diào)的方法反向輸出字符串。 #include void main() void reverse(); reverse(); void reve
26、rse() char ch; ch=getchar(); if(ch=#) putchar(c h); else reverse();/*遞歸調(diào)用*/ putchar(c h); ,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,ch=#,ch=c,ch=b,ch=a,main(),輸出a,輸出b,輸出c,輸出#,(顛倒字符串),4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,例 求兩個(gè)正整數(shù)的最大公約數(shù)。 分別用迭代和遞歸的方法實(shí)現(xiàn) 遞歸的條件:,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,/*迭代方式,使用循環(huán)結(jié)構(gòu)實(shí)現(xiàn)*/ #include void main() int GCD(in
27、t m,int n); int num1,num2; printf(Input num1 ,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,/*遞歸方式,使用分支結(jié)構(gòu)實(shí)現(xiàn)。主函數(shù)與上面程序相同*/ #include void main() int GCD(int m,int n); int num1,num2; printf(Input num1 ,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,例12 求一個(gè)正整數(shù)的各位數(shù)字之和 分別用迭代和遞歸的方法實(shí)現(xiàn) 遞歸的條件:,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,/*迭代方式,使用循環(huán)結(jié)構(gòu)實(shí)現(xiàn)*/ #include void main() int num_sum(int
28、n); int num; printf(Input the num:); scanf(%d, ,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,/*遞歸方式,使用分支結(jié)構(gòu)實(shí)現(xiàn)。主函數(shù)與上面程序相同*/ int num_sum(int n) if(n10) return n; else return n%10+num_sum(n/10); ,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,例15 求斐波納契數(shù)列中第n個(gè)數(shù)。,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,/*迭代方式,使用循環(huán)結(jié)構(gòu)實(shí)現(xiàn)*/ #include void main() long fib(int n); int n; printf(Input the n
29、:); scanf(%d, ,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,long fib(int n) if(n=0|n=1) return n; else return fib(n-1)+fib(n-2); ,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,例16漢諾塔(Tower of Hanoi)問(wèn)題。,4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,分析(1)考慮A座上有n個(gè)盤(pán)子的一般情況。將n個(gè)盤(pán)子從A座移到C座算作一個(gè)大問(wèn)題,可以分解為3個(gè)小問(wèn)題: 第一步:將A座上面的n-1個(gè)盤(pán)子借助C座移到B座上。這是整體粗略的考慮,不管實(shí)現(xiàn)的細(xì)節(jié)。只有這樣,C座上空了,A座的第n個(gè)盤(pán)子才能直接移到C上。 第二步:將A座上的
30、第n個(gè)盤(pán)子移到C上。 第三步:再將B座上的n-1個(gè)盤(pán)子借助A座移到C座上。 (2)對(duì)大問(wèn)題和第1步、第3步的小問(wèn)題作對(duì)比,它們都是把若干個(gè)盤(pán)子從一個(gè)座借助一個(gè)座移到另一個(gè)座上,只是源座、借助座、目標(biāo)座不同。符合遞歸的條件1:要解決的問(wèn)題可以轉(zhuǎn)換為一個(gè)新的問(wèn)題,而這個(gè)新的問(wèn)題的解法和原來(lái)問(wèn)題相同。 (3)遞歸函數(shù)可以描述為: hanoi(盤(pán)子個(gè)數(shù),源座,借助座,目標(biāo)座) 大問(wèn)題描述為:hanoi(n,left,middle,right),4.2 程序設(shè)計(jì)中實(shí)現(xiàn)模塊化的方法,第一個(gè)問(wèn)題:hanoi(n-1,left,right,middle) 第一個(gè)問(wèn)題:hanoi(n-1,middle,left
31、,right) (4)第2步可以編寫(xiě)一個(gè)移動(dòng)函數(shù): move(源座,目標(biāo)座),4.3 程序設(shè)計(jì)中標(biāo)識(shí)符的作用域和生存期,C程序的一般結(jié)構(gòu)如圖,4.3 程序設(shè)計(jì)中標(biāo)識(shí)符的作用域和生存期,在一個(gè)完整的C程序中,函數(shù)將程序劃分為若干個(gè)相 對(duì)獨(dú)立的區(qū)域。對(duì)于在不同的區(qū)域范疇之內(nèi)聲明或定 義的標(biāo)識(shí)符(特別是變量)必須要考慮以下幾個(gè)方面 的問(wèn)題: 標(biāo)識(shí)符(特別是變量)的作用范圍如何確定; 標(biāo)識(shí)符(特別是變量)的存在期間如何確定; 怎樣使用或限制在同一程序的其它源程序文件中定義的標(biāo)識(shí)符(變量);,4.3 程序設(shè)計(jì)中標(biāo)識(shí)符的作用域和生存期,對(duì)于一個(gè)標(biāo)識(shí)符的性質(zhì)可以從兩方面進(jìn)行分析,一是其能夠起作用的空間范圍,
32、即標(biāo)識(shí)符的作用域;二是其值存在的時(shí)間范圍,即標(biāo)識(shí)符的生存期。,4.3 程序設(shè)計(jì)中標(biāo)識(shí)符的作用域和生存期,在C語(yǔ)言中,變量定義的完整形式如下: 存儲(chǔ)類(lèi)別符 變量表; 數(shù)據(jù)類(lèi)型符說(shuō)明標(biāo)識(shí)符(變量)的取值范圍和可以對(duì) 該變量進(jìn)行的操作;存儲(chǔ)類(lèi)別符用于指定數(shù)據(jù)對(duì)象在 系統(tǒng)內(nèi)存中存放的方法。變量的存儲(chǔ)類(lèi)別有四種,它 們是:自動(dòng)型(auto)、寄存器型(register)、靜態(tài) 型(static)和外部參照型(extern)。,標(biāo)識(shí)符的作用域,4.3 程序設(shè)計(jì)中標(biāo)識(shí)符的作用域和生存期,標(biāo)識(shí)符的作用域 從變量的作用域概念上可以將變量分為“全局變量”和“局部變量”兩類(lèi)。 C語(yǔ)言使用存儲(chǔ)類(lèi)別關(guān)鍵字extern和
33、auto來(lái)表示變量的作用域?qū)傩浴?全局變量是指定義在所有函數(shù)外面的變量,其定義的形式如下: extern 變量表;,4.3 程序設(shè)計(jì)中標(biāo)識(shí)符的作用域和生存期,例 全局變量的作用域示例。 #include int i; void main() void incre(); i+; incre(); printf(i=%dn,i);/*程序運(yùn)行結(jié)果為:i=2,為什么?*/ void incre() i+; ,4.3 程序設(shè)計(jì)中標(biāo)識(shí)符的作用域和生存期,局部變量是定義在函數(shù)內(nèi)部的變量,局部變量的作用域被限定在它們所定義的范圍之內(nèi),在C函數(shù)中定義自動(dòng)變量的地方有三個(gè): 函數(shù)形式參數(shù)表部分; 函數(shù)體內(nèi)部;
34、復(fù)合語(yǔ)句內(nèi)部;局部變量的存儲(chǔ)類(lèi)別符是auto,所以在C語(yǔ)言中局部變量又稱(chēng)為自動(dòng)變量。,4.3 程序設(shè)計(jì)中標(biāo)識(shí)符的作用域和生存期,例 局部變量的作用域示例。 #include void main() void incre(); int i=10; i+; incre(); incre(); printf(i=%dn,i); /*程序運(yùn)行結(jié)果為:i=11,為什么?*/ void incre() int i=20; i+; printf(i=%dn,i); /*函數(shù)兩次別調(diào)用時(shí)的運(yùn)行結(jié)果為:i=21,為什么?*/ ,4.3 程序設(shè)計(jì)中標(biāo)識(shí)符的作用域和生存期,4.3 程序設(shè)計(jì)中標(biāo)識(shí)符的作用域和生存期,C語(yǔ)言中規(guī)定按“定義就近原則”來(lái)確定使用的變量,具體說(shuō)就是如下兩條原則: 在函數(shù)中如果定義有與全局變量同名的局部變量,則當(dāng)程序的控制流程進(jìn)入到函數(shù)的作用范圍時(shí),使用在函數(shù)中定義的局部同名變量; 在程序的一個(gè)更小局部范圍(復(fù)合語(yǔ)句)中如果定義有與較大范圍(函數(shù)局部或全局)變量同名的變量,則當(dāng)程序的
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 豫北方言處所介詞研究
- 發(fā)熱查因病例討論
- 科學(xué)做好入學(xué)準(zhǔn)備活動(dòng)銜接教育
- 小班健康勇敢告訴老師
- 頜下腺護(hù)理課件
- 牙體牙髓科護(hù)理
- 股骨骨折患者護(hù)理查房
- 領(lǐng)克品牌介紹
- 2025年四川省德陽(yáng)市中考招生考試數(shù)學(xué)真題試卷(真題+答案)
- 預(yù)防毒品班會(huì)課件
- 生活垃圾焚燒發(fā)電廠(chǎng)自動(dòng)監(jiān)測(cè)設(shè)備運(yùn)行維護(hù)技術(shù)規(guī)范
- 血管加壓藥物在急診休克中的應(yīng)用專(zhuān)家共識(shí)2021解讀課件
- 《個(gè)人信息保護(hù)法》知識(shí)考試題庫(kù)150題(含答案)
- 高一化學(xué)達(dá)標(biāo)訓(xùn)練:第一單元化石燃料與有機(jī)化合物
- 反食品浪費(fèi)法培訓(xùn)
- 2025版國(guó)家開(kāi)放大學(xué)法學(xué)本科《知識(shí)產(chǎn)權(quán)法》期末紙質(zhì)考試總題庫(kù)
- 2025年行政執(zhí)法人員執(zhí)法證考試必考多選題庫(kù)及答案(共300題)
- 嗜鉻細(xì)胞瘤危象的救治策略
- 《工程勘察設(shè)計(jì)收費(fèi)標(biāo)準(zhǔn)》(2002年修訂本)
- 2024年度瀝青水穩(wěn)混合料銷(xiāo)售代理合同
- 《汽車(chē)尾氣治理技術(shù)》課件
評(píng)論
0/150
提交評(píng)論