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

提交评论