Fortran语言基础 联系客服

发布时间 : 星期五 文章Fortran语言基础更新完毕开始阅读f58fff49fe4733687e21aa93

山东建筑大学

程序执行结果:

a=2 (子程序的a执行结果) a=1 (主程序的a)

通过参数传递,可以将主程序的变量值传递给子程序。

program ex0804 implicit none integer :: a = 1 integer :: b = 2

call add(a,b) ! 把变量a及b交给子程序add来处理 stop end

subroutine add(first, second) implicit none

integer :: first, second ! first,second的内容会从CALL时得到 write(*,*) first+second return end

程序执行结果显示a+b的值。

进入子程序后,由于first和second这两个变量使用来接受参数的,first的初值等于主程序中的a,second等于主程序中的b。Fortran在传递参数时使用的是传址调用(call by address/call by reference)。就是说主程序传递出去的参数和子程序接受的参数,使用相同的内存地址来记录数据。例如:

program ex0805 implicit none integer :: a = 1 integer :: b = 2 write(*,*) a,b call add(a) call add(b) write(*,*) a,b

45

数值分析程序设计——Fortran基础

stop end

subroutine add(num) implicit none integer :: num num = num+1 return end

例 计算五名选手以不同角度和速度投掷标枪的距离。假设在一场田径比赛的标枪项目中,有五位选手的标枪投掷情况如下:

1号选手:以30度每秒25米的速度掷出标枪; 2号选手:以45度每秒20米的速度掷出标枪; 3号选手:以35度每秒21米的速度掷出标枪; 4号选手:以50度每秒27米的速度掷出标枪; 5号选手:以40度每秒22米的速度掷出标枪;

假如忽略空气阻力以及身高等因素,试计算每位选手的投掷距离。

program ex0806 implicit none

integer, parameter :: players = 5

real :: angle(players) = (/ 30.0, 45.0, 35.0, 50.0, 40.0 /) real :: speed(players) = (/ 25.0, 20.0, 21.0, 27.0, 22.0 /) real :: distance(players) integer :: I do I=1, players

call Get_Distance( angle(i), speed(i), distance(i) ) write(*,\ end do stop end

! 把0~360的角度转换成0~2PI的弧度

46

山东建筑大学

subroutine Angle_TO_Rad( angle, rad ) implicit none real angle, rad

real, parameter :: pi=3.14159 rad = angle*pi/180.0 return end

! 由角度、切线速度来计算投射距离 subroutine Get_Distance( angle, speed, distance ) implicit none

real angle, speed ! 传入的参数 real distance ! 准备传回去的结果 real rad, Vx, time ! 内部使用 real, parameter :: G=9.81

call Angle_TO_Rad( angle, rad ) ! 单位转换 Vx = speed*cos(rad) ! 水平方向速度 time = 2.0*speed*sin(rad) / G ! 在空中飞行时间 distance = Vx * time ! 距离 = 水平方向速度 * 飞行时间 return end

6.2 自定义函数(FUNCTION)

Fortran的库函数中包含有常用的一些数学函数。对于经常要完成的某一个功能可以写成函数,以扩充库函数。自定义函数的执行和子程序基本相同,也是要经过调用才能执行,也可以独立声明变量。参数传递的方法和子程序基本类似,区别在于:

(1) 调用自定义函数前要声明;

(2) 自定义函数执行后会返回一个数值。 先看一个简单的例子:

program ex0807

47

数值分析程序设计——Fortran基础

implicit none real :: a=1 real :: b=2

real, external :: add !声明add是一个函数而不是变量 !调用函数add,调用函数不需使用call命令 write(*,*) add(a,b) stop end

function add(a,b) !以下为函数体 implicit none

real :: a,b ! 传入的参数 real :: add

! add跟函数名称一样,这边不是用来声明变量, ! 是声明这个函数会返回的数值类型 add = a+b return end

声明中多了external,表示所要声明的不是可以使用的变量,而是一个可以调用的函数。并且调用函数不使用CALL命令。

6.3 全局变量(COMMON)

不同程序之间,也就是在不同的函数之间或是主程序跟函数之间,除了可以通过参数传递的方法来共享内存,还可以通过“全局变量”来让不同程序中声明出来的变量使用相同的内存位置。这是另一种在不同程序间传递数据的方法。

6.3.1 COMMON的使用

program ex0810 implicit none integer :: a,b

common a,b ! 定义a,b是全局变量中的第1及第2个变量

48