語言簡介 FORTRAN By 陳鯨太 1

Download Report

Transcript 語言簡介 FORTRAN By 陳鯨太 1

FORTRAN 語言簡介
By 陳鯨太
1
Outline
•
•
•
•
•
•
•
•
語言簡介、編譯器簡介
Fortran 基本事項
輸出、輸入及宣告
格式化輸出
程式結構
流程控制
陣列
函式
2
Fortran 簡介
•
•
•
•
全名-Formula Translator
IBM 1954 ~ 1957
第一個被廣泛使用的高階語言
演化
– 1978  FORTRAN 77
– 1992  FORTRAN 90
– 1997  FORTRAN 95
3
FORTRAN COMPILER 簡介1
• Visual FORTRAN
–
–
–
–
Microsoft  Digital  Compaq  HP?
Microsoft Visual Studio
完整的windows程式開發工具
可與Visual C++相互連結使用
4
FORTRAN COMPILER 簡介2
• 計中工作站
– 提供Fortran 90 及 Fortran 77
• 編譯方式
– 輸出至a.out
• f77 filename.for
• f90 filename.f90
– 輸出至指定檔案(sample)
• f77 filename.for -o sample
• f90 filename.for -o sample
5
FORTRAN COMPILER 簡介3
• 計中工作站之 Fortran
– 只提供在 ccsun26~35
– 總數:2套
• 登入
– telnet ccsun27.cc.nctu.edu.tw
– 帳號:u9031XXX
– 密碼:預設值是身份証字號
6
FORTRAN 基本事項1
• 字元集
– 英文字母:A~Z (大小寫不分)
– 數字:0~9
– 特殊符號:冒號、等號、加、減、乘、除、
底線 …etc
7
FORTRAN 基本事項2
• 程式碼寫作格式
– Fixed Format
• Fortran 77 的舊格式
• 為了使用打孔卡而發明
• 詳細規定每個字元的“用法”
– Free Format
• Fortran 90之後的新格式
• 提供較大彈性
8
FORTRAN 基本事項3
• Fixed Format
– 第1個字元
• 如果是字母c,C或*(星號),表示此行是註解
– 第1-5個字元
• 如果這邊是數字,表示這一行的代號,否則應為空白
– 第6個字元
• 如果是0以外的字元,表示這一行程式會接續上一行
– 第7-72個字元
• FORTRAN程式碼的寫作區域
– 第73個字元之後
• 不使用,超過部份會被忽略,有的編譯器會有錯誤訊息
9
FORTRAN 基本事項4
• Free Format
–
–
–
–
–
不規定每一行第幾字元有什麼作用
驚嘆號 ! 後面文字是註解
每行可寫作132個字元
行號在每行程式最前面
一行程式碼的最後如果是符號&,代表下一
行程式會和這一行連接。
10
FORTRAN 基本事項5
! Free Format
program main
write(*,*) “hello” ! 列印出hello這個字
write(*,*) &
“hello”
wri&
te(*,*) “hello”
end
11
輸出1
program main
write(*,*) “hello”
stop
end
12
輸出2
• Write(*,*)
– 第一個參數:輸出的位置
– 第二個參數:輸出格式
– 相等寫法:
• WRITE(*,*) “HELLO”
• WRITE(6,*) “HELLO”
• WRITE(UNIT=6, FMT=*) “HELLO”
13
輸出3
• 關於write(*,*)
– 自動換行
– 印出雙引號使用連續2個雙引號
• WRITE(*,*) “ MY NAME IS “”CASTER””. ”
– FORTRAN 90 雙引號/單引號
– FORTRAN 77 單引號
14
輸出4
• PRINT
– 語法:PRINT *, ”輸出字串”
– 專門對螢幕輸出
15
結束程式
•
結束程式
1. END
2. END PROGRAM
3. END PROGRAM MAIN ! MAIN是主程式
的名字
•
•
Fortran 90  1, 2, 3
Fortran 77  1
16
資料型態1
• 整數(integer)
– 宣告方式:integer a
–內定範圍為2^32~ -2^32
17
資料型態2
• 浮點數
– 宣告方式:real a 或 real*4 a
– 單精確度
• 3.4*10^38 ~ -3.4*10^38
• 有效位數6~7位
– 雙精確度:real*8 a
• 1.79*10^308
• 有效位數15~16位
18
資料型態3
• 複數
– 宣告:complex a
– 使用:a=(x,y) !x為實部,y為虛部
program main
complex a,b
a=(1.0,1.0)
b=(3.0,4.3)
write(*,*) “a+b=”, a+b
write(*,*) “a-b=”, a-b
write(*,*) “a*b=”,a*b
write(*,*) “a/b=”, a/b
stop
end
19
資料型態4
• 執行結果:
a+b= (4.0,5.3)
a-b= (-2.0,-3.3000001)
a*b= (-1.3000002,7.3)
a/b= (0.2655511,-0.047289926)
20
資料型態5
• 字元及字串
– Character a !宣告字元
– Character*10 a !宣告長度為10的字串
• 其它寫法
– CHARACTER*10
– CHARACTER(LEN=10)
– CHARACTER*(10)
• 給予初始值
– A=”字串內容”
21
輸入指令
• 輸入指令的基本語法如下:
INTEGER A
READ (*,*) A !讀入一個整數,並存到A內
READ (5,*) A !同上
READ(UNIT=5, FMT=*) A !同上
22
格式化輸出1
• 關於I
WRITE(*,”(I5)”) 100 !用5個字元的欄位來輸出一個整數
OUTPUT : _ _ 1 0 0
WRITE(*,”(I3)”) 100000
OUTPUT: * * *
WRITE(*,”(I5.4)”) 3
!輸出五個字元欄位,至少輸出4位,不足補0
OUTPUT: _ 0 0 0 3
23
格式化輸出2
• 關於F
WRITE(*,”(F9.3)”) 123.45
!輸出9個字元欄位,包括小數部份3個位數
OUTPUT: _ _ 1 2 3 . 4 5 0
• 關於E
WRITE(*,”(E15.7)”) 123.45
!用科學計號表示法,輸出15個字元欄位,小數部份佔
7位
OUTPUT : _ _ 0 . 1 2 3 4 5 0 0 E + 0 3
24
格式化輸出3
•關於A
WRITE (*,”(A10)”) “HELLO”
!用10個字元寬度輸出字串
OUTPUT: _ _ _ _ _ H E L L O
WRITE (*,”(A3)”) “HELLO”
OUTPUT : H E L
25
格式化輸出4
•關於B
WRITE (*,”(B6.5)”) 3
!把3變成二進位輸出,字6個字元寬,至少輸
出5位
OUTPUT : _ 0 0 0 1 1
26
格式化輸出5
•關於X
WRITE (*,”(3X)”) 20
!輸出前先填3個空白字元
OUTPUT: _ _ _ 2 0
27
變數名稱取名原則1
• 長度限制
– FORTRAN 77  至少6
– FORTRAN 90  至少31
• 不需宣告就能使用
– 第一個字母為I, J, K, L, M, N 整數
– 其它浮點數
28
變數名稱取名原則2
PROGRAM MAIN
I=11+22
WRITE(*,*) “11+22=”, J
STOP
END
• 結果:
11+22=0
29
變數名稱取名原則3
• 關閉內定型態的功能
IMPLICIT NONE
– 每個變數必需事先宣告
– 位置:PROGRAM指令的下一行
30
常數的宣告
• 方式一
REAL PI
PARAMETER(PI=3.14159)
• 方式二
REAL, PARAMETER ::PI=3.14159
31
程式結構
32
FLOW CONTROL1
• IF … THEN… ELSE語法:
IF(邏輯判斷式) THEN
執行動作1
ELSE
執行動作2
END IF
33
FLOW CONTROL2
PROGRAM MAIN
IMPLICIT NONE
REAL HIEGHT
REAL WEIGHT
READ(*,*) HEIGHT
READ(*,*) WEIGHT
IF (WEIGHT > HEIGHT-100) THEN
WRITE(*,*) “TOO FAT!”
ELSE
WRITE(*,*) “UNDER CONTROL”
END IF
STOP
END
34
FLOW CONTROL3
• 邏輯運算式
= = 相等
/ = 不相等
> 大於
> = 大於等於
< 小於
< = 小於等於
.AND. 如果兩邊式子都成立,整個條件就成立
.OR.
兩邊的式子只要有一個成立,整個條件就成立
.NOT. 如果後面的式子不成立,整個式子就算成立
.EQV. 兩邊式子的邏輯運算結果相同時,整個式子就成立
.NEQV. 兩邊式子的邏輯運算結果不同時,整個式子就成立
35
FLOW CONTROL4
• FORTRAN 77的邏輯運算式
.EQ.
.NE.
.GT.
.GE.
.LT.
.LE.
等於
不等於
大於
大於等於
小於
小於等於
36
FLOW CONTROL5
• DO迴圈語法:
DO 起始值, 終止值, 累加值
執行程式碼
END DO
• 例:
DO I=10, 5, -1
WRITE(*,*) I
END DO
37
FLOW CONTROL6
• 結果:
10
9
8
7
6
5
38
FLOW CONTROL7
• Do…while語法:
DO WHILE (邏輯運算)
程式碼
END DO
39
陣列1
• FORTRAN 90 陣列的宣告
integer a(10) !宣告a這個陣列有10個元素
integer , dimension(10) :: a
! 同上,另一種作法
• FORTRAN 77 陣列的宣告
integer a
dimension a(10)
• 注意!!index值從1開始算起!!
40
陣列2
• 使用陣列
– a(1)=18
– INTEGER A(3)
DATA A /36, 24, 36/
– 在FORTRAN 90中,還可以省略DATA這個敘
述
INTEGER :: A(3) = (/36, 26, 36/)
◎ 括號跟除號之間不能有空格,並且冒號不能
省略。
41
函式1
• 副程式(SUBROUTINE)的使用:(可錯位)
PROGRAM MAIN
主程式碼
END
SUBROUTINE SUB1()
程式碼
END SUBROUTINE
SUBROUTINE SUB2()
程式碼
END SUBROUTINE
42
函式2
• 特性:
–
–
–
–
CALL BY REFERENCE
無回傳值
副程式最後一個指令通常是RETURN
在主程式呼叫副程式:CALL
43
函式3
PROGRAM MAIN
IMPLICIT NONE
INTEGER :: A=1
WRITE (*,*) “A的初始值是”, A
CALL ADD(A)
WRITE(*,*) “A後來的值是”, A
STOP
END
SUBROUTINE ADD(NUM)
IMPLICIT NONE
INTEGER NUM
NUM = NUM + 1
RETURN
END SUBROUTINE
44
函式4
• 這個程式的輸出:
A的初始值是 1
A後來的值是 2
• 因為呼叫了subroutine,使得A的值被改
變!
45
函式5
• 自訂函數(function)
– 類似SUBROUTINE
– 不同點
• 呼叫前必需宣告
• 有回傳值
– 宣告方式
• Fortran 90
REAL , EXTERNAL :: ADD
• Fortran 77
REAL ADD
EXTERNAL ADD
46
函式6
PROGRAM MAIN
IMPLICIT NONE
REAL, EXTERNAL:: TRIPPLE
real:: A=1.38
WRITE (*,*) "A的初始值是", A
WRITE (*,*) "呼叫函數",TRIPPLE(A)
WRITE(*,*) "A後來的值是", A
STOP
END
REAL FUNCTION TRIPPLE(NUM)
IMPLICIT NONE
REAL NUM
TRIPPLE = NUM * 3
RETURN
END
47
執行結果
A的初始值是 1.38
呼叫函數 4.14
A後來的值是 1.38
48
作業
• 圓面積計算公式
–
–
–
–
輸入:半徑(浮點數),輸出:圓面積(浮點數)
必需使用subroutine, function其中一種方式
圓周率使用課堂上教的方法宣告
Pi=3.1416
49
Any Question
• Please email : [email protected]
50