FORTRAN90第三章循環結構程序設計_第1頁
FORTRAN90第三章循環結構程序設計_第2頁
FORTRAN90第三章循環結構程序設計_第3頁
FORTRAN90第三章循環結構程序設計_第4頁
FORTRAN90第三章循環結構程序設計_第5頁
已閱讀5頁,還剩31頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

FORTRAN90第三章循環結構程序設計Contents本章內容Fortran循環結構的完整知識脈絡,從基礎概念到綜合實踐。01循環結構的基本概念02DO計數循環03DOWHILE條件循環04循環嵌套05EXIT與CYCLE控制06綜合應用與練習CHAPTER01循環結構的基本概念理解循環的本質、應用場景與結構化設計思想ControlStructures三大基本控制結構結構化程序設計理論證明,任何復雜算法都可以由順序、選擇、循環三種基本結構組合而成。循環結構賦予程序重復執行的能力,是處理批量數據和迭代計算的核心工具。順序結構語句按書寫順序依次執行,每條語句執行一次,是程序的基礎骨架。基礎骨架選擇結構通過IF或SELECTCASE根據條件判斷選擇不同分支執行,實現決策邏輯。決策邏輯循環結構在滿足特定條件時反復執行某段代碼塊,適合處理大量重復性計算任務。迭代計算ALGORITHM·LOOP循環結構的典型應用場景循環結構適用于一切具有"重復執行"特征的算法場景:累加累乘、數據遍歷、迭代逼近等。在科學計算中,循環是處理數組、矩陣、數值迭代的核心手段。累加累乘如求1+2+…+n、n!等數列運算,通過循環逐項累計結果Σ·n!數據遍歷逐元素訪問數組或數據序列,完成統計、查找、排序等操作數組遍歷迭代逼近如牛頓法求根、泰勒級數求和,反復計算直到滿足精度要求牛頓法批量輸入輸出循環讀取或打印多組數據,避免重復書寫相同語句批量I/OFORTRAN90·SYNTAXFORTRAN90循環語句類型FORTRAN90提供三類循環語句:計數型DO循環用于已知次數的重復;條件型DOWHILE循環根據邏輯條件決定循環繼續與否;隱含DO是一種簡潔寫法,主要用于I/O語句和數組初始化。DO計數循環通過循環變量從初值到終值按步長變化來控制循環次數,適合迭代次數已知的場景步長可正可負,默認步長為1循環變量自動遞增或遞減適用于數值積分等固定步長計算已知次數DOWHILE條件循環當邏輯表達式為真時重復執行循環體,適合循環次數未知、依賴條件的迭代場景先判斷條件,條件為真才執行需確保循環體內有條件變化語句適用于迭代求解、數據讀取等場景條件驅動隱含DO在READ/PRINT/數組構造器中使用,形如(A(I),I=1,N),簡化批量I/O操作可嵌套使用,支持多維數組操作控制變量僅在語句內有效常用于格式化輸出和數組初始化批量I/OCHAPTER02DO計數循環掌握循環變量、初值、終值與步長的協作機制Fortran·SyntaxDO循環語法格式DO循環的標準格式為DOvar=start,end[,step]...ENDDO,循環變量必須是整型標量,步長省略時默認值為1,循環次數在進入循環前就完全確定。SyntaxDOvar

