已阅读5页,还剩56页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Fortran95程序设计 彭国伦编著 第5章流程控制与逻辑运算 1 5 0 1自顶向下设计 当给定一个新问题 如上一章的作业 一个很自然的倾向就是坐在电脑前面开始编程 而不是 浪费 时间进行思考 对于很小的问题 这种飞跃式的编程方法通常都是可行的 现实世界中 问题一般都是大型的 如果尝试采用这种方法 程序员将陷入绝望的困境 在编写程序解决大型问题之前 彻底考虑一下问题以及将要采取的方法是非常值得的 2 2020 4 5 2 5 0 1自顶向下设计 自顶向下设计就是一个过程 从大型任务开始 将其分解为更小的 更容易理解的块 子任务 执行所需任务的一部分 如果需要 每个子任务还可以依次再细分为更小的子任务 对每一个块单独编码和测试 直到每一个子任务都能够独立的正确工作 将子任务集成为一个完整的任务 3 2020 4 5 3 5 0 1自顶向下设计 清楚的陈述要解决的问题定义程序所需的输入和程序产生的输出 设计要在程序中实现的算法 将算法转换为Fortran语句 测设完成的Fortran程序 4 2020 4 5 4 5 0 1自顶向下设计 开始 表明问题 定义所需的输入输出量 设计算法 将算法转换为Fortran语句 测试完成的Fortran程序 结束 子任务单元测试 连续构建子任务 子任务加入主程序 Alpha版本 Beta版本 正式版本 5 2020 4 5 5 5 0 2伪代码与流程图 作为设计过程的一部分 有必要对欲实现的算法进行描述 为便于你和他人理解 应该以一种标准的形式对算法进行描述 并且这个描述还应该便于设计思路转换为Fortran代码 描述算法的形式称为结构 construction 利用这些结构描述的算法称为结构化算法 constructedalgorithm 当算法在Fortran程序中实现时 结果程序称为结构化程序 structuredprogram 6 2020 4 5 6 5 0 2伪代码与流程图 用来建立算法的结构可以用两种不同的方法描述 伪代码和流程图 伪代码是Fortran语句和自然语言掺杂在一起的混合体 构成类Fortran程序 对每个不同的想法或代码段都有单独的一行来表示 伪代码具有灵活性和易修改的特点 伪代码中经常使用 代替 号 表示一个值存在于一个变量中 或者叫赋值 流程图是描述算法的图形化方法 修改比较麻烦 7 2020 4 5 7 5 0 2伪代码与流程图 8 椭圆框表示算法的开始和结束 矩形框表示计算 并将计算结果赋给一个变量 表示输入或输出操作 两种选择中的选择指向 子程序的引用 反复的或计数的循环回路 2020 4 5 8 5 1IF语句 5 1 1IF基本用法最基本的使用方法是由一个程序模块所构成 当IF所赋值的逻辑判断式成立时 这模块中的程序代码才会执行 IF 逻辑判断式 THEN EndIF 逻辑成立时才会执行这里面的程序代码 2020 4 5 能够在程序执行当中自动选择转向 跳过某些程序模块来执行程序代码 这是IF关键字的功能 9 ex0501 f90 programex0501implicitnonereal kind 4 speedwrite speed 信息提示read speed 读入车速if speed 100 0 then speed 100时才会执行下面这一行程序write Slowdown endifstopend 2020 4 5 10 程序的核心部分 if speed 100 0 then speed 100时才会执行下面这一行程序write Slowdown endifstop 从IF到ENDIF之间的程序算是一个区块 IF中判断式成立时会执行这个区块中的程序 IF中判断式不成立时 会跳跃到ENDIF后的地方继续执行 IF括号中的判断式成立时 如果所需要执行的程序模块只有一行程序代码 可以把IF跟这行程序代码写在同一行 上面程序中if到endif之间的内容可以改写成下面这一行程序代码 If speed 100 0 write Slowdown 2020 4 5 11 12 5 1IF语句 IF命令还可以搭配ELSE 用来赋值当判断式不成立时 会去执行某一段程序代码 IF 逻辑判断式 THEN ELSE ENDIF 逻辑成立时 执行这一段的程序代码 逻辑不成立时则执行这一段的程序代码 如果 那么就 否则就 2020 4 5 12 ex0502 programex0502implicitnonereal kind 4 height 记录身高real kind 4 weight 记录体重write height read height 读入身高write weight read weight 读入体重if weight height 100 then 如果体重大于身高减去100 会执行下面的程序write Toofat else 如果体重不大于身高减去100 会执行下面的程序write Undercontrol endifstopend 13 46 09 13 14 5 1 2逻辑运算 IF命令需搭配逻辑表达式才能使用 逻辑运算符号 2020 4 5 14 2020 4 5 PROGRAMex0501IMPLICITNONEREALspeedWRITE speed READ speedIF speed GT 100 then FORTRAN77要用缩写 GT 代表大于 write Slowdown ENDIFSTOPEND ex0501 for ex0501 f90 15 16 5 1 2逻辑运算 逻辑表达式除了可以单纯对两个数字比较大小之外 还可以对两个逻辑表达式间的关系来运算 如 If a 80 and A 90 then and 是并且的意思 表示相互关系的集合运算符 大于小于等式的运算符号优先级高于集合运算符号 2020 4 5 16 2020 4 5 programex0503implicitnoneintegerrain windspeedwrite Rain read rainwrite Wind read windspeedif rain 500 or windspeed 10 thenwrite 停止上班上课 elsewrite 照常上班上课 endifstopend ex0503 f90 17 2020 4 5 集合运算符的使用方法 18 2020 4 5 集合运算符的使用举例 AND 10 5 AND 61 AND 3 1True10 5 AND 62 AND 1 3False OR 1 5 OR 21 OR 3 1True1 5 OR 2 5False NOT NOT 3 5True NOT 1 2False 19 2020 4 5 EQV 1 3 EQV 2 3True13False NEQV 1 2 NEQV 22 NEQV 2 3False 20 2020 4 5 If A 10 AND A 10并且A 20时 也就是变量A在10 20之 间时条件成立 If key Y OR key y then 如果变量key等于字符Y或y时 条件成立If NOT A 10 then 变量A等于10时 条件不成立 逻辑运算可以通过利用AND OR NOT EQV NEQV 这几个运算符号连接出很长的表达式 也可以用括号 括起来以确定他们的运算先后顺序 21 逻辑表达式中包含算术运算符 关系运算符和逻辑运算符 它们的运算优先次序如下表 2020 4 5 22 23 5 1 2逻辑运算 程序代码中可以使用逻辑表达式来设置逻辑变量的内容Logical var A B 当A的数值大于B时 logical var这个逻辑变量会被设定成 真 TRUE 否则会被设定为 假 FALSE 2020 4 5 使用IF时 可以先把逻辑运算的结果存放到逻辑变量中 再利用逻辑变量来做条件判断 23 2020 4 5 programex0504implicitnoneintegerrain windspeedlogicalr wwrite Rain read rainwrite Wind read windspeedr rain 500 如果rain 150 r true 不然r false w windspeed 10 如果windspeed 10 w true 不然w false if r or w then 只要r或w有一个值是true就成立write 停止上班上课 elsewrite 照常上班上课 endifstopend ex0504 f90 24 25 5 1 3多重判断IF ELSEIF 多重判断可一次列出多个条件及多个程序模块 IF 条件1 then elseif 条件2 then elseif 条件3 then elseif 条件4 then else Endif 条件1成立时 执行这个模块程序 条件2成立时 执行这个模块程序 条件3成立时 执行这个模块程序 条件4成立时 执行这个模块程序 Else这个模块可以省略 每个条件都不成立时 才执行这个模块程序 2020 4 5 25 2020 4 5 programex0505implicitnoneintegerscorecharactergradewrite Score read score if score 90 and score 80 and score 70 and score 60 and score 0 and score100的不合理情形grade endifwrite Grade A1 gradestopend ex0505 f90 26 2020 4 5 因为IF ELSEIF所组合出来的多重判断式只会执行第一个符合条件的程序模块 执行完后就跳到ENDIF后继续执行程序 每个条件都不成立时才会执行ELSE中的模块 所以EX0505可以简化为 programex0506implicitnoneintegerscorecharactergradewrite Score read score if score 100 thengrade elseif score 90 then 会执行到此 代表score 80 then 会执行到此 代表score 70 then 会执行到此 代表score 60 then 会执行到此 代表score 0 then 会执行到此 代表score 60grade E else 会执行到此 代表score 0grade endifwrite Grade A1 gradestopend ex0506 f90 27 2020 4 5 利用多个独立的IF语句也能实现多重判断的效果如 判别成绩等级 if score 90 and score 80 and score 70 and score 60 and score 0 and score100 or score 0 grade write Grade A1 gradestopend programex0507implicitnoneintegerscorecharactergradewrite Score read score ex0507 f90 28 29 5 1 3多重判断IF ELSEIF If score 90 grade A If score 80 grade B If score 70 grade C If score 60 grade D If score 0 grade E If score 100 or score 0 grade 2020 4 5 如果把EX0507 F90中的6个IF语句改为如下的样子 执行后会发现 永远都只能得到 E 或 两种结果 29 例子1 二次方程式求解 设计并并编写程序 无论是何种类型 都可以求出二次方程式的根 定义输入输出ax2 bx c 0提示用户输入系数a b c设计算法 读取输入数据 计算根 输出根 2020 4 5 30 例子1 二次方程式求解 Datadictionary declarevariabletypes definitions unitsREAL a Coefficientofx 2termofequationREAL b CoefficientofxtermofequationREAL c ConstanttermofequationREAL discriminant DiscriminantoftheequationREAL imag part Imaginarypartofequation forcomplexroots REAL real part Realpartofequation forcomplexroots REAL x1 Firstsolutionofequation forrealroots REAL x2 Secondsolutionofequation forrealroots 2020 4 5 31 例子1 二次方程式求解 PrompttheuserforthecoefficientsoftheequationWRITE Thisprogramsolvesfortherootsofaquadratic WRITE equationoftheformA X 2 B X C 0 WRITE EnterthecoefficientsA B andC READ a b c EchobackcoefficientsWRITE ThecoefficientsA B andCare a b c Calculatediscriminantdiscriminant b 2 4 a c 2020 4 5 32 例子1 二次方程式求解 Solvefortheroots dependinguponthevalueofthediscriminantIF discriminant 0 THEN therearetworealroots so x1 b sqrt discriminant 2 a x2 b sqrt discriminant 2 a WRITE Thisequationhastworealroots WRITE X1 x1WRITE X2 x2ELSEIF discriminant 0 THEN therearecomplexroots so real part b 2 a imag part sqrt abs discriminant 2 a WRITE Thisequationhascomplexroots WRITE X1 real part i imag partWRITE X2 real part i imag partELSEIF discriminant 0 THEN thereisonerepeatedroot so x1 b 2 a WRITE Thisequationhastwoidenticalrealroots WRITE X1 X2 x1ENDIFENDPROGRAMroots 2020 4 5 33 34 5 1 4嵌套IF语句 IF THEN 第1层IF开始IF THEN 第2层IF开始IF THEN 第3层IF开始ELSEIF THENELSEENDIF 第3层IF结束ENDIF 第2层IF结束ENDIF 第1层IF结束 2020 4 5 34 2020 4 5 ex0508 f90 嵌套IF举例 读入坐标点 x y 判断其落在哪个象限 elseif x0 then x0ans 2elseif y 0 then x 0 y 0ans 3else x 0 y 0ans 0endifelse x 0 y 任意数ans 0endifif ans 0 then ans不为0时 代表有解write 第 I1 象限 anselsewrite 落在轴上 endifstopend programex0508implicitnonerealx yintegeranswrite Input x y read x yif x 0 thenif y 0 then x 0 y 0ans 1elseif y0 y0 y 0ans 0endif 35 2020 4 5 5 1 5命名的IF结构 可以给IF结构指定一个名称 对IF结构中的所有组成部分进行命名 可以快速地指明某一特定的ELSE或ELSEIF语句属于那个IF结构 可使程序员的注意力更加清晰 带有名称的IF结构的形式 名称 IF 逻辑表达式 1 THEN语句1语句2 ELSEIF 逻辑表达式 2 THEN 名称 语句1语句2 ELSE 名称 语句1语句2 ENDIF 名称 36 37 5 2浮点数及字符的逻辑运算 5 2 1浮点数的逻辑判断使用浮点数做逻辑运算时 要避免使用 等于 的判断使用浮点数计算 有效位数是有限的 难免会出现计算上的误差 理想中的等号不一定会成立例 EX0509 f90浮点数的计算误差经常发生 在判断式中要给误差预留一点空间例 EX0510 f90 2020 4 5 37 2020 4 5 ex0509 f90 programex0509implicitnonereal areal b 3 0a SQRT b 2 b 理论上a应该要等于0if a 0 0 thenwrite a等于0 elsewrite a不等于0 endifstopend 38 2020 4 5 programex0509 2implicitnonereal areal b 4 0a SQRT b 2 b 理论上a应该要等于0if a 0 0 thenwrite a等于0 elsewrite a不等于0 endifstopend 39 2020 4 5 ex0510 f90 programex0510implicitnonereal areal b 3 0real parameter e 0 0001 设置误差范围a SQRT b 2 b 理论上a应该要等于0if abs a 0 0 e thenwrite a等于0 elsewrite a不等于0 endifstopend 40 41 5 2 2字符的逻辑判断 字符也可比较大小 根据是比较它们的字符码 个人计算机中比较字符用字符的ASC 码 2020 4 5 a b 因为a的ASC 码为97 b的ASC 码为98 A a 因为A的ASC 码为97 a的ASC 码为98 abc bcd 根据字母顺序来比较 字符串 abc 的第1个字符小于字符 串 bcd 的第1个字符 abc abcd 根据字母顺序来比较 两个字符串的前3个字符都一样 但字符串 abcd 比字符串 abc 多了一个字符 41 2020 4 5 ex0511 f90 programex0511implicitnonecharacter len 20 str1 str2characterrelationwrite String1 read A20 str1write String2 read A20 str2 if str1 str2 thenrelation elseif str1 str2 thenrelation elserelation endifwrite String1 A1 String2 relationstopend 42 43 5 3SELECTCASE语句 Selectcase 变量 case 数值1 case 数值2 case 数值n casedefault Endif 放入所要判断的变量 变量等于数值1时 执行此程序段 变量等于数值2时 执行此程序段 变量等于数值n时 执行此程序段 变量不等于任何数值时 执行此程序段 2020 4 5 43 2020 4 5 case里的冒号前后放入两个数字代表在这两个数字之间的所有数值 case的括号里面可以用逗号来放多个变量 case 1 变量 1时 会执行这个case中的程序模块case 1 5 1 变量 5时 会执行这个case中的程序模块case 1 1 变量时 会执行这个case中的程序模块case 5 变量 5时 会执行这个case中的程序模块case 1 3 5 变量等于1或3或5时 会执行这个case中的程序模块 44 2020 4 5 ex0512 f90 programex0512implicitnoneintegerscorecharactergradewrite Score read scoreselectcase score case 90 100 90到100分之间grade A case 80 89 80到89分之间grade B case 70 79 70到79分之间grade C case 60 69 60到69分之间grade D case 0 59 0到59分之间grade E casedefault 其它情形grade endselectwrite Grade A1 gradestopend 使用SELECT CASE语句写的判断分数等级的程序 45 46 5 3SELECTCASE语句 使用SELECTCASE来取代某些使用IF ELSEIF的多重语句 会让代码看起来比较简洁 SELECTCASE有一些限制 只能使用整数 字符和逻辑变量 不能使用浮点数和复数 每个case中所使用的数值必须是固定的常量 不能使用变量 2020 4 5 46 2020 4 5 integer a 65integer b 97integer parameter c 87read keyselectcase key case a 这一行程序错误 case中不能使用变量 case b 这一行程序错误 case中不能使用变量 case c c是声明成parameter的常量 可以使用 endselect 47 2020 4 5 programex0513implicitnonereala b anscharacteroperatorread aread A1 operator 不使用格式有些机器会 读不到除号 read bselectcase operator case ans a b 48 2020 4 5 case ans a bcase ans a bcase ans a bcasedefault 输入其它符号不处理write Unknownoperator A1 operatorstop 结束程序endselectwrite F6 2 A1 F6 2 F6 2 a operator b ansstopend 49 50 5 4其他流程控制 5 4 1GOTO从Fortran77之前就流传下来的古老的 跳转 语句不建议使用使用GOTO会使编写的程序在结构上变乱 导致程序代码难以阅读 这里介绍是希望大家能看懂一些用古典风格编写的程序 GOTO命令就是提供程序员一个任意跳跃到所赋值 行代码 的那一行程序位置来执行程序的能力 2020 4 5 50 2020 4 5 判断一个人是否过重的程序ex0502 f90使用GOTO改写后的形式 ex0514 for PROGRAMex0514IMPLICITNONEREALheight 记录身高REALweight 记录体重WRITE height READ height 读入身高WRITE weight READ weight 读入体重IF weight height 100 GOTO200 上面不成立 没有跳到200才会执行这里100WRITE Undercontrol GOTO300 下一行不能执行所以要跳到300 200WRITE Toofat 300STOPEND 51 2020 4 5 使用GOTO编写的 循环 ex0515 for PROGRAMex0515IMPLICITNONEINTEGERIINTEGERNPARAMETER N 10 DATAI 0 10WRITE 1X A3 I2 I II I 1IF I LT N GOTO10STOPEND 52 2020 4 5 GOTO还有一种用法 程序代码中可以一次提供好几个跳跃点 根据GOTO后面的算式来选择要使用哪一个跳跃点 称为计算GOTO语句 形式 goto label1 label2 label3 lablek int exprlabel1到lablek是可执行语句的行代码 int expr表达式计算出一个1和k之间的整形数 如果int expr的值为1 转去行代码为label1的语句执行 int expr的值为k 转去行代码为labelk的语句执行 如果label的值小于1或者大于k 将引发错误 53 2020 4 5 PROGRAMex0516IMPLICITNONEINTEGERIINTEGERNDATAI N 2 1 CI N 1时GOTO10 I N 2时GOTO20 I N 3时GOTO30CI N3时不做GOTO 直接执行下一行GOTO 10 20 30 I N10WRITE I N 1 GOTO10020WRITE I N 2 GOTO10030WRITE I N 3 100STOPEND ex0516 for 54 2020 4 5 IF判断还有一种叫做算术判断的方法 做法和GOTO类似 形式 if arithmetic expression label1 label2 label3其中arithmetic expression可以是任何整形 实型算术表达式 label1 label2和label3是可执行语
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 劳保鞋销售合同
- 养殖种苗销售合同
- 火锅食材销售合同
- 年度个人销售合同
- 海南住宅销售合同
- 布草购买销售合同
- 钢筋机械连接工艺检验合格标准制定方法选择原则
- Android优化系统课程设计
- 电抽搐治疗课件
- 2025-2026学年3.4.3加减消元法沪科版数学七年级上学期(课件)
- 第六章-初始适航管理-民用航空器适航管理教学课件
- DB44∕T 2830-2026 艾滋病病毒感染者及艾滋病患者手术室管理规范
- 黑龙江省哈尔滨市2025届中考物理试卷(含答案)
- 2026年中国中车集团软件岗面试常见问题及嵌入式系统考点
- 储能行业压缩空气储能电站经济性调研报告
- 长租公寓盈利模式与成本结构优化
- 2026年自贡市自流井区社区工作者招聘笔试参考试题及答案解析
- 2026年初级经济师之初级经济师工商管理从业资格考试真题及参考答案详解AB卷
- 雨课堂学堂在线学堂云审计法律研究与案例(西南政法大学)单元测试考核答案
- 2026安徽合肥市发展和改革委员会上半年招聘事业单位工作人员20人考试备考试题及答案解析
- 2026年危险化学品重点县专家指导服务自查表
评论
0/150
提交评论