Fortran程序设计第六章循环结构_第1页
Fortran程序设计第六章循环结构_第2页
Fortran程序设计第六章循环结构_第3页
Fortran程序设计第六章循环结构_第4页
Fortran程序设计第六章循环结构_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

Fortran程序设计第六章循环结构—从DO循环到嵌套迭代的完整掌握Contents本章内容概览Fortran第六章·循环结构,从基础概念到嵌套优化,系统掌握程序重复执行的核心机制。01循环结构概述与基本概念02DO循环语法与执行机制03DOWHILE循环与流程控制04嵌套循环与经典算法应用05循环优化与编程实践CHAPTER01循环结构概述与基本概念理解循环的本质:让计算机高效执行重复性任务的编程范式Chapter06·Fortran为什么需要循环结构循环结构是编程语言处理重复性任务的基石。在科学计算领域,从简单的数列求和到复杂的矩阵迭代,循环使得用少量代码完成海量计算成为可能,是Fortran作为数值计算语言的核心能力支撑。TheProblem没有循环的困境冗长、不可扩展、无法处理大规模数据。手写重复代码效率低下,且难以维护和调试。TheSolution循环的核心价值简洁、通用、支撑经典算法实现。通过控制结构实现自动化重复,是结构化程序设计的关键要素。问题驱动:没有循环的困境01计算1到100的和需手写100条加法语句,代码冗长且无法扩展到更大规模02处理1000个学生的成绩统计时,逐条编写代码既不可行也不具备通用性03科学计算中矩阵迭代可能涉及百万次运算,无循环则完全无法实现循环的核心价值01用3-5行代码替代成百上千行重复语句,极大提升编码效率和程序简洁性02使程序具备处理任意规模数据的能力,从10次到100万次运算使用同一逻辑03为算法实现提供基础框架,排序、搜索、数值逼近等经典算法均依赖循环CHAPTER06·循环结构循环的基本概念与分类Fortran循环结构分为计数控制的DO循环和条件控制的DOWHILE循环两大类。DO循环适用于已知迭代次数的场景,DOWHILE循环适用于需要根据运行时条件动态判断终止时机的场景,两者互补构成了Fortran完整的循环体系。DO循环计数循环01预先确定循环次数,通过循环变量从初值到终值的递增/递减来控制执行02典型场景:遍历数组元素、固定次数的数值计算、生成序列数据03Fortran77使用语句标号标记循环终点,Fortran90引入ENDDO更清晰已知次数DOWHILE循环条件循环01根据逻辑表达式的真假决定是否继续执行,循环次数在运行前不确定02典型场景:迭代求解、用户输入验证、收敛判断等无法预知次数的任务03每次迭代前评估条件,条件为.TRUE.时执行循环体,为.FALSE.时退出动态判断LOOPSTRUCTURE·COREELEMENTS循环的三大核心要素任何循环结构都由初始化、条件判断、变量更新三个要素构成。三者协同工作确保循环能够正确启动、持续执行并最终终止。理解这三要素是分析和编写一切循环程序的理论基础。初始化在循环开始前为循环变量赋初值,如DO循环中的i=1或WHILE循环前的sum=0i=1条件判断每次迭代前评估终止条件,DO循环自动判断是否超出终值,WHILE循环评估逻辑表达式if/while变量更新每次迭代后修改循环变量使其趋向终止条件,DO循环按步长自动递增,WHILE需手动编写i=i+step缺失的后果缺少初始化导致随机值参与运算,缺少条件判断或变量更新将导致无限循环(死循环)死循环Chapter02DO循环语法与执行机制深入掌握Fortran最核心的计数循环:语法规范、执行流程与步长控制CHAPTER06·LOOPSTRUCTURESDO循环的基本语法Fortran的DO循环经历了从77标准到90标准的语法演进。Fortran77依赖语句标号标记循环终点,Fortran90引入ENDDO实现结构化闭合。两种语法在逻辑上等价,但90标准显著提升了代码可读性和维护性。Fortran77经典语法DOlabelvar=start,end[,step]格式为DOlabelvar=start,end[,step],用数字标号标记循环终点终点语句通常为CONTINUE,标号占据代码第1-5列,数值本身无特殊含义示例:DO10i=1,n...10CONTINUE,程序员负责确保标号唯一标号驱动Fortran90现代语法DOvar=start,end[,step]...ENDDO格式为DOvar=start,end[,step]...ENDDO,无需标号即可闭合支持为循环命名如name:DO...ENDDOname,便于嵌套循环中的辨识推荐在新程序中使用此语法,结构清晰且不易因标号冲突引发错误结构化闭合CHAPTER06·循环结构DO循环的执行流程DO循环的执行遵循"赋初值→判断→执行→递增"的四步流程。Fortran在循环启动时预先计算迭代次数且不再更改,即使循环体内修改了终值变量也不影响已确定的循环次数。STEP01赋初值·算次数将初值start赋给循环变量var,并预先计算总迭代次数:(end−start)/step+1STEP02条件判断判断循环变量是否超出终值范围——正步长时var>end则退出循环,负步长时var<end则退出。var>end∨var<endSTEP03执行循环体执行循环体内的全部语句,包括计算、赋值、输入输出等所有操作。执行全部语句STEP04递增·返回循环变量自动增加步长step的值,然后返回步骤二继续下一轮判断,直至条件不满足。var=var+stepStepControlDO循环的步长控制DO循环通过step参数灵活控制循环变量的变化方向和幅度。步长可正可负、可为变量,但不能为零。步长的选择直接决定了循环变量的遍历序列和迭代次数,是实现多样化计数逻辑的关键参数。步长类型与应用01默认步长为1:DOi=1,10产生序列1,2,3,…,10,是最常用的正向递增形式1→10step=102正步长跳步:DOi=1,20,3产生1,4,7,10,13,16,19,适用于隔项处理1→20step=303负步长递减:DOi=100,1,-10产生100,90,80,…,10,适用于倒序遍历100→1step=-10步长的约束与陷阱01步长为0是非法操作,将导致无限循环或编译错误,必须在代码中严格避免step≠002步长可以是变量(如DOi=1,n,step),但循环启动后步长值不再随变量变化而改变initonce03符号需逻辑一致:正步长要求start≤end,负步长要求start≥endsign(start,end,step)FORTRAN·LOOP实例:DO循环计算累加和累加求和是DO循环最经典的应用场景,完整展示了初始化、循环控制和结果输出的标准编程范式。01变量初始化声明INTEGER类型变量,sum赋初值0防止内存干扰INTEGER02循环主体DOi=1,n驱动递增,每次执行sum=sum+iDOLOOP03结果输出PRINT语句输出sum值,n=100时结果为5050505004扩展思考修改步长可计算偶数和或奇数和STEP=2INTEGER::i,n,sumsum=0READ*,nDOi=1,nsum=sum+iENDDOPRINT*,sumFortranDO循环累加求和核心代码CHAPTER06·循环结构迭代次数计算与循环变量规则DO循环的迭代次数在启动时由公式确定且不再改变。循环变量在正常结束后处于未定义状态,编程时应避免在循环外直接引用。迭代次数公式迭代次数由MAX(0,INT((end−start+step)/step))计算,结果为非负整数;结果为0时循环体不执行。方向矛盾检测正步长但start>end(如DOi=10,1,1),迭代次数为0,直接跳过循环体,不产生任何执行。循环变量状态Fortran90规定正常退出后循环变量值未定义,不应在ENDDO之后直接引用该变量。安全实践建议若需使用最终值,可在循环体内用额外变量保存中间结果,或使用EXIT语句退出时变量仍有定义。CHAPTER03DOWHILE循环与流程控制条件驱动循环与EXIT/CYCLE流程干预:应对迭代次数不确定的编程场景Chapter06·LoopStructuresDOWHILE循环语法与应用DOWHILE循环以逻辑表达式作为继续执行的条件,每次迭代前先判断条件真假。它不自动管理循环变量,需要程序员手动更新条件相关变量。语法结构与执行逻辑格式为DOWHILE(logical_expr)...ENDDO,每次迭代前先评估逻辑表达式条件为.TRUE.时执行循环体,为.FALSE.时退出循环,判断发生在执行之前循环变量的初始化和更新都需手动编写,忘记更新将导致无限循环典型应用场景迭代求解NEWTON如牛顿法求方程根,当相邻两次迭代差值小于精度阈值时停止输入验证VALIDATE反复提示用户输入直到获得合法数据,循环次数取决于用户行为搜索与查找SEARCH在数据集中搜索满足特定条件的元素,找到后退出循环Fortran·循环结构实例:DOWHILE计算累加和通过手动控制循环变量的初始化和递增,DOWHILE循环实现了与DO循环等价的累加功能。虽然代码量略多,但DOWHILE的条件表达式可以是任意复杂的逻辑判断,赋予了程序员更大的控制自由度。01手动初始化在循环前将sum设为0、i设为1,这两个初始化步骤缺一不可02条件判断DOWHILE(i<=10)在每次迭代前检查i是否仍在有效范围内03手动递增循环体内必须包含i=i+1,否则i永远为1,循环将永不终止04对比DO循环同样的任务DO循环只需3行核心代码,DOWHILE需要5行但条件表达更灵活3vs5核心代码行数Fortran·第六章·循环结构EXIT语句:提前退出循环EXIT语句允许在循环体内的任意位置根据运行时条件立即终止循环。它打破了只能通过循环头部条件判断退出的限制,使程序能够在找到目标解、检测到错误或满足特定条件时高效退出,避免不必要的后续迭代。EXIT的工作机制执行到EXIT时立即跳出当前所在的最内层循环,控制流转到ENDDO之后的语句通常与IF语句配合使用:IF(condition)EXIT,满足条件时触发提前退出在嵌套循环中EXIT仅退出所在层级,外层循环不受影响继续正常执行典型使用场景搜索查找:在数组中找到目标值后立即EXIT,避免遍历剩余元素的无效计算错误检测:迭代过程中检测到发散或异常值时EXIT,防止计算进一步恶化提前终止:当DOi=1,10循环中i==8时EXIT,后续8、9、10不再执行Fortran·LoopControlCYCLE语句:跳过当前迭代CYCLE使程序跳过当前迭代中后续语句,直接回到循环头部。与EXIT的"彻底退出"不同,CYCLE是"部分跳过",循环仍在继续。CYCLE的工作机制执行到CYCLE时跳过本轮剩余语句,直接回到循环头部进行下一次迭代判断。该机制让程序能够灵活控制循环流程,避免执行不必要的计算步骤。循环并未终止,只是当前这一次迭代被中断,后续迭代照常执行。CYCLE仅影响单次迭代,不改变循环的整体执行次数和终止条件。通常与IF配合:IF(i==5)CYCLE表示当i为5时跳过本轮。这种条件控制是CYCLE最常见的使用场景。EXIT与CYCLE对比EXIT终止整个循环,转到ENDDO之后;CYCLE跳过本轮,回到DO头部。两者控制范围截然不同,EXIT是全局终止,CYCLE是局部跳过。i=1到10:EXIT在i=8触发输出1-7;CYCLE在i=5触发输出1-4和6-10。对比可见CYCLE保留了其他迭代的执行机会。两者可组合使用:CYCLE跳过不需要的迭代,EXIT在满足终止条件时彻底退出。合理搭配能实现复杂的循环控制逻辑。Fortran·LoopControl综合实例:EXIT与CYCLE联合使用在同一个循环中同时使用CYCLE跳过特定迭代和EXIT提前终止,是处理复杂循环逻辑的标准模式。两者协同实现了精细化的流程控制。代码逻辑DOi=1,10循环中,IF(i==5)CYCLE跳过5的输出,IF(i==8)EXIT提前退出循环。i=1,10执行结果输出1,2,3,4,6,7共6个值,5被CYCLE跳过,8到10因EXIT而未执行。6个值流程图解析每次迭代先检查CYCLE条件(跳过),再检查EXIT条件(终止),最后执行正常操作。3步检查实际映射等价于数据处理中"跳过缺失值(CYCLE)并在遇到无效数据时终止(EXIT)"的处理策略。过滤+终止CHAPTER04嵌套循环与经典算法应用从二维遍历到经典数列:嵌套循环的设计思维与典型算法实现Chapter06·LoopStructures嵌套循环的概念与执行机制嵌套循环通过在循环体内嵌入新的循环来处理多维数据或多层次的重复任务。外循环每迭代一次,内循环完整执行一轮,总执行次数为各层迭代次数的乘积。Fortran·NestedDOouter:

