一、程序設(shè)計(jì)方法二、作用域或范圍scopel三、可見性與名稱_第1頁(yè)
一、程序設(shè)計(jì)方法二、作用域或范圍scopel三、可見性與名稱_第2頁(yè)
一、程序設(shè)計(jì)方法二、作用域或范圍scopel三、可見性與名稱_第3頁(yè)
一、程序設(shè)計(jì)方法二、作用域或范圍scopel三、可見性與名稱_第4頁(yè)
一、程序設(shè)計(jì)方法二、作用域或范圍scopel三、可見性與名稱_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

一、程序設(shè)計(jì)方法

二、作用域或范圍scopel

三、可見性與名稱隱藏第7章程序的結(jié)構(gòu)1一、程序設(shè)計(jì)方法程序的結(jié)構(gòu)是指程序組織、函數(shù)安排、變量?jī)?nèi)存分配、數(shù)據(jù)的流動(dòng)與信息共享等問題。程序首先由源程序構(gòu)成,大的程序常分解為一個(gè)個(gè)相對(duì)較小的源程序,每一較小的源程序又細(xì)分為若干個(gè)功能獨(dú)立的函數(shù)。編譯和連接器把分散的獨(dú)立的模塊有機(jī)的組合起來,形成一個(gè)正常運(yùn)行的可執(zhí)行文件。掌握作用域、可見性、生存期和外部連接屬性、靜態(tài)存儲(chǔ)屬性這些基本概念是開發(fā)軟件的必備功底。21.自頂向下的程序設(shè)計(jì)

現(xiàn)代科學(xué)最重要的技巧就是折零,把復(fù)雜的問題分解成盡可能簡(jiǎn)單的細(xì)小部分。自頂向下的模塊化處理正是這一手法在程序設(shè)計(jì)行業(yè)的一個(gè)運(yùn)用。自頂向下的程序設(shè)計(jì)是一個(gè)總體設(shè)計(jì)的過程,是從一般到具體的設(shè)計(jì)過程。3涉及到的概念:a.明確軟件的目標(biāo)軟件的目標(biāo)是用戶的直接需要也是程序員創(chuàng)造的原動(dòng)力,軟件的目標(biāo)確定程序的規(guī)模、軟件的方案與資源配置,不編寫與軟件目標(biāo)無關(guān)的代碼。b.制定整體規(guī)劃設(shè)計(jì)整體規(guī)劃設(shè)計(jì)是周密安排數(shù)據(jù)結(jié)構(gòu)與算法的恰當(dāng)分層和協(xié)調(diào)呼應(yīng)。復(fù)雜的體系簡(jiǎn)約為盡量線性無關(guān)的簡(jiǎn)單構(gòu)架,在各種可能的細(xì)分層次中尋求簡(jiǎn)單明了的布局實(shí)現(xiàn)。4c.化整為零適當(dāng)細(xì)化化整為零適當(dāng)細(xì)化是在整體框架的層次結(jié)構(gòu)確定以后,為整體設(shè)計(jì)的每一個(gè)獨(dú)立部分設(shè)計(jì)具體的算法和數(shù)據(jù)結(jié)構(gòu),以及不同層次之間數(shù)據(jù)的協(xié)商關(guān)系。

d.多路逼近精益求精多路逼近是考慮具體問題存在多種解決途徑,此路不通換一種思路,通??偸菚?huì)存在更好的突破方法;精益求精則是把高頻運(yùn)用的代碼最優(yōu)化,關(guān)鍵的控制變量簡(jiǎn)化到最少。5模塊劃分是一個(gè)從頂向下的設(shè)計(jì)過程。頂層是一個(gè)主模塊,用于程序流程的總控,在交互式編程模式該模塊由一個(gè)內(nèi)嵌分支選擇結(jié)構(gòu)的無窮循環(huán)構(gòu)成。主模塊下直接監(jiān)控下一層的若干模塊,下層的每一模塊各自分管不同的模塊。每一相對(duì)獨(dú)立的模塊可分別調(diào)試。 模塊本身的功能是相對(duì)獨(dú)立的,但模塊之間的聯(lián)系是布局階段應(yīng)該重點(diǎn)考慮的內(nèi)容。模塊之間的聯(lián)系稱為耦合。耦合關(guān)系總的分為兩種,一種是控制耦合,另一種是數(shù)據(jù)耦合。6模塊化程序設(shè)計(jì)是匯編語言、C語言和FORTRAN語言強(qiáng)調(diào)的編程要領(lǐng),也是面向?qū)ο蟮木幊讨改?,程序設(shè)計(jì)應(yīng)該遵循的一些基本原則:

