程序流程控制课件_第1页
程序流程控制课件_第2页
程序流程控制课件_第3页
程序流程控制课件_第4页
程序流程控制课件_第5页
已阅读5页,还剩31页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程式流程控制8.1演算法與流程要想充分利用電腦的高速計算能力來處理實際的問題,需要使用者能夠將問題抽象成計算能夠理解的電腦語言,也就是使用者應該編寫電腦程式的能力。那麼學習了一種電腦語言是否就具有了編程的能力呢?答案是否定的。使用者還需要具有將實際問題分解成一連串具體可操作步驟的能力。這就涉及到演算法的問題了。通常意義上的編程高手,不僅僅是指這個人對於某一門電腦語言有深入的研究,還指這個人在演算法上也有一定的造詣。8.1.1演算法學習一種電腦語言僅僅學習它的語法規則還不夠,更重要的是要學習如何針對各種類型的具體問題,制定行之有效的解決方法和操作步驟,也就是所謂的演算法(Algorithm)。只要學會了制定正確且有效的演算法,用何種高級電腦語言來編寫具體的電腦程式就僅僅只是一個工具選擇的問題了。因此,演算法的設計也是電腦程式設計的核心內容。需要注意的是,演算法這個詞所涉及的並不僅僅是計算的問題。演算法可以包括很多領域,泛指為解決實際而採取的方法和步驟。在英語中,計算方法和演算法是兩個詞。前者是“ComputationalMethod”,後者是“Algorithm”。計算方法更像通常意義上所理解的演算法,它指求解數值解的近似方法。實際的“演算法”一詞含義更為廣泛。它不僅僅指數值計算中的計算方法,還可以指事務處理中的規章流程、物資供應中的調配方法、糕點師傅製作蛋糕的技法等。而程式員所關心的,自然僅僅是指能夠在電腦上實現的演算法。8.1.2傳統流程圖流程圖是一種演算法描述手段,它用一些圖框來表示計算過程中各種類型的操作。在圖框中寫出演算法的各個步驟,然後用帶箭頭的線條把這些圖框連接起來,以表示執行的先後順序。採用這種方式來表示演算法,形象直觀,理解起來非常容易。美國國家標準化協會ANSI規定了一些常用的流程圖符號,已為世界各國的程式工作者普遍採用。下麵介紹最常用的一些流程圖符號。8.1.3基本程式結構前一節介紹的流程圖又稱為傳統流程圖。傳統流程圖中使用流程線來指出各個框之間的執行順序,流程線在使用上沒有嚴格限制。因此,流程圖的繪製者可以根據自身的意願將流程線畫成他想要的形式,隨之而來的是程式的執行流程也隨意地轉來轉去。這種做法使流程圖顯得雜亂無章,閱讀者需要花費相當的精力去追蹤程式流程,對演算法邏輯的理解也較為困難。人們為這種情況起了一個名字——BS,意思是一碗麵條。要提高演算法的描述品質,使演算法在設計和閱讀方面都變得方便,就必須限制流程線的濫用。即流程線不能毫無規律的四處亂轉,必須按一定的方向來繪製。但是,分支結構和迴圈結構又是在描述演算法時不可避免的。一個演算法不可能按從頭到尾的順序執行下來,總會有一些向前或向後的非順序轉移。針對這些問題,人們設計了三種最基本的流程結構,使用這三種基本結構就可以表示一個良好的演算法。可以將這些基本結構稱為預製件,一個演算法就是通過這些預製件像搭積木一樣按順序排列起來的。

