




已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
FORTRAN语言 FORTRAN77结构化程序设计 第五章循环结构的实现 重复执行一组指令称为循环操作 在程序中存在两类循环 无条件循环和有条件循环 无条件循环是无休止地执行一个程序段 而有条件循环是在满足一定条件时才执行循环 经常会遇到循环类型的问题 例如需要对全班学生求平均成绩 求n的阶乘 求n个数的和等都需要用到循环处理的方法 5 1用GOTO语句实现循环 GOTO语句的形式 GOTO例如 GOTO10 表示流程转去标号为10的语句行继续执行 由于GOTO语句破坏了语句顺序执行的正常状态 不符合结构化程序设计原则 因此一般不提倡使用GOTO语句 只有在一个基本结构内部可以使用GOTO语句 利用GOTO语句可以实现循环处理 例 读入学生的学号和成绩并且打印 无条件循环 10READ NUM GRADEPRINT NUM GRADEGOTO10有条件循环 N 110READ NUM GRADEPRINT NUM GRADEN N 1IF N LE 5 GOTO10 5 2用DO语句实现循环 当需要执行的循环次数为已知时用DO语句实现循环比较方便 例如 上节读5个学生的学号和成绩 要执行READ语句和PRINT语句5次 可以改用DO语句实现 DO10 N 1 5 1READ NUM GRADE10PRINT NUM GRADE 5 2 1循环语句 DO语句 和循环次数的计算 DO循环由一个DO语句和循环体组成 DO10 I 1 10 1 循环语句 J I I 循环体 10PRINT I JDO语句的一般形式为 DO标号 循环变量 初值 终值 步长 sv e1 e2 e3循环次数可以从循环初值 终值和步长计算出来 r INT e2 e1 e3 e3 例如 DO10 I 1 10 2DO20 N 1 5DO100 X 1 2 2 4 0 2DO150 T 2 5 2 50 0 2 0 0 5DO200 M 1 5 12 5 1 5 5 2 2循环执行过程 循环执行过程执行以下步骤 计算表达式e1 e2 e3的值 并将它们转换成循环变量的类型 将初值e1赋予循环变量v 计算应循环的次数r 检查循环次数 若r 0或r0 则执行循环体 执行终端语句时循环变量v增值 即v v e3 循环次数r减1 返回步骤4 重复执行步骤4 5 6 7 从以上流程图和上述步骤可知 终端语句的作用 除了完成该语句本身的功能 还有两个作用 1 使循环变量v增值e3 2 使循环次数r减1 5 2 3循环终端语句和继续语句 CONTINUE语句 循环终端语句可以是除了GOTO 块IF ELSE ELSEIF ENDIF END STOP和RETURN语句之外的任一可执行语句 如打印语句 赋值语句 输入语句等都可以作为终端语句非执行语句不能作为循环的终端语句 为了使循环的起止范围清晰 使终端语句与一般执行语句所区别 用CONTINUE语句作为终端语句 继续语句CONTINUE的形式为 CONTINUE例如 READ A BCONTINUEPRINT A BDO20 I 1 10 2PRINT I20CONTINUE 例5 1 求5 INTEGERFACTFACT 1DO10 I 1 5FACT FACE I10CONTINUEPRINT FACTEND 例5 2 求1 2 N READ NSUM 0 0FACT 1 0DO100 I 1 NFACT FACE ISUM SUM FACT100CONTINUEPRINT SUMEND 例5 3 一个整数I 求另一个整数J 使I和J在用8位二进制表示时互为逆序 例如I 3 用8位二进制表示为00000011 应求出J 192 其二进制数形式为11000000 即根据b7 b1b0得到b0b1 b7 思路 依次求出b0 b1 b2 b7 然后 将b0 27 b1 26 b7 20相加 得到J 给定I后 用函数MOD I 2 即可求出b0 例如MOD 3 2 的值为1 得b0 1 再将I 2 I得到新的I 如此继续下去 直到求出b7为止 COBTAINTHEBIT REVERSEOFIPRINT NUMBERTOREVERSE READ IJ 0DO10 K 1 8J 2 J MOD I 2 I I 210CONTINUEPRINT REVERSEIS JEND 例5 4 求ex 1 x x2 2 x3 3 xn n READ N XTERM 1 0E 1 0DO10 I 1 NTERM TERM X IE E TERM10CONTINUEPRINT EXP X EEND 5 2 5DO循环的嵌套 在一个DO循环中又完整地包含另一个DO循环 称为DO循环的嵌套 DO10 I 1 10DO20 J 1 5 20CONTINUE 10CONTINUE内循环应当完整地嵌套在外循环之内 内外循环不能交叉 DO10 I 1 10DO20 J 1 5 10CONTINUE 20CONTINUE 例5 5 求1 3 5 7 CCALCULATES1 3 5 7 DO20 J 1 7 2FACT 1 0DO10 K 1 JFACT FACT K10CONTINUEPRINT J FACT20CONTINUEEND 例5 6 例5 4程序可以改用DO循环嵌套实现 READ N XE 1 0DO10 I 1 NFACT 1 0P 1 0DO20 J 1 IFACT FACT JP P X20CONTINUETERM P FACTE E TERM10CONTINUEPRINT EXP X EEND 例5 7 打印 九九乘法表 DO10 I 1 9DO20 J 1 IK I JPRINT I J K20CONTINUEPRINT 10CONTINUEEND 例5 8 百钱买百鸡问题 公元五世纪末 我国古代数学家张丘建在 算经 中提出了 百鸡问题 鸡翁一 值钱五 鸡母一 值钱三 鸡雏三 值钱一 百钱买百鸡 问鸡翁 母 雏各几何 意为 公鸡每只5元 母鸡3元 小鸡一元三只 100元买100只鸡 设X为公鸡数 Y为母鸡数 Z为小鸡数 根据题意 X Y Z 1005X 3Y Z 3 100 15X 9Y Z 3003个未知数 2个方程式 是一个不定方程 它没有唯一解 而有多组解 对这类问题无法用解析法解 只能将所有可能的X Y Z值一个一个地去试 看是否满足上面两个方程式 如满足就是一组解 原始版 INTEGERX Y ZDO10 X 0 100DO20 Y 0 100DO30 Z 0 100IF X Y Z EQ 100 THENIF 15 X 9 Y Z EQ 300 PRINT X Y ZENDIF30CONTINUE20CONTINUE10CONTINUEEND 改进版 INTEGERX Y ZDO10 X 0 19DO20 Y 0 33Z 100 X YIF 15 X 9 Y Z EQ 300 PRINT X Y Z20CONTINUE10CONTINUEEND 5 3当型循环的实现 DO循环用来处理循环次数确定的情况是比较方便的 但是在处理的问题中 有许多是事先无法确定循环次数的 而是只给出一个条件 满足此条件时就继续执行循环体 若不满足 则循环停止 例如统计得分并计算平均成绩的程序 事先不知道有多少人得分 只能用SCORE的值来控制循环是否继续 当SCORE 0 表示输入了一个正常的成绩 应该统计和处理 当SCORE 0 则表示数据结束 不再执行循环体 程序进行结束处理 可以用不同方法实现 当型 循环 有不少计算机系统提供了DOWHILE语句 能很方便地实现当型循环 但FORTRAN77标准并未规定有此语句 只能用块IF或逻辑IF语句来实现 当型 循环 5 3 1用WHILE语句实现当型循环 WHILE语句的格式 DO标号 WHILE 逻辑表达式 循环体标号CONTINUE 例5 9 统计若干个学生的得分并计算平均成绩 INTEGERCOUNTSUM 0 0COUNT 0READ SCOREDO10 WHILE SCORE GE 0 0 SUM SUM SCORECOUNT COUNT 1READ SCORE10CONTINUEAVER SUM COUNTPRINT COUNT COUNTPRINT AVERAGE AVEREND 例5 11 输入两个正整数M和N 求其最大公约数 用辗转相除法来求最大公约数 例如 27和6 先用27除以6 余数为3 由于余数不等于0 再将6作为被除数 3作为除数 再求余数 此时余数为0 则除数3就是最大公约数 INTEGERM N RREAD M NIF M LT N THENT MM NN TENDIFR MOD M N DO10 WHILE R NE 0 M NN RR MOD M N 10CONTINUEPRINT THEGREATESTCOMMONDIVISORIS NEND 例5 12 判断一个数N是否是素数 把N作为被除数 将2 INT SQRT N 作为除数 若都除不尽 N是素数 否则不是 READ NJ SQRT REAL N I 2DO10 WHILE I LE J AND MOD N I NE 0 I I 110CONTINUEIF I GT J THENPRINT N ISAPRIMENUMBER ELSEPRINT N ISNOTAPRIMENUMBER ENDIFEND 5 3 2用块IF和GOTO语句实现当型循环 用块IF和GOTO语句来代替WHILE语句实现当型循环 即用GOTO语句实现 返回 以形成循环 用块IF语句实现 条件判断 以决定是否继续执行循环 这种循环的形式可写为 标号S1IF 逻辑表达式 THEN块1GOTOS1ENDIF 例5 13 用块IF和GOTO语句实现例5 9 INTEGERCOUNTSUM 0 0COUNT 0READ SCORE10IF SCORE GE 0 0 THENSUM SUM SCORECOUNT COUNT 1READ SCOREGOTO10ENDIFAVER SUM COUNTPRINT COUNT COUNTPRINT AVERAGE AVEREND 例5 14 用块IF和GOTO语句实现判断N是否是素数 READ NJ SQRT REAL N I 210IF I LE J AND MOD N I NE 0 THENI I 1GOTO10ENDIFIF I GT J THENPRINT N ISAPRIMENUMBER ELSEPRINT N ISNOTAPRIMENUMBER ENDIFEND 例5 15 用公式 2 6 1 12 1 22 1 32 1 N2求 的近似值 N由键盘输入 READ NSUM 0 0I 110IF I LE N THENTERM 1 0 I I SUM SUM TERMI I 1GOTO10ENDIFPI SQRT 6 0 SUM PRINT PI PIEND 5 4直到型循环的实现 在FORTRAN中实现直到型的方法有2 用UNTIL语句用逻辑IF语句 5 4 1用UNTIL语句实现直到型循环 格式 DOS1 UNTIL 条件 循环体标号S1CONTINUE注意 UNTIL 条件 虽然写在循环的第一个语句 但它却在执行终端语句时进行判断条件的 例5 17 求5 T 1 0I 2DO10 UNTIL I GT 5 T T II I 110CONTINUEPRINT TEND 例5 18 求2000 2500年之间的所有闰年 若能被4整除 不能被100整除 则输出是闰年 若能被100整除 又能被400整除 输出是闰年 INTEGERYEARYEAR 2000DO100 UNTIL YEAR GT 2500 IF MOD YEAR 4 EQ 0 THENIF MOD YEAR 100 NE 0 THENPRINT YEAR ISALEAPYEAR ELSEIF MOD YEAR 400 EQ 0 THENPRINT YEAR ISALEAPYEAR ELSEPRINT YEAR ISNOTALEAPYEAR ENDIFELSEPRINT YEAR ISNOTALEAPYEAR ENDIFY Y 1100CONTINUEEND 5 4 2用逻辑IF语句实现直到型循环 若不能用UNTIL语句 则可以用逻辑IF语句实现直到型循环 其形式可以表示为 标号S1循环体IF 逻辑表达式 GOTOS1 例5 19 求1 1 2 1 3 1 4 1 99 1 100 INTEGERSIGNSUM 1 0DENO 2 0SIGN 110SIGN 1 SIGNTERM SIGN DENOSUM SUM TERMDENO DENO 1IF DENO LE 100 0 GOTO10PRINT SUMEND 例5 20 判素数 INTEGERWREAD NW 0I 2J SQRT REAL N 10R MOD N I IF R EQ 0 THENW 1ELSEI I 1ENDIFIF I GT J OR W NE 0 THENELSEGOTO10ENDIFIF W EQ 0 THENPRINT N ISAPRIMENUMBER ELSEPRINT N ISNOTAPRIMENUMBER ENDIFEND 例5 21 Fibonacci数列问题 问题 某人第一个月有一对兔子 假定到第三个月时这对兔子会产下一对小兔子 以后每月都生一对小兔子 而小兔子生下后到第三个月又会生一对小兔子 以此规律繁殖 显然 第一个月 第二个月时只有一对兔子 第三个月共有两对 生了一对 第四个月有3对 老的再生下一对 第五个月有5对 老的已生2对 小的生1对 如此繁殖下去 归纳数列的规律 它前两个数为1 1 从第三个数开始每个数是其前面两个数之和 即1 1 2 3 5 8 13 21 34 请编程打印出此数列的前面若干个数 使每一个数都不超过100000 如果到第30个数仍未超过10万 则打印30个数即可 递推关系式为 Fn Fn 1 Fn 2 n 2 初始条件为 F1 1 n 1 F2 1 n 2 解上述Fibonacci数列的思路是 从F1 F2推出下一个数F 再将原来的F2作为F1 原来的F作为F2再推出新的F 如此一直推下去 1 1 2 3 5 8 13 21 34 F1 1 0F2 1 0PRINT F1PRINT F2N 3F F1 F210PRINT FF1 F2F2 FF F1 F2N N 1IF N LE 30 AND F LE 1E5 GOTO10END 5 5几种循环形式的关系和比较 一 DO循环用来处理已确定循环次数的问题 WHILE循环和UNTIL循环既可用来处理已知循环次数的循环问题 也可用来处理不确定循环次数的问题 对事先已确定循环次数的问题 用DO循环比较方便 它能使循环变量自动增值 不需用户写逻辑表达式 只需写出循环变量的初值 终值和步长即可 使用方便 二 DO循环实质上也是一种 当型循环 它也是 先判断条件 后执行循环体 但这种 当型循环 的循环条件只能是 当r不等于0 三 几种形式的循环可以互相转换 或者说 同一个问题可用任一种循环来处理 例如求5 即可以用DO循环处理 也可用UNTIL循环处理 四 各种循环可以互相嵌套 但必须一个循环完整地包含在另一个循环之内 例5 22 求3 100之间的全部素数 由于3以上的素数必然是奇数 而且奇数的因子只能是奇数 DO10 N 3 100 2J SQRT REAL N I 3DO20WHILE I LE J AND MOD N I NE 0 I I 220CONTINUEIF I GT J PRINT N10CONTINUEEND 例5 23 验证哥德巴赫猜想 哥德巴赫提出一个不小于6的偶数必定能表示为两个素数之和 例如 6 3 3 8 3 5 10 3 7 将6 100之间的全部偶数表示为两个素数之和 思路 一个数N 可分解为A和B两个数 分别检查A和B是否素数 如都是 则为一组解 如A不是素数 就不必再检查B是否素数 先从A 3开始 检验A和B B N A 是否素数 然后使A 2 A 再检验A B是否素数 直到A N 2为止 INTEGERN A B WDO10 N 6 10
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国鸡肉制品加工项目创业计划书
- 中国伞花蔷薇项目创业计划书
- 中国C2C项目创业计划书
- 中国计算机软件咨询项目创业计划书
- 中国观赏林项目创业计划书
- 中国尿液沉渣分析仪项目创业计划书
- 中国多煤体学习系统项目创业计划书
- 食品生产合作合同
- 多模态数据的深度神经记忆整合方法-洞察阐释
- 科大讯飞AI数字员工解决方案
- 工程勘察设计收费管理规定
- 光伏复杂山坡地形场平方案
- 机器视觉课件
- 2022年广东省普通高等院校校招收中等职业学校毕业生统一考试英语试卷及答案
- 示范文本-《电池消费税纳税申报表》
- 项目施工条件分析
- 2022秋期版2208国开电大专科《政治学原理》网上形考(任务1至4)试题及答案
- 初中英语一词多义重点词汇汇总大全
- 运营管理案例分析-巴里勒
- 我的家乡福州PPT课件
- XX风电场工程风机240小时试运行预验收实施方案---风电场工程必备
评论
0/150
提交评论