大的模塊盡量分成若干線性無關(guān)的獨(dú)立模塊

模塊盡量順序往下執(zhí)行或跳轉(zhuǎn)(特別在使用goto語句或匯編接口的jmp指令時(shí))

模塊的入口或出口盡量簡(jiǎn)單歸一

模塊的嵌套層次盡量以少為優(yōu)(嵌套包括函數(shù)調(diào)用的嵌套和選擇與循環(huán)之間的嵌套)

一個(gè)模塊或函數(shù)的源代碼控制在3個(gè)page之內(nèi)7模塊A模塊B模塊C主模塊模塊Ai模塊Aj模塊Bk模塊Cm模塊Cn模塊Cx模塊Gb模塊Ga模塊Gc模塊Gi模塊Gj模塊Gk層次圖示例8上面用方塊圖表示的模塊之間的關(guān)系為層次圖。主模塊調(diào)用子模塊A、B、C,而其中的子模塊A調(diào)用下層的模塊Ai、Aj。次下層的模塊Ga是被上層的A模塊序列共同調(diào)用的模塊,因此這樣的模塊稱為隸屬于上層A模塊的公共模塊。同樣地Gb、Gc分別是上層B或C模塊序列的公共模塊。最下層的模塊Gi、Gj和Gk則是所有上層共享的模塊。92.從下往上的程序設(shè)計(jì)

從下往上的程序設(shè)計(jì)是一種從簡(jiǎn)單到復(fù)雜的過程。這是一種返樸歸真的設(shè)計(jì)過程,同時(shí)也是新手邁入軟件殿堂的直接方便法門。從下往上的程序設(shè)計(jì)主要的步驟為:

a.從簡(jiǎn)單的問題入手

b.從易到難各個(gè)擊破

c.由分到合整體組裝

