版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第五章 結(jié)構(gòu)化程序設(shè)計概論學(xué)習(xí)目標熟悉數(shù)據(jù)的基本概念,掌握數(shù)據(jù)的表示方法熟悉代碼的基本概念,掌握代碼的控制方法熟悉算法的基本概念,了解算法、程序與代碼的關(guān)系掌握結(jié)構(gòu)化程序設(shè)計的一般方法了解問題規(guī)模與程序控制結(jié)構(gòu)之間的關(guān)系掌握程序測試的基本方法與手段了解代碼優(yōu)化的基本策略5.1 數(shù)據(jù)的基本概念數(shù)據(jù)與信息數(shù)據(jù)與地址數(shù)據(jù)類型文字常量變 量聲 明數(shù)據(jù)與數(shù)據(jù)類型數(shù)據(jù)與信息數(shù)據(jù):數(shù)據(jù)特征、數(shù)據(jù)名稱與特征值信息:數(shù)據(jù)所具有的意義數(shù)據(jù)并不能解釋自身,程序不了解數(shù)據(jù)的意義數(shù)據(jù)類型:對數(shù)據(jù)進行分類每一類數(shù)據(jù)具有同樣的存儲表示(存儲分配格式),同樣的操作集基本數(shù)據(jù)類型(預(yù)定義數(shù)據(jù)類型)與用戶自定義類型(用戶可按需創(chuàng)
2、建新的數(shù)據(jù)類型)文字與量文字常量:程序中出現(xiàn)的值只能以值的形式標識,其值不可改變?nèi)粢暶鲊栏褚饬x的常量,使用 C99 的 const文字常量不可尋址,而普通常量可以尋址變量:程序中定義和命名的數(shù)據(jù)對象四個基本特征:VANT先聲明后使用在程序執(zhí)行期間,可改變變量的值,不能改變變量的名稱、類型與地址聲 明數(shù)據(jù)標識的目的:區(qū)分數(shù)據(jù)模擬世界中各種數(shù)據(jù)的聯(lián)系,構(gòu)造具有復(fù)雜結(jié)構(gòu)的數(shù)據(jù)聲明的目的將程序執(zhí)行時數(shù)據(jù)對象的名字與類型信息通知編譯器,在數(shù)據(jù)對象與數(shù)據(jù)值及存儲位置間建立關(guān)聯(lián)輔助編譯器選擇合適的存儲表示使得類型檢查靜態(tài)化,減少程序錯誤聲明與定義聲明并不一定就是定義,聲明雖引入名字,但只有那些確實在程序中
3、引入了實體的聲明才是定義5.2 代碼的基本概念表達式語義賦值與初始化代碼與計算控制流斷言與程序不變量表達式語義表達式語義:表達式的求值順序C 語言未規(guī)定表達式求值順序,一般由操作符的優(yōu)先級與結(jié)合性決定例外情況遞增遞減操作符滿足特定計算規(guī)則不同編譯器的實現(xiàn)可能不同:出于優(yōu)化的目的,編譯器可能重排部分代碼,表達式的求值順序可能會發(fā)生用戶事先無法察覺的變化既是優(yōu)點(程序設(shè)計可以高度靈活)也是缺點(錯誤的求值順序帶來錯誤的計算結(jié)果)明確表達設(shè)計意圖,盡量不在表達式中使用帶副作用的操作符,表達式應(yīng)盡量簡短賦值與初始化賦值:將數(shù)據(jù)對象與某個具體值相關(guān)聯(lián)的基本操作左值:出現(xiàn)在賦值號左邊的數(shù)據(jù)對象具有左值,在
4、程序中表現(xiàn)為數(shù)據(jù)對象的地址右值:出現(xiàn)在賦值號右邊的數(shù)據(jù)對象具有右值,在程序中表現(xiàn)為數(shù)據(jù)對象的值例:x = x;初始化初始化不是賦值:賦值可以在程序運行期間執(zhí)行多次,初始化只在為變量分配存儲空間時執(zhí)行一次未初始化的數(shù)據(jù)對象只有左值沒有右值,其存儲內(nèi)容維持原先位序列,所以不要引用未初始化的數(shù)據(jù)對象!代碼與控制流代碼與計算:代碼是計算的簡潔表達操作為程序的基本單位,一系列的操作構(gòu)成計算以及計算的順序靜態(tài)代碼文本與動態(tài)執(zhí)行過程程序在運行期間根據(jù)靜態(tài)代碼文本產(chǎn)生計算過程,即動態(tài)執(zhí)行過程兩者并不相同,優(yōu)秀的程序員應(yīng)保證兩者盡可能匹配,例如少用甚至不用goto語句控制流控制程序流向的程序結(jié)構(gòu):復(fù)合、分支、循
5、環(huán)斷言與程序不變量斷言與不變量的含義斷言:程序中存在某些特定位置,在該處某些判斷永真,該判斷式即為斷言不變量:無論程序如何執(zhí)行,斷言的值都應(yīng)保持不變(具有恒定屬性)斷言與不變量的意義若斷言值未保持,說明程序必然發(fā)生了錯誤斷言在編程時非常重要,一個優(yōu)秀程序員的第一行 C 代碼應(yīng)該從斷言開始書寫!斷言與程序不變量示例在程序中使用 assert() 表達斷言#include void ProcessString(char* str) assert( str != NULL ); assert( *str != 0 ); assert() 是宏而不是函數(shù),位于頭文件“assert.h”中如果不希望在編
6、譯后的程序中出現(xiàn)斷言代碼,在程序開頭聲明 NDEBUG 宏后再編譯上述代碼需要對字符串str進行處理。在進行處理前,程序必須保證該字符串既不能不存在也不能為空串。如果斷言未滿足,則程序會在輸出錯誤信息后終止執(zhí)行5.3 算法及其表示方法概要程序的辨證統(tǒng)一:數(shù)據(jù)與代碼數(shù)據(jù)表示:指定程序使用的數(shù)據(jù)結(jié)構(gòu)與組織形式代碼組織:數(shù)據(jù)上所進行操作的描述與組織形式算法的基本概念為解決某類問題而設(shè)計或采取的方法或步驟算法必須能夠轉(zhuǎn)化為計算機可執(zhí)行的指令序列(代碼)算法基本特征:有窮性、確定性、輸入、輸出與有效性代碼與偽代碼均可以用來表達算法設(shè)計思想與算法執(zhí)行步驟代碼與偽代碼給定兩個正整數(shù)m與n,設(shè)計求解最大公因子
7、的算法int gcd( int m, int n ) int r;start: r = m % n; if( r = 0 ) return n; m = n; n = r; goto start;代碼以計算機語言書寫,計算機易理解,程序員不易理解偽代碼界于自然語言與計算機語言之間,一般用符號或文字表示算法的實際執(zhí)行步驟,程序員易理解,計算機不理解輸入:整數(shù)m與n輸出:m與n的最大公因子步驟1:m除以n,余數(shù)為r步驟2:若r為0,則n為所求,算法終止;否則步驟3:將n作為新m,r作為新n,返回第1步重新計算5.4 結(jié)構(gòu)化程序的組織程序的結(jié)構(gòu)化程序的一般結(jié)構(gòu)結(jié)構(gòu)化與函數(shù)抽象程序范型程序的結(jié)構(gòu)化結(jié)構(gòu)
8、化結(jié)構(gòu)化語句:滿足單入口單出口條件的語句復(fù)合語句、分支語句與循環(huán)語句都是結(jié)構(gòu)化語句結(jié)構(gòu)化程序:使用結(jié)構(gòu)化語句設(shè)計的程序結(jié)構(gòu)定理:所有程序都可使用上述三類結(jié)構(gòu)化語句實現(xiàn)結(jié)構(gòu)化優(yōu)點單入口單出口的控制流易于確定程序動態(tài)計算過程,易于理解注意事項結(jié)構(gòu)化程序并不一定是好程序,程序的合理組織最重要!程序的一般結(jié)構(gòu)根據(jù)用戶輸入的底面半徑與高度,計算圓柱體體積#include /* 包含必要的頭文件 */#define PI 3.14159265 /* PI宏定義, 一次定義多次使用 */float radius, height, volume; /* 全局變量聲明 */void main() /* 主函數(shù)
9、*/ /* 輸入半徑與高度 */ printf(“This program computes the volume of the cylinder.n“); printf(“Please input the radius value: “); scanf(“%f“, &radius); printf(“Please input the height value: “); scanf(“%f“, &height); /* 計算體積 */ volume = PI * radius * radius * height; /* 輸出體積 */ printf(“The volume of the cyl
10、inder is %fn“, volume);主函數(shù)包括輸入、計算與輸出三部分程序無非是對特定輸入數(shù)據(jù)進行處理并輸出處理結(jié)果的指令序列,所以任何程序都應(yīng)包括輸入、計算與輸出三部分結(jié)構(gòu)化與函數(shù)抽象程序設(shè)計過程按照功能需求,進行自頂向下的功能分解與逐步求精,最終形成代碼大多數(shù)問題的求解過程非常復(fù)雜,如何合理地控制程序規(guī)模和復(fù)雜性呢?程序的分割與結(jié)構(gòu)化:著重于安排操作序列而不是數(shù)據(jù)結(jié)構(gòu),使程序易于創(chuàng)建、理解與維護函數(shù)抽象:結(jié)構(gòu)化程序設(shè)計的主要工具體現(xiàn)要執(zhí)行的命令、計算或任務(wù),這些抽象構(gòu)成了函數(shù)用戶只關(guān)心抽象的語法和該抽象提供的功能或服務(wù),不關(guān)心如何實現(xiàn)該功能結(jié)構(gòu)化與函數(shù)抽象示例根據(jù)用戶輸入的底面半徑
11、與高度,計算圓柱體體積#include /* 包含必要的頭文件 */#define PI 3.14159265 /* PI宏定義, 一次定義多次使用 */float radius, height, volume; /* 全局變量聲明 */void Input(); /* 輸入半徑與高度,將實際的輸入操作隱藏在函數(shù)內(nèi)部 */void Compute(); /* 計算體積,將實際的計算過程隱藏在函數(shù)內(nèi)部 */void Output(); /* 輸出體積,將實際的輸出操作隱藏在函數(shù)內(nèi)部 */void main() /* 主函數(shù),表現(xiàn)為對上述函數(shù)的調(diào)用,無其他代碼 */ Input(); Comput
12、e(); Output();主函數(shù)是否更容易理解?沒有復(fù)雜的輸入、計算與輸出的實現(xiàn)細節(jié),理解主函數(shù)一點都不困難在主函數(shù)層次,只需了解一旦聲明三個全局變量,連續(xù)調(diào)用上述三個函數(shù)即能完成主函數(shù)的計算任務(wù)就可以了結(jié)構(gòu)化與函數(shù)抽象示例(續(xù))void Input() printf(“This program computes the volume of the cylinder.n“); printf(“Please input the radius value: “); scanf(“%f“, &radius); printf(“Please input the height value: “); s
13、canf(“%f“, &height);void Compute() volume = PI * radius * radius * height;void Output() printf(“The volume of the cylinder is %fn“, volume);只有在確實必要的時候才需要了解這三個函數(shù)的具體實現(xiàn)細節(jié)與代碼通過程序分割與邏輯分組,程序分離成一個一個的模塊在需要的時候,我們可以使用這些模塊像積木一樣構(gòu)造整個程序5.4 程序范型范型:實現(xiàn)特定程序代碼的通用模式有助于形成函數(shù)抽象編寫出的代碼容易重用:不加修改或部分修改就可以適應(yīng)其他場合示例:數(shù)據(jù)輸入模式具有重復(fù)性輸出
14、提示信息,接受用戶輸入輸入:提醒用戶輸入數(shù)據(jù)的提示信息輸出:數(shù)據(jù)值步驟1:輸出提示信息步驟2:獲取數(shù)據(jù)值并輸出程序范型示例float radius, height, volume; float GetFloatValue(char* prompt);float GetFloatValue(char* prompt) float t; printf(“%s“, prompt); scanf(“%f“, &t); return t;void Input() printf(“This program computes the volume of the cylinder.n“); /* 調(diào)用GetF
15、loatValue函數(shù)進行radius值的實際輸入操作 */ radius = GetFloatValue(“Please input the radius value: “); /* 調(diào)用GetFloatValue函數(shù)進行height值的實際輸入操作 */ height = GetFloatValue(“Please input the height value: “);功能分解與逐步求精自頂向下的功能分解先從整體考慮問題,將原始問題分解成邏輯上相互獨立的多個部分;一一實現(xiàn)分解后的各部分,將上述實現(xiàn)組裝成原始問題的解功能分解必須按照程序需求進行,分解后的各部分應(yīng)能實現(xiàn)為單入口單出口的函數(shù)逐步
16、求精對于復(fù)雜系統(tǒng),功能分解可能不會一步到位,對于某些部分可能需要重復(fù)上述功能分解步驟在功能分解與逐步求精過程中,我們最關(guān)心的既不是數(shù)據(jù)對象,也不是具體算法,而是算法模式(程序范型)5.5 程序測試與代碼優(yōu)化程序測試順序結(jié)構(gòu):一般一次測試分支結(jié)構(gòu):所有分支路徑都需測試循環(huán)結(jié)構(gòu):第一次迭代,最后一次迭代,中間一次迭代程序調(diào)試:查找與改正錯誤語法錯誤與邏輯錯誤程序效率與代碼優(yōu)化正確性不是程序設(shè)計的全部,效率同樣重要程序測試示例編程實現(xiàn)攝氏溫度到華氏溫度的轉(zhuǎn)換,溫度轉(zhuǎn)換公式為 ,c 為攝氏溫度值,f 為轉(zhuǎn)換后的華氏溫度值#include /* 包含必要的頭文件 */float f, c; /* 全局變
17、量聲明 */float GetFloatValue(char* prompt); /* 獲取用戶輸入的浮點數(shù)據(jù) */void Input(); /* 輸入數(shù)據(jù),將實際的輸入過程隱藏在函數(shù)內(nèi)部 */void Compute(); /* 溫度轉(zhuǎn)換,將實際的計算過程隱藏在函數(shù)內(nèi)部 */void Output(); /* 輸出結(jié)果,將實際的輸出操作隱藏在函數(shù)內(nèi)部 */void main() /* 主函數(shù),表現(xiàn)為對上述函數(shù)的調(diào)用,無其他代碼 */ Input(); Compute(); Output();程序測試示例(續(xù))float GetFloatValue(char* prompt) float t
18、; printf(“%s“, prompt); scanf(“%f“, &t); return t;void Input() c = GetFloatValue(“Please input temperature value(C): “);void Compute() f = c * 1.8 + 32;void Output() printf(“Temperature Value(F): %fn“, f);功能分解的好處:本例主函數(shù)的實現(xiàn)與體積計算程序完全相同,程序結(jié)構(gòu)也相同程序調(diào)試示例下述程序存在一些錯誤,請找出#include float f, c; float GetFloatValue(char* prompt); void Input(); void Compute(); void Output(); void main() Input(); Comput(); Output()
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度綠色建筑材料產(chǎn)銷合作框架協(xié)議書3篇
- 專項舊房翻新改造授權(quán)合同2024版一
- 專項消防工程:2024年中央空調(diào)安全系統(tǒng)協(xié)議版B版
- 2025年度時尚秀場場地租賃拍攝合同4篇
- 2025年度產(chǎn)業(yè)園企業(yè)入駐綠色生產(chǎn)技術(shù)轉(zhuǎn)移合作協(xié)議4篇
- 2025年度工業(yè)0智能廠房租賃合作協(xié)議2篇
- 2025年度汽車零部件全球采購合同4篇
- 2025年度虛擬現(xiàn)實設(shè)備檢測服務(wù)合同范本4篇
- 二零二五年度綜合醫(yī)院設(shè)備采購協(xié)議-64排螺旋CT設(shè)備3篇
- 2024年藥品供應(yīng)鏈管理合作協(xié)議6篇
- GB/T 8005.2-2011鋁及鋁合金術(shù)語第2部分:化學(xué)分析
- GB/T 37234-2018文件鑒定通用規(guī)范
- GB/T 31888-2015中小學(xué)生校服
- 質(zhì)量檢查考核辦法
- 不動產(chǎn)登記實務(wù)培訓(xùn)教程課件
- 云南省普通初中學(xué)生成長記錄-基本素質(zhì)發(fā)展初一-初三
- 2023年系統(tǒng)性硬化病診斷及診療指南
- 外科醫(yī)師手術(shù)技能評分標準
- 《英語教師職業(yè)技能訓(xùn)練簡明教程》全冊配套優(yōu)質(zhì)教學(xué)課件
- 采購控制程序
- 六年級上冊數(shù)學(xué)簡便計算題200題專項練習(xí)
評論
0/150
提交評論