作为一个编程语言,其面对的首要问题就是解决问题,那么就要用到一些函数来处理一些特定的问题,今天数组学习完发现还有一个多小时的空闲时间,时间够用我就继续学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,今天就搞到这里吧,子程序已经结束了,明天开始自定义函数。