d.由簡(jiǎn)到繁層層派生10復(fù)雜的問題是由簡(jiǎn)單的事物組合成的,因此從簡(jiǎn)單的問題入手就顯得尤為重要,首先解決簡(jiǎn)單問題的算法和數(shù)據(jù)結(jié)構(gòu),確定簡(jiǎn)單問題的函數(shù)實(shí)現(xiàn)和相應(yīng)的數(shù)據(jù)接口。簡(jiǎn)單的問題解決之后,便可以面對(duì)略為困難的問題,一步一步地從易到難各個(gè)擊破,相應(yīng)的算法和數(shù)據(jù)結(jié)構(gòu)隨之由少到多的豐富。接著是由分到合整體組裝的過程,一個(gè)個(gè)分散的獨(dú)立的程序編好后,把所有的模塊組裝起來形成整體可以運(yùn)行的程序。113.結(jié)構(gòu)化程序設(shè)計(jì)模塊化強(qiáng)調(diào)功能的細(xì)分,將大的模塊分為若干基本模塊,這些模塊形成上層調(diào)用下層的控制結(jié)構(gòu)。 結(jié)構(gòu)化程序設(shè)計(jì)重點(diǎn)是關(guān)于一個(gè)模塊的邏輯清晰的組織方式。一個(gè)模塊由七種基本控制結(jié)構(gòu)組成,即順序結(jié)構(gòu)、三種選擇結(jié)構(gòu)和三種循環(huán)結(jié)構(gòu),基本控制結(jié)構(gòu)可以視為單一的語句塊融入模塊中,通過七種控制結(jié)構(gòu)的適當(dāng)?shù)呐帕薪M合嵌套實(shí)現(xiàn)。 結(jié)構(gòu)化程序設(shè)計(jì)限制其它形式的流程控制形式,特別是goto語句。goto語句跳轉(zhuǎn)的目的直接,當(dāng)goto語句從較深的內(nèi)層的控制結(jié)構(gòu)中向外向下跳轉(zhuǎn)時(shí),比其它形式的控制轉(zhuǎn)向具有更快捷明了的特點(diǎn)。124.多文件結(jié)構(gòu)模塊化設(shè)計(jì)的特點(diǎn)自然導(dǎo)致多文件的組織形式。每一個(gè)源文件中包含一到多個(gè)函數(shù),這些函數(shù)構(gòu)成源程序。出現(xiàn)在程序中的名稱都遵循先聲明后索引的原則,函數(shù)的定義和變量的定義必須存在且在各自的范圍內(nèi)唯一的存在。聲明型的語句放置在*.h頭文件中,函數(shù)和變量定義放置在實(shí)現(xiàn)文件*.cpp中。把一個(gè)龐大的源程序分解為容易處理的許多相對(duì)小的文件符合分層管理的原則;一個(gè)較小的源文件編譯后形成*.obj目標(biāo)模塊,這些分別編譯的*.obj目標(biāo)模塊連接后構(gòu)成*.exe執(zhí)行文件。多文件結(jié)構(gòu)常通過工程文件.prj或.dsw來組織。13#include<stdio.h>#include"A.h"voidmain(void){printf("%d\n",k);}//A.cppA.hA.cppA.objB.hB.cppB.objC.hC.cppC.obj*.libx.exe連接預(yù)處理編譯14模塊化設(shè)計(jì)的特點(diǎn)自然導(dǎo)致多文件的組織形式。每一個(gè)源文件中包含一到多個(gè)函數(shù),這些函數(shù)構(gòu)成源程序。出現(xiàn)在程序中的名稱都遵循先聲明后索引的原則,函數(shù)的定義和變量的定義必須存在且在各自的范圍內(nèi)唯一的存在。聲明型的語句放置在*.h頭文件中,函數(shù)和變量定義放置在實(shí)現(xiàn)文件*.cpp中。把一個(gè)龐大的源程序分解為容易處理的許多相對(duì)小的文件符合分層管理的原則。大的程序由此形成多文件結(jié)構(gòu)。一個(gè)較小的源文件編譯后形成*.obj目標(biāo)模塊,這些分別編譯的*.obj目標(biāo)模塊連接后構(gòu)成*.exe執(zhí)行文件。多文件結(jié)構(gòu)常通過工程文件.prj或.dsw來組織。15二、作用域或范圍scopel

