fortran程序設計第5章_第1頁
fortran程序設計第5章_第2頁
fortran程序設計第5章_第3頁
fortran程序設計第5章_第4頁
fortran程序設計第5章_第5頁
已閱讀5頁,還剩29頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

Chapter05Fortran程序設計第5章循環結構程序設計Contents本章目錄系統掌握循環結構的原理與多種實現方式01循環結構基本概念02IF與GOTO構建循環03DO循環語句詳解04循環結構綜合應用CHAPTER01循環結構基本概念理解循環的本質、分類與三大核心要素ControlStructure什么是循環結構循環結構是程序設計中反復執行某一代碼段的控制結構,分為無條件循環和有條件循環兩類。實際編程中必須使用條件循環以避免'死循環',讓程序在問題解答后自動退出。無條件循環無休止地反復執行程序段,缺少退出機制,將導致"死循環",程序永遠無法結束。死循環有條件循環每次執行前根據預設條件判斷是否繼續,條件不滿足時自動退出,是唯一正確的循環方式。條件判斷循環體被反復執行的程序段,如"判斷肥胖問題"中輸入身高體重并判斷的過程即為一個循環體。程序段LoopStructure引例:為什么需要循環當需要重復執行相同處理過程時,逐條書寫的方式既不現實也難以維護。循環結構將重復操作抽象為"循環體",以一套代碼處理任意數量的同類數據,大幅提升程序的簡潔性和可擴展性。01??問題場景考察5個人的體重情況,每人需輸入身高H和體重W0,計算標準體重W1=H-110并判斷偏胖/偏瘦/標準。這是典型的批量數據處理需求,相同邏輯需對多組數據重復執行。02??流水賬寫法將輸入、計算、判斷過程逐人重復書寫5次,代碼冗長且當人數變為50或500時完全不可維護。重復代碼導致可讀性差、修改困難,任何調整都需逐處修改。03??循環寫法將"輸入身高體重→計算標準體重→判斷并提示"抽象為一個循環體,通過控制機制自動重復指定次數。只需編寫一次處理邏輯,由循環結構控制執行次數,代碼簡潔清晰。04??循環的本質價值用一套代碼處理任意數量的同類數據,實現代碼復用,是結構化程序設計的核心思想之一。循環使程序具備可擴展性,數據規模變化時無需修改核心邏輯。LOOPSTRUCTURE循環結構的三大核心要素任何正確的循環結構都必須包含初始化、循環體和循環出口三個要素。其中循環出口是防止"死循環"的關鍵,可通過"計數"或"條件判斷"兩種方式實現。初始化為進入循環做準備,通常包括給計數器變量賦初值、讀取第一批數據等操作,確保循環有正確的起始狀態。初始化是循環執行的起點,決定了后續迭代的正確性。起始狀態循環體被反復執行的程序段,常用設計方法包括遞推(由已知推未知)、迭代(逐步逼近)和窮舉(逐一嘗試)。循環體是解決問題的核心邏輯所在。遞推·迭代循環出口防止死循環的關鍵機制,可通過"計數法"(已知循環次數)或"條件法"(滿足特定條件時退出)來設置。合理的出口設計保證程序能夠正常終止。計數·條件LOOPEXITSTRATEGIES設置循環出口的兩種方法循環出口的設置分為'計數法'和'條件法'兩種。計數法適用于已知循環次數的場景,通過計數器遞增或遞減來控制循環;條件法適用于次數未知的場景,通過特定信號或條件來觸發退出。計數法01適用場景:問題已提供明確的循環次數N,例如"處理5個人的數據"或"計算前100項之和"02正向計數:計數器I初值設為0,每執行一次循環體I加1,當I達到N時退出循環03反向計數:計數器I初值設為N,每執行一次循環體I減1,當I變為0時退出循環條件法01適用場景:循環次數未知,例如"處理一批數據直到遇到負數"或"持續讀取直到文件末尾"02信號約定:人為設定一個特殊值(如-1、0或特定字符串)作為循環終止信號03條件判斷:每次循環前或循環后檢查條件表達式,條件為真時繼續,為假時退出CHAPTER02IF與GOTO構建循環用最基礎的分支與跳轉語句理解循環的本質ControlFlowGOTO語句:無條件跳轉GOTO語句是Fortran中最基礎的跳轉工具,通過"GOTO標號"實現無條件轉移。它是構建原始循環的核心機制,但單獨使用會產生死循環,必須配合IF條件判斷來設置循環出口。01語法格式:"GOTO標號",其中標號為合法的1~5位正整數,且必須是本程序單位中某語句的語句標號。02執行機制:程序遇到GOTO語句后,立即跳轉到標號所指的語句繼續執行,中間的所有語句將被跳過。03在循環中的作用:將GOTO語句放在循環體末尾、指向循環體開頭的標號,即可形成反復執行的循環結構。04局限性:單獨使用GOTO只能構建無條件循環(死循環),必須配合IF語句判斷退出條件才能構建正確的循環。Fortran·LoopControl死循環示例:GOTO構建的無條件循環在循環體末尾加入GOTO語句指向循環開頭即可形成循環,但若沒有退出機制,程序將進入死循環——END語句永遠不會被執行,程序永遠無法自動結束。無條件循環程序(死循環)行號代碼說明1REALH,W0聲明實型變量5READ*,H,W0循環入口:讀入身高體重W1=H-110計算標準體重IF(ABS(W0-W1).LE.5)THEN判斷體重是否在標準范圍PRINT*,'標準!'標準體重輸出ELSEIF(W0.GT.W1)THEN判斷是否偏胖PRINT*,'過胖!'過胖輸出ELSE→PRINT*,'過瘦!'過瘦輸出ENDIF條件判斷結束GOTO5跳回第5行,形成死循環END永遠不會被執行到Summary該程序在READ和GOTO之間形成循環,但因缺少退出條件,END語句永遠不會執行,程序陷入死循環。FORTRAN·LOOPCONTROL用計數法修復死循環通過引入計數器變量I并配合IF條件判斷,可將無條件循環改造為條件循環。計數器每次遞增,達到預設次數后跳過GOTO語句,程序自然執行到END結束。計數法控制循環(處理5人數據)代碼說明REALH,W0聲明變量INTEGERI聲明計數器I=0要素1:初始化5READ*,H,W0循環入口標號W1=H-110計算標準體重IF(ABS(W0-W1).LE.5)THEN判斷體重PRINT*,'標準!'ELSEIF(W0.GT.W1)THENPRINT*,'過胖!'ELSE/PRINT*,'過瘦!'ENDIFI=I+1計數器遞增IF(I.LT.5)GOTO5要素3:循環出口——未滿5次則繼續END滿5次后自然到達此處結束Fortran·循環控制用條件法設置循環出口當循環次數未知時,可通過約定特殊信號值(如負數、特定字符串)作為終止條件。每次循環前檢查輸入是否為終止信號,若是則跳出循環,否則繼續執行循環體。條件法控制循環(處理未知人數數據)代碼說明REALH,W0,W1聲明變量5READ*,H,W0循環入口:讀入數據IF(H.LT.0)GOTO100終止信號:身高為負則跳至結束W1=H-110計算標準體重(循環體)IF(ABS(W0-W1).LE.5)THEN判斷體重情況PRINT*,'標準!'ELSEIF(W0.GT.W1)THENPRINT*,'過胖!'ELSE/PRINT*,'過瘦!'ENDIFGOTO5未遇到終止信號,繼續循環100END終止標號:程序結束CHAPTER03DO循環語句詳解Fortran最核心的循環控制結構與多種用法Fortran·LoopControlDO循環基本語法DO循環是Fortran中最重要的計數循環語句,通過"循環變量=初值,終值,步長"三參數精確控制循環次數,比IF+GOTO方式更安全、更清晰。01基本格式DO變量=初值,終值[,步長],步長可省略默認為1,循環體位于DO與ENDDO之間。DOi=1,N,S02執行流程賦初值→判斷越界→執行循環體→加步長→再判斷,直至越界退出循環。五步迭代機制03次數計算循環次數=MAX(0,INT((終值?初值+步長)/步長)),步長為正且初值大于終值時循環0次。MAX(0,INT(…))04關鍵約束循環體內不得修改循環變量的值;正常結束后變量等于終值加步長,即首次越界的值。不可變·可預測Fortran·LoopControlDO循環的多種寫法DO循環支持正步長、負步長和省略步長三種寫法。步長的正負決定了循環變量的增減方向,初值與終值的大小關系必須與步長方向一致,否則循環次數為0。正步長與默認步長DOI=1,10默認步長1,I依次取1,2,3,...,10,循環10次DOI=1,10,2步長2,I依次取1,3,5,7,9,循環5次DOI=0,100,10步長10,I依次取0,10,20,...,100,循環11次負步長(遞減循環)DOI=10,1,-1步長-1,I依次取10,9,8,...,1,循環10次DOI=100,0,-25步長-25,I依次取100,75,50,25,0,循環5次DOI=1,10,-1循環0次——步長為負但初值小于終值,首次判斷即越界FORTRAN·循環結構DO循環應用:累加求和累加求和是DO循環最典型的應用場景。關鍵在于循環外初始化累加器為0,循環體內執行"累加器=累加器+當前項",循環結束后累加器即為總和。計算1+2+3+...+N的和代碼說明PROGRAMSUM_EXAMPLE程序開始INTEGER::I,N,SUM聲明變量READ*,N讀入NSUM=0初始化累加器(必須在循環外)DOI=1,N,1循環:I從1到NSUM=SUM+I每次將I累加到SUMENDDO循環結束PRINT*,'SUM=',SUM輸出結果ENDPROGRAM程序結束通過DO循環將1到N的整數逐個累加,SUM在循環外初始化為0是關鍵。01初始化循環開始前,將累加器SUM置為0,確保從零開始計數。02迭代累加循環體中執行SUM=SUM+I,每輪將當前項I加入累加器。03輸出結果循環結束后,SUM中保存的即為1+2+…+N的總和。COREPATTERNS=S+aiNESTEDLOOPDO循環嵌套DO循環可以嵌套使用,外層循環每執行一次,內層循環完整執行一輪。嵌套循環是處理二維數據、矩陣運算和多重遍歷的基礎工具,需注意內外層循環變量不重疊、循環體完全包含。嵌套規則內層DO循環必須完全包含在外層循環體內,不得交叉;內外層循環變量名稱不得相同。變量獨立執行次數若外層循環M次、內層循環N次,則內層循環體共執行M×N次,時間復雜度為O(M×N)。M×N典型應用二維數組遍歷(外層控行、內層控列)、矩陣乘法、九九乘法表打印等需要雙重遍歷的場景。二維遍歷性能注意嵌套層數不宜過多(一般不超過3層),否則執行次數指數增長,可能導致程序運行時間過長。≤3層Fortran·NestedLoop嵌套循環示例:九九乘法表九九乘法表是嵌套DO循環的經典應用。外層循環控制行(I=1到9),內層循環控制列(J=1到I),內層終值隨外層變量變化,形成三角形輸出結構。打印九九乘法表代碼說明PROGRAMMULTI_TABLE程序開始INTEGER::I,J聲明循環變量DOI=1,9外層循環:控制行數DOJ=1,I內層循環:J從1到I(三角形)WRITE(*,'(I1,"*",I1,"=",I2,2X)',&格式化輸出乘法式ADVANCE='NO')J,I,J*IADVANCE='NO'不換行ENDDO內層循環結束PRINT*,''每行結束后換行ENDDO外層循環結束ENDPROGRAM程序結束外層I控制行、內層J控制列,內層終值為I形成三角形輸出,ADVANCE='NO'實現同行連續打印。Fortran90DOWHILE循環:條件驅動DOWHILE是Fortran90引入的條件循環語句,適用于循環次數未知的場景。它在每次執行循環體前先判斷條件,條件為真則執行,為假則退出。初始條件為假時循環體不執行。01語法格式DOWHILE(邏輯表達式)DOWHILE(邏輯表達式)定義循環入口,循環體位于DOWHILE與ENDDO之間,每次執行前先檢查條件表達式。前置判斷邏輯條件02與DO循環的區別DO循環由計數器控制、循環次數確定;DOWHILE由邏輯條件控制、循環次數不確定。前者適合遍歷已知范圍,后者適合條件終止場景。計數器vs條件確定vs不確定03典型場景持續讀取數據直到遇到終止信號、迭代計算直到誤差小于閾值、游戲循環直到用戶選擇退出。適用于結束條件明確但次數未知的場景。數據讀取迭代收斂事件循環04注意防止死循環循環體內必須有改變條件表達式的語句,否則條件永遠為真,程序陷入死循環。務必確保循環變量在循環體內被正確更新。?必須更新條件邊界檢查FORTRAN·LOOPCONTROLDOWHILE應用示例DOWHILE循環適用于循環次數未知的數據讀取場景。通過在循環前和循環體末尾各讀入一次數據,配合DOWHILE條件判斷,實現"讀到終止信號即停"的靈活控制。累加正數,遇負數停止代碼說明PROGRAMSUM_POSITIVE程序開始REAL::X,SUM聲明變量SUM=0.0初始化累加器READ*,X先讀入第一個數DOWHILE(X>=0.0)條件:X非負則繼續SUM=SUM+X累加正數READ*,X讀入下一個數ENDDOX<0時退出循環PRINT*,'正數之和=',SUM輸出結果ENDPROGRAM程序結束先在循環外讀入一次數據,DOWHILE判斷后在循環體內再次讀入,實現不定次數的數據讀取與累加。FORTRAN90·LOOPCONTROLEXIT與CYCLE:精細循環控制EXIT和CYCLE是Fortran90提供的兩個循環內部控制語句。EXIT立即終止整個循環(類似break),CYCLE跳過本次循環剩余部分直接進入下一次迭代(類似continue),二者配合IF條件使用可實現靈活的循環控制。EXIT語句功能立即跳出當前循環,不再執行循環體剩余部分,也不再判斷循環條件,程序從ENDDO之后繼續執行典型用法IF(終止條件)EXIT,常用于在循環體內檢測到異常數據或找到目標后提前退出嵌套循環EXIT只跳出它所在的那一層循環,不影響外層循環的執行CYCLE語句功能跳過本次循環體中CYCLE之后的所有語句,直接回到循環頭部進行下一次迭代的條件判斷或計數典型用法IF(跳過條件)CYCLE,常用于過濾不符合要求的數據,跳過處理直接進入下一輪與EXIT的區別EXIT是徹底退出循環,CYCLE只是跳過本次,循環仍會繼續執行后續迭代Fortran控制流EXIT與CYCLE代碼示例EXIT和CYCLE可組合使用實現復雜循環控制:EXIT處理"徹底終止"場景,CYCLE處理"跳過當前"場景。累加正數,遇0停止,跳過負數代碼說明PROGRAMFILTER_SUM程序開始REAL::X,SUM聲明變量INTEGER::I,NSUM=0.0初始化READ*,N讀入數據個數DOI=1,NDO循環N次READ*,X讀入一個數據IF(X==0.0)EXIT遇0提前終止整個循環IF(X<0.0)CYCLE遇負數跳過本次,不累加SUM=SUM+X只累加正數ENDDOPRINT*,'正數之和=',SUM輸出結果ENDPROGRAM程序結束EXIT遇0提前終止循環,CYCLE遇負數跳過累加,二者配合實現靈活的數據過濾與控制。FORTRAN·CONTROLFLOW三種循環方式對比Fortran中構建循環有三種方式:IF+GOTO(原始方式)、DO(計數循環)和DOWHILE(條件循環)。現代編程推薦使用DO和DOWHILE,EXIT/CYCLE作為補充,GOTO方式已不推薦。TABLE三種循環構建方式對比對比維度IF+GOTODO循環DOWHILE適用場景任意(最靈活)已知循環次數循環次數未知代碼結構松散,易混亂結構清晰結構清晰循環出口需手動用IF設置自動(計數器越界)自動(條件為假)死循環風險高(易遺漏出口)低中(需確保條件變化)現代推薦度不推薦強烈推薦推薦DO循環和DOWHILE是現代Fortran編程的首選,IF+GOTO方式已逐步淘汰。CHAPTER04循環結構綜合應用通過經典案例掌握遞推、迭代與窮舉等循環設計方法ALGORITHM·遞推法遞推法:斐波那契數列斐波那契數列(1,1,2,3,5,8,13...)是遞推法的經典應用。通過維護前兩項的值,在每次循環中計算新項并更新前兩項,即可用O(N)時間復雜度求出第N項。求斐波那契數列第N項代碼說明PROGRAMFIBONACCI程序開始INTEGER::I,N,F1,F2,F3聲明變量READ*,N讀入NF1=1第1項F2=1第2項IF(N==1.OR.N==2)THEN前兩項直接輸出PRINT*,1ELSEDOI=3,N從第3項開始遞推F3=F1+F2當前項=前兩項之和F1=F2更新:前一項前移F2=F3更新:當前項變為前一項ENDDOPRINT*,F3輸出第N項ENDIFENDPROGRAM程序結束通過維護F1和F2兩個變量,每次循環計算F3=F1+F2并滾動更新,實現O(N)遞推。FORTRAN·循環結構迭代法:牛頓法求平方根牛頓迭代法通過Xnew=(Xold+A/Xold)/2公式不斷逼近平方根真值,每次迭代精度翻倍,是條件循環的典型應用。代碼說明PROGRAMSQRT_NEWTON程序開始REAL::A,X,X_OLD聲明變量READ*,A讀入待求平方根的數X=A/2.0初始猜測值DO無限循環(內部用EXIT退出)X_OLD=X保存舊值X=(X+A/X)/2.0牛頓迭代公式IF(ABS(X-X_OLD)<1E-6)EXIT精度滿足則退出ENDDOPRINT*,'平方根=',X輸出結果ENDPROGRAM程序結束用DO+EXIT實現不定次數迭代,每次用X=(X+A/X)/2逼近平方根,精度達1E-6時退出。ALGORITHM·EXHAUSTIVESEARCH窮舉法:判斷素數窮舉法通過逐一嘗試所有可能來解決問題。判斷素數時從2試除到√N即可(優化),找到因子立即EXIT退出。窮舉法思路簡單直觀,是循環結構最基本的應用模式之一。FORTRAN·判斷N是否為素數代碼說明PROGRAMCHECK_PRIME程序開始INTEGER::N,I聲明變量LOGICAL::IS_PRIME邏輯標志READ*,N讀入NIS_PRIME=.TRUE.先假設為素數DOI=2,INT(SQRT(REAL(N)))試除到√NIF(MOD(N,I)==0)THEN能整除則不是素數IS_PRIME=.FALSE.修改標志EXIT找到因子,提前退出ENDIFENDDOIF(IS_PRIME)THEN根據標志輸出PRINT*,N,'是素數'ELSEPRINT*,N,'不是素數'ENDIFENDPROGRAM程序結束用LOGICAL標志配合DO循環窮舉試除到√N,EXIT在找到因子時提前退出,效率高且邏輯清晰。Algorithm·Fortran累乘法:計算階乘N!階乘N!=1×2×3×...×N是累乘法的經典應用。累乘器必須初始化為1而非0,循環體執行"累乘器=累乘器×當前項"。基本階乘01FACT=1初始化(非0),DOI=1,N循環中執行FACT=FACT*I,循環結束FACT即為N!02注意數據范圍:13!已超出INTEGER(4)范圍,大數階乘需用REAL或INTEGER(8)類型030!=1是數學約定,程序中應單獨處理N=0的情況擴展:累加階乘之和01求1!+2!+3!+...+N!:外層循環控制項數,每次將當前階乘值累加到總和中02優化技巧:利用K!=(K-1)!×K的遞推關系,無需每次重新計算,單次循環即可完成03SUM=0,FACT=1;DOI=1,N:FACT=FACT*I,SUM=SUM+FACT;ENDDOFORTRAN·EUCLIDEANALGORITHM綜合案例:輾轉相除法求最大公約數輾轉相除法(歐幾里得算法)通過反復取余逼近最大公約數,余數為0時除數即為結果。用輾轉相除法求GCD(M,N)CODE說明PROGRAMGCD_EUCLID程序開始INTEGER::M,N,R聲明變量READ*,M,N讀入兩個正整數DO無限循環R=MOD(M,N)求M除以N的余數IF(R==0)EXIT余數為0則退出循環M=N更新:除數變為被除數N=R更新:余數變為除數ENDDOPRINT*,'GCD=',NN即為最大公約數ENDPROGRAM程序結束輾轉相除法:反復用MOD求余并更新,余數為0時EXIT退出,當前除數N即為最大公約數。FORTRAN·核心模式循環與數組:天然搭檔循環與數組是Fortran編程中最常見的組合模式。數組存儲批量數據,循環變量充當數組下標,實現對每個元素的逐一讀取、計算和修改。數組讀入用循環變量I作為下標,DOI=1,N逐個READ*讀入數組元素,實現批量數據采集。這是最基礎的數組操作模式。DOI=1,N;READ*求最大值先令MAX=A(1),再DOI=2,N逐一比較,IF(A(I)>MAX)則更新,循環結束即得最大值。經典遍歷算法。MAX=A(1)條件統計循環遍歷數組,用IF判斷每個元素是否滿足條件,滿足則計數器加1,如統計及格人數。篩選與聚合結合。COUNT+IF數組輸出DO循環逐元素PRINT*輸

溫馨提示

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

評論

0/150

提交評論