C程序設(shè)計教程7_第1頁
C程序設(shè)計教程7_第2頁
C程序設(shè)計教程7_第3頁
C程序設(shè)計教程7_第4頁
C程序設(shè)計教程7_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C+程序設(shè)計教程(第二版)第七章 程序結(jié)構(gòu) Chapter 7 Program Structure 18:17:591程序結(jié)構(gòu): 使程序得以運行的框架組織便是程序結(jié)構(gòu),對程序結(jié)構(gòu)的研究,是為了更好地表達算法思想,使其符合編譯邏輯,又具有更好的可讀性和可維護性學(xué)習(xí)目標: 1. 從簡單的函數(shù)層層調(diào)用,初步理解+程序結(jié)構(gòu) 2. 學(xué)習(xí)合理組織程序的規(guī)則與經(jīng)驗,掌握擴展程序規(guī)模的基本方法18:17:592第七章內(nèi)容 函數(shù)組織( Function Organization ) 頭文件 ( Header Files ) 全局數(shù)據(jù) ( Global Data ) 靜態(tài)數(shù)據(jù) ( Static Data ) 作用

2、域與生命期 ( Scope & Lifetime ) 名空間 ( namespace ) 預(yù)編譯 ( Pre-Compilation ) 18:17:5931. 函數(shù)組織 ( Function Organization )函數(shù):對輸入?yún)?shù)負責(zé),埋頭做自己的事,最終返回結(jié)果函數(shù)組織:通過在函數(shù)中進行函數(shù)調(diào)用來擴展運行的規(guī)模,層層疊疊的函數(shù)構(gòu)成樹結(jié)構(gòu)做法:將若干個函數(shù)組織成文件,又將若干個文件構(gòu)成程序的辦法來進行編程分工18:17:594對如下的函數(shù)調(diào)用關(guān)系,進行文件劃分mainf2f1f3g1g2hp文件文件文件18:17:595. 頭文件 ( Header Files )原始頭文件:作為共同開

3、發(fā)的項目,為了共享彼此的過程資源(函數(shù)),將全體函數(shù)聲明放在一個共用的頭文件中界面頭文件:界定模塊可用資源(函數(shù),數(shù)據(jù),類型等)(可由一個或幾個頭文件組合,其實現(xiàn)由他人提供),或提供他人使用的模塊資源它是由軟件工程師分發(fā)的、以規(guī)范項目開發(fā)為目的的資源文件做法:練習(xí)劃分函數(shù)組,模仿學(xué)習(xí)構(gòu)造頭文件,并注意頭文件的應(yīng)含內(nèi)容18:17:596/ abc.hvoid f1 ( );void f2 ( );void f3 ( );void g1 ( );void g2 ( );void p ( );void h ( );原始頭文件 (包含age5的圖中的一切函數(shù)聲明)18:17:597頭文件的使用:使函數(shù)

4、調(diào)用免于聲明/ a1.cpp#include”abc.h”void f1() if() p(); g1(); else g2(); h(); 18:17:598頭文件的使用:使函數(shù)調(diào)用免于聲明/ a2.cpp#include”abc.h”int main() f1(); f2(); f3();/-void f3() f1();/-void p() f3();/-18:17:599頭文件的使用:使函數(shù)調(diào)用免于聲明/ a3.cpp#include”abc.h”void h() void f2() g1(); g2();/-void g1() void g2() 18:17:5910界面頭文件/ a

5、1.h a1.cpp提供的資源void f1();/ a2.h a2.cpp提供的資源void p();/ a3.h a3.cpp提供的資源void g1();void g2();void f2();void h(); 18:17:5911/ a1.cpp#include”a2.h”#include”a3.h”void f1() if() p(); g1(); else g2(); h(); 使用界面頭文件18:17:5912/ a2.cpp#include”a1.h”#include”a3.h”static void f3();int main() f1(); f2(); f3();void

6、 f3() f1();void p() f3();使用界面頭文件18:17:5913/ a3.cpp#include”a3.h”void h() void f2() g1(); g2();void g1() void g2() 使用界面頭文件18:17:59143. 全局數(shù)據(jù) ( Global Data )全局數(shù)據(jù):使若干個模塊在程序范圍內(nèi)共享(讀與寫)數(shù)據(jù),是若干程序文件溝通數(shù)據(jù)的一種形式意義:模塊的獨立性由數(shù)據(jù)的封閉性來支持全局數(shù)據(jù)破壞了數(shù)據(jù)的封閉性,因而對小程序簡單而對規(guī)范化程序則不登大雅之堂做法:練習(xí)函數(shù)之間用參數(shù)傳遞數(shù)據(jù)的常規(guī)形式,盡量避免使用全局數(shù)據(jù)18:17:5915例如:對于矩

7、陣的輸入、處理和輸出vectorvector a; / global Datavoid input ( );void transpose ( );void print ( );int main ( ) input ( ); / using a transpose ( ); / using a print ( ); / using a18:17:5916消去全局數(shù)據(jù):前一個過程的輸出作為后一個過程的輸入typedef vectorvector Mat ; Mat input ( ) ;Mat transpose ( const Mat& a) ;void print ( const Mat& a

8、 ) ;int main ( ) print ( transpose ( input ( ) ) ) ;18:17:5917在多個程序文件組成的程序中共享數(shù)據(jù),要遵守一次定義規(guī)則/ item1.cpp#includeusing namespace std ;int n = 8 ; / define void f ( ) ;int main ( ) coutn”n”; f ( ) ;/ item2.cpp#includeusing namespace std ;extern int n ; / declarevoid f ( ) coutn”n”; 18:17:59184. 靜態(tài)數(shù)據(jù) ( Sta

9、tic Data )靜態(tài)全局數(shù)據(jù):在一個程序文件中共享的數(shù)據(jù)注意:全局數(shù)據(jù)則在多個程序文件中共享數(shù)據(jù)靜態(tài)局部數(shù)據(jù):在屢次調(diào)用的同一個函數(shù)中共享的數(shù)據(jù)18:17:5919演示靜態(tài)局部變量void func() static int a=2; a+; int b=5; b+; couta=a, b=bendl;int main() func(); func();/ a=3, b=6/ a=4, b=618:17:59205. 作用域與生命期 ( Scope & Lifetime )作用域:有很多種,變化最多的是局部作用域作用域遵守就近原則,它總是取用最貼近的名字,除非名字加前綴,則指特定區(qū)域的名字

10、生命期:實體一旦產(chǎn)生(定義)后,存活時間的度量作用域與生命期:作用域是編程規(guī)范,用于編譯時的語法檢查,生命期是程序運行中的實體存活度量,體現(xiàn)運行程序的內(nèi)在規(guī)律名字訪問遵守作用域規(guī)則,而作用域以實體存活為前提18:17:5921處于生命期中的實體總是能被安全訪問到,即使違背模塊的黑盒準則int* f() static int a=1; a+; return &a;int main() int* pa = f(); *pa = 8; /ok,但偷越到了函數(shù)f的局部區(qū) cout*pa“n”;/ 818:17:5922生命期消亡的實體,其空間位置上的訪問,得不到安全保證int* f() int a=1

11、; int* p=&a; return p; / a的生命期在此處消亡int main() int* pa = f(); cout*pa“n”; cout*pa“n”;/ 1/ 419883018:17:5923. 名空間 ( namespace )名空間:解決名字沖突的方法所有名字都有空間歸屬,在一定的空間中,名字是不允許沖突的引用一個名字時,加上空間歸屬的前綴,就可以唯一確定該名字所對應(yīng)的實體無前綴名字:很多時候,名字都是無前綴的,這是因為事先已經(jīng)指定了默認名字空間如果默認名空間在兩個以上,則必須注意名字沖突的可能性18:17:5924名空間的使用/ 局部名空間默認#includeusin

12、g std:cout;using std:endl;/-int abs ( int a ) return a0 ? a : -a; /-int main ( ) int a = abs ( -5 ); / 使用自定義函數(shù) int b = std:abs ( -5 ); / 使用標準庫函數(shù) coutaendlbendl;18:17:59257. 預(yù)編譯 ( Pre-Compilation )預(yù)編譯:+在正式編譯前的準備工作,它包括文件的加盟、代碼的取舍、字符的替代等操作文件加盟由include指令引導(dǎo),代碼取舍由ifdef或ifndef引導(dǎo),字符替代功能在逐漸退化,因為+語言本身完全可以勝任這項工作18:17:5926頭文件的可嵌套性,使得必須人為控制文件的展開操作,這就是頭文件衛(wèi)士的由來(x.cpp中將出現(xiàn)二次struct Date定義)/a.h#include”b.h”/ /x.cpp#include”a.h”#i

溫馨提示

  • 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論