標(biāo)識(shí)符與名稱作為同義詞使用,作用域或作用范圍是名稱在程序中可以有效索引、適當(dāng)操作的特定區(qū)域,名稱的作用域開始于該名稱的聲明或定義處,結(jié)束于相應(yīng)的程序段。1.局部作用域在一個(gè)程序塊內(nèi)引入的名稱僅在此塊中以及包含在此塊中的塊內(nèi)是可訪問的,且僅有效于從定義開始處直到其匹配的右花括號(hào)“}”之間.局部作用域中定義的變量稱為局部變量.程序塊由括在花括號(hào){}中的0個(gè)或多個(gè)語句構(gòu)成,一個(gè)程序塊整體相當(dāng)于一條語句。單條語句可以出現(xiàn)的地方程序塊也可以出現(xiàn)。16程序塊包括函數(shù)體具有語法格式為:voidfunct(intvalue,long&parm){typedeflongtype;structsa{intk;intn;};intadd(int,int);typea=add(1,2);執(zhí)行語句序列1;type&b=a;執(zhí)行語句序列2;typec,&d=c;sas,&u=s;執(zhí)行語句序列3;}//value,parm,type,sa,a,b,c,d,s,u,add作用域到此結(jié)束17前面的執(zhí)行語句序列1不識(shí)別其后引入的名稱b,c,d,s,u,后面的執(zhí)行語句序列3識(shí)別前面同層程序段引入的名稱type,sa,value,parm,a,b,c,d,s,u。函數(shù)的形參(在函數(shù)標(biāo)題頭內(nèi)定義的參量)的作用域認(rèn)為是在函數(shù)體的最外層塊的作用域內(nèi)。函數(shù)形參value和parm對(duì)于整個(gè)函數(shù)體都是可訪問的。函數(shù)形參就是定義在接口堆棧空間的局部變量,函數(shù)型參中的局部變量不可以與函數(shù)體中同層的局部變量相同。18程序塊可以嵌套,靈活地引入變量可以對(duì)這些變量的范圍和可見性施以準(zhǔn)確的控制。函數(shù)的實(shí)現(xiàn)部分或定義體就是由一對(duì)花括號(hào){}包含的,程序塊常用于選擇語句或循環(huán)語句的基本執(zhí)行語句部分中。在一個(gè)程序塊內(nèi)定義的變量或標(biāo)識(shí)名稱其可見性局限于花括號(hào){}之內(nèi)的后續(xù)部分。如上typedef引入類的別名和struct引入的結(jié)構(gòu)名作用范圍介于函數(shù)體中。19關(guān)于for初始化表達(dá)式中的作用域(C89不支持這種格式)

C++(C99)中for循環(huán)的第一個(gè)表達(dá)式中可以引進(jìn)變量,其間引入的變量為局部變量,相當(dāng)于這些變量緊臨在for語句前剛定義。對(duì)于for(intk=0;e2;e3){s;}語句,變量k的有效索引區(qū)域即是變量k的作用域,這個(gè)變量的作用域隨編譯器不同而存在細(xì)微的差異。

20在微軟vc6.0中變量k的有效索引范圍擴(kuò)展到包含for語句的最近的程序塊,即語句塊{...;for(intk=0;e2;e3){s;}...}相當(dāng)于{;...;intk;for(k=0;e2;e3){s;}...k此處有效...;}。在變量的作用范圍內(nèi),不要為一個(gè)變量進(jìn)行兩次的存儲(chǔ)空間分配。在BorlandC++Builder5.0中,變量k的作用域僅局限于循環(huán)體語句,超出花括號(hào)之外或單條循環(huán)體語句之外,名稱k就成為沒有定義的變量。即:{...;for(intk=0;e2;e3){s;}...}語句塊相當(dāng)于{...;{intk;for(k=0;e2;e3){s;}}...k此處無效...}。21[例]初始化語句中引入的局部變量的作用范圍#include<iostream.h>voidmain(){ for(intk=0;k<100;++k)cout<<k<<"\n";cout<<k<<"1.\n";//在Builder5.0中此處的變量k是沒有定義的變量for(intk=100;k>=0;--k)//vc6.0中[intk=100;]導(dǎo)致變量k兩次定義cout<<k<<"\n";} //為了程序可移植性應(yīng)回避作用域不確定的方法。22這樣:

在Builder5.0中去掉語句[cout<<k<<“1.\n”;]則得到正確的程序.