=start,end[,step]<body>ENDDOvar循環控制變量start迭代初值end迭代終值step步長(可選)標準格式DO循環變量=初值,終值[,步長],以ENDDO或CONTINUE語句結束類型約束循環變量必須為整型變量,初值、終值、步長可以是整型常量或整型表達式步長規則步長可省略,省略時默認值為1;步長可為正、負或零(步長為零通常導致無限循環)CONTROLFLOWDO循環執行過程DO循環在進入前先計算循環次數r=MAX(0,INT((e2-e1+e3)/e3))。若r≤0則跳過循環體;否則循環變量從初值開始,每輪增加步長,執行r次后退出,退出時循環變量值不再可用。01計算初值與確定參數進入循環前先計算初值e1、終值e2、步長e3的表達式值,并據此確定循環次數re1·e2·e302計算循環次數r循環次數公式:r=MAX(0,INT((e2-e1+e3)/e3)),r=0時循環體不執行r=0跳過03逐輪執行與步長遞增每輪循環結束后循環變量自動加步長,再與終值比較決定是否繼續下一輪自動+步長04退出循環與變量失效循環正常結束后循環變量的值超出終值范圍,不應再引用該值(屬未定義狀態)未定義狀態FORTRAN·DOLOOP示例:求1+2+…+100的和累加求和是DO循環最經典的應用。通過初始化累加器為0,在循環體內反復執行sum=sum+i,利用循環變量i作為被加數,100次迭代后得到結果5050。01初始化累加器sum=0,確保在循環開始前清零,避免垃圾值影響結果sum=002設定循環范圍DOi=1,100循環變量從1遞增到100,步長默認為1,共執行100次i=1→10003逐次累加循環體內sum=sum+i將當前i值累加到sum中sum+=i04輸出結果循環結束后PRINT*,sum輸出最終結果5050Fortran·LoopControl負步長DO循環當步長為負值時,循環變量從大到小遞減。此時要求初值≥終值,否則循環次數r計算為0,循環體不執行。遞減執行DOi=10,1,-1:循環變量從10遞減到1,步長為-1,共執行10次循環10次繼續條件負步長時循環繼續的條件為:循環變量≥終值,與正步長方向相反i≥終值零次執行若初值小于終值且步長為負(如DOi=1,10,-1),r=0,循環體一次不執行r=0典型應用逆序遍歷數組、從后向前查找元素、倒計時輸出等場景逆序遍歷FORTRAN·LEGACYSYNTAX帶標號的DO循環(舊式寫法)早期FORTRAN用標號+CONTINUE語句標識循環終點,FORTRAN90推薦用ENDDO取代。理解舊式寫法有助于閱讀維護歷史科學計算代碼。01DO100i=1,10...100CONTINUE舊式格式:DO100i=1,10...100CONTINUE,用數字標號標記循環終點標號終點02DO...ENDDOFORTRAN90推薦使用DO...ENDDO塊結構,可讀性更好且易于嵌套現代推薦03多個DO循環可共用同一個CONTINUE終點,但容易導致邏輯混亂,不推薦共用陷阱04閱讀舊代碼時注意:標號范圍定義了循環體,縮進不規范時需仔細核對邊界邊界核對Fortran·ControlFlowDO循環注意事項DO循環有嚴格的約束規則:循環變量在循環體內不可被賦值修改;初值、終值、步長在循環開始前計算一次后即固定,循環體內對它們的修改不影響循環次數。禁止修改循環變量循環體內對循環變量賦值(如i=i+2)屬于未定義行為,編譯器可能不報錯但結果不可預測i=i+2?邊界值只求值一次初值、終值、步長表達式在進入循環時只求值一次,后續修改這些變量不影響循環次數Eval×1終值不可靠循環正常終止后循環變量的值取決于編譯器實現,不應在循環外繼續引用該變量Unspecified使用CYCLE/EXIT如需跳過某些值或提前退出循環,應使用CYCLE或EXIT語句,而非直接修改循環變量CYCLE·EXITFORTRAN·DOLOOP示例:計算n!(階乘)階乘計算是DO循環累乘應用的典型。累乘器初始值必須為1(非0),循環體內反復執行fact=fact*i,n次迭代后得到n!。當n較大時需注意整型溢出問題。累乘器初始化fact初始化為1(非0),任何數乘以0都得0,這是累乘與累加的關鍵區別。初始化錯誤將導致結果恒為0。fact=1DO循環累乘DOi=1,n循環n次,每輪執行fact=fact*i,逐步累積乘積。循環變量i從1遞增至n,最終得到n!的精確值。n次迭代整型溢出防護n較大時(如n>12)結果可能超出默認整型范圍。應使用KIND=8長整型或實型存儲,防止數據截斷或程序異常。n>12邊界條件檢查IF(n<0)時階乘無定義,應給出錯誤提示后退出程序。良好的輸入驗證是健壯程序的基礎,避免無效計算。n<0CHAPTER03DOWHILE條件循環以邏輯條件驅動循環執行,處理未知次數的迭代問題Fortran·LoopControlDOWHILE語法與執行過程DOWHILE循環在每輪循環開始前先判斷邏輯條件:條件為.TRUE.時執行循環體,為.FALSE.時退出循環。循環次數在編寫時不確定,完全取決于運行時的條件變化。01語法格式DOWHILE(邏輯表達式)...ENDDO,邏輯表達式必須返回.TRUE.或.FALSE.,這是循環控制的核心機制。02執行流程先判斷條件→條件為真則執行循環體→回到條件判斷→條件為假則退出,形成完整的控制閉環。03首次判斷為假若首次判斷條件即為.FALSE.,循環體一次也不執行,與DO計數循環r=0情況一致,體現了前置判斷的特性。04防止死循環必須在循環體內包含能改變條件值的語句,否則將導致無限循環(死循環),這是編程中需要特別注意的陷阱。DOWHILE·FORTRAN示例:輸入累加直到輸入0為止當循環次數取決于運行時輸入時,DOWHILE是理想選擇。本例先讀入一個數,DOWHILE(x/=0)控制循環繼續,輸入0時條件不滿足而退出。初始化讀取先執行一次READ*,x讀取首個輸入值,為循環條件判斷提供初始數據。這是DOWHILE結構的典型前置步驟。條件判斷DOWHILE(x/=0)判斷當前輸入是否非零,非零則進入循環體進行累加。條件為假時立即退出循環。累加與更新循環體內先sum=sum+x累加,再READ*,x讀取下一個輸入,保證條件值持續更新。順序至關重要。終止與輸出當用戶輸入0時,條件x/=0為假,循環終止,打印累計結果。程序流程清晰可控。LoopConstructsDO與DOWHILE適用場景對比DO循環適合已知次數的計數型循環,DOWHILE適合次數未知的條件型循環。兩者可互相轉化,但選擇合適形式能提升代碼可讀性。DO計數循環Count-Controlled循環次數在進入循環前即可由初值、終值、步長確定典型場景:遍歷數組、計算已知項數的級數、固定步數迭代代碼簡潔直觀,編譯器可進行循環優化已知次數DOWHILE條件循環Condition-Controlled循環次數取決于運行時條件的變化,編寫時無法預知典型場景:迭代收斂判斷、交互式輸入、搜索滿足條件的值需確保循環體內有改變條件的語句,避免死循環未知次數ScientificComputing示例:牛頓迭代法求平方根牛頓迭代法是DOWHILE在科學計算中的經典應用。通過x=(x+a/x)/2反復逼近√a,當相鄰兩次迭代值之差小于精度要求ε時終止循環。xnew=(x+a/x)/201迭代公式—xnew=(x+a/x)/2.0,每次迭代使x更接近√a的真實值02終止條件—ABS(xnew?x)<epsilon(如1.0E-6),精度達標時退出循環03循環控制—DOWHILE(ABS(xnew?x)>=epsilon)持續迭代,不滿足精度則繼續04變量更新—循環體內x=xnew,并計算新的xnew,保證收斂判斷持續有效CHAPTER04循環嵌套處理多維數據與復雜迭代結構的利器NestedLoops循環嵌套的基本規則循環嵌套中,外層循環每迭代一次,內層循環完整執行一輪。若外層循環m次、內層循環n次,則最內層循環體共執行m×n次。嵌套層數越多,總執行次數增長越快,需注意性能影響。01外層循環控制"大維度"(如矩陣行),內層循環控制"小維度"(如矩陣列)02每層循環必須使用不同的循環變量,避免變量沖突導致邏輯錯誤03內層循環完整執行一輪后,外層循環變量才前進一個步長04兩層嵌套總執行次數為m×n,三層為m×n×k,指數增長時需注意時間復雜度NESTEDLOOPS·FORTRAN示例:打印九九乘法表九九乘法表是二重循環的經典練習。外層i=1,9控制行號,內層j=1,i控制每行列數。內層終值隨外層變量變化,使每行輸出不同數量的等式,形成三角形排列。01外層DOi=1,9控制行號,共9行,每行對應一組乘法等式02內層DOj=1,i控制每行列數,終值等于當前行號i,第k行輸出k個等式03循環體內用WRITE(*,…,ADVANCE='NO')控制不換行輸出04每行內層循環結束后執行一次PRINT*換行,保證輸出格式整齊OUTPUTPATTERN三角形輸出結構i=11×1=1i=22×1=22×2=4i=33×1=33×2=63×3=9···i=88×1=88×2=168×3=24…8×8=64i=99×1=99×2=189×3=27…9×9=81第i行輸出i個等式→共45個等式FORTRAN·二重循環示例:矩陣轉置矩陣轉置是二重循環在科學計算中的核心應用。通過外層i遍歷行、內層j遍歷列,將A(i,j)賦給B(j,i),實現行列互換。該模式是FORTRAN矩陣處理的基礎范式。定義矩陣維度定義A(m,n)為原矩陣,B(n,m)為轉置結果矩陣,行列維度互換。A(m,n)→B(n,m)二重循環遍歷外層DOi=1,m遍歷行,內層DOj=1,n遍歷列,共執行m×n次賦值。m×n次核心賦值操作B(j,i)=A(i,j),將原矩陣第i行第j列寫入轉置矩陣第j行第i列。B(j,i)=A(i,j)內置函數捷徑FORTRAN90支持B=TRANSPOSE(A)內置函數,理解循環實現有助于掌握底層邏輯。TRANSPOSEFORTRAN90·語法增強命名循環(FORTRAN90新特性)FORTRAN90允許為DO循環指定名稱(如outer:DO...ENDDOouter),在深層嵌套中顯著提升可讀性,并可配合EXIT/CYCLE語句精確控制要退出或跳過的循環層級。01??命名語法循環名:DO...ENDDO循環名,名稱在DO和ENDDO處需保持一致,形成顯式的循環邊界標記,便于快速識別循環范圍。02??EXIT精確退出EXIT循環名嵌套時可配合EXIT循環名語句直接退出指定層級的循環,而非僅退出最內層,實現靈活的流程控制。03??CYCLE精確跳過CYCLE循環名CYCLE循環名可跳過指定層級的當前迭代,使該層循環直接進入下一輪,避免冗余計算。04??代碼自文檔化即使不嵌套,命名循環也有助于代碼自文檔化,通過語義化名稱直觀表達循環意圖,顯著提高可讀性和長期維護性。CHAPTER05EXIT與CYCLE控制精確控制循環流程的提前退出與迭代跳過機制FORTRAN·流程控制EXIT語句:提前終止循環EXIT語句使程序立即跳出所在循環(或命名循環),執行ENDDO之后的下一條語句。常用于在循環中搜索到目標后提前退出,避免無意義的后續迭代,提升運行效率。語法基本語法EXIT或EXIT循環名,無條件退出當前循環或指定名稱的循環EXIT行為執行跳轉執行EXIT后程序跳到ENDDO后的第一條語句,不再執行循環體剩余部分ENDDO場景查找即退出在數組中查找目標值,找到后EXIT退出,避免遍歷剩余元素搜索優化進階命名嵌套退出在命名嵌套循環中EXITouter可直接退出外層循環,而非僅退出最內層EXITouterFORTRAN·循環控制CYCLE語句:跳過當前迭代CYCLE語句跳過循環體中剩余語句,直接進入下一輪迭代(循環變量按步長更新)。常用于過濾不符合條件的數據項,避免用多層IF嵌套包裹整個循環體。語法形式CYCLE或CYCLE循環名,跳過當前迭代的剩余語句,直接進入下一輪循環。CYCLE變量正常更新執行CYCLE后循環變量仍按步長遞增,不改變循環總次數的預期。步長更新典型場景遍歷數據時跳過不合法或無需處理的元素,如IF(x<0)CYCLE。IF(x<0)結構優勢相比用IF包裹整個循環體,CYCLE使代碼結構更扁平、邏輯更清晰。扁平結構ALGORITHM·EXIT示例:判斷素數(EXIT應用)素數判斷是EXIT的典型應用。循環從2試除到√n,一旦發現整除即用EXIT提前退出,循環結束后根據循環變量是否超出終值來判斷n是否為素數,效率遠優于遍歷到n-1。01只需試除到INT(SQRT(REAL(n))),因為若n有大于√n的因子則必有小于√n的因子——搜索空間從n?1縮減到√n,復雜度大幅降低。O(√n)02構造DOi=2,INT(SQRT(REAL(n)))循環,在循環體內用MOD(n,i)==0逐一試除判斷是否整除。DOLOOP03若整除則執行EXIT立即退出循環,此時i≤√n,說明n存在真因子,可判定n不是素數。EARLYEXIT04循環正常結束(未觸發EXIT)時i>√n,說明在試除范圍內無可整除因子,n是素數。i>√nCHAPTER06綜合應用與練習通過典型案例融會貫通各類循環結構與控制語句ALGORITHM·NUMERICALMETHOD示例:泰勒級數求ex利用泰勒展開ex=Σ(xn/n!)計算指數函數,采用DOWHILE循環,當某項絕對值小于精度ε時退出。關鍵優化是遞推計算每一項:term=term*x/n,避免重復計算階乘和冪。遞推關系第n項=第n-1項×x/n,避免每輪重新計算xn和n!的巨大開銷,將復雜度從O(n2)降至O(n)。term×x/n初始化sum=1.0,term=1.0,從n=1開始逐次累加term到sum中,首項e0=1已含在初始值內。sum=1.0退出條件DOWHILE(ABS(term)>epsilon)控制循環,精度達標即退出,無需預設迭代次數上限。ABS(term)>ε迭代三步循環體內n=n+1,term=term*x/n,sum=sum+term,三步完成一輪迭代,邏輯清晰且易于調試。3StepsALGORITHM示例:冒泡排序冒泡排序通過二重循環實現:外層i控制趟數(共n-1趟),內層j控制每趟的相鄰元素比較與交換。每趟將未排序部分的最大值移至末尾,是一種直觀但效率較低的排序算法。01外層循環控制趟數DOi=1,n-1控制排序趟數,n個元素最多需n-1趟即可全部有序。n-102內層循環縮小范圍DOj=1,n-i控制每趟比較范圍,每完成一趟末尾已排好,范圍縮小1。n-i03相鄰比較與交換IF(a(j)>a(j+1))THEN交換兩個元素,使較大值向后移動。SWAP04標志變量提前退出可設標志變量,某趟無交換則提前EXIT,最好情況復雜度降為O(n)。O(n)Algorithm·GCD示例:輾轉相除法求最大公約數歐幾里得算法(輾轉相除法)通過反復取余計算GCD:r=MOD(a,b),然后將b賦給a、r賦給b,直到余數為0。循環次數取決于輸入值,DOWHILE(r/=0)是最自然的實現方式。01算法原理:GCD(a,b)=GCD(b,MOD(a,b)),反復用余數替換直到余數為0。這一核心等式保證了算法的正確性,是數學上最優雅的求最大公約數方法之一。GCD(b,MOD)→遞歸降維02初始化:讀入a,b,計算r=MOD(a,b),DOWHILE(r/=0)控制循環。循環條件判斷余數是否為零,為零則終止,否則繼續迭代。DOWHILE(r/=0)→條件驅動03循環體內:a=b,b=r,r=MOD(a,b),三個賦值完成一輪輾轉。每次迭代都將問題規模縮小,余數必然遞減,確保有限步內收斂。a=b,b=r→狀態轉移04循環終止:b即為最大公約數,該算法時間復雜度為O(log(min(a,b)))。效率極高,即使對于大整數也能快速求解。O(logn)→對數級高效Fortran·循環結構隱含DO循環隱含DO是一種在I/O語句和數組構造器中使用的簡寫循環形式,形如(expr,var=start,end,step)。它不占用獨立語句塊,但功能等價于展開的DO循環,使批量操作更加簡潔。語法結構(表達式,循環

溫馨提示

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

最新文檔

評論

0/150

提交評論