函數(shù)與程序結(jié)構(gòu).ppt
《函數(shù)與程序結(jié)構(gòu).ppt》由會員分享,可在線閱讀,更多相關(guān)《函數(shù)與程序結(jié)構(gòu).ppt(65頁珍藏版)》請在裝配圖網(wǎng)上搜索。
Chap10函數(shù)與程序結(jié)構(gòu) 10 1圓形體積計算器10 2漢諾塔問題10 3長度單位轉(zhuǎn)換10 4大程序構(gòu)成 本章要點 怎樣把多個函數(shù)組織起來 怎樣用結(jié)構(gòu)化程序設(shè)計的思想解決問題 怎樣用函數(shù)嵌套求解復(fù)雜的問題 怎樣用函數(shù)遞歸解決問題 如何使用宏 如何使用多文件模塊構(gòu)建較大規(guī)模程序 使用結(jié)構(gòu)化程序設(shè)計方法解決復(fù)雜的問題把大問題分解成若干小問題 小問題再進(jìn)一步分解成若干更小的問題寫程序時 用main 解決整個問題 它調(diào)用解決小問題的函數(shù)這些函數(shù)又進(jìn)一步調(diào)用解決更小問題的函數(shù) 從而形成函數(shù)的嵌套調(diào)用 10 1圓形體積計算器 程序結(jié)構(gòu) 例10 1設(shè)計一個常用圓形體體積計算器 采用命令方式輸入1 2 3 分別選擇計算球體 圓柱體 圓錐體的體積 并輸入計算所需相應(yīng)參數(shù) 分析 輸入1 2 3選擇計算3種體積 其他輸入結(jié)束計算設(shè)計一個控制函數(shù)cal 經(jīng)它辨別圓形體的類型再調(diào)用計算球體 圓柱體 圓錐體體積的函數(shù)設(shè)計單獨的函數(shù)計算不同圓形體的體積 10 1 1程序解析 計算常用圓形體體積 3層結(jié)構(gòu) 5個函數(shù)降低程序的構(gòu)思 編寫 調(diào)試的復(fù)雜度可讀性好 程序結(jié)構(gòu) 例10 1源程序 definePI3 141592654voidcal intsel intmain void intsel while 1 printf 1 計算球體體積 n printf 2 計算圓柱體積 n printf 3 計算圓錐體積 n printf 其他 退出程序運行 n printf 請輸入計算命令 scanf d 常用圓形體體積計算器的主控函數(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 計算球體體積V 4 3 PI r r r doublevol ball doubler printf 請輸入球的半徑 scanf lf 計算圓柱體積V PI r r h doublevol cylind doubler h printf 請輸入圓柱的底圓半徑和高 scanf lf lf 計算圓錐體積V h 3 PI r r doublevol cone doubler h printf 請輸入圓錐的底圓半徑和高 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 在一個函數(shù)中再調(diào)用其它函數(shù)的情況稱為函數(shù)的嵌套調(diào)用 如果函數(shù)A調(diào)用函數(shù)B 函數(shù)B再調(diào)用函數(shù)C 一個調(diào)用一個地嵌套下去 構(gòu)成了函數(shù)的嵌套調(diào)用 具有嵌套調(diào)用函數(shù)的程序 需要分別定義多個不同的函數(shù)體 每個函數(shù)體完成不同的功能 它們合起來解決復(fù)雜的問題 10 1 2函數(shù)的嵌套調(diào)用 結(jié)構(gòu)化程序設(shè)計方法 自頂向下 逐步求精 函數(shù)實現(xiàn)自頂向下 程序設(shè)計時 應(yīng)先考慮總體步驟 后考慮步驟的細(xì)節(jié) 先考慮全局目標(biāo) 后考慮局部目標(biāo) 先從最上層總目標(biāo)開始設(shè)計 逐步使問題具體化 不要一開始就追求眾多的細(xì)節(jié) 逐步求精 對于復(fù)雜的問題 其中大的操作步驟應(yīng)該再將其分解為一些子步驟的序列 逐步明晰實現(xiàn)過程 函數(shù)實現(xiàn) 通過逐步求精 把程序要解決的全局目標(biāo)分解為局部目標(biāo) 再進(jìn)一步分解為具體的小目標(biāo) 把最終的小目標(biāo)用函數(shù)來實現(xiàn) 問題的逐步分解關(guān)系 構(gòu)成了函數(shù)間的調(diào)用關(guān)系 限制函數(shù)的長度 一個函數(shù)語句數(shù)不宜過多 既便于閱讀 理解 也方便程序調(diào)試 若函數(shù)太長 可以考慮把函數(shù)進(jìn)一步分解實現(xiàn) 避免函數(shù)功能間的重復(fù) 對于在多處使用的同一個計算或操作過程 應(yīng)當(dāng)將其封裝成一個獨立的函數(shù) 以達(dá)到一處定義 多處使用的目的 以避免功能模塊間的重復(fù) 減少全局變量的使用 應(yīng)采用定義局部變量作為函數(shù)的臨時工作單元 使用參數(shù)和返回值作為函數(shù)與外部進(jìn)行數(shù)據(jù)交換的方式 只有當(dāng)確實需要多個函數(shù)共享的數(shù)據(jù)時 才定義其為全局變量 函數(shù)設(shè)計時應(yīng)注意的問題 10 2漢諾塔問題 10 2 1程序解析10 2 2遞歸函數(shù)基本概念10 2 3遞歸程序設(shè)計 10 2 1漢諾 Hanoi 塔問題解析 將64個盤從座A搬到座B 1 一次只能搬一個盤子 2 盤子只能插在A B C三個桿中 3 大盤不能壓在小盤上 ABC 分析 ABC 分析 ABC ABC n n 1 n 1 分析 ABC ABC n 10 2 1漢諾 Hanoi 塔問題解析 遞歸方法的兩個要點 1 遞歸出口 一個盤子的解決方法 2 遞歸式子 如何把搬動64個盤子的問題簡化成搬動63個盤子的問題 把漢諾塔的遞歸解法歸納成三個步驟 n 1個盤子從座A搬到座C第n號盤子從座A搬到座Bn 1個盤子從座C搬到座B 算法 hanio n個盤 A B C為過渡 if n 1 直接把盤子A Belse hanio n 1個盤 A C B為過渡 把第n號盤A Bhanio n 1個盤 C B A為過渡 10 2 2遞歸函數(shù)基本概念 例10 2用遞歸函數(shù)實現(xiàn)求n 遞推法在學(xué)習(xí)循環(huán)時 計算n 采用的就是遞推法 n 1 2 3 n用循環(huán)語句實現(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 寫成函數(shù)fact n 則fact n 的實現(xiàn)依賴于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 的實現(xiàn)過程 fact 3 3 fact 2 2 fact 1 fact 1 1 2 1 2 3 2 6 同時有4個函數(shù)在運行 且都未完成 10 2 3遞歸程序設(shè)計 用遞歸實現(xiàn)的問題 滿足兩個條件 問題可以逐步簡化成自身較簡單的形式 遞歸式 n n n 1 nn 1 i n ii 1i 1遞歸最終能結(jié)束 遞歸出口 兩個條件缺一不可解決遞歸問題的兩個著眼點 10 2 3遞歸程序設(shè)計 例10 3編寫遞歸函數(shù)reverse intn 實現(xiàn)將整數(shù)n逆序輸出 分析 將整數(shù)n逆序輸出可以用循環(huán)實現(xiàn) 且循環(huán)次數(shù)與n的位數(shù)有關(guān) 遞歸實現(xiàn)整數(shù)逆序輸出也需要用位數(shù)作為控制點 歸納遞歸實現(xiàn)的兩個關(guān)鍵點如下 遞歸出口 直接輸出n 如果n 9 即n為1位數(shù)遞歸式子 輸出個位數(shù)n 10 再遞歸調(diào)用reverse n 10 輸出前n 1位 如果n為多位數(shù) 10 2 3遞歸程序設(shè)計 由于結(jié)果是在屏幕上輸出 因此函數(shù)返回類型為voidvoidreverse intnum if num 9 printf d num 遞歸出口 else printf d num 10 reverse num 10 遞歸調(diào)用 例10 4漢諾 Hanoi 塔問題 ABC hanio n個盤 A B C為過渡 if n 1 直接把盤子A Belse hanio n 1個盤 A C B為過渡 把n號盤A Bhanio n 1個盤 C B A為過渡 源程序 搬動n個盤 從a到b c為中間過渡 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ù)計算x的n次冪 intmi intx intn if n 1 returnx elsereturnx mi x n 1 10 3長度單位轉(zhuǎn)換 10 3 1程序解析10 3 2宏基本定義10 3 3帶參數(shù)的宏定義10 3 4文件包含10 3 5編譯預(yù)處理 10 3 1程序解析 例10 5歐美國家長度使用英制單位 1英里 1609米 1英尺 30 48厘米 1英寸 2 54厘米 請編寫程序轉(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)識符宏定義字符串編譯時 把程序中所有與宏名相同的字符串 用宏定義字符串替代 definePI3 14 definearr size4說明 宏名一般用大寫字母 以與變量名區(qū)別宏定義不是 語句 后面不得跟分號宏定義可以嵌套使用 definePI3 14 defineS2 PI PI 多用于符號常量 宏定義可以寫在程序中任何位置 它的作用范圍從定義書寫處到文件尾 可以通過 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簡單的帶參數(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ù)是兩種不同的概念宏可以實現(xiàn)簡單的函數(shù)功能 示例用宏實現(xiàn)兩個變量值的交換 與函數(shù)的區(qū)別在哪里 宏定義應(yīng)用示例 定義宏LOWCASE 判斷字符c是否為小寫字母 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)一計算不可一邊替換一邊計算 更不可以人為添加括號D 3 x F x 先用x替換展開 x x 2進(jìn)一步對F x 展開 這里不能加括號 3 3 2 7最后把x 3代進(jìn)去計算D D 3 D x x 2 先對D 3 用x替換展開 x x 2 F x x 2 拿展開后的參數(shù)對D進(jìn)一步進(jìn)行宏替換 x x 2 x x 2 2拿展開后的參數(shù)對F進(jìn)一步進(jìn)行宏替換 3 3 2 3 3 2 2 13最后把x 3代進(jìn)去計算運行結(jié)果 7 13 結(jié)果分析 10 3 4文件包含 系統(tǒng)文件以stdio h math h等形式供編程者調(diào)用實用系統(tǒng)往往有自己諸多的宏定義 也以 h的形式組織 調(diào)用問題 如何把若干 h頭文件連接成一個完整的可執(zhí)行程序 文件包含include 格式 include include 需包含的文件名 作用把指定的文件模塊內(nèi)容插入到 include所在的位置 當(dāng)程序編譯連接時 系統(tǒng)會把所有 include指定的文件拼接生成可執(zhí)行代碼 注意編譯預(yù)處理命令 以 開頭 在程序編譯時起作用 不是真正的C語句 行尾沒有分號 文件包含 系統(tǒng)文件夾 當(dāng)前文件夾 系統(tǒng)文件夾 例10 7將例10 5中長度轉(zhuǎn)換的宏 定義成頭文件length h 并寫出主函數(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個函數(shù)分別存儲在2個 C文件上 要求通過文件包含把它們聯(lián)結(jié)起來 ctype h字符處理math h與數(shù)學(xué)處理函數(shù)有關(guān)的說明與定義stdio h輸入輸出函數(shù)中使用的有關(guān)說明和定義string h字符串函數(shù)的有關(guān)說明和定義stddef h定義某些常用內(nèi)容stdlib h雜項說明time h支持系統(tǒng)時間函數(shù) 常用標(biāo)準(zhǔn)頭文件 編譯預(yù)處理是 語言編譯程序的組成部分 它用于解釋處理 語言源程序中的各種預(yù)處理指令 文件包含 include 和宏定義 define 都是編譯預(yù)處理指令在形式上都以 開頭 不屬于C語言中真正的語句增強(qiáng)了C語言的編程功能 改進(jìn) 語言程序設(shè)計環(huán)境 提高編程效率 10 3 5編譯預(yù)處理 C程序的編譯處理 目的是把每一條C語句用若干條機(jī)器指令來實現(xiàn) 生成目標(biāo)程序 由于 define等編譯預(yù)處理指令不是C語句 不能被編譯程序翻譯 需要在真正編譯之前作一個預(yù)處理 解釋完成編譯預(yù)處理指令 從而把預(yù)處理指令轉(zhuǎn)換成相應(yīng)的C程序段 最終成為由純粹C語句構(gòu)成的程序 經(jīng)編譯最后得到目標(biāo)代碼 編譯預(yù)處理 編譯預(yù)處理的主要功能 文件包含 include 宏定義 define 條件編譯 編譯預(yù)處理功能 條件編譯 defineFLAG1 ifFLAG程序段1 else程序段2 endif 編譯預(yù)處理功能 10 4大程序構(gòu)成 多文件模塊的學(xué)生信息庫系統(tǒng) 10 4 1分模塊設(shè)計學(xué)生信息庫系統(tǒng)10 4 2C程序文件模塊10 4 3文件模塊間的通信 10 4 1分模塊設(shè)計學(xué)生信息庫系統(tǒng) 例10 8請綜合例9 1 例9 2 例9 3和例9 4 分模塊設(shè)計一個學(xué)生信息庫系統(tǒng) 該系統(tǒng)包含學(xué)生基本信息的建立和輸出 計算學(xué)生平均成績 按照學(xué)生的平均成績排序以及查詢 修改學(xué)生的成績等功能 函數(shù)建立為 10 4 1分模塊設(shè)計學(xué)生信息庫系統(tǒng) 由于整個程序規(guī)模較大 按照功能圖 分成三個程序文件模塊 并把結(jié)構(gòu)體定義等寫成一個頭文件 頭文件student h輸入輸出程序文件input output cvoidnew student structstudentstudents voidoutput student structstudentstudents 計算平均成績與平均成績排序程序文件aver sort cvoidaverage structstudentstudents voidsort structstudentstudents 查詢修改程序文件modify cvoidmodify structstudentstudents voidsearch student structstudentstudents intnum 10 4 1分模塊設(shè)計學(xué)生信息庫系統(tǒng) 一共定義了三個 c程序文件和一個 h頭文件 它們各自獨立 再通過主函數(shù)main 調(diào)用 主函數(shù)放在student system c文件中 各文件存放在同一個文件夾下 相互間的連接采用文件包含的形式 主函數(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è)計是編寫出具有良好結(jié)構(gòu)程序的有效方法一個大程序最好由一組小函數(shù)構(gòu)成如果程序規(guī)模很大 需要幾個人合作完成的話 每個人所編寫的程序會保存在自己的 c文件中為了避免一個文件過長 也會把程序分別保存為幾個文件 一個大程序會由幾個文件組成 每一個文件又可能包含若干個函數(shù) 我們把保存有一部分程序的文件稱為程序文件模塊 10 4 2C程序文件模塊 一個大程序可由幾個程序文件模塊組成 每一個程序文件模塊又可能包含若干個函數(shù) 程序文件模塊只是函數(shù)書寫的載體 當(dāng)大程序分成若干文件模塊后 可以對各文件模塊分別編譯 然后通過連接 把編譯好的文件模塊再合起來 連接生成可執(zhí)行程序 問題 如何把若干程序文件模塊連接成一個完整的可執(zhí)行程序 文件包含工程文件 由具體語言系統(tǒng)提供 10 4 2C程序文件模塊 程序 文件 函數(shù)關(guān)系小程序 主函數(shù) 若干函數(shù) 一個文件大程序 若干程序文件模塊 多個文件 每個程序文件模塊可包含若干個函數(shù) 各程序文件模塊分別編譯 再連接整個程序只允許有一個main 函數(shù) 10 4 3文件模塊間的通信 文件模塊與變量外部變量靜態(tài)全局變量文件模塊與函數(shù)外部函數(shù)靜態(tài)的函數(shù) 10 4 3文件模塊間的通信 外部變量全局變量只能在某個模塊中定義一次 如果其他模塊要使用該全局變量 需要通過外部變量的聲明外部變量聲明格式為 extern變量名表 如果在每一個文件模塊中都定義一次全局變量 模塊單獨編譯時不會發(fā)生錯誤 一旦把各模塊連接在一起時 就會產(chǎn)生對同一個全局變量名多次定義的錯誤反之 不經(jīng)聲明而直接使用全局變量 程序編譯時會出現(xiàn) 變量未定義 的錯誤 10 4 3文件模塊間的通信 靜態(tài)全局變量當(dāng)一個大的程序由多人合作完成時 每個程序員可能都會定義一些自己使用的全局變量為避免自己定義的全局變量影響其他人編寫的模塊 即所謂的全局變量副作用 靜態(tài)全局變量可以把變量的作用范圍僅局限于當(dāng)前的文件模塊中即使其他文件模塊使用外部變量聲明 也不能使用該變量 10 4 3文件模塊間的通信 文件模塊與函數(shù)外部函數(shù)如果要實現(xiàn)在一個模塊中調(diào)用另一模塊中的函數(shù)時 就需要對函數(shù)進(jìn)行外部聲明 聲明格式為 extern函數(shù)類型函數(shù)名 參數(shù)表說明 靜態(tài)的函數(shù)把函數(shù)的使用范圍限制在文件模塊內(nèi) 不使某程序員編寫的自用函數(shù)影響其他程序員的程序 即使其他文件模塊有同名的函數(shù)定義 相互間也沒有任何關(guān)聯(lián) 增加模塊的獨立性 本章小結(jié) 多函數(shù)程序的組織結(jié)構(gòu)函數(shù)調(diào)用的層次結(jié)構(gòu)多文件模塊實現(xiàn) 文件包含合理運用變量在多文件模塊 多函數(shù)間的關(guān)聯(lián)程序文件模塊 變量與文件模塊 函數(shù)與文件模塊的關(guān)系遞歸函數(shù)構(gòu)成要素 遞歸式子 重點 與遞歸出口運用遞歸函數(shù)解決特殊問題 如漢諾塔 編譯預(yù)處理文件包含宏實質(zhì) 編譯預(yù)處理的替代帶參的宏 不是函數(shù)- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 函數(shù) 程序結(jié)構(gòu)
鏈接地址:http://www.820124.com/p-5329967.html