在vc6.0中去掉int改為for(k=100;k>=0;--k)則ok。在Builder5.0中運(yùn)行相關(guān)程序遇到變量k無定義的提示時(shí),可將for(intk=0;e2;e3){s;}語句改為intk;for(k=0;e2;e3){s;}。232.函數(shù)作用域 標(biāo)號(hào)是唯一具有函數(shù)作用域的名稱。標(biāo)號(hào)常與goto語句配合使用,在一個(gè)語句前放置一個(gè)彼此不同名的標(biāo)號(hào)不影響程序的運(yùn)行,它們可在一個(gè)函數(shù)內(nèi)的任意位置使用,但在函數(shù)外部則不能訪問。變量名、標(biāo)號(hào)名屬于不同的名稱空間,因此可以并行不背地使用。24[例]標(biāo)號(hào)名在一個(gè)特殊的名稱空間#include<iostream.h>voidmain(void){charchs;constintn=8;for(intk=0;k<n;k++){if(k%2)gotok;//標(biāo)號(hào)k與變量k同名 chs='a'+k;goton;//標(biāo)號(hào)n與常量n同名k:chs='A'+k;n:cout<<chs<<""; } }//輸出:aBcDeFgH253.函數(shù)原型作用域在函數(shù)原型中聲明的名稱其作用域位于兩個(gè)圓括號(hào)之間,在其它位置無法訪問到原型中的標(biāo)識(shí)符,實(shí)際上原型中的標(biāo)識(shí)符是可有可無的,但給函數(shù)原型的形參一個(gè)容易理解、記憶的標(biāo)識(shí)符增加程序的可讀性。以下原型聲明了三個(gè)名稱(s1,s2,m),這些名稱在原型結(jié)尾處便超出作用域了:char*f(char*s1,constchar*s2,intm);//不能寫成char*f(char*s,constchar*s,intm);函數(shù)原型可寫成抽象的形式,特別當(dāng)形參中的參數(shù)很多使得一行容納不下函數(shù)的原型時(shí):char*f(char*,constchar*,int);264.類作用域類作用域是指類的成員名等可有效訪問的范圍.結(jié)構(gòu)聲明和變量定義: structCPoint{floatx;floaty;};inty;5.文件作用域任何在函數(shù)或類的外部引進(jìn)的名稱具有文件作用域或全局作用范圍,其作用域開始于定義處或聲明處,直到文件的結(jié)束。函數(shù)名和在函數(shù)體外引入的結(jié)構(gòu)名具有全局作用范圍。在文件作用域定義的變量稱為全局變量,全局變量在定義之后源文件剩余部分不同程序塊或函數(shù)體的任何位置均可訪問,除非被內(nèi)層塊同樣的名稱所覆蓋。27全局變量(包括靜態(tài)全局變量)在全局范圍,局部變量在局部范圍,在同一范圍的變量名不能相同。不同函數(shù)體中的名稱屬于不同的局部范圍,彼此毫不相干。 在一個(gè)程序段,全局變量可以與局部變量名相同,系統(tǒng)優(yōu)先采用局部變量名。 函數(shù)形參的數(shù)據(jù)傳遞經(jīng)過堆??臻g進(jìn)行,堆??臻g中的數(shù)據(jù)是動(dòng)態(tài)變化的。全局?jǐn)?shù)據(jù)可以被不同函數(shù)共享。因此程序設(shè)計(jì)中把一些關(guān)鍵的數(shù)據(jù)設(shè)置成全局變量,但全局變量越少越好。 28定義全局變量可同時(shí)指定初始值時(shí),若沒有指定初始值,則全局變量具有0值。初始值可以是一個(gè)可以求值的表達(dá)式,甚至是函數(shù)調(diào)用。全局作用范圍中可以通過初始化語句實(shí)施特定的運(yùn)算,但不可以出現(xiàn)獨(dú)立的執(zhí)行語句。獨(dú)立的執(zhí)行語句只出現(xiàn)函數(shù)體中。例如:

intg_var=1;在全局范圍不可以分開寫成:intg_var;g_var=1; 29三、可見性與名稱隱藏

名稱的作用域限定著其在該范圍的可操作性,可見性進(jìn)一步明確作用域中名稱的實(shí)際有效性或優(yōu)先索引性。通常作用域與可見性是一致的,但復(fù)合語句的嵌套結(jié)構(gòu)和在任何位置都可引入變量的靈活特點(diǎn),導(dǎo)致內(nèi)層語句塊中的變量覆蓋外層的同名變量.C/C++名稱搜尋次序?yàn)椋菏紫人饕齼?nèi)層變量或名稱的定義,如果內(nèi)層程序塊中變量或名

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論