函數(shù)與程序結(jié)構(gòu).ppt
-
資源ID:5329967
資源大?。?span id="ru1pi6y" class="font-tahoma">665.50KB
全文頁(yè)數(shù):65頁(yè)
- 資源格式: PPT
下載積分:14.9積分
快捷下載
會(huì)員登錄下載
微信登錄下載
微信掃一掃登錄
友情提示
2、PDF文件下載后,可能會(huì)被瀏覽器默認(rèn)打開(kāi),此種情況可以點(diǎn)擊瀏覽器菜單,保存網(wǎng)頁(yè)到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請(qǐng)使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無(wú)水印,預(yù)覽文檔經(jīng)過(guò)壓縮,下載后原文更清晰。
5、試題試卷類(lèi)文檔,如果標(biāo)題沒(méi)有明確說(shuō)明有答案則都視為沒(méi)有答案,請(qǐng)知曉。
|
函數(shù)與程序結(jié)構(gòu).ppt
Chap10函數(shù)與程序結(jié)構(gòu) 10 1圓形體積計(jì)算器10 2漢諾塔問(wèn)題10 3長(zhǎng)度單位轉(zhuǎn)換10 4大程序構(gòu)成 本章要點(diǎn) 怎樣把多個(gè)函數(shù)組織起來(lái) 怎樣用結(jié)構(gòu)化程序設(shè)計(jì)的思想解決問(wèn)題 怎樣用函數(shù)嵌套求解復(fù)雜的問(wèn)題 怎樣用函數(shù)遞歸解決問(wèn)題 如何使用宏 如何使用多文件模塊構(gòu)建較大規(guī)模程序 使用結(jié)構(gòu)化程序設(shè)計(jì)方法解決復(fù)雜的問(wèn)題把大問(wèn)題分解成若干小問(wèn)題 小問(wèn)題再進(jìn)一步分解成若干更小的問(wèn)題寫(xiě)程序時(shí) 用main 解決整個(gè)問(wèn)題 它調(diào)用解決小問(wèn)題的函數(shù)這些函數(shù)又進(jìn)一步調(diào)用解決更小問(wèn)題的函數(shù) 從而形成函數(shù)的嵌套調(diào)用 10 1圓形體積計(jì)算器 程序結(jié)構(gòu) 例10 1設(shè)計(jì)一個(gè)常用圓形體體積計(jì)算器 采用命令方式輸入1 2 3 分別選擇計(jì)算球體 圓柱體 圓錐體的體積 并輸入計(jì)算所需相應(yīng)參數(shù) 分析 輸入1 2 3選擇計(jì)算3種體積 其他輸入結(jié)束計(jì)算設(shè)計(jì)一個(gè)控制函數(shù)cal 經(jīng)它辨別圓形體的類(lèi)型再調(diào)用計(jì)算球體 圓柱體 圓錐體體積的函數(shù)設(shè)計(jì)單獨(dú)的函數(shù)計(jì)算不同圓形體的體積 10 1 1程序解析 計(jì)算常用圓形體體積 3層結(jié)構(gòu) 5個(gè)函數(shù)降低程序的構(gòu)思 編寫(xiě) 調(diào)試的復(fù)雜度可讀性好 程序結(jié)構(gòu) 例10 1源程序 definePI3 141592654voidcal intsel intmain void intsel while 1 printf 1 計(jì)算球體體積 n printf 2 計(jì)算圓柱體積 n printf 3 計(jì)算圓錐體積 n printf 其他 退出程序運(yùn)行 n printf 請(qǐng)輸入計(jì)算命令 scanf d 常用圓形體體積計(jì)算器的主控函數(shù) voidcal intsel doublevol ball void doublevol cylind void doublevol cone void switch sel case1 printf 球體積為 2f n vol ball break case2 printf 圓柱體積為 2f n vol cylind break case3 printf 圓錐體積為 2f n vol cone break 計(jì)算球體體積V 4 3 PI r r r doublevol ball doubler printf 請(qǐng)輸入球的半徑 scanf lf 計(jì)算圓柱體積V PI r r h doublevol cylind doubler h printf 請(qǐng)輸入圓柱的底圓半徑和高 scanf lf lf 計(jì)算圓錐體積V h 3 PI r r doublevol cone doubler h printf 請(qǐng)輸入圓錐的底圓半徑和高 scanf lf lf 10 1 2函數(shù)的嵌套調(diào)用 順序調(diào)用intmain void y fact 3 z mypow 3 5 2 doublefact intn doublemypow doublex inn 嵌套調(diào)用intmain void cal sel voidcal intsel vol ball doublevol ball 10 1 2函數(shù)的嵌套調(diào)用 例10 1分析 intmain void cal sel voidcal intsel vol ball vol cylind vol cone doublevol ball doublevol cylind doublevol cone 在一個(gè)函數(shù)中再調(diào)用其它函數(shù)的情況稱(chēng)為函數(shù)的嵌套調(diào)用 如果函數(shù)A調(diào)用函數(shù)B 函數(shù)B再調(diào)用函數(shù)C 一個(gè)調(diào)用一個(gè)地嵌套下去 構(gòu)成了函數(shù)的嵌套調(diào)用 具有嵌套調(diào)用函數(shù)的程序 需要分別定義多個(gè)不同的函數(shù)體 每個(gè)函數(shù)體完成不同的功能 它們合起來(lái)解決復(fù)雜的問(wèn)題 10 1 2函數(shù)的嵌套調(diào)用 結(jié)構(gòu)化程序設(shè)計(jì)方法 自頂向下 逐步求精 函數(shù)實(shí)現(xiàn)自頂向下 程序設(shè)計(jì)時(shí) 應(yīng)先考慮總體步驟 后考慮步驟的細(xì)節(jié) 先考慮全局目標(biāo) 后考慮局部目標(biāo) 先從最上層總目標(biāo)開(kāi)始設(shè)計(jì) 逐步使問(wèn)題具體化 不要一開(kāi)始就追求眾多的細(xì)節(jié) 逐步求精 對(duì)于復(fù)雜的問(wèn)題 其中大的操作步驟應(yīng)該再將其分解為一些子步驟的序列 逐步明晰實(shí)現(xiàn)過(guò)程 函數(shù)實(shí)現(xiàn) 通過(guò)逐步求精 把程序要解決的全局目標(biāo)分解為局部目標(biāo) 再進(jìn)一步分解為具體的小目標(biāo) 把最終的小目標(biāo)用函數(shù)來(lái)實(shí)現(xiàn) 問(wèn)題的逐步分解關(guān)系 構(gòu)成了函數(shù)間的調(diào)用關(guān)系 限制函數(shù)的長(zhǎng)度 一個(gè)函數(shù)語(yǔ)句數(shù)不宜過(guò)多 既便于閱讀 理解 也方便程序調(diào)試 若函數(shù)太長(zhǎng) 可以考慮把函數(shù)進(jìn)一步分解實(shí)現(xiàn) 避免函數(shù)功能間的重復(fù) 對(duì)于在多處使用的同一個(gè)計(jì)算或操作過(guò)程 應(yīng)當(dāng)將其封裝成一個(gè)獨(dú)立的函數(shù) 以達(dá)到一處定義 多處使用的目的 以避免功能模塊間的重復(fù) 減少全局變量的使用 應(yīng)采用定義局部變量作為函數(shù)的臨時(shí)工作單元 使用參數(shù)和返回值作為函數(shù)與外部進(jìn)行數(shù)據(jù)交換的方式 只有當(dāng)確實(shí)需要多個(gè)函數(shù)共享的數(shù)據(jù)時(shí) 才定義其為全局變量 函數(shù)設(shè)計(jì)時(shí)應(yīng)注意的問(wèn)題 10 2漢諾塔問(wèn)題 10 2 1程序解析10 2 2遞歸函數(shù)基本概念10 2 3遞歸程序設(shè)計(jì) 10 2 1漢諾 Hanoi 塔問(wèn)題解析 將64個(gè)盤(pán)從座A搬到座B 1 一次只能搬一個(gè)盤(pán)子 2 盤(pán)子只能插在A B C三個(gè)桿中 3 大盤(pán)不能壓在小盤(pán)上 ABC 分析 ABC 分析 ABC ABC n n 1 n 1 分析 ABC ABC n 10 2 1漢諾 Hanoi 塔問(wèn)題解析 遞歸方法的兩個(gè)要點(diǎn) 1 遞歸出口 一個(gè)盤(pán)子的解決方法 2 遞歸式子 如何把搬動(dòng)64個(gè)盤(pán)子的問(wèn)題簡(jiǎn)化成搬動(dòng)63個(gè)盤(pán)子的問(wèn)題 把漢諾塔的遞歸解法歸納成三個(gè)步驟 n 1個(gè)盤(pán)子從座A搬到座C第n號(hào)盤(pán)子從座A搬到座Bn 1個(gè)盤(pán)子從座C搬到座B 算法 hanio n個(gè)盤(pán) A B C為過(guò)渡 if n 1 直接把盤(pán)子A Belse hanio n 1個(gè)盤(pán) A C B為過(guò)渡 把第n號(hào)盤(pán)A Bhanio n 1個(gè)盤(pán) C B A為過(guò)渡 10 2 2遞歸函數(shù)基本概念 例10 2用遞歸函數(shù)實(shí)現(xiàn)求n 遞推法在學(xué)習(xí)循環(huán)時(shí) 計(jì)算n 采用的就是遞推法 n 1 2 3 n用循環(huán)語(yǔ)句實(shí)現(xiàn) result 1 for i 1 i n i result result i 遞歸法n n n 1 當(dāng)n 1遞歸式子 1當(dāng)n 1或n 0遞歸出口即求n 可以在 n 1 的基礎(chǔ)上再乘上n 如果把求n 寫(xiě)成函數(shù)fact n 則fact n 的實(shí)現(xiàn)依賴(lài)于fact n 1 10 2 2遞歸函數(shù)基本概念 例10 2用遞歸函數(shù)求n includedoublefact intn intmain void intn scanf d 10 2 2遞歸函數(shù)基本概念 遞歸式 遞歸出口 例10 2分析 求n 遞歸定義n n n 1 n 1 n 1 n 0 1 includedoublefact intn intmain void intn scanf d fact n n fact n 1 main fact 3 fact 2 fact 1 printf fact 3 f 3 fact 2 f 2 fact 1 f 1 return f return f return f 遞歸函數(shù)fact n 的實(shí)現(xiàn)過(guò)程 fact 3 3 fact 2 2 fact 1 fact 1 1 2 1 2 3 2 6 同時(shí)有4個(gè)函數(shù)在運(yùn)行 且都未完成 10 2 3遞歸程序設(shè)計(jì) 用遞歸實(shí)現(xiàn)的問(wèn)題 滿(mǎn)足兩個(gè)條件 問(wèn)題可以逐步簡(jiǎn)化成自身較簡(jiǎn)單的形式 遞歸式 n n n 1 nn 1 i n ii 1i 1遞歸最終能結(jié)束 遞歸出口 兩個(gè)條件缺一不可解決遞歸問(wèn)題的兩個(gè)著眼點(diǎn) 10 2 3遞歸程序設(shè)計(jì) 例10 3編寫(xiě)遞歸函數(shù)reverse intn 實(shí)現(xiàn)將整數(shù)n逆序輸出 分析 將整數(shù)n逆序輸出可以用循環(huán)實(shí)現(xiàn) 且循環(huán)次數(shù)與n的位數(shù)有關(guān) 遞歸實(shí)現(xiàn)整數(shù)逆序輸出也需要用位數(shù)作為控制點(diǎn) 歸納遞歸實(shí)現(xiàn)的兩個(gè)關(guān)鍵點(diǎn)如下 遞歸出口 直接輸出n 如果n 9 即n為1位數(shù)遞歸式子 輸出個(gè)位數(shù)n 10 再遞歸調(diào)用reverse n 10 輸出前n 1位 如果n為多位數(shù) 10 2 3遞歸程序設(shè)計(jì) 由于結(jié)果是在屏幕上輸出 因此函數(shù)返回類(lèi)型為voidvoidreverse intnum if num 9 printf d num 遞歸出口 else printf d num 10 reverse num 10 遞歸調(diào)用 例10 4漢諾 Hanoi 塔問(wèn)題 ABC hanio n個(gè)盤(pán) A B C為過(guò)渡 if n 1 直接把盤(pán)子A Belse hanio n 1個(gè)盤(pán) A C B為過(guò)渡 把n號(hào)盤(pán)A Bhanio n 1個(gè)盤(pán) C B A為過(guò)渡 源程序 搬動(dòng)n個(gè)盤(pán) 從a到b c為中間過(guò)渡 voidhanio intn chara charb charc if n 1 printf c c n a b else hanio n 1 a c b printf c c n a b hanio n 1 c b a intmain void intn printf inputthenumberofdisk scanf d inputthenumberofdisk 3thestepsfor3diskare a ba cb ca bc ac ba b ABC inputthenumberofdisk 3thestepsfor3diskare a ba cb ca bc ac ba b 課堂練習(xí) 利用遞歸函數(shù)計(jì)算x的n次冪 intmi intx intn if n 1 returnx elsereturnx mi x n 1 10 3長(zhǎng)度單位轉(zhuǎn)換 10 3 1程序解析10 3 2宏基本定義10 3 3帶參數(shù)的宏定義10 3 4文件包含10 3 5編譯預(yù)處理 10 3 1程序解析 例10 5歐美國(guó)家長(zhǎng)度使用英制單位 1英里 1609米 1英尺 30 48厘米 1英寸 2 54厘米 請(qǐng)編寫(xiě)程序轉(zhuǎn)換 include defineMile to meter1609 1英里 1609米 defineFoot to centimeter30 48 1英尺 30 48厘米 defineInch to centimeter2 54 1英寸 2 54厘米 intmain void floatfoot inch mile 定義英里 英尺 英寸變量 printf Inputmile footandinch scanf f f f Inputmile footandinch 1 235 11 200000miles 1930 800077meters3 000000feet 91 440000centimeters5 100000inches 12 954000centimeters 10 3 2宏基本定義 define宏名標(biāo)識(shí)符宏定義字符串編譯時(shí) 把程序中所有與宏名相同的字符串 用宏定義字符串替代 definePI3 14 definearr size4說(shuō)明 宏名一般用大寫(xiě)字母 以與變量名區(qū)別宏定義不是 語(yǔ)句 后面不得跟分號(hào)宏定義可以嵌套使用 definePI3 14 defineS2 PI PI 多用于符號(hào)常量 宏定義可以寫(xiě)在程序中任何位置 它的作用范圍從定義書(shū)寫(xiě)處到文件尾 可以通過(guò) undef 強(qiáng)制指定宏的結(jié)束范圍 10 3 2宏基本定義 defineA Thisisthefirstmacro voidf1 printf A n defineB Thisisthesecondmacro A的有效范圍voidf2 printf B B的有效范圍 undefBintmain void f1 f2 return0 宏的作用范圍 10 3 3帶參數(shù)的宏定義 例10 6簡(jiǎn)單的帶參數(shù)的宏定義 include defineMAX a b a b a b defineSQR x x xintmain void intx y scanf d d 10 3 3帶參數(shù)的宏定義 例 definef a a a aintmain void 水仙花數(shù) inti x y z for i 1 i 1000 i x i 10 y i 10 10 z i 100 if x x x y y y z z z i printf d n i return0 definef a a a a 各位數(shù)字的立方和等于它本身的數(shù) 例如153的各位數(shù)字的立方和是13 53 33 153 x y x y x y f x f y f z i f x y x y 3 definef a b t t a a b b t intmain intx y t scanf d d t x x y y t 編譯時(shí)被替換 帶參數(shù)的宏定義不是函數(shù) 宏與函數(shù)是兩種不同的概念宏可以實(shí)現(xiàn)簡(jiǎn)單的函數(shù)功能 示例用宏實(shí)現(xiàn)兩個(gè)變量值的交換 與函數(shù)的區(qū)別在哪里 宏定義應(yīng)用示例 定義宏LOWCASE 判斷字符c是否為小寫(xiě)字母 defineLOWCASE c c a c 0 c 9 c 0 1 defineF x x 2 defineD x x F x intmain printf d d D 3 D D 3 return0 練習(xí) 帶宏定義的程序輸出 閱讀帶宏定義的程序 先全部替換好 最后再統(tǒng)一計(jì)算不可一邊替換一邊計(jì)算 更不可以人為添加括號(hào)D 3 x F x 先用x替換展開(kāi) x x 2進(jìn)一步對(duì)F x 展開(kāi) 這里不能加括號(hào) 3 3 2 7最后把x 3代進(jìn)去計(jì)算D D 3 D x x 2 先對(duì)D 3 用x替換展開(kāi) x x 2 F x x 2 拿展開(kāi)后的參數(shù)對(duì)D進(jìn)一步進(jìn)行宏替換 x x 2 x x 2 2拿展開(kāi)后的參數(shù)對(duì)F進(jìn)一步進(jìn)行宏替換 3 3 2 3 3 2 2 13最后把x 3代進(jìn)去計(jì)算運(yùn)行結(jié)果 7 13 結(jié)果分析 10 3 4文件包含 系統(tǒng)文件以stdio h math h等形式供編程者調(diào)用實(shí)用系統(tǒng)往往有自己諸多的宏定義 也以 h的形式組織 調(diào)用問(wèn)題 如何把若干 h頭文件連接成一個(gè)完整的可執(zhí)行程序 文件包含include 格式 include include 需包含的文件名 作用把指定的文件模塊內(nèi)容插入到 include所在的位置 當(dāng)程序編譯連接時(shí) 系統(tǒng)會(huì)把所有 include指定的文件拼接生成可執(zhí)行代碼 注意編譯預(yù)處理命令 以 開(kāi)頭 在程序編譯時(shí)起作用 不是真正的C語(yǔ)句 行尾沒(méi)有分號(hào) 文件包含 系統(tǒng)文件夾 當(dāng)前文件夾 系統(tǒng)文件夾 例10 7將例10 5中長(zhǎng)度轉(zhuǎn)換的宏 定義成頭文件length h 并寫(xiě)出主函數(shù)文件 頭文件length h源程序 defineMile to meter1609 1英里 1609米 defineFoot to centimeter30 48 1英尺 30 48厘米 defineInch to centimeter2 54 1英寸 2 54厘米 主函數(shù)文件prog c源程序 include include length h 包含自定義頭文件 intmain void floatfoot inch mile 定義英里 英尺 英寸變量 printf Inputmile footandinch scanf f f f 將例10 1的5個(gè)函數(shù)分別存儲(chǔ)在2個(gè) C文件上 要求通過(guò)文件包含把它們聯(lián)結(jié)起來(lái) ctype h字符處理math h與數(shù)學(xué)處理函數(shù)有關(guān)的說(shuō)明與定義stdio h輸入輸出函數(shù)中使用的有關(guān)說(shuō)明和定義string h字符串函數(shù)的有關(guān)說(shuō)明和定義stddef h定義某些常用內(nèi)容stdlib h雜項(xiàng)說(shuō)明time h支持系統(tǒng)時(shí)間函數(shù) 常用標(biāo)準(zhǔn)頭文件 編譯預(yù)處理是 語(yǔ)言編譯程序的組成部分 它用于解釋處理 語(yǔ)言源程序中的各種預(yù)處理指令 文件包含 include 和宏定義 define 都是編譯預(yù)處理指令在形式上都以 開(kāi)頭 不屬于C語(yǔ)言中真正的語(yǔ)句增強(qiáng)了C語(yǔ)言的編程功能 改進(jìn) 語(yǔ)言程序設(shè)計(jì)環(huán)境 提高編程效率 10 3 5編譯預(yù)處理 C程序的編譯處理 目的是把每一條C語(yǔ)句用若干條機(jī)器指令來(lái)實(shí)現(xiàn) 生成目標(biāo)程序 由于 define等編譯預(yù)處理指令不是C語(yǔ)句 不能被編譯程序翻譯 需要在真正編譯之前作一個(gè)預(yù)處理 解釋完成編譯預(yù)處理指令 從而把預(yù)處理指令轉(zhuǎn)換成相應(yīng)的C程序段 最終成為由純粹C語(yǔ)句構(gòu)成的程序 經(jīng)編譯最后得到目標(biāo)代碼 編譯預(yù)處理 編譯預(yù)處理的主要功能 文件包含 include 宏定義 define 條件編譯 編譯預(yù)處理功能 條件編譯 defineFLAG1 ifFLAG程序段1 else程序段2 endif 編譯預(yù)處理功能 10 4大程序構(gòu)成 多文件模塊的學(xué)生信息庫(kù)系統(tǒng) 10 4 1分模塊設(shè)計(jì)學(xué)生信息庫(kù)系統(tǒng)10 4 2C程序文件模塊10 4 3文件模塊間的通信 10 4 1分模塊設(shè)計(jì)學(xué)生信息庫(kù)系統(tǒng) 例10 8請(qǐng)綜合例9 1 例9 2 例9 3和例9 4 分模塊設(shè)計(jì)一個(gè)學(xué)生信息庫(kù)系統(tǒng) 該系統(tǒng)包含學(xué)生基本信息的建立和輸出 計(jì)算學(xué)生平均成績(jī) 按照學(xué)生的平均成績(jī)排序以及查詢(xún) 修改學(xué)生的成績(jī)等功能 函數(shù)建立為 10 4 1分模塊設(shè)計(jì)學(xué)生信息庫(kù)系統(tǒng) 由于整個(gè)程序規(guī)模較大 按照功能圖 分成三個(gè)程序文件模塊 并把結(jié)構(gòu)體定義等寫(xiě)成一個(gè)頭文件 頭文件student h輸入輸出程序文件input output cvoidnew student structstudentstudents voidoutput student structstudentstudents 計(jì)算平均成績(jī)與平均成績(jī)排序程序文件aver sort cvoidaverage structstudentstudents voidsort structstudentstudents 查詢(xún)修改程序文件modify cvoidmodify structstudentstudents voidsearch student structstudentstudents intnum 10 4 1分模塊設(shè)計(jì)學(xué)生信息庫(kù)系統(tǒng) 一共定義了三個(gè) c程序文件和一個(gè) h頭文件 它們各自獨(dú)立 再通過(guò)主函數(shù)main 調(diào)用 主函數(shù)放在student system c文件中 各文件存放在同一個(gè)文件夾下 相互間的連接采用文件包含的形式 主函數(shù)程序文件student system c include student h include input output c include aver sort c include modify c intCount 0 全局變量 記錄當(dāng)前學(xué)生總數(shù) intmain void 主函數(shù)調(diào)用各函數(shù) 10 4 2C程序文件模塊 結(jié)構(gòu)化程序設(shè)計(jì)是編寫(xiě)出具有良好結(jié)構(gòu)程序的有效方法一個(gè)大程序最好由一組小函數(shù)構(gòu)成如果程序規(guī)模很大 需要幾個(gè)人合作完成的話(huà) 每個(gè)人所編寫(xiě)的程序會(huì)保存在自己的 c文件中為了避免一個(gè)文件過(guò)長(zhǎng) 也會(huì)把程序分別保存為幾個(gè)文件 一個(gè)大程序會(huì)由幾個(gè)文件組成 每一個(gè)文件又可能包含若干個(gè)函數(shù) 我們把保存有一部分程序的文件稱(chēng)為程序文件模塊 10 4 2C程序文件模塊 一個(gè)大程序可由幾個(gè)程序文件模塊組成 每一個(gè)程序文件模塊又可能包含若干個(gè)函數(shù) 程序文件模塊只是函數(shù)書(shū)寫(xiě)的載體 當(dāng)大程序分成若干文件模塊后 可以對(duì)各文件模塊分別編譯 然后通過(guò)連接 把編譯好的文件模塊再合起來(lái) 連接生成可執(zhí)行程序 問(wèn)題 如何把若干程序文件模塊連接成一個(gè)完整的可執(zhí)行程序 文件包含工程文件 由具體語(yǔ)言系統(tǒng)提供 10 4 2C程序文件模塊 程序 文件 函數(shù)關(guān)系小程序 主函數(shù) 若干函數(shù) 一個(gè)文件大程序 若干程序文件模塊 多個(gè)文件 每個(gè)程序文件模塊可包含若干個(gè)函數(shù) 各程序文件模塊分別編譯 再連接整個(gè)程序只允許有一個(gè)main 函數(shù) 10 4 3文件模塊間的通信 文件模塊與變量外部變量靜態(tài)全局變量文件模塊與函數(shù)外部函數(shù)靜態(tài)的函數(shù) 10 4 3文件模塊間的通信 外部變量全局變量只能在某個(gè)模塊中定義一次 如果其他模塊要使用該全局變量 需要通過(guò)外部變量的聲明外部變量聲明格式為 extern變量名表 如果在每一個(gè)文件模塊中都定義一次全局變量 模塊單獨(dú)編譯時(shí)不會(huì)發(fā)生錯(cuò)誤 一旦把各模塊連接在一起時(shí) 就會(huì)產(chǎn)生對(duì)同一個(gè)全局變量名多次定義的錯(cuò)誤反之 不經(jīng)聲明而直接使用全局變量 程序編譯時(shí)會(huì)出現(xiàn) 變量未定義 的錯(cuò)誤 10 4 3文件模塊間的通信 靜態(tài)全局變量當(dāng)一個(gè)大的程序由多人合作完成時(shí) 每個(gè)程序員可能都會(huì)定義一些自己使用的全局變量為避免自己定義的全局變量影響其他人編寫(xiě)的模塊 即所謂的全局變量副作用 靜態(tài)全局變量可以把變量的作用范圍僅局限于當(dāng)前的文件模塊中即使其他文件模塊使用外部變量聲明 也不能使用該變量 10 4 3文件模塊間的通信 文件模塊與函數(shù)外部函數(shù)如果要實(shí)現(xiàn)在一個(gè)模塊中調(diào)用另一模塊中的函數(shù)時(shí) 就需要對(duì)函數(shù)進(jìn)行外部聲明 聲明格式為 extern函數(shù)類(lèi)型函數(shù)名 參數(shù)表說(shuō)明 靜態(tài)的函數(shù)把函數(shù)的使用范圍限制在文件模塊內(nèi) 不使某程序員編寫(xiě)的自用函數(shù)影響其他程序員的程序 即使其他文件模塊有同名的函數(shù)定義 相互間也沒(méi)有任何關(guān)聯(lián) 增加模塊的獨(dú)立性 本章小結(jié) 多函數(shù)程序的組織結(jié)構(gòu)函數(shù)調(diào)用的層次結(jié)構(gòu)多文件模塊實(shí)現(xiàn) 文件包含合理運(yùn)用變量在多文件模塊 多函數(shù)間的關(guān)聯(lián)程序文件模塊 變量與文件模塊 函數(shù)與文件模塊的關(guān)系遞歸函數(shù)構(gòu)成要素 遞歸式子 重點(diǎn) 與遞歸出口運(yùn)用遞歸函數(shù)解決特殊問(wèn)題 如漢諾塔 編譯預(yù)處理文件包含宏實(shí)質(zhì) 編譯預(yù)處理的替代帶參的宏 不是函數(shù)