《FORTRAN SYNTAX》第4章 函数

(4.3) 函数的参数

COMMON是FORTRAN77中使用全局变量的方法,它可以将不同作用域下的变量联系起来。

PROGRAM main
    IMPLICIT NONE
    !INTEGER,COMMON :: a,b !错误写法
    INTEGER :: a,b
    COMMON a,b
    a = 1
    b = 2
    CALL showCommon() !□□1□□2
END PROGRAM main
    
SUBROUTINE showCommon()
    IMPLICIT NONE
    INTEGER :: num1,num2
    COMMON num1,num2
    WRITE(*,"(2I3)") num1,num2
END SUBROUTINE showCommon

取用全局变量时,是根据它们声明时相对位置关系来做对应,而不是使用变量名称来对应。所以在上面这个程序中num1对应anum2对应bCOMMON还可以在变量很多的时候进行分组:

PROGRAM main
    IMPLICIT NONE
    INTEGER :: a,b,c,d,e,f
    COMMON /group1/ a
    COMMON /group2/ b
    COMMON /group3/ c
    COMMON /group4/ d
    COMMON /group5/ e
    COMMON /group6/ f
    f = 1
    CALL show_common_6() !□□1
END PROGRAM main
    
SUBROUTINE show_common_6()
    IMPLICIT NONE
    INTEGER :: num6
    COMMON /group6/ num6
    WRITE(*,"(I3)") num6
END SUBROUTINE show_common_6

COMMON变量还可以用BLOCK DATA程序模块中的DATA语句批量赋值。

PROGRAM main
    IMPLICIT NONE
    INTEGER :: a,b
    COMMON a,b
    INTEGER :: c,d
    COMMON /group/ c,d
    WRITE(*,"(4(I3))") a,b,c,d
END PROGRAM main

BLOCK DATA assign_common_variable
    IMPLICIT NONE
    INTEGER a,b
    COMMON a,b
    DATA a,b /1,2/
    INTEGER c,d
    COMMON /group/ c,d
    DATA c,d /3,4/
END BLOCK DATA assign_common_variable

BLOCK DATA这一段程序也很类似于子程序。它也是一段独立的程序模块,也拥有自己的变量声明,不过它不需要被别人调用就可以自己执行。事实上这一段程序会在主程序执行前就会生效,不过它的功能只在于设置全局变量的初值,不能有其他执行命令的出现。还有一点需要指出,全局变量不能声明成常量,所以BLOCK DATA中不能出现PARAMETER

(4.4) 几类特殊函数

函数除了可以让别人调用,还可以自己调用自己,这叫做递归(recursion)。递归函数每次被调用时,函数中声明的局部变量都会使用不同的地址,比较经典的案例是用递归计算阶乘:

PROGRAM main
    IMPLICIT NONE
    INTEGER :: n = 5
    INTEGER,EXTERNAL :: factorial
    WRITE(*,*) factorial(n)
END PROGRAM main

RECURSIVE INTEGER FUNCTION factorial(n) RESULT(ans) !递归函数必须使用RESULT来改名
    IMPLICIT NONE
    INTEGER,INTENT(IN) :: n !参数n只能由外部传入
    IF(n < 0) THEN
        STOP
    ELSE IF(n <= 1) THEN
        ans = 1
        RETURN
    END IF
    ans = n * factorial(n-1) !调用自己来计算(n-1)!
END FUNCTION factorial

(4.5) 一些少用的功能

PROGRAM main
    IMPLICIT NONE
    CALL head_sub() !Hello\World!
    CALL mid_sub() !World!
END PROGRAM main
 
SUBROUTINE head_sub()
    IMPLICIT NONE
    WRITE(*,*) "Hello!"
    ENTRY mid_sub() !另一个入口
    WRITE(*,*) "World!"
END SUBROUTINE head_sub
PROGRAM main
    IMPLICIT NONE
    INTEGER :: a
    WRITE(*,*) "请随便输入一个数:"
    READ(*,*) a
    CALL judge_number(a,*100,*200,*300) !指定了三个折返点
100 WRITE(*,*) "Negative."
    STOP
200 WRITE(*,*) "Zero."
    STOP
300 WRITE(*,*) "Positive."
END PROGRAM main

SUBROUTINE judge_number(num,*,*,*)
    IMPLICIT NONE
    INTEGER :: num
    IF(num < 0) THEN
        RETURN 1 !返回第一个折返点
    ELSE IF(num == 0) THEN
        RETURN 2 !返回第二个折返点
    ELSE
        RETURN 3 !返回第三个折返点
    END IF
END SUBROUTINE judge_number

《 F O R T R A N   S Y N T A X 》系列博客创作参考资料来源 《FORTRAN\ SYNTAX》系列博客创作参考资料来源 FORTRAN SYNTAX》系列博客创作参考资料来源

  1. 《Fortran95程序设计》.彭国伦.中国电力出版社.
  2. 《工程分析程序设计》.陈斌、周屈兰.西安交通大学出版社.
  3. 《Fortran程序设计(第四版)》.Stephen J.Chapman.中国电力出版社.

博客创作: A i d e n   L e e 博客创作:Aiden\ Lee 博客创作:Aiden Lee
特别声明:文章仅供学习参考,转载请注明出处,严禁盗用!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值