Fortran学习8:函数1

作为一个编程语言,其面对的首要问题就是解决问题,那么就要用到一些函数来处理一些特定的问题,今天数组学习完发现还有一个多小时的空闲时间,时间够用我就继续学Fortran,下午去办公室再学数学和勘探原理。其实我更喜欢java中的说法,把函数叫做方法,因为解决一个问题,首要的任务就是找到解决这个问题的方法,函数的话我老觉得不贴切,不过这都是题外话了,只要能够我们所要面对的问题,那他就很棒了!

对于Fortran来说,函数这是个笼统的概念,它是自定义函数和子程序的统称,子程序可以用来独立出某一段代码,让其他地方可以调用,而自定义函数就可以用来自由扩充Fortran库中原先并没有的函数。

1、子程序subroutin,我们可以把某一段使用非常多的代码段改成subroutine形式,这样就可以再uoge地方调用,但是我有个非常不舒服的地方,fortran要用一句call subroutine_name来调用,这非常让我不爽。

仿照书上的来写一个例子:连续的信息轰炸:

program messageboom

    implicit none
    integer :: counter
    do counter=1,999
        CALL message()
    end do 
stop "over"
end program messageboom
subroutine message
    implicit none
    character(len=10)::array
    array="hello!"
    write(*,*)array
    RETURN
end subroutine message

其实这是个灰常简单的结构:

program name

    implicit none
    ....
    CALL sub1
    CALL sub2
end program name
subroutine sub1(!传参)
    argument type, intent(inout) :: sub1
    ...
return
end subroutine sub1
subroutine sub2(!传参)
    argument type, intent(inout) :: sub2
    ...
return
end subroutine sub2

subroutine里面随遍写,想些什么些什么,但是子程序的名字是不能乱给的,必须要凸显出其意义来,或者就是要在子程序中有注释。

主程序不一定要放在程序的最开始,可以以安排到程序中任意位置,我的建议就是,可以把子程序和后面的函数,都写到主程序之前,这样子的话,我们在写主程序的时候可以很清晰的知道调用哪个,而且也可以放在最后,就比如说你突然想实现某一个功能,然后在主程序中调用的时候,前面的已经写完了,不好再去修改,这个时候就可以扔在主程序后面了。

在子程序的后面会有一个return,做用很简单,就是返回子程序被调用的位置,通常子程序里不会有stop,因为这会使得子程序结束后整个程序全部结束,达不到我们所想要的效果,而且return是可以出现在子程序中的任意地方,使得程序提前返回。

子程序是要独立声明自己的变量的,但是我的附庸的附庸不是我的附庸,所以,主程序归并看不到。

但是子程序中所传递的参数都是要在子程序中声明的。

subroutine sub1name(firstnum,secondnum...)
    !那么在子程序中我们还是要对传入的firstnum,secondnum等参数进行声明的:
    !variable_type1::firstnum
    !variable_type2::secondnum
    ......
retrun
end subroutine sub1name

好了书上的都非常简单了,没啥意思,我们来试着用subroutine做一次斐波那契数列:

!这是循环形式
subroutine fobonacciproduce(a)
    integer::a(10)
    integer i
    a=0
    a(1)=0
    a(2)=1
    do i = 3,10, 1
        a(i)=a(i-1)+a(i-2)
    end do
    RETURN
end subroutine fobonacciproduce
program fibonacci

    implicit none
    integer::a(10)
    call fobonacciproduce(a)
    write(*,"(I3,I3,I3,I3,I3,I3,I3,I3,I3,I3)")a
end program fibonacci
!我想递归来着,但不知道递归为毛会出错,说是没有相应规定的声明,只好放弃了,唉

ok,今天就搞到这里吧,子程序已经结束了,明天开始自定义函数。 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值