Fortran語言基礎 - 圖文 - 下載本文

數值分析程序設計——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

山東建筑大學

a=1 b=2

call ShowCommon() stop end

subroutine ShowCommon() implicit none

integer :: num1, num2

common num1, num2 ! 定義a,b是全局變量中的第1及第2

個變量

write(*,*) num1, num2 return end

程序執行結果:

1 2 注釋:

(1) 取用全局變量,是根據他們聲明時的相對位置關系,而不是變量名

稱對應。

(2) 由于全局變量是使用地址對應的方法在程序中共享數據,在子程序

中若僅使用部分全局變量,也必須聲明全部全局變量。這在全局變量很多的情況下是非常麻煩的,解決的方法是,把變量歸類放在彼此獨立的COMMON中。 (3) 全局變量不能用DATA賦值;

6.3.2 BLOCK DATA命令

全局變量不能直接在子程序或主程序中使用DATA來設值初值。全局變量的賦值采用BLOCK DATA語句。其結構為

BLOCK DATA NAME ! NAME可以省略 IMPLICIT NONE INTEGER …

49

數值分析程序設計——Fortran基礎

REAL … COMMON …

COMMON /GROUP1/… DATA VAR1,VAR2, … …. ....

END BLOCK DATA NAME 看一個實例:

program ex0812 implicit none integer :: a,b

common a,b ! a,b放在不具名的全局變量空間中 integer :: c,d

common /group1/ c,d ! c,d放在group1的全局變量空間中 integer :: e,f

common /group2/ e,f ! e,f放在group2的全局變量空間中 write(*,\ stop end block data implicit none integer a,b

common a,b ! a,b放在不具名的全局變量空間中 data a,b /1,2/ ! 設定a,b的初值 integer c,d

common /group1/ c,d ! c,d放在group1的全局變量空間中 data c,d /3,4/ ! 設定c,d的初值 integer e,f

common /group2/ e,f ! e,f放在group2的全局變量空間中 data e,f /5,6/ ! 設定e,f的初值

50





pk10冠军百期错一 澳洲快乐8开奖软件 2019特大股灾 北京快三 大小计划 体彩排列3和值玩法技巧 华东15选5app 第一配资网 福建十一选五开奖结果前一遗漏 黑龙江22选5开奖结果今天晚 股市行情走势600744 湖北快三昨天开奖结果 选四开奖结果 上海 查询 000989股票行情 山东十一选五最新开奖 江苏11选5基本走势图 在线股票大盘走势图 山东十一选五一定牛分布图