8.1.4用偽代碼表示演算法用前面介紹的流程圖來表示演算法直觀易懂,但畫起來卻比較費事。同時在設計一個演算法時往往不可能一蹴而就,經常需要對原來的想法進行反復修改。這時,想要在已經畫好的流程圖上添加新的元素就非常困難了。因此,流程圖只適宜於表示演算法,用在設計演算法的過程中並不是很理想(特別是演算法比較複雜,需要經常進行修改時就顯得更不方便)。為了方便的進行演算法設計,經常會使用一種稱為偽代碼的工具。偽代碼是用介於自然語言和電腦語言之間的文字和符號來描述演算法。使用偽代碼來描述代碼就像寫一篇帶命題的敘事作文一樣,只要按照事件發生的邏輯先後次序來書寫就可以了。它不使用圖形符號,因此描述演算法時相當方便,格式緊湊、易於理解,最重要的是它很易於向電腦程式語言過渡。8.2選擇結構選擇結構提供一種多義執行的手段,即當判斷條件滿足特定要求時就去執行特定的操作。選擇結構是三種基本程式結構之一。Fortran語言中提供了多種語句來實現選擇結構。本節將主要介紹Fortran語言中選擇結構的實現方式和相關的語句。8.2.1判斷語句IF和分支選擇語句SELECTCASEIF語句和SELECTCASE語句在Fortran語言中都能夠用於構造選擇結構,兩者在語言功能上並無多大差別。本節簡要介紹IF語句和SELECTCASE語句的基本概念和作用,詳細的用法會在後面的小節進行介紹。在Fortran77時代,選擇結構是通過IF語句和IF構造來實現的。其中,IF語句只能提供單一選擇,即條件滿足就執行某種操作,條件不滿足則不執行任何操作。IF語句在有多個並列條件需要判斷時就很不方便,而且一旦某一個條件成立後,IF語句並不會跳過其餘的判斷。這就使得判斷的效率較低。在有多個並列條件需要判斷時,最好使用IF構造。IF構造能夠提供多義選擇,即構造中存在多個條件選項,當不滿足條件一時,就去檢查條件二。只要在進行檢查的過程中有一個條件滿足就會去執行相應的操作,執行完相應的操作後就跳出所在的IF構造,而不會再去檢查其餘的判斷條件。8.2.2判斷語句IF的基本用法使用IF語句來實現選擇結構通常有兩種用法:語句形式和構造形式。前者一般用於實現單一選擇,後者則可以實現二義選擇。1.語句形式採用IF語句來實現單一選擇的一般語法形式如下:IF(邏輯運算式)執行語句2.構造形式:除了能夠使用IF語句來實現單一判斷之外,還可以使用塊IF語句來組成IF構造用於多重選擇。3.IF語句的使用8.2.3判斷語句IF實現多重判斷IF構造除了可以實現二義判斷之外,還可以實現多重判斷。這時候,IF構造中需要加入新的元素——ELSEIF語句。有了ELSEIF語句後,IF構造中可以同時存在多個判斷條件和多個執行模組,但是只有其中一個條件能夠成立,並且只有一個執行模組能夠執行。使用IF語句和ELSEIF語句來實現多重判斷的基本形式如下:IF(邏輯運算式1)THENTHEN塊ELSEIF(邏輯運算式2)THENELSEIF塊……ELSEELSE塊ENDIF8.2.4IF語句的嵌套IF構造除了能夠單獨使用外,構造中的任意一個語句塊裏都可以再次嵌入另一個構造。被嵌入的構造可以是另一個IF構造,也可以是另一些形態、功能不同的構造,如CASE構造、DO構造等。前提是必須將整個構造完整地嵌入到IF構造的某一個語句塊中,不允許被嵌入構造的一部分在一個語句塊中,另一部分在別的語句塊或是不在被嵌入的IF構造中,即被嵌入的任何構造不允許跨越兩個獨立的語句塊。IF語句嵌套的形式可以表示如下:[構造名1:]IF(邏輯運算式1)THEN[構造名2:]IF(邏輯運算式2)THEN[構造名3:]IF(邏輯運算式3)THEN……ENDIF[構造名3]……ENDIF[構造名2]……ENDIF[構造名1]8.2.5IF語句的特殊用法在Fortran77中,IF語句還能夠實現一種特殊的選擇方法,也就是算術IF語句。算術IF語句根據算術運算式值得結果,有條件的將程式的計算流程轉到三條執行語句中的一句。IF語句的這種用法的基本形式如下:IF(運算式)標號1,標號2,標號3其中,運算式為標量整型或實型運算式,兩端用括弧括起來;標號1至3必須是本程式單元中的有效可執行語句的標號。語句中所有的三個語句標號都必須書寫,但並不一定要指向三個不同的語句,在同一個算術IF語句中允許同一個語句標號出現多次。算術IF語句在執行時,首先會計算運算式的值,根據運算式的值來確定要執行哪一個標號指定的執行語句:如果運算式的值小於零,則程式流程轉到標號1指定的語句去執行;如果運算式的值等於零,則程式流程轉到標號2指定的語句去執行;如果運算式的值大於零,則程式流程轉到標號3指定的語句去執行。8.2.6SELECTCASE語句的用法SELECTCASE語句是Fortran90/95標準中新增加的語句。該語句用於容納CASE塊,為程式員提供了一種從多個備用可執行分支選項中選取一個來執行的手段。儘管多重判斷的IF構造也可以實現這一功能,但是在某些多條件選擇的應用場合使用IF構造會使代碼顯得比較繁瑣、層次關係比較複雜。使用CASE構造就可以避免這一問題,編寫出來的代碼也顯得更加直觀、簡潔。CASE構造的作用和IF構造非常類似,它也用於編寫分叉選擇演算法,即根據判斷條件的成立與否來區分操作不同的可執行模組。不同之處在於:CASE構造只能把某個判斷條件的可能結果區分成若干個孤立的離散值或片斷(這意味著CASE構造中的判斷條件不允許出現重疊),按不同的值或片斷進行不同的操作。如果遇到判斷條件比較複雜或者存在多種判斷條件互相交叉的情況時,CASE構造在處理這些判斷條件時顯得不是很方便,在這種情況下只能考慮使用IF構造來進行處理。8.2.7SELECTCASE語句的應用下麵給出一些SELECTCASE語句的實際應用例子。首先演示的程式使用了整型運算式的CASE構造,例子的原型就是程式TEST0802的個人所得稅計算程式。在進行改動前需要注意,CASE構造中的選擇運算式是不允許為實型運算式的。因此,需要一個將實型數據轉換為整型數據的函數,可以考慮使用基本數學函數中的INT函數。8.3迴圈結構除了順序結構、選擇結構外,實際的程式中還常常遇到需要重複執行的操作或代碼段。在這種情況下,就需要用到一種新的控制結構——迴圈結構。如果程式的世界中缺少了這種結構,那麼結果將不可想像。比如上一節最後一個實例中所作的5次猜測,如果沒有迴圈結構,同樣功能的代碼段,即“猜測-判斷”,需要重複書寫5次。這種情況至少還知道要重複書寫幾次,在有的應用領域,如數值領域的迭代求解,甚至連要重複的次數都不清楚。迴圈結構的出現使得這一類問題變得不再是任何問題。本節就將介紹迴圈結構的相關內容。8.3.1基本的DO構造DO構造在Fortran77和Fortran90/95中都提供用以執行迴圈操作,但是兩個標準在DO構造的具體實現形式上是不同的。儘管這樣,兩個標準下的各種DO迴圈都可以歸納為如下所示的DO構造一般形式:[構造名:]DO[標號][迴圈控制]塊終止語句其中,構造名選項只允許在Fortran90/95標準中使用,用於標識構造的起止範圍;DO語句後的標號選項在Fortran77和Fortran90/95標準中同樣適用,儘管帶標號的DO構造是較老的語法形式;迴圈控制用於控制迴圈的執行,提供迴圈停止或跳出迴圈的手段等;中止語句用於標定迴圈構造的結束位置,並不是說迴圈執行到該條語句就會停止執行,而是通過該條語句將流程返回到DO語句。8.3.2無條件迴圈與DO語句現實中的迴圈可以分為不帶迴圈變數與帶迴圈變數兩種形式,前者只能通過循環體中的條件判斷等跳出循環體;後者則能夠通過迴圈變數來執行確定次數的重複操作。後者也可以稱為無條件的迴圈,它可以不通過條件判斷來實現迴圈的終止。當需要執行的迴圈次數為已知時,使用DO語句來實現迴圈比較方便。它由一個DO語句和循環體組成,在Fortran90/95標準中的一般形式如下:[構造名:]DO迴圈變數=迴圈初值,迴圈終值[,迴圈增量]