DOi=1,minner:

DOj=1,n!body(i,j)ENDDOinnerENDDOouterm×n次总执行嵌套结构与执行原理01外循环控制"大维度"(如行),内循环控制"小维度"(如列),形成层级遍历02外循环执行m次、内循环执行n次时,内层循环体总共执行m×n次03Fortran中可用命名循环如outer:DO...ENDDOouter设计原则与注意事项04嵌套层数通常不超过3层,过深嵌套导致代码难以调试且执行时间指数级增长05内外循环变量必须使用不同变量名(如i和j),避免变量冲突导致逻辑错误06EXIT和CYCLE只作用于最内层,退出外层需使用命名循环语法NESTEDLOOP·嵌套循环实例:嵌套循环打印乘法表乘法表是理解嵌套循环执行逻辑的最佳案例——100次内层执行完整呈现了"外一次、内全部"的运行时序FORTRAN90PROGRAMMultiplicationIMPLICITNONEINTEGER::i,jDOi=1,10DOj=1,10WRITE(*,'(I4)',ADVANCE='NO')i*jENDDOWRITE(*,*)ENDDOENDPROGRAM100次内层循环·完整10×10矩阵01外层循环DOi=1,10控制行号,每完成一次外循环迭代代表一行输出完毕i行02内层循环DOj=1,10控制列号,每次迭代计算并输出i×j的乘积结果j列03总执行次数为10×10=100次内层循环体执行,生成完整乘法表矩阵100×04格式技巧:WRITE(*,'(I4)',ADVANCE='NO')实现同行连续输出,行末换行I4Fortran·第六章循环结构循环与数组:计算数组平均值DO循环遍历数组是Fortran数据处理的基础,配合累加器实现求和、平均值等统计计算,可推广到方差、极值等一切遍历任务。01常量定义用PARAMETER定义数组大小常量N=5,便于统一管理和后续扩展修改。通过命名常量提升代码可读性,避免魔法数字散布在程序各处。02循环累加DOi=1,N中通过array(i)逐元素访问,将每个值累加到sum变量。循环变量i作为数组下标,实现顺序遍历,是数组处理的核心模式。03精度控制平均值=sum/N,声明为REAL类型以保留小数精度。整数除法会截断小数,必须显式转换为浮点类型确保计算准确。04扩展应用条件统计与极值查找:IF(array(i)>max)逐步更新,或统计满足条件的元素个数。同一套遍历框架可扩展至方差、标准差、中位数等复杂统计量计算。Fortran·第六章·循环结构经典算法:斐波那契数列斐波那契数列(F(n)=F(n-1)+F(n-2))是循环生成序列的经典案例。通过维护两个状态变量a和b作为滑动窗口,循环每次迭代计算新项并前移窗口,以O(n)时间复杂度高效生成任意长度的斐波那契数列。算法思路维护a、b两个变量表示相邻两项,每次计算c=a+b后执行a=b,b=c实现窗口前移c=a+b循环实现DOi=1,n中先输出a的值,再计算下一项,n次迭代生成前n项数列DOi=1,n数列特征0,1,1,2,3,5,8,13,21...每项为前两项之和,在自然界和算法中广泛出现0,1,1,2,3,5,8…性能对比循环法O(n)远优于递归法O(2n),当n=40时递归需约10亿次运算而循环仅需40次O(n)vsO(2n)Algorithm&Implementation数值迭代:牛顿法求平方根牛顿迭代法是DOWHILE循环在科学计算中的典范应用。通过反复应用更新公式逐步逼近平方根真值,当相邻两次迭代的差值小于精度阈值时终止。算法设计与实现01初始化猜测值guess=x/2.0,设定精度阈值epsilon=1.0E-602DOWHILE控制迭代,当ABS(new-old)>epsilon时继续,满足精度时自动退出循环03每次迭代执行guess=(guess+x/guess)/2.0,该公式具有二阶收敛速度收敛性与工程实践01牛顿法求平方根通常5–7次迭代即可达到10⁻⁶精度,收敛速度极快02需设置最大迭代次数防护:IF(iter>max_iter)EXIT避免意外不收敛导致死循环03此模式可推广到求立方根、解非线性方程等一切基于迭代逼近的数值计算问题Chapter05循环优化与编程实践性能调优、边界安全与工程规范:从能运行到高效可靠的循环编程进阶OPTIMIZATIONSTRATEGY循环优化:减少冗余计算循环体内的每条语句会被执行N次,因此消除循环内的冗余计算是性能优化的首要策略。将不变表达式提升到循环外、避免重复函数调用、减少不必要的类型转换,这些优化在大规模迭代中可带来数倍的性能提升。常见冗余模式与消除方法01不变表达式外提如b*b−4*a*c中a、b、c不随循环变化时,应预先计算并存储b*b−4*a*c02函数调用优化循环内反复调用同一参数的函数时,将结果缓存到临时变量中复用缓存复用03常量运算预计算将循环内的常量表达式(如PI*R*R)移至循环前一次性计算PI*R*R优化效果与度量04累积效果显著百万次循环中消除一次冗余浮点运算可节省约0.01秒,累积效果在大规模计算中显著0.01s05编译器优化标志-O2、-O3可自动完成部分外提,但程序员手动优化更可控-O2/-O306量化优化效果用SYSTEM_CLOCK或CPU_TIME函数对比优化前后的执行时间,量化优化效果SYSTEM_CLOCK第六章·循环结构边界安全:防范越界与死循环数组越界和无限循环是最常见的两类循环错误,通过SIZE函数、安全阈值和编译器检查可有效防范。RISK数组越界风险循环变量超出数组维度时,Fortran默认不报错但读写非法内存,导致数据损坏或程序崩溃。非法内存SOLUTION防范越界始终使用SIZE(array)作为循环上界而非硬编码数字,确保循环范围与数组大小一致。SIZE()GUARD无限循环防护DOWHILE循环中设置最大迭代次数,通过IF(count>max_iter)EXIT作为安全阀。EXITDEBUG调试工具编译时使用gfortran-fcheck=bounds开启边界检查,运行时自动报告越界访问。-fcheckCHAPTER6·PARALLEL并行优化:OpenMP加速循环当循环各迭代相互独立时,OpenMP可将其分配到多个CPU核心并行执行,理论上实现与核心数成正比的加速比。OpenMP基本原理!$OMPPARALLELDO▸在DO循环前添加!$OMPPARALLELDO指令,编译器自动将迭代分配给多核心执行▸4核CPU处理100万元素循环理论提速4倍,实际加速比受内存带宽和同步开销影响-fopenmpOMP_NUM_THREADS▸编译时需添加-fopenmp标志启用OpenMP支持,运行时通过OMP_NUM_THREADS设置线程数PRINCIPLE并行化的适用条件✓迭代独立性是前提:第i次迭代不依赖第i-1次的结果,如逐元素数组运算可安全并行!$OMPREDUCTION(+:sum)⚠数据竞争风险:多个线程同时写入同一变量时需使用!$OMPREDUCTION(+:sum)归约操作✗不适用场景:斐波那契数列等前后依赖的递推计算无法直接并行化,需改造算法CONDITIONSCODEQUALITY编程规范:提升循环代码可读性循环代码的可读性直接影响程序的可维护性和团队协作效率。通过语义化变量命名、清晰的注释说明、命名循环语法和适度的代码拆分,可以将复杂的嵌套循环从"只有作者能看懂"转变为"团队成员都能理解"的高质量代码。语义化命名用row、col、iter替代i、j、k,让循环变量的用途一目了然无需额外解释row·col·iter注释先行循环

温馨提示

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

评论

0/150

提交评论