程序閱讀的藝術(shù)_第1頁
程序閱讀的藝術(shù)_第2頁
程序閱讀的藝術(shù)_第3頁
程序閱讀的藝術(shù)_第4頁
程序閱讀的藝術(shù)_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

程序的閱讀幾個(gè)問題程序設(shè)計(jì)這門課很難嗎?難在什么地方?進(jìn)入大學(xué),要學(xué)會(huì)什么?學(xué)會(huì)做人;學(xué)會(huì)思維;學(xué)會(huì)知識(shí)。作為一個(gè)計(jì)算機(jī)科學(xué)的人材,應(yīng)該具有什么樣的能力?對(duì)于計(jì)算機(jī)科學(xué)與技術(shù)學(xué)科的人才來說,發(fā)展幾個(gè)方面的專業(yè)能力是非常重要的:⑴計(jì)算思維能力 抽象思維能力、邏輯思維能力⑵算法設(shè)計(jì)與分析能力⑶程序設(shè)計(jì)能力⑷計(jì)算系統(tǒng)的認(rèn)知、分析、設(shè)計(jì)和應(yīng)用能力程序的非物理特性按照唯物論的觀點(diǎn),人們認(rèn)識(shí)事物是從感性認(rèn)識(shí)再到理性認(rèn)識(shí),是先有感性認(rèn)識(shí),后有理性認(rèn)識(shí)。然而,對(duì)于計(jì)算機(jī)程序設(shè)計(jì)來說,要獲得感性認(rèn)識(shí)是很難的。所謂程序的非物理特性就是沒有直觀性,或者說直觀性的程度極低。計(jì)算機(jī)科學(xué)與技術(shù)學(xué)科的人都有這樣的體會(huì),當(dāng)我們第一次學(xué)習(xí)用一種(高級(jí)程序設(shè)計(jì))語言編寫第一個(gè)程序時(shí),我們會(huì)感到莫大的困難。當(dāng)一個(gè)老師教學(xué)生學(xué)寫每一個(gè)程序時(shí),也感到困難重重。而且這種困難要比我們?nèi)プ鲆粋€(gè)基本的物理、化學(xué)實(shí)驗(yàn),去學(xué)習(xí)安裝一臺(tái)收音機(jī)要大得多。另一個(gè)突出的例子是,在本科學(xué)習(xí)階段,操作系統(tǒng)原理和高級(jí)語言編譯原理是兩門最重要的專業(yè)課,應(yīng)該說受到了老師和學(xué)生廣泛的高度重視。因?yàn)檫@兩門課程不僅對(duì)學(xué)習(xí)掌握基本的系統(tǒng)很重要,更為學(xué)生真正開始建立系統(tǒng)的概念,形成計(jì)算機(jī)軟件系統(tǒng)的運(yùn)行模型,掌握本學(xué)科的一些基本方法都有具有重要的意義。但是,實(shí)際情況告訴我們,對(duì)大多數(shù)學(xué)生來說,當(dāng)他們學(xué)過這兩門課后,并不能馬上真正掌握這兩類系統(tǒng)。其根本原因是程序的非物理特性,這便使得計(jì)算機(jī)的初學(xué)者很難建立起計(jì)算機(jī)系統(tǒng)的有效模型,而這種模型沒有建立起來之前,進(jìn)行程序設(shè)計(jì)是很困難的。這里的程序包括微程序在內(nèi)的硬件系統(tǒng)的一些執(zhí)行程序。這種現(xiàn)象在其它學(xué)科是不存在的。例如,輪子、火箭是看得見、摸得到的,其發(fā)動(dòng)機(jī)的運(yùn)轉(zhuǎn)、動(dòng)力的傳遞也是清晰的。直觀性給了人們獲得感性認(rèn)識(shí)的基礎(chǔ),這是符合人類認(rèn)識(shí)的第一階段的基本要求的。而計(jì)算系統(tǒng)的運(yùn)行卻是看不見的。由于很難獲得感性認(rèn)識(shí),所以理性認(rèn)識(shí)就很難建立起來。如何克服程序的非物理特性給我們學(xué)習(xí)程序設(shè)計(jì)帶來的困難?或者說,如何跨越程序的非物理特性在我們獲得程序設(shè)計(jì)的理性認(rèn)識(shí)過程中所造成的障礙?所以,克服了初期困難的人都有這樣的經(jīng)驗(yàn),要想構(gòu)造一個(gè)計(jì)算機(jī)(軟件、硬件)系統(tǒng),設(shè)計(jì)者首先需要在自己的頭腦中形成這個(gè)系統(tǒng),并讓這個(gè)系統(tǒng)在自己的頭腦中運(yùn)行起來。而且系統(tǒng)的復(fù)雜性還在于要求我們讓這個(gè)系統(tǒng)在不同的抽象級(jí)別上運(yùn)行,同時(shí)還需要讓它的子系統(tǒng)分別運(yùn)行。由于這些運(yùn)行是在頭腦中運(yùn)行的,所以,高度的抽象思維和嚴(yán)密的邏輯思維是本學(xué)科特別強(qiáng)調(diào)的思維能力。程序閱讀的意義對(duì)于計(jì)算機(jī)程序的閱讀,克努特曾說過:通過閱讀他人的計(jì)算機(jī)程序獲得技巧,是極其重要,但在許許多多的計(jì)算機(jī)課程中這樣的訓(xùn)練卻可悲地被忽視了,因此導(dǎo)致了計(jì)算機(jī)極其糟糕地低效的使用。學(xué)習(xí)一種計(jì)算機(jī)程序設(shè)計(jì)語言,不管是匯編語言還是高級(jí)語言,一個(gè)重要而又常用的方法就是閱讀:閱讀書中的例題,閱讀別人寫的程序,更多的是閱讀自已寫的程序。就程序本身的意義來說:一個(gè)程序是“被閱讀”的。首先是被計(jì)算機(jī)閱讀,這是毫無疑義的,但更多是被人閱讀的。這時(shí)人充當(dāng)了機(jī)器的角色,也就是說,人要和機(jī)器閱讀程序一樣,給出每個(gè)語句(每條指令)執(zhí)行的結(jié)果。讓人去完成機(jī)器的工作,這對(duì)于人來說是十分艱苦的事情。但是,只有通過閱讀,才能加深對(duì)各種語句的語法和語義的理解,才能在后續(xù)的學(xué)習(xí)中,正確、靈活地運(yùn)用語句,編寫出高質(zhì)量的程序。因此,閱讀是學(xué)習(xí)一種高級(jí)語言的重要方法。程序閱讀的過程,其實(shí)就是在我們的頭腦中形成計(jì)算系統(tǒng)并讓這個(gè)系統(tǒng)運(yùn)行起來的過程。很顯然,這是一件很艱苦的工作。因?yàn)檫@項(xiàng)工作,需要嚴(yán)密的邏輯思維能力和高度抽象的思維能力——計(jì)算思維能力。(特別是對(duì)于初學(xué)者)因此,這也是培養(yǎng)和發(fā)展我們的計(jì)算思維能力的一個(gè)過程。閱讀的方法閱讀的目的是為了分析程序中的語句是如何實(shí)現(xiàn)算法的。對(duì)于一些較為復(fù)雜的程序,如果一開始就去分析每一個(gè)語句的功能,就很容易掉進(jìn)"迷宮",因此,在分析一個(gè)程序時(shí),應(yīng)該先分析程序的結(jié)構(gòu),然后再對(duì)每個(gè)結(jié)構(gòu)中的語句逐一進(jìn)行跟蹤閱讀,具體來說如下:1.程序結(jié)構(gòu)的分析程序結(jié)構(gòu)的分析應(yīng)符合結(jié)構(gòu)化程序設(shè)計(jì)的原則。我們知道,C語言是一種結(jié)構(gòu)化程序設(shè)計(jì)語言,它只包含三種基本結(jié)構(gòu):順序、選擇、循環(huán),每種結(jié)構(gòu)只有一個(gè)入口和一個(gè)出口。而各個(gè)結(jié)構(gòu)之間的連接方式有兩種:積木式的連接和嵌套式的連接。積木式的連接是:一個(gè)結(jié)構(gòu)的出口與另一個(gè)結(jié)構(gòu)的入口的連接;嵌套式的連接是:在一個(gè)結(jié)構(gòu)的內(nèi)部嵌套另一個(gè)結(jié)構(gòu)。一般來說,我們應(yīng)先分析出程序中積木式連接的各個(gè)結(jié)構(gòu),然后再找出這些結(jié)構(gòu)中的嵌套式連接的結(jié)構(gòu)。分析程序結(jié)構(gòu)時(shí)可以借用一些工具,如N_S圖、偽代碼等,即根據(jù)源程序畫出能反映程序結(jié)構(gòu)的N_S圖,或?qū)懗龅刃У膫未a。這是一個(gè)與編程過程剛好相反的過程。2.語句的跟蹤閱讀對(duì)于順序結(jié)構(gòu)的語句,閱讀是不成問題的。而對(duì)于選擇結(jié)構(gòu)的語句,由于與我們平時(shí)所用的自然語言比較一致,也不是太大的困難,關(guān)鍵在于,當(dāng)有兩個(gè)選擇結(jié)構(gòu)連接時(shí),采用積木式的連接與采用嵌套式連接的差別是很大,有時(shí)甚至使得程序運(yùn)行的結(jié)果截然相反,關(guān)于這一點(diǎn),可閱讀第2章。循環(huán)結(jié)構(gòu)是三種結(jié)構(gòu)中最為復(fù)雜的一種,對(duì)這種結(jié)構(gòu)的跟蹤閱讀可以用列表的方法,將循環(huán)過程中各語句執(zhí)行的結(jié)果一一列出。例1.1求兩個(gè)正整數(shù)的最大公約數(shù)。我們還是從有名的歐幾里德算法說起。【歐幾里德算法】El.[求余數(shù)]以n除m并令r為所得余數(shù)(0<=m,0<n)。E2.[余數(shù)為0?]若r=0,算法結(jié)束,n即為答案。E3.[互換]置m-n,n-r,并返回步驟El。為了使計(jì)算過程更為緊湊,也考慮到當(dāng)n=0時(shí),算法仍然有效,可將以上算法稍作改動(dòng)如下:E'1.[n為0?]若n=0,算法結(jié)束,m即為答案。E'2.[求余數(shù)]以n除m并令r為所得余數(shù)(0<=m,0<n)。E'3.[互換]置m-n,n-r,并返回步驟E'l。根據(jù)以上所描述的算法,我們可以用C語言寫出程序:main(){intm,n;cout<<"input:";cin>>m>>n;while(n!=0){r=m%n;m=n;n=r;}cout<<“gcd=”<<m<<endl;}這個(gè)程序由三個(gè)語句組成:輸入(scanf)、循環(huán)(while)、輸出(printf)。因此程序的積木式結(jié)構(gòu)如圖1.1輸入m,n的值循環(huán)結(jié)構(gòu)計(jì)算n的值當(dāng)n=0,循環(huán)結(jié)束輸出計(jì)算結(jié)果m圖1.1這個(gè)程序只有積木式的結(jié)構(gòu),關(guān)鍵是分析循環(huán)結(jié)構(gòu)的執(zhí)行過程,即對(duì)循環(huán)體內(nèi)的語句逐一進(jìn)行跟蹤閱讀,直至循環(huán)條件不成立。例如:當(dāng)輸入20,12時(shí)(即m=20,n=12),分析程序執(zhí)行的過程如下:初始狀態(tài):r=?,m=20,n=12執(zhí)行過程循環(huán)條件n!=0TTTF循r=m%n840環(huán)m=n1284(結(jié)果)體n=r840例1.2分析下面程序的積木式結(jié)構(gòu)和嵌套式結(jié)構(gòu)。main(){inti,n,sum;cout<<"inputadigtal:";cin>>n;sum=0;i=1;while(sum<=n){if(i%2!=0)sum=sum+i;i++;}cout>>"sum=">>sum>>endl;}程序的積木式結(jié)構(gòu)如圖1.2

