Fortran教程3:函数和子过程
文章目录
- 运算符
- 函数
- 子过程
- 递归
前两节: 1 安装和编译; 2 数据类型
运算符
Fortran
中运算符分为三类,即算术、关系、逻辑。算术运算符有5个,即+, -, *, /, **
,表示加、减、乘、除、乘方。
关系运算符和逻辑运算符,均有等价的字符表示,列表如下
真值条件 | 真值条件 | ||||
---|---|---|---|---|---|
== | .eq. | A和B相等 | /= | .ne. | A和B不等 |
> | .gt. | A>BA>BA>B | < | .lt. | A<BA<BA<B |
>= | .ge. | A⩾BA\geqslant BA⩾B | <= | .le. | A⩽BA\leqslant BA⩽B |
逻辑运算符共有5个,只能作用于逻辑值.true.
和.false.
与 | 或 | 非 | 同或 | 异或 |
---|---|---|---|---|
.and.
|
.or.
|
.not.
|
.eqv.
|
.neqv.
|
有了运算符,就可以进行计算了,而想要计算,就少不了函数。
函数
fortran
创建函数的方法如下
function func(i) result(j)integer, intent (in) :: i ! 输入integer :: j ! 输出j = i**2 + i**3
end functionprogram mainimplicit noneinteger :: i, funci = 3print *, i, "^2+", i, "^3=", func(i)
end program
其中func
为函数名,i
为函数的输入参数;result(j)
表示j
是这个函数的返回值,和现代语言的不同之处是,fortran
并没有使用return
这个关键字。
intent(in)
表明变量为只读,之所以要写上这个关键字,乃因fortran
函数在传参时,传递的是地址,换言之,如果函数改变了传递进来的参数的值,会导致这个值发生全局性的改变。用了intent(in)
,将使得这个值不可被更改,保证了传参的严谨性。
后面的主函数main
中,调用了func
,最终结果为
3 ^2+ 3 ^3= 36
关键字result
是可以省略的,但这样写,必须在函数块内,把返回值的名字写为函数的名字。仍以刚刚的函数为例,若不想使用result
,则可写为如下形式
function func(i)integer, intent (in) :: i ! 输入integer :: func ! 输出func = i**2 + i**3
end function
子过程
如果函数没有返回值,那么就是子过程,用关键字subroutine
表示
!testSub.f95
subroutine swap(a,b)real::a,b,tmptmp = aa = bb = tmp
end subroutine swapprogram testSub
implicit nonereal :: a, ba = 2.0b = 3.0 call swap(a, b)print *, "a = ", aprint *, "b = ", bend program testSub
编译结果如下,看来a
和b
的值果然交换了。
>gfortran testSub.f95
>a.exea = 3.00000000b = 2.00000000
递归
现代主流的编程语言,诸如C/C++,java, c#, python之类的,函数本身就是支持递归的,无需额外的递归标志。但fortran
需要用recursive
修饰的函数,才能进行递归操作,即自己调用自己。
递归函数的另一个问题就是,必须采用result
的方式声明返回值,下面以经典的阶乘为例
! recurTest.f95
recursive function fac (n) result(f)implicit noneinteger :: finteger, intent (in) :: nif(n>1) thenf = n * fac(n-1)elsef = 1end if
end function facprogram recurTestimplicit none integer :: a, faca = fac(15)print *, a
end program recurTest
结果如下
1>gfortran recurTest.f95
>a.exe2004310016
这里涉及到了if()then...else...end if
语句,接下来着重讲解fortran的控制流程。
Fortran教程3:函数和子过程相关推荐
- 亲测可用--word报错:子过程或函数未定义
今天公司有同事的word出了问题,大概过程是:向word里面粘贴图片或者文字的时候出现一个弹窗说"子过程或函数未定义". 由于他的office是2010版本的,所以我选择了升级成2 ...
- java sub函数,请问Sub子过程与Function函数过程有什么区别?
function是函数,sub是子程序,都可以传递参数,但函数有返回值,子程序没有 function 可以用自身名字返回一个值,sub 需定义别的变量,用传址方式传回值. Sub 过程与Functio ...
- VBA学习10_子过程模块化及函数Function()
子过程和模块化 为什么使用过程 (1) 程序结构清晰 (2) 功能灵活易改 (3) 避免重复代码 代码调用 ⇒ 使用Call关键字 常省略 Sub 的本质 宏 对于代码来说就是一个过程 Sub 合并及 ...
- python教程:函数递归与生成器教程
一.什么是递归 如果函数包含了对其自身的调用,该函数就是递归的.递归做为一种算法在程序设计语言中广泛应用,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的 ...
- 有一个5 * 5的二维数组,保留主对角线上的元素,并使其他元素均为0,要求用函数和子函数完成
<程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p143 7.1.2 上级实训内容 [实现内容8]有一个5 * 5的二维数组,保留主对角线上的元素,并使 ...
- Swift3.0语言教程查找字符集和子字符串
Swift3.0语言教程查找字符集和子字符串 Swift3.0语言教程查找字符集和子字符串,在字符串中当字符内容很多时,我们就需要使用到查找字符集或者子字符串的方法.以下我们将讲解3种查找字符集和子字 ...
- Swift2.0语言教程之函数嵌套调用形式
Swift2.0语言教程之函数嵌套调用形式 Swift2.0语言函数嵌套调用形式 在Swift中,在函数中还可以调用函数,从而形成嵌套调用.嵌套调用的形式往往有两种:一种是在一个函数中调用其他函数:另 ...
- abap--REUSE_ALV_GRID_DISPLAY事件子过程和cl_gui_grid类的事件对应关系
一.SLIS定义的ALV的事件名称 * Events slis_ev_item_data_expand type slis_formname value 'ITEM_DATA_EXPAND', ...
- REUSE_ALV_GRID_DISPLAY事件子过程和cl_gui_grid类的事件对应关系
一.SLIS定义的ALV的事件名称 * Events slis_ev_item_data_expand type slis_formname value 'ITEM_DATA_EXPAND', ...
最新文章
- while语法php格式,PHP While 循环
- mysql 三级联动_c#+Mysql 实现三级联动
- db2 语句包括不必要的列表_DB2的一些常用SQL写法(转)
- windows phone 了解LinearGradientBrush类和RadialGradienBrush类(11)
- Redisson 实现分布式锁
- Python中内置函数的介绍
- clean,compile,build,install,package区别
- bit是python最快的bitcoin库_新的Bitcoinpython节点比以前的Python库快100倍
- Weka数据挖掘平台
- linux 系统下 tar 的压缩与解压缩命令
- 沙盘推演具体包括哪些内容
- ANSYSworkbench中skewness解释
- 2020年下半年软考中级——软件设计师考试总结感想(已过!!!)
- ARM920T的MMU与Cache ——转载
- 基于区块链技术的航运贸易流程研究
- 恒指赵鑫:04.11今日恒指早盘思路
- Hyperledger Fabric架构详解
- Win10更新系统,VirtualBox与win10不兼容处理办法
- 【计算机毕业设计】328学生就业管理系统设计与实现
- 为开源新时代赋能 2021开源科技节完美落幕
热门文章
- c语言计算器图形界面v1.0,vc+easy x
- Hashmap如何实现key的唯一性
- [置顶] 卡巴斯基2009许可文件、卡巴斯基2009kav版授权key(8月25日更新)
- UCI计算机工程必修专业课,想问问加州大学欧文分校计算机工程专业怎么样?
- mac备忘录html,mac备忘录怎么备份与恢复|mac备忘录的使用方法
- 一键生成 API 文档的妙招
- 怎么样把亚马逊EC2的帐号清除干净
- Student学员数据库-[学生信息]、[学生成绩]表
- 通信信号与系统分析(四 基于simulink仿真)
- 6. HTML和CSS