循環體ENDDO[構造名]8.3.3條件迴圈與DO構造在編程實踐中,除了會遇到執行次數確定的迴圈外,還有一種情況是執行次數未知的迴圈。這一類迴圈不能通過使迴圈變數“增加”到迴圈終值的形式來終止,只能通過循環體中的判斷條件來控制程式的流程是否跳出迴圈構造。因此,這種迴圈又被稱為條件迴圈,在相應的迴圈構造中不含醒房刂票淞俊1.條件迴圈實現方式一2.條件迴圈實現方式二除了將判斷條件寫在循環體內的方式(也稱為直到型迴圈)之外,還可以通過WHILE語句來實現當型迴圈。在Fortran90/95標準中,DOWHILE語句被增加到迴圈構造方式中以支持當型迴圈。8.3.4迴圈的署名同其他的一些構造一樣,迴圈也是可以命名的,命名的原則同變數的命名原則完全一致。迴圈一旦命名,則在迴圈終止語句後必須跟上迴圈的名字,以使編譯程序明白那一個迴圈結構被封閉。命名的迴圈在有多層嵌套或是DO構造較多的情況下會使各個迴圈顯得更加清晰。下麵來看一段實際的例子。TEST0818.F90!署名迴圈範例PROGRAMTEST0818IMPLICITNONE

