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

下載本文檔

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

文檔簡介

一、程序設計方法

二、作用域或范圍scopel

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

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

d.多路逼近精益求精多路逼近是考慮具體問題存在多種解決途徑,此路不通換一種思路,通??偸菚嬖诟玫耐黄品椒ǎ痪媲缶珓t是把高頻運用的代碼最優(yōu)化,關鍵的控制變量簡化到最少。5模塊劃分是一個從頂向下的設計過程。頂層是一個主模塊,用于程序流程的總控,在交互式編程模式該模塊由一個內(nèi)嵌分支選擇結構的無窮循環(huán)構成。主模塊下直接監(jiān)控下一層的若干模塊,下層的每一模塊各自分管不同的模塊。每一相對獨立的模塊可分別調試。 模塊本身的功能是相對獨立的,但模塊之間的聯(lián)系是布局階段應該重點考慮的內(nèi)容。模塊之間的聯(lián)系稱為耦合。耦合關系總的分為兩種,一種是控制耦合,另一種是數(shù)據(jù)耦合。6模塊化程序設計是匯編語言、C語言和FORTRAN語言強調的編程要領,也是面向對象的編程指南,程序設計應該遵循的一些基本原則:

大的模塊盡量分成若干線性無關的獨立模塊

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

模塊的入口或出口盡量簡單歸一

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

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

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

a.從簡單的問題入手

b.從易到難各個擊破

c.由分到合整體組裝

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

標識符與名稱作為同義詞使用,作用域或作用范圍是名稱在程序中可以有效索引、適當操作的特定區(qū)域,名稱的作用域開始于該名稱的聲明或定義處,結束于相應的程序段。1.局部作用域在一個程序塊內(nèi)引入的名稱僅在此塊中以及包含在此塊中的塊內(nèi)是可訪問的,且僅有效于從定義開始處直到其匹配的右花括號“}”之間.局部作用域中定義的變量稱為局部變量.程序塊由括在花括號{}中的0個或多個語句構成,一個程序塊整體相當于一條語句。單條語句可以出現(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作用域到此結束17前面的執(zhí)行語句序列1不識別其后引入的名稱b,c,d,s,u,后面的執(zhí)行語句序列3識別前面同層程序段引入的名稱type,sa,value,parm,a,b,c,d,s,u。函數(shù)的形參(在函數(shù)標題頭內(nèi)定義的參量)的作用域認為是在函數(shù)體的最外層塊的作用域內(nèi)。函數(shù)形參value和parm對于整個函數(shù)體都是可訪問的。函數(shù)形參就是定義在接口堆??臻g的局部變量,函數(shù)型參中的局部變量不可以與函數(shù)體中同層的局部變量相同。18程序塊可以嵌套,靈活地引入變量可以對這些變量的范圍和可見性施以準確的控制。函數(shù)的實現(xiàn)部分或定義體就是由一對花括號{}包含的,程序塊常用于選擇語句或循環(huán)語句的基本執(zhí)行語句部分中。在一個程序塊內(nèi)定義的變量或標識名稱其可見性局限于花括號{}之內(nèi)的后續(xù)部分。如上typedef引入類的別名和struct引入的結構名作用范圍介于函數(shù)體中。19關于for初始化表達式中的作用域(C89不支持這種格式)

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

20在微軟vc6.0中變量k的有效索引范圍擴展到包含for語句的最近的程序塊,即語句塊{...;for(intk=0;e2;e3){s;}...}相當于{;...;intk;for(k=0;e2;e3){s;}...k此處有效...;}。在變量的作用范圍內(nèi),不要為一個變量進行兩次的存儲空間分配。在BorlandC++Builder5.0中,變量k的作用域僅局限于循環(huán)體語句,超出花括號之外或單條循環(huán)體語句之外,名稱k就成為沒有定義的變量。即:{...;for(intk=0;e2;e3){s;}...}語句塊相當于{...;{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;]導致變量k兩次定義cout<<k<<"\n";} //為了程序可移植性應回避作用域不確定的方法。22這樣:

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

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

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

名稱的作用域限定著其在該范圍的可操作性,可見性進一步明確作用域中名稱的實際有效性或優(yōu)先索引性。通常作用域與可見性是一致的,但復合語句的嵌套結構和在任何位置都可引入變量的靈活特點,導致內(nèi)層語句塊中的變量覆蓋外層的同名變量.C/C++名稱搜尋次序為:首先索引內(nèi)層變量或名稱的定義,如果內(nèi)層程序塊中變量或名

溫馨提示

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

評論

0/150

提交評論