1.輸入n的值2.循環(huán)結(jié)構(gòu):計(jì)算sum3.輸出計(jì)算結(jié)果sum圖1.2再來分析程序的嵌套式結(jié)構(gòu)。第2個(gè)"積木"是一個(gè)循環(huán)結(jié)構(gòu),其中嵌套了一個(gè)選擇結(jié)構(gòu),嵌套式的連接如下:2.1初始狀態(tài)2,3循環(huán)體2.22,3循環(huán)體圖1.3讀者可仿照例1.1方法,自行分析上述的循環(huán)結(jié)構(gòu),看看程序執(zhí)行的過程是怎樣的,實(shí)現(xiàn)什么樣的功能。閱讀的過程是艱苦的,初學(xué)者對(duì)此可能不十分習(xí)慣。但是這是學(xué)習(xí)一種計(jì)算機(jī)程序設(shè)計(jì)語言所必須掌握的方法,這是必須經(jīng)歷的過程,企圖繞開這個(gè)過程,尋找別的捷徑是不可能的。幾位計(jì)算科學(xué)大師的話王選數(shù)學(xué)基礎(chǔ)好、邏輯思維嚴(yán)密的人,一旦掌握了軟件設(shè)計(jì)和編程的基本方法和技巧后,就能制造出結(jié)構(gòu)清晰、高效率和可靠的軟件系統(tǒng);而一個(gè)思維不嚴(yán)密和推理能力差的程序員,即使有多年的編程實(shí)踐,往往仍不能很好地完成任務(wù)。狄克斯特拉(EdsgarWybeDijstra)1972年獲獎(jiǎng)的EdsgerW.Dijkstra,在祖國(guó)荷蘭獲數(shù)學(xué)和物理學(xué)學(xué)士,理論物理博士學(xué)位。在他2000年退休前一直是美國(guó)Taxas大學(xué)的計(jì)算機(jī)科學(xué)和數(shù)學(xué)教授。發(fā)現(xiàn)了以他名字命名的圖論中的最短路徑算法。但他獲得圖靈獎(jiǎng)的主要原因卻是發(fā)明了ALGOL這一第二代編程語言?!耙粋€(gè)高水平的程序員應(yīng)該一開始就避免故障的引入,而不應(yīng)該把大量的時(shí)間放在程序調(diào)試上?!盌ijkstra一貫主張把科學(xué)的思維引入系統(tǒng)設(shè)計(jì)和程序設(shè)計(jì)中,這也是他鼓吹的結(jié)構(gòu)程序設(shè)計(jì)的目的之一?!冻绦蛟O(shè)計(jì)的教學(xué)就是思維方法的教學(xué)》(TheTeachingofProgrammingi.e.theTeachingofThinking)Dijkstra的主要貢獻(xiàn)是在20世紀(jì)50年代末到70年代初,也就是他20多歲到40歲出頭這段時(shí)間成的?;貞涍@些過去時(shí)的成就是想強(qiáng)調(diào):洞察力對(duì)于一個(gè)科學(xué)家是何等的重要!Dijkstra獲圖靈獎(jiǎng)以后,軟件領(lǐng)域又涌現(xiàn)出圖形用戶界面、面向?qū)ο蠹夹g(shù)等一系列新的里程碑,因特網(wǎng)更是帶來一個(gè)全新的時(shí)代。但是30年前Dijkstra關(guān)于程序可靠性的一些名言至今仍有意義:“有效的程序員不應(yīng)該浪費(fèi)很多時(shí)間用于調(diào)試程序,他們應(yīng)該一開始就不要把故障引入?!薄俺绦驕y(cè)試是表明存在故障的非常有效的方法,但對(duì)于證明沒有故障,測(cè)試是很無能為力的?!盌ijkstra大力鼓吹程序正確性證明,但這一方法離實(shí)用還有相當(dāng)距離,因?yàn)橐欢卧闯绦虻恼_性證明的文字往往比源代碼還要長(zhǎng),所以充分的軟件測(cè)試今天仍不可或缺。但是程序員的科學(xué)訓(xùn)練是十分重要的。有人曾做過一個(gè)實(shí)驗(yàn):一個(gè)題目由一批印度程序員編程,其結(jié)果驚人地相似;而由一批中國(guó)程序員來做,編出程序五花八門。中國(guó)的軟件人員有時(shí)把創(chuàng)造性放在不恰

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論