VisualFortran90第6章.ppt

上传人:sh****n 文档编号:6561336 上传时间:2020-02-29 格式:PPT 页数:37 大小:443KB
返回 下载 相关 举报
VisualFortran90第6章.ppt_第1页
第1页 / 共37页
VisualFortran90第6章.ppt_第2页
第2页 / 共37页
VisualFortran90第6章.ppt_第3页
第3页 / 共37页
点击查看更多>>
资源描述
第6章程序单元和过程 6 1概述 主程序的结构 单元定义说明部分输入计算或处理输出END 引入子程序的目的 模块化设计 所有功能都在主程序单位内完成 1 一个Fortran90程序主程序单元个数 1个2 子程序单元 0 n个子程序单元不能独立存在 只能被主程序单元或被其它子程序单元调用 甚至可以递归调用 调用本身 源程序的结构 子程序 又称过程 的分类 1 函数子程序分为内部函数子程序外部函数子程序 2 子例行子程序分为内部子例行子程序外部子例行子程序 用于完成复杂的计算返回一个或多个值 用于完成复杂计算 返回一个或多个值 或用于其它数据处理 6 2外部函数子程序 VisualFortran90的函数 1 内在函数 系统函数 标准函数 如 sin cos sqrt abs kind 2 Function语句编写的函数 自定义 分为内部函数 外部函数 6 2 1函数子程序的编写方法 RECURSIVE FUNCTION函数名 虚元表 RESULT 结果名 说明部分程序体 具体计算END FUNCTION 函数名 函数子程序的结构 例 编写求N 的函数子程序 FUNCTIONFACT N RESULT FACT RESULT IMPLICITNONEINTEGER N I FACT RESULTFACT RESULT 1DOI 1 NFACT RESULT FACT RESULT IENDDOENDFUNCTIONFACT 表示函数开始 函数名字 N是虚元 表示函数结果 存放函数结果的变量 至少有一条语句给结果变量赋值 函数结束 虚元与结果变量必须进行类型说明 如要求1 2 5 则主程序为 PROGRAMMAININTEGER FACT SUM 0 IDOI 1 5SUM SUM FACT I ENDDOPRINT SUMEND 说明函数的类型 调用函数求阶乘 END FUNCTION 函数名 一 子程序END语句写法 1 函数单位的结束标志2 将控制返回到主调程序 子程序END语句功能 说明 1 作为函数子程序的第一行 注释行除外 2 如果函数是递归的 则应以RECURSIVE开头 3 函数名与普通变量名的取法相同 且为全局名 即作用域为整个程序 不得与已有的全局名同名 二 子程序开始语句的写法 RECURSIVE FUNCTION函数名 虚元表 RESULT 结果名 4 主调程序与被调程序两个单位之间的数据传递 RESULT 结果名 子程序的一个输出结果一般写法 函数名 RESULT 用于保存一个计算结果 称为函数值 且结果名有类型 必须在子程序说明部分说明类型 虚元表 子程序的所有输入 及除函数值之外的其他计算结果的输出 虚元之间用逗号分隔 都要在说明语句中说明类型 如果没有虚元 函数名后是一对空括号 函数值返回给调用式 由实元传递给对应的虚元 虚元数据返回给对应的实元 5 虚元的含义 编写子程序时没有具体值 调用时或调用结束后才获得数值 因此只是一个符号 表示输入 输出 名字可随便用户取 6 虚元可以是变量名 数组名 过程名 指针等 7 虚元的可选属性INTENT INTENT IN 表示函数开始时 虚元从实元中获得值 作为子程序的输入 不得再改变其值 INTENT OUT 表示函数结束时 把虚元的值传送给实元 作为子程序的输出 对应的实元不能是表达式 INTENT INOUT 表示虚元既要从实元中获得值 又要向实元传送值 作为子程序的输入输出 例 REAL INTENT IN X Y 三 子程序程序体的写法 分为说明部分和执行部分 1 说明部分应对程序体内一切变量 数组等实体 包括虚元 作出说明 同时还要说明函数结果变量名 但不可说明函数名 2 执行部分中必须对函数结果名至少赋值一次 FUNCTIONF X Y Z RESULT F RESULT IMPLICITNONEREAL X Y z F RESULTF RESULT X YZ X YEND 复习 子程序编写思路 程序单位定义虚元表子程序所有输入和除结果名以外的输出结果名不能和函数名同名说明语句虚元表中的所有虚元 函数结果名 其它中间变量不能说明函数名执行语句完成子程序单位的所有功能至少有一次对结果名赋值程序单位结束语句ENDFunction 例6 2 编写函数子程序 求下列公式前n项的和 算法1 将该式的分母定义为函数子程序ISUM FUNCTIONISUM N RESULT ISUM RESULT IMPLICITNONEINTEGER N ISUM RESULT IISUM RESULT 0DOI 1 NISUM RESULT ISUM RESULT IENDDOENDFUNCTIONISUM 主调程序 PROGRAMMAIN SUMIMPLICITNONEINTEGER N K ISUMREAL X SREAD N XS 0 0DOK 1 NS S X K ISUM K ENDDOPRINT S SENDPROGRAMMAIN SUM 主调程序必须说明函数的类型 调用ISUM函数 算法2 把求和的工作全部由函数实现 这时需要给函数设计两个变元 n和x 如下所示 FUNCTIONSUM2 N X RESULT SUM2 RESULT IMPLICITNONEINTEGER N I J T 0REAL X SUM2 RESULTSUM2 RESULT 0DOI 1 NT T ISUM2 RESULT SUM2 RESULT X I TENDDOENDFUNCTIONSUM2 T表示分母 主调程序为 PROGRAMMAIN SUM2IMPLICITNONEINTEGER NREAL SUM2 X SREAD N XS SUM2 N X PRINT S SENDPROGRAMMAIN SUM2 输入数据 调用函数处理 输出结果 FORTRAN中允许不同的程序单元之间可以使用相同的变量名 例 主程序中有变量N X 函数子程序中有虚元N X 但它们不是相同的变量 调用子程序的执行流程 每当程序调用一个子程序时 VisualFortran90就将程序的返回地址 断点 参数 以及局部变量等压入栈内 被调用的过程运行完后 VisualFortran90将回收存放变量和参数的栈空间 然后返回断点继续程序的运行 6 2 2函数子程序的调用 1 调用式是表达式 调用结束后调用式得到函数值 2 常见形式 Y 函数名 实元表 PRINT 函数名 实元表 IF 函数名 实元表 注意 实元与虚元一般必须在个数 次序 类型上保持一致 但实元与虚元名字可以不同 函数子程序的调用形式 FUNCTIONF X Y Z RESULT F RESULT IMPLICITNONEREAL X Y z F RESULTF RESULT X YZ X YEND PROGRAMNAIN READ A BD F A B c PRINT C DEND 主 子 例 虚元 实元 例6 3 编写判断素数的函数子程序 调用它实现例5 11的功能 求出20 50之间的全部素数 6 2 3函数子程序应用举例 FUNCTIONPRIME M RESULT PRIME RESULT IMPLICITNONEINTEGER M I PRIME RESULTDOI 2 M 2IF MOD M I 0 EXITENDDOIF I M 2 THENPRIME RESULT 1ELSEPRIME RESULT 0ENDIFENDFUNCTIONPRIME 主调程序 PROGRAMMAINIMPLICITNONEINTEGER N PRIMEDON 20 50IF PRIME N 1 PRINT NENDDOENDPROGRAMMAIN 主调程序必须说明函数的类型 调用PRIME函数 表达式 改写PRIME函数 使用逻辑变量 FUNCTIONPRIME M RESULT PRIME RESULT IMPLICITNONEINTEGER M ILOGICAL PRIME RESULTPRIME RESULT FALSE DOI 2 M 2IF MOD M I 0 EXITENDDOIF I M 2 PRIME RESULT TRUE ENDFUNCTIONPRIME 说明结果为逻辑类型 先假定不是素数 6 3外部子例行子程序 外部子例行子程序的结构 外部子例行子程序 过程的另一种形式 用户定义 用于完成复杂计算任务 返回一个或多个值 或用于其它数据处理 Recursive Subroutine子程序名 虚元表 说明部分程序体End Subroutine 子程序名 与函数子程序的区别 1 没有RESULT关键字 2 虚元 负责子程序的全部输入和全部输出3 无虚元时 SUBROUTINT子程序名或SUBROUTINT子程序名 4 函数子程序的调用是表达式形式 而子例子程序必须通过CALL语句来调用 CALL子程序名 实元表 例 编写求N 的子例行子程序 SUBROUTINEFACT N FACT VALUE IMPLICITNONEINTEGER INTENT IN NINTEGER INTENT OUT FACT VALUEINTEGER IFACT VALUE 1DOI 1 NFACT VALUE FACT VALUE IENDDOENDSUBROUTINEFACT 表示子例行子程序开始 子例行子程序名 两个虚元表示输入和输出 给结果变量赋值 如要求1 2 5 则主程序为 PROGRAMMAININTEGER SUM 0 I VALUEDOI 1 5CALLFACT I VALUE SUM SUM VALUEENDDOPRINT SUMEND 使用CALL语句调用 注意 主程序中不能对子例行子程序的名字说明类型 首先将该多边形划分成若干个三角形 每个三角形的边长分别用L1 L2 L3表示 然后用下面的公式 海伦公式 计算每个三角形的面积 最后将这几个三角形的面积相加 以上问题要经过三次完全相同的运算 但参加运算的L1 L2 L3量值不同 我们可以编写一段程序实现这一功能 并为该程序段命名 在计算每个三角形面积时调用该程序 并代入不同的参数完成运算 从而简化设计 便于结构化的程序设计 例 求如图所示的多边形的面积 分别使用函数子程序与子例行子程序实现 FUNCTIONAREA A B C RESULT AREA RESULT REAL INTENT IN A B CREAL P AREA RESULTP A B C 2 AREA RESULT SQRT P P A P B P C ENDFUNCTIONAREA PROGRAMMAINIMPLICITNONEREAL L1 L2 L3 L4 L5 L6 L7 S1 S2 S3 SREAL AREAREAD L1 L2 L3 L4 L5 L6 L7S1 AREA L1 L2 L3 S2 AREA L3 L4 L5 S3 AREA L5 L6 L7 S S1 S2 S3PRINT S SENDPROGRAMMAIN 方法一 使用函数实现 表达式方式调用 方法2 使用子例行子程序实现 SUBROUTINEAREA A B C AREA VALUE IMPLICITNONEREAL INTENT IN A B CREAL INTENT OUT AREA VALUEREAL PP A B C 2 AREA VALUE SQRT P P A P B P C ENDSUBROUTINEAREA 设置第四个参数存放结果 主调程序为 PROGRAMMAINIMPLICITNONEREAL L1 L2 L3 L4 L5 L6 L7 S1 S2 S3 SREAD L1 L2 L3 L4 L5 L6 L7CALLAREA L1 L2 L3 S1 CALLAREA L3 L4 L5 S2 CALLAREA L5 L6 L7 S3 S S1 S2 S3PRINT S SENDPROGRAMMAIN 使用CALL语句调用 练习题 一 选择题1 下面的函数过程说明语句中 错误的是 A FUNCTIONMYFUN X RESULT B FUNCTIONMYFUN X RESULT MYFUN RESULT C FUNCTIONMYFUN RESULT RESULT MYFUN D FUNCTIONMYFUN RESULT MYFUN RESULT 练习题 2 下面的子例行程序过程说明语句中 正确的是 A SUBROUTINEMYSUB RESULT RE B SUBROUTINEMYSUBC SUBROUTINEMYSUB 1 2 D SUBROUTINEMYSUB AREA RESULT RE 练习 计算函数Sinh x 的值 当ex的通项值小于等于1E 6时停止 计算公式如下 主程序如下 Programmain1Real MyExp y xWrite Enterx Read xY MyExp x MyExp x 2 0Write YENDPROGRAM 函数子程序FunctionMyExp x result Exp res Real Exp res x s Tinteger NN 1 T 1 S 1doT T X NIF ABS T 1E 5 EXITS S T N N 1enddoExp res SENDFUNCTION 两次调用
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!