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(n²)降至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

提交评论