INTEGER::I

PRINT:DOI=1,2PRINT*,'第',I,'次迴圈…'ENDDOPRINT

ENDPROGRAMTEST08188.3.5迴圈的嵌套同IF構造和SELECTCASE構造類似,DO構造也允許在自身中再嵌入其他的DO構造。在一個DO迴圈中又完整地包含另一個DO迴圈的方法,稱為DO迴圈的嵌套。迴圈嵌套中的各層迴圈變數不允許重名。迴圈嵌套的層數可以不限,但是迴圈嵌套的層次太多會使得各層迴圈不容易分辨。對此,可以通過對迴圈進行命名以使迴圈嵌套的層次更清晰。要注意,迴圈嵌套中的內迴圈應當完整地嵌套在外迴圈之內,也就是說內迴圈是外迴圈中循環體的一部分,內外迴圈不允許交叉。例如,如下形式的迴圈嵌套是合法的:OUT:DOI=1,4IN:DOJ=1,5……ENDDOINENDDOOUT8.3.6DO迴圈規則在使用DO迴圈時,需要注意迴圈的一些其他規則。比如,迴圈變數可以在循環體中被引用,但不應當再被賦值,即使迴圈變數的值保持不變。例如下麵的寫法都是不正確的,迴圈變數N和M不能在循環體內被重新賦值:DON=1,10……N=N*2……ENDDODOM=1,10……M=M……ENDDO8.3.7隱式DO迴圈隱式DO迴圈實際上是一種帶控制迴圈變數的DO迴圈,但簡化成只有DO迴圈的第一句,並且把關鍵字DO隱去。隱式DO迴圈的一般形式如下:I=m1,m2[,m3]其中,m1表示迴圈的初值;m2表示迴圈的終值;m3表示迴圈的增量。如果省略本項目,則默認為1。隱式DO迴圈不是一種可以獨立存在的語句。它只能作為輸入輸出列表的一個組成部分,用來控制重複讀寫的次數。它的應用形式如下:(I/O列表,迴圈變數名=迴圈初值,迴圈終值[,迴圈增值])8.4迴圈的控制在Fortran90/95標準中,引入了兩個控制迴圈執行流程的語句EXIT和CYCLE。這兩條語句實際上在某些Fortran77編譯器中早已被當成了不成文的標準之一了。8.4.1EXIT語句在實際變成種,有許多實際問題是無法預先知道迴圈次數的,比如一些數學和工程領域中的迭代演算法。對於這類問題,最常見的做法是給出一個判別條件。如果滿足這個判別條件就重複執行循環體,否則就退出迴圈。因此有條件迴圈時迴圈的執行次數不是固定的。傳統的做法是使用GOTO語句來使流程跳出迴圈,但這種方法不符合結構化程式設計的要求。針對這種情況,Fortran90/95通過引入EXIT語句來滿足結構化程式設計的要求。EXIT語句的作用是停止迴圈並使流程控制退出迴圈結構,因此又被稱為出口語句。該語句的一般形式如下:EXIT[DO構造名]8.4.2EXIT語句與條件迴圈通過DOWHILE語句來實現迴圈猜測,在這條DOWHILE語句中的邏輯判斷運算式就是簡單的邏輯真(TRUE)。這種用法是允許的,它表示當型迴圈的執行條件一直滿足,無須進行判斷。但是在使用時應該注意,在循環體內一定要提供跳出迴圈的手段,否則迴圈會一直執行下去形成死迴圈。下麵的代碼通過在判斷語句中加入EXIT語句,跳出迴圈。IF(Rchar==Gchar)EXIT如果用戶輸入的字元等於系統隨機得到的字元,則執行EXIT語句退出迴圈。如果用戶猜測的字元不正確,則會向用戶提示應該向哪個字元方向進行猜測。8.4.3EXIT語句與無條件迴圈除了應用於條件迴圈中用作迴圈退出的手段外,EXIT語句還可以應用於無條件迴圈中。當EXIT語句應用於無條件迴圈中時,如果迴圈變數大於迴圈終值或是與EXIT語句配合的邏輯運算式為真都會跳出迴圈的執行。這種應用通常用在無法預知迴圈執行的次數並且不知道迴圈退出條件是否能夠滿足的場合。比如,計算流體力學中求解流動問題時,通常採用這種方法來提供雙重的迴圈退出機制。由於這類問題的複雜性會涉及到計算方法、流動對象的網格好壞等因素,通常不知道該問題是否能夠收斂,也不知道需要計算多少步才能收斂。8.4.4CYCLE語句CYCLE語句是另一種常用於迴圈的流程控制語句。同EXIT語句不一樣,CYCLE語句的作用不是流程跳出迴圈,而是使流程重新回到迴圈的開頭。該語句的一般形式為:CYCLE[DO構造名]當迴圈執行到CYCLE語句時,它會使迴圈的流程跳過位於它之後的那部分DO塊,重新返回到迴圈的第一個可執行語句開始執行。運用CYCLE語句,可以使迴圈在某一次的迭代過程中不執行該語句後面的代碼,使迴圈的應用更為靈活多變。CYCLE語句與EXIT語句一樣屬於特定的DO構造。如果語句引用了DO構造名,則它屬於該構造,否則它屬於所出現的最內層DO構造。8.5再論GOTO語句GOTO語句是相當古老的流程控制語句,在Fortran77時代是主要的流程控制語句。儘管該語句功能強大,但是濫用該語句會造成整個程式的流程雜亂無章,不符合結構化程式設計的要求。這種說法並不意味著GOTO語句就不能使用,而是建議在程式中慎用該語句。當然,某些GOTO語句的形式,如計算GOTO語句和賦值GOTO語句,在Fortran90/95標準中是被廢除、不建議使用的語句。8.5.1無條件GOTO語句該語句的一般形式如下:GOTOlabel其中,label是本程式單元中可用的語句標號,必須出現在可執行語句之前。比如……X=Y+3.GOTO43Y=Y+5.4Z=X+Y……8.5.2計算GOTO語句計算GOTO語句在Fortran95標準中是一項被廢除的語法,這裏只作簡單介紹以便在閱讀一些舊Fortran程式時能夠有所幫助。計算GOTO語句的用途是根據運算式的值來確定程式的控制流程轉向一系列設定的分支目標中的一項。這種GOTO語句的一般形式如下:GOTO(標號列表)[,]運算式其中,標號列表由本程式單元中一系列可用的分支目標語句的標號組成,標號之間通過逗號“,”來分隔。同樣的標號允許在標號列表中出現多次。8.5.3賦值GOTO語句賦值GOTO語句在Fortran90標準中是一種過時的語法,在Fortran95標準中則被廢除。同無條件GOTO語句相比,賦值GOTO語句後所跟的不是語句標號,而是表示語句標號的整型變數。需要注意的是,這裏的整型變數不允許通過賦值符進行賦值,比如下麵的賦值GOTO語句是錯誤的:……I=10GOTOI……賦值GOTO語句中的標號變數必須使用ASSIGN語句來賦值,比如下麵的形式就是正確的:……ASSIGN10TOIGOTOI……8.5.4用?還是不用?正如前面一節提到的,GOTO語句的濫用在一定程度上決定了這一語句目前的處境。但是GOTO語句自身並沒有錯誤,錯誤在於程式員過分依賴於GOTO語句的強大功能而沒有注意到程式自身應該具有的邏輯性。因此,在新的Fortran標準中除了計算GOTO語句和賦值GOTO語句這兩種過時的語法被廢除以外,無條件GOTO語句仍然在新標準中保留了自己的一席之地。在實際編程過程中,用不著因為害怕破壞程式的結構而不敢去使用GOTO語句。只要在使用中時刻牢記GOTO語句只在一個基本程式結構中使用,程式流程的跳轉僅限於基本結構

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论