




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
11:17:001程序結(jié)構(gòu):使程序得以運(yùn)行的框架組織便是程序結(jié)構(gòu),對程序結(jié)構(gòu)的研究,是為了更好地表達(dá)算法思想,使其符合編譯邏輯,又具有更好的可讀性和可維護(hù)性學(xué)習(xí)目標(biāo):
1.從簡單的函數(shù)層層調(diào)用,初步理解C++程序結(jié)構(gòu)
2.學(xué)習(xí)合理組織程序的規(guī)則與經(jīng)驗(yàn),掌握擴(kuò)展程序規(guī)模的基本方法11:17:002第七章內(nèi)容
函數(shù)組織(FunctionOrganization)
頭文件(HeaderFiles)
全局?jǐn)?shù)據(jù)(GlobalData)
靜態(tài)數(shù)據(jù)(StaticData)
作用域與生命期(Scope&Lifetime)
名空間(namespace)
預(yù)編譯(Pre-Compilation)
11:17:0031.函數(shù)組織(FunctionOrganization)函數(shù):對輸入?yún)?shù)負(fù)責(zé),埋頭做自己的事,最終返回結(jié)果函數(shù)組織:通過在函數(shù)中進(jìn)行函數(shù)調(diào)用來擴(kuò)展運(yùn)行的規(guī)模,層層疊疊的函數(shù)構(gòu)成樹結(jié)構(gòu)做法:將若干個函數(shù)組織成文件,又將若干個文件構(gòu)成程序的辦法來進(jìn)行編程分工11:17:004對如下的函數(shù)調(diào)用關(guān)系,進(jìn)行文件劃分mainf2f1f3g1g2hp文件1文件2文件311:17:0052.頭文件(HeaderFiles)原始頭文件:作為共同開發(fā)的項(xiàng)目,為了共享彼此的過程資源(函數(shù)),將全體函數(shù)聲明放在一個共用的頭文件中界面頭文件:界定模塊可用資源(函數(shù),數(shù)據(jù),類型等)(可由一個或幾個頭文件組合,其實(shí)現(xiàn)由他人提供),或提供他人使用的模塊資源.它是由軟件工程師分發(fā)的、以規(guī)范項(xiàng)目開發(fā)為目的的資源文件做法:練習(xí)劃分函數(shù)組,模仿學(xué)習(xí)構(gòu)造頭文件,并注意頭文件的應(yīng)含內(nèi)容11:17:006//abc.hvoidf1();voidf2();voidf3();voidg1();voidg2();voidp();voidh();原始頭文件
(包含Page5的圖中的一切函數(shù)聲明)11:17:007頭文件的使用:使函數(shù)調(diào)用免于聲明//a1.cpp#include”abc.h”voidf1(){
if(…){p();g1();else{g2();h();}}11:17:008頭文件的使用:使函數(shù)調(diào)用免于聲明//a2.cpp#include”abc.h”intmain(){f1();f2();f3();}//-------voidf3(){f1();}//-------voidp(){f3();}//-------11:17:009頭文件的使用:使函數(shù)調(diào)用免于聲明//a3.cpp#include”abc.h”voidh(){…}voidf2(){g1();g2();}//-------voidg1(){…}voidg2(){…}11:17:0010界面頭文件//a1.ha1.cpp提供的資源voidf1();//a2.h
a2.cpp提供的資源voidp();//a3.h
a3.cpp提供的資源voidg1();voidg2();voidf2();voidh();
11:17:0011//a1.cpp#include”a2.h”#include”a3.h”voidf1(){
if(…){p();g1();
}else{g2();h();}}使用界面頭文件11:17:0012//a2.cpp#include”a1.h”#include”a3.h”staticvoidf3();intmain(){f1();f2();f3();}voidf3(){f1();}voidp(){f3();}使用界面頭文件11:17:0013//a3.cpp#include”a3.h”voidh(){…}voidf2(){g1();g2();}voidg1(){…}voidg2(){…}使用界面頭文件頭文件的嵌套引用//a1.ha1.cpp提供的資源voidf1();//a2.h
a2.cpp提供的資源#include<a1.h>voidp();//a3.ha1.cpp提供的資源#include<a1.h>//第1次包含a1.h#include<a2.h>//第2次包含a1.h11:17:0014如何避免頭文件嵌套引用#ifndef__A3_H__#define__A3_H__//a3.ha1.cpp提供的資源#include<a1.h>//第1次包含a1.h#include<a2.h>//這里不會再次包含a1.h#endif//__A2_H__11:17:0015//a1.ha1.cpp提供的資源#ifndef__A1_H__#define__A1_H__voidf1();#endif//__A1_H__//a2.h
a2.cpp提供的資源#ifndef__A2_H__#define__A2_H__#include<a1.h>voidp();#endif//__A2_H__11:17:00163.全局?jǐn)?shù)據(jù)(GlobalData)全局?jǐn)?shù)據(jù):使若干個模塊在程序范圍內(nèi)共享(讀與寫)數(shù)據(jù),是若干程序文件溝通數(shù)據(jù)的一種形式意義:模塊的獨(dú)立性由數(shù)據(jù)的封閉性來支持.全局?jǐn)?shù)據(jù)破壞了數(shù)據(jù)的封閉性,因而對小程序簡單而對規(guī)范化程序則不登大雅之堂做法:練習(xí)函數(shù)之間用參數(shù)傳遞數(shù)據(jù)的常規(guī)形式,盡量避免使用全局?jǐn)?shù)據(jù)11:17:0017例如:對于矩陣的輸入、處理和輸出vector<vector<int>>a;//globalDatavoidinput();voidtranspose();voidprint();intmain(){input();//usingatranspose();//usingaprint();//usinga}11:17:0018消去全局?jǐn)?shù)據(jù):前一個過程的輸出作為后一個過程的輸入typedefvector<vector<int>>Mat;Matinput();Mattranspose(constMat&a);voidprint(constMat&a);intmain(){print(transpose(input()));}11:17:0019在多個程序文件組成的程序中共享數(shù)據(jù),
//item1.cpp#include<iostream>usingnamespacestd;intn=8;//define
voidf();intmain(){cout<<n<<”\n”;f();}//item2.cpp#include<iostream>usingnamespacestd;externintn;//declarevoidf(){cout<<n<<”\n”;}一次定義規(guī)則11:17:0020//item1.cpp#include<iostream>usingnamespacestd;intn=8;//define
voidf();intmain(){cout<<n<<”\n”;f();}//item2.cpp#include<iostream>usingnamespacestd;externintn=8;//declarevoidf(){cout<<n<<”\n”;}全局常量//file1.cppconstintROWS=10;constintCOLUMNS=10;Intmain(){intarr[ROWS][COLUMNS];for(intI=0;I<ROWS;i++) for(intj=0;j<COLUMNS;j++) …}11:17:0021優(yōu)點(diǎn):
數(shù)值改動簡單缺點(diǎn):
每次修改需要重新編譯程序改進(jìn)方法:
使用向量11:17:00224.靜態(tài)數(shù)據(jù)(StaticData)靜態(tài)全局?jǐn)?shù)據(jù):在一個程序文件中共享的數(shù)據(jù).注意:全局?jǐn)?shù)據(jù)則在多個程序文件中共享數(shù)據(jù)靜態(tài)局部數(shù)據(jù):在屢次調(diào)用的同一個函數(shù)中共享的數(shù)據(jù)11:17:0023演示靜態(tài)全局變量(1)voidfunc(){a++;
intb=5;b++;cout<<"a="<<a<<",b="<<b<<endl;}staticinta=2;intmain(){func();func();}11:17:0024演示靜態(tài)全局變量(2)//file1.cppstaticinta=2;intmain(){ cout<<“a=“<<a<<endl;}//file2.cppexterninta;voidfunc(){ cout<<“a=“<<a<<endl;}11:17:0025演示靜態(tài)局部變量voidfunc(){
staticinta=2;a++;
intb=5;b++;cout<<"a="<<a<<",b="<<b<<endl;}intmain(){func();func();}//a=3,b=6//a=4,b=611:17:00265.作用域與生命期(Scope&Lifetime)作用域:有很多種,變化最多的是局部作用域.作用域遵守就近原則,它總是取用最貼近的名字,除非名字加前綴,則指特定區(qū)域的名字生命期:實(shí)體一旦產(chǎn)生(定義)后,存活時間的度量作用域與生命期:作用域是編程規(guī)范,用于編譯時的語法檢查,生命期是程序運(yùn)行中的實(shí)體存活度量,體現(xiàn)運(yùn)行程序的內(nèi)在規(guī)律.名字訪問遵守作用域規(guī)則,而作用域以實(shí)體存活為前提11:17:0027處于生命期中的實(shí)體總是能被安全訪問到,即使違背模塊的黑盒準(zhǔn)則int*f(){
staticinta=1;a++;
return&a;}intmain(){
int*pa=f();*pa=8;//ok,但偷越到了函數(shù)f的局部區(qū)
cout<<*pa<<“\n”;}//811:17:0028生命期消亡的實(shí)體,其空間位置上的訪問,得不到安全保證int*f(){
inta=1;
int*p=&a;
returnp;}//a的生命期在此處消亡intmain(){
int*pa=f();cout<<*pa<<“\n”;cout<<*pa<<“\n”;}//1//4198830交叉作用域與解決措施inta=3;voidfn(){inta=4;{inta=6;cout<<a;}}11:17:002911:17:00306.名空間(namespace)名空間:解決名字沖突的方法.所有名字都有空間歸屬,在一定的空間中,名字是不允許沖突的.引用一個名字時,加上空間歸屬的前綴,就可以唯一確定該名字所對應(yīng)的實(shí)體無前綴名字:很多時候,名字都是無前綴的,這是因?yàn)槭孪纫呀?jīng)指定了默認(rèn)名字空間.如果默認(rèn)名空間在兩個以上,則必須注意名字沖突的可能性11:17:0031名空間的使用//局部名空間默認(rèn)#include<iostream>usingstd::cout;usingstd::endl;//-------------------------------------intabs(inta){returna>0?a:-a;}//-------------------------------------intmain(){
inta=abs(-5);//使用自定義函數(shù)
intb=std::abs(-5);//使用標(biāo)準(zhǔn)庫函數(shù)
cout<<a<<endl<<b<<endl;}11:17:0032名空間的組織//局部名空間默認(rèn)namespacemyswap;Intn=10;voidswap(
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合伙經(jīng)營股票合同范例
- 游泳池承包經(jīng)營合同范本
- 勞務(wù)合同范本美團(tuán)外賣
- 出口公司合同范本
- 北京市預(yù)付卡合同范本
- 業(yè)主變更合同范本
- 寫公司合同范本
- 吊車裝租賃合同范例
- 衛(wèi)生護(hù)理合同范本
- 單層彩鋼瓦采購合同范本
- 滁州城市職業(yè)學(xué)院單招《職業(yè)技能測試》參考試題庫(含答案)
- 基于單片機(jī)控制的充電樁設(shè)計(jì)
- SB-T 11238-2023 報(bào)廢電動汽車回收拆解技術(shù)要求
- 鋰電池正極材料行業(yè)分析
- 國家級省級化工園區(qū)列表
- 肩關(guān)節(jié)脫位手法復(fù)位課件
- 汽車懸架概述
- 中藥飲片處方審核培訓(xùn)課件
- 周圍靜脈輸液操作并發(fā)癥的預(yù)防及處理
- 北師版四下數(shù)學(xué)數(shù)學(xué)好玩教材分析公開課課件教案
- 二人合伙開寵物店協(xié)議書(5篇)
評論
0/150
提交評論