fortran語(yǔ)法手冊(cè)資料_第1頁(yè)
fortran語(yǔ)法手冊(cè)資料_第2頁(yè)
fortran語(yǔ)法手冊(cè)資料_第3頁(yè)
fortran語(yǔ)法手冊(cè)資料_第4頁(yè)
fortran語(yǔ)法手冊(cè)資料_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1F0RTRAN77四則運(yùn)算符

+-*/**(其中**表示乘方)

在表達(dá)式中按優(yōu)先級(jí)次序由低到高為:+或或/-**—函數(shù)-()

2F0RTRAN77變量類型

2.1隱含約定:I-N規(guī)則

凡是以字母LJ,K,L,M,N六個(gè)字母開(kāi)頭的,即認(rèn)為是整型變量,其它為

實(shí)型變量。

2.2用類型說(shuō)明語(yǔ)句確定變量類型:可以變更I?N規(guī)則

INTEGER整型

REAL實(shí)型

DOUBLE

雙精度實(shí)型

PRECISION

復(fù)型,賦值形式為(實(shí)部,虛部),如

COMPLEX口=(8,76£+0.5,-67.8£-3)(=(3?0,6.3),假如含表達(dá)式則用CMPLX,

如C=CMPLX(3.0*Az6.0+B)

LOGICAL邏輯型,邏輯常量有、、T〃和“F〃,T'表示\TRUE.〃/F〃表示\FALSE.〃

字符型,N為字符串長(zhǎng)度,可以在變量名稱后重新指定長(zhǎng)度,如

CHARACTER*N

CHARACTER*8STR1,STR2*1O,賦值形式為STR2=T'MABOY.,

2.3用IMPLICIT語(yǔ)句將某一字母開(kāi)頭的全部變量指定為所需類型

如IMPLICITREAL(I,J)

三種定義的優(yōu)先級(jí)別由低到高依次為:I-N規(guī)則-IMPLICn?語(yǔ)句一類型說(shuō)明語(yǔ)

句,因此,在程序中IMPLICIT語(yǔ)句應(yīng)放在類型說(shuō)明語(yǔ)句之前。

2.4數(shù)組的說(shuō)明與運(yùn)用

運(yùn)用I-N規(guī)則時(shí)用DIMENSION說(shuō)明數(shù)組,也可在定義變量類型同時(shí)說(shuō)明數(shù)組,

說(shuō)明格式為;數(shù)組名(下標(biāo)下界,下標(biāo)上界),也可省略下標(biāo)下界,此時(shí)默認(rèn)為1,

例:

DIMENSIONIA(0:9),ND(80:99),W(3,2)/NUM(-1:0)ZA(0:2,0:1/0:3)

REALIA(10),ND(80:99)運(yùn)用隱含DO循環(huán)進(jìn)行數(shù)組輸入輸出操作:例如

,,,

WRITE(*,10)(I=zIz'A=zA(I)zI=lz10/2)

10FORMAT(1X,5(A2,I2,1X,A2/4))

2.5運(yùn)用DATA語(yǔ)句給數(shù)組賦初值

變量表中可出現(xiàn)變量名,數(shù)組名,數(shù)組元素名,隱含DO循環(huán),但不許出現(xiàn)任何形

式的表達(dá)式:例如

DATAA,B,C/-LO,?LO,-1Q/

DATAA/-1.0/,B/-1.0/zC/-1.0/

DATAAzB,C/3*-1.0/CHARACTER*6CHN(IO)

DATACHN/10*''/INTEGERNUM(IOOO)

DATA(NUM⑴,1=1,500)/500*0/,(NUM⑴,1=501,1000)/500*1/

3F0RTRAN77程序書(shū)寫規(guī)則

程序中的變量名,不分大小寫;

變量名稱是以字母開(kāi)頭再加上1到5位字母或數(shù)字構(gòu)成,即變更名字串中只有

前6位有效;

一行只能寫一個(gè)語(yǔ)句;

程序的第一個(gè)語(yǔ)句固定為PROGRAM程序名稱字符串

某行的第1個(gè)字符至第5個(gè)字符位為標(biāo)號(hào)區(qū),只能書(shū)寫語(yǔ)句標(biāo)號(hào)或空著或注釋內(nèi)

容;

某行的第1個(gè)字符為C或大號(hào)時(shí),則表示該行為注釋行,其后面的內(nèi)容為注釋內(nèi)

容;

某行的第6個(gè)字符位為非空格和非0字符時(shí),則該行為上一行的續(xù)行,一個(gè)語(yǔ)句

最多可有19個(gè)續(xù)行;

某行的第7至72字符位為語(yǔ)句區(qū),語(yǔ)句區(qū)內(nèi)可以任加空格以求美觀;

某行的第73至80字符位為注釋區(qū),80字符位以后不能芍內(nèi)容。

4F0RTRAN77關(guān)系運(yùn)算符

.GT.大于

.GE.天于或等于

.LT,小于

.LE.小于或等于

.EQ,等于

.NE.不等于.AND.邏輯與

.OR.邏輯或

.NOT.邏輯非

.EQV.邏輯等

.NEQV.邏輯不等

運(yùn)算符優(yōu)先級(jí)由高到低依次為:()-**-*或/-+或一.GT,或,GE.或,LT.

或?LE,或.EQ.或.NE.—?NOT.—?AND.一,OR.T.EQV,或?NEQV

5F0RTRAN77語(yǔ)句

語(yǔ)句說(shuō)明備注

第一個(gè)*號(hào)是指輸入輸出文件設(shè)備號(hào)或其它設(shè)備,假如不指定

WRITE(*產(chǎn))

輸出語(yǔ)句則是指顯示器或打印機(jī),其次個(gè)*號(hào)是指表控格式語(yǔ)句的行

XI,X2

號(hào),如不指定則用默認(rèn)格式

PRINT*,X1,X2輸出語(yǔ)句*號(hào)是指表控格式語(yǔ)句的行號(hào),如不指定則用默認(rèn)格式

READ*,X1,X2輸入語(yǔ)句*號(hào)是指表控格式語(yǔ)句的行號(hào),如不指定則用默認(rèn)格式

FORMAT(格式

請(qǐng)見(jiàn)附錄一。請(qǐng)見(jiàn)附錄二。

符)

結(jié)束程序或于

END

程序

結(jié)束程序并輸

STOP[N][N]為數(shù)字或字符串信息

出信息[N]

暫停程序執(zhí)行

并輸出信息

PAUSE[N][N]為數(shù)字或字符串信息

[N],輸入回

車后接著執(zhí)行

參數(shù)語(yǔ)句,用

來(lái)定義常量,

PARAMETER

在程序中應(yīng)放

(PI=3.14)

在類型說(shuō)明語(yǔ)

句之后

等價(jià)語(yǔ)句,()

EQUIVALENCE

內(nèi)變量共用一EQUIVALENCE。!.,X2,...XN),(XI,X2,...XN),...

(變量表)

個(gè)存儲(chǔ)單元。

公用語(yǔ)句,其

后變量相等,

用來(lái)在程序單

無(wú)名公用區(qū):在主程序各子程序中相同,均在可執(zhí)行語(yǔ)句之

位間傳遞數(shù)

前,如

COMMON據(jù),同時(shí)可以

COMMONA(5),I

xi,……用來(lái)說(shuō)明數(shù)

出名公用區(qū):名稱放在兩個(gè)〃之間,如

組。程序中可'7

COMMON〃X1,X2,X3/C1/X4,X5,X6

有一個(gè)無(wú)名公

用區(qū)和多個(gè)出

名公用區(qū)。

說(shuō)明項(xiàng)中內(nèi)容:

1UNIT=N,FILE=NAM,STATUS=STR1Z

ACCESS=STR2ZFORM=STR3,RECL=C,

BLANK=STR4,ERR=BH,IOSTAT=M

其中:

1.N=1?99;

2.NAM為文件名,可以是字符常量或變量;

3.STR1='NEW'時(shí)新建文件;'OLD'時(shí)打開(kāi)文件;

OPEN(說(shuō)明項(xiàng)打開(kāi)舊文件或'SCRATCH,時(shí)表示臨時(shí)文件,關(guān)閉時(shí)自動(dòng)刪除,且不能與

1)創(chuàng)建新文件FILE=NAM項(xiàng)共存;'UNKNOWN'時(shí)由計(jì)算機(jī)系統(tǒng)規(guī)定文件

狀態(tài);

4.STR2為文件存取方式「SEQUENTIAL'表示依次存取,

'DIRECT'表示干脆存取,省略此項(xiàng)時(shí)表示按依次存??;

5.STR3為記錄格式說(shuō)明,'FORMATTED'表示記錄按有格式

形式存放,'UNFORMATTED'表示記錄按無(wú)格式形式存放。

省略此項(xiàng)時(shí),對(duì)于依次文件是有格式的,對(duì)于干脆存取文件是

無(wú)格式的;

6.C表示記錄長(zhǎng)度,以字節(jié)為單位,干脆存取文件必指定,依次

文件必省略;

7.STR4表示數(shù)字值格式輸入字段中空格含意,'NULL'時(shí)表

示忽視不計(jì),'ZERO'時(shí)表示按0計(jì)。省略此項(xiàng)時(shí)按0計(jì);

8.BH表示出錯(cuò)時(shí)處理語(yǔ)句行標(biāo)號(hào),可以省略此項(xiàng);

9.M為整數(shù),出錯(cuò)時(shí)返回該整數(shù),可以省略此項(xiàng)。

說(shuō)明項(xiàng)2中內(nèi)容:

UNIT=NSTATUS=STR5ERR=BH,IOSTAT=M

CLOSE(說(shuō)明項(xiàng)關(guān)閉已打開(kāi)文ZZ

其中STR5為文件關(guān)閉狀態(tài)「KEEP時(shí)保留「DELETE刪除,

2)省略此項(xiàng)時(shí)為保留;

ERR=BH,IOSTAT=M可以省略。

將文件讀寫指

REWIND(說(shuō)明說(shuō)明項(xiàng)3中內(nèi)容:UNIT=N,ERR=BH,IOSTAT=M

針置于文件開(kāi)

項(xiàng)3)ERR=BH,IOSTAT=M可以省略

BACKSPACE將文件讀寫指

(說(shuō)明項(xiàng)3)針回退一行

6F0RTRAN77選擇推斷語(yǔ)句

6.1邏輯IF語(yǔ)句

IF(邏輯表達(dá)式)程序語(yǔ)句

6.2無(wú)ELSE塊

IF(邏輯表達(dá)式)THEN

程序塊

ENDIF

6.3標(biāo)準(zhǔn)選擇

IF(邏輯表達(dá)式)THEN

程序塊1

ELSE

程序塊2

ENDIF

6.4多重選擇塊

IF(邏輯表達(dá)式1)THEN

程序塊1

ELSEIF(邏輯表達(dá)式2)THEN

程序塊2

ELSEIF(邏輯表達(dá)式2)THEN

程序塊2

ELSEIF(邏輯表達(dá)式N)THEN

程序塊N

ELSE

程序塊N+l

ENDIF

7F0RTRAN77循環(huán)語(yǔ)句

7.1GOTO語(yǔ)句

標(biāo)號(hào)程序行

程序塊

GOTO標(biāo)號(hào)

7.2DO語(yǔ)句

DO標(biāo)號(hào),記數(shù)變量=起始值,終止值,步距〃語(yǔ)句,如

DO標(biāo)號(hào),N=l,100,1

程序塊

標(biāo)號(hào)CONTINUE

7.3DOWHILE語(yǔ)句

DO標(biāo)號(hào),WHILE(PLEQ.3.14159)

程序塊

標(biāo)號(hào)CONTINUE

7.4DOUNTIL語(yǔ)句

DO標(biāo)號(hào),UNTIL(邏輯表達(dá)式)〃語(yǔ)句,如

DO標(biāo)號(hào),UNTIL(PLGT.3.14159)

程序塊

標(biāo)號(hào)CONTINUE

8F0RTRAN77內(nèi)部函數(shù)

INT(X)將數(shù)字串或數(shù)值X轉(zhuǎn)換為整型數(shù)

REAL(X)將數(shù)字串或數(shù)值X轉(zhuǎn)換為實(shí)型數(shù)

DBEL(X)將數(shù)字串或數(shù)值X轉(zhuǎn)換為雙精度型數(shù)

CMPLX(X)將數(shù)字串或數(shù)值X轉(zhuǎn)換為復(fù)型數(shù)

CHAR(X)將數(shù)值X轉(zhuǎn)換為字符(0WXW255)

ICHAR(X)將字符X轉(zhuǎn)換為整數(shù)

AINT(X)截去X的小數(shù)部分

ANINT(X)將X舍入到最接近的整數(shù)

NINT(X)將X舍入到最接近的整型數(shù)

ABS(X)返回X的肯定值

返回的余數(shù)

MOD(X1ZX2)X1/X2

取的符號(hào),取的肯定值

SIGN(X1ZX2)X2XI

DIM(X1ZX2)當(dāng)X1>X2時(shí),等于X1-X2,當(dāng)X1<X2時(shí),等于0

DPROD(X1ZX2)雙精度乘(XI,X2均為實(shí)數(shù))

AIMAG(X)返回字符串X的虛部

CONJG(X)返回字符串X的共規(guī)

MAX(X1,X2,X3,??.,XN)返回X1,X2,X3,…,XN中最大值

MIN(X1,X2,X3,???,XN)返回X1,X2,X3,…,XN中最小值

SQRT(X)返回X的平方根(XNO)

EXP(X)返回E的X次方

LOG(X)返回以E為底的X的對(duì)數(shù)即自然對(duì)數(shù)(X>0)

LOGIO(X)返回以10為底的X的對(duì)數(shù)即常用對(duì)數(shù)(X>0)

SIN(X)返回弧度值X的正弦值

COS(X)返回弧度值X的余弦值

TAN(X)返回弧度值X的正切值

ASIN(X)返回弧度值X的反正弦值

ACOS(X)返回弧度值X的反余弦值

ATAN(X)返回弧度值X的反正切值

SINH(X)返回X的雙曲正弦值

COSH(X)返回X的雙曲余弦值

TANH(X)返回X的雙曲正切值

LEN(X)返回字符串X的長(zhǎng)度

INDEX(X1,X2)返回字符串X2在字符串XI中的位置,不包含時(shí)返回0

假如字符串則等于否則等于

LGE(X1ZX2)X1>X2.TRUE.,.FALSE.

LGT(X1,X2)假如字符串X1>X2則等于.TRUE,,否則等于.FALSE.

LLE(X1,X2)假如字符串X1<X2則等于.TRUE,,否則等于.FALSE.

假如鉀串貝等金則等于

LLT(X1ZX2)XKX2F.TRUE..FALSE.

9F0RTRAN77函數(shù)與子程序

9.1FORTRAN77語(yǔ)句函數(shù)

當(dāng)函數(shù)非常簡(jiǎn)潔,用一條語(yǔ)句足以定義時(shí)(允許運(yùn)用接著行)才用;

應(yīng)當(dāng)放在全部可執(zhí)行語(yǔ)句之前和有關(guān)類型說(shuō)明語(yǔ)句之后,是非執(zhí)行語(yǔ)句;

只在其所在程序單位中有意義;

語(yǔ)句函數(shù)中的虛參就是變量名,不能是常量、表達(dá)式或數(shù)組元素等;

語(yǔ)句函數(shù)定義語(yǔ)句中的表達(dá)式可以包含已經(jīng)定義過(guò)的語(yǔ)句函數(shù)、外部函數(shù)或內(nèi)部

函數(shù)。

語(yǔ)句函數(shù)通過(guò)表達(dá)式得一個(gè)函數(shù)值,此數(shù)值類型必需與函數(shù)名的類型一樣。語(yǔ)句

函數(shù)的運(yùn)用同內(nèi)部函數(shù)相同。

語(yǔ)句函數(shù)例子:

YMJ(R)=3.14159265*R*R

ZMJ=YMJ(5)

9.2FORTRAN77自定義函數(shù)

定義格式:

類型說(shuō)明FUNCTION函數(shù)名(虛擬參數(shù)1,虛擬參數(shù)2,……,虛擬參數(shù)N)

程序塊(可以含有RETURN)

函數(shù)名=函數(shù)值

END

調(diào)用格式與內(nèi)部函數(shù)相同。

9.3FORTRAN77子程序

定義格式:

SUBROUTINE子程序名(虛擬參數(shù)1,虛擬參數(shù)2,……,虛擬參數(shù)N)

程序塊(可以含有RETURN)

END

調(diào)用格式:

CALL子程序名(實(shí)在參數(shù)1,實(shí)在參數(shù)2,……,實(shí)在參數(shù)N)

數(shù)據(jù)塊子程序:只是用來(lái)給出名公用區(qū)中的變量賦初值,格式如下:

BLOCKDATA子程序名

DATA語(yǔ)句塊

END

附錄一、F0RTRAN77限制輸入輸出格式

1?在打印輸出時(shí),每?行第1個(gè)字符不顯示,用來(lái)限制縱向走紙或顯示行。

第1個(gè)字符作用

工格正常㈣車換斤

0回車并跳過(guò)1行

1換頁(yè)

+只回車不換行

其它通常是回車換行

2,輸入小數(shù)時(shí),自帶小數(shù)點(diǎn)優(yōu)先。

3,輸出字段寬度不夠時(shí)用*號(hào)填充。

附錄二、F0RTRAN77限制輸入輸出格式語(yǔ)句

1IW或IW.M整數(shù)型W為字段寬度,M為最少數(shù)字位數(shù)

2FW.D實(shí)數(shù)型D為小數(shù)位數(shù)

3EW.D或EW.DEE指數(shù)實(shí)數(shù)型E為指數(shù)位數(shù),通常為3或4

4GW.M自動(dòng)實(shí)數(shù)型

5DW.D雙精度型

6LW|邏輯型

7A或AW」字符型不指定W時(shí)自動(dòng)

8'字符串'插入字符串兩個(gè)'表示一個(gè)字符'

9NH字符串插入長(zhǎng)度為N的字符串

10NX插入N個(gè)空格

11RIW,R(NX,IW.M)R個(gè)IW,R個(gè)(NXJW.M)R為重復(fù)系數(shù)

12/換行

13,$禁止換行

書(shū)目:

說(shuō)

數(shù)

據(jù)

流程

四、

環(huán)

五、

-X.數(shù)組

八、函數(shù)

七、

八、

一、說(shuō)明

本文多數(shù)內(nèi)容是我讀彭國(guó)倫《Fortran95程序設(shè)計(jì)》的筆記。只讀到第九章,

主要是3~9章,都是最基本的用法(原書(shū)共16章)。這里主要摘錄了我看書(shū)過(guò)

程中總結(jié)的一些Fortran和C不同的地方,主要是語(yǔ)法方面。希望這份筆記能

夠給學(xué)過(guò)C但沒(méi)有接觸過(guò)Fortran的同學(xué)帶去一些幫助。要想得更清晰些,舉

薦看一下原書(shū),覺(jué)得作者真的寫得很好,很清晰;假如有C語(yǔ)言的基礎(chǔ),看完

前九應(yīng)當(dāng)很快的,花一兩天就行了。覺(jué)得假如耐性看完本文,基本功能應(yīng)當(dāng)也可

以順當(dāng)用起來(lái)了。外,由于我之前沒(méi)有用過(guò)Fortran,這次為了趕文檔看書(shū)又

看得很粗淺,大多數(shù)東西看過(guò)之后都沒(méi)得及細(xì)致想,只是按著作者的意思去理

解。所以這份筆記還處于紙上談兵的層次。假如有不妥的方,希望大家指正。

感謝!文中藍(lán)色的部分是程序代碼,!后面的內(nèi)容為注釋。

二、概述

1、名詞說(shuō)明Fortran=FormulaTranslator/Translation一看就知道有什么

特色了:可以把接近數(shù)學(xué)語(yǔ)言的文本翻譯成機(jī)械語(yǔ)言。的確,從一起先,IBM

設(shè)計(jì)的時(shí)候就是為了便利數(shù)值計(jì)算和科學(xué)數(shù)據(jù)處理。設(shè)計(jì)強(qiáng)大的數(shù)組操作就是為

了實(shí)現(xiàn)這一目標(biāo)。ortran奠定了高級(jí)語(yǔ)言發(fā)展的基礎(chǔ)?,F(xiàn)在Fortran在科研和

機(jī)械方面應(yīng)用很廣。

2、Fortran的主要版本及差別按其發(fā)展歷史,F(xiàn)ortran編譯器的版本其實(shí)許多。

現(xiàn)在在廣泛運(yùn)用的是Fortran77和Fortran90oortran90在Fortran77基礎(chǔ)

上添加了不少運(yùn)用的功能,并且改良了77編程的版面格式,所以編程時(shí)舉薦運(yùn)

用90。鑒于許多現(xiàn)成的程序只有77版本,有必要知道77的一些基本常識(shí),至

少保證能夠看77程序。以下是77和90的一些格式上的區(qū)分。Fortran77:固

定格式(fixedformat),程序代碼擴(kuò)展名:.f或.for(1)若某行以C,c或*

開(kāi)頭,則該行被當(dāng)成注釋;(2)每行前六個(gè)字符不能寫程序代碼,可空著,或

者「5字符以數(shù)字表明行代碼(用作格式化輸入出等);772為程序代碼編寫

區(qū);73往后被忽視;(3)太長(zhǎng)的話可以續(xù)行,所續(xù)行的第六個(gè)字符必需是

以外的任何字符。Fortran90:自由格式(freeformat),擴(kuò)展名:.f90(1)

以〃!〃引導(dǎo)注釋;(2)每行可132字符,行代碼放在每行最前面;(3)以&

續(xù)行,放在該行末或下行初。以下都是探討Fortran90。

3、Fortran的一些特點(diǎn),和C的一些不同其實(shí)許多,在下面涉及詳細(xì)方面時(shí)可

以看到。這里只是大致提一些。(1)不分大小寫(2)每句末尾不必要寫分號(hào)

(3)程序代碼吩咐間的空格沒(méi)有意義(4)不像C,Fortran不運(yùn)用{}(5)

數(shù)據(jù)類型多出了復(fù)數(shù)和邏輯推斷類型。比如復(fù)數(shù)類型complex::a!聲明

復(fù)數(shù)的方法。復(fù)數(shù)明顯便利了科學(xué)計(jì)算,滿意了工程方面需求a=(l.0,2.0)!

a=l+i(6)多出了乘幕運(yùn)算(**)。乘累除了整數(shù)還可以是實(shí)數(shù)形式。如開(kāi)

方,開(kāi)立方a=4.0**0.5,a=8.0**(1.0/3.0)?(7)數(shù)組有一些整體操

作的功能;可以便利的對(duì)部分元素進(jìn)行操作(8)有些狀況下可以聲明大小待定

的數(shù)組,很好用的功能

4、Fortran的基本程序結(jié)構(gòu)

先看一看所謂的“HeiloFortran"程序。

programmain!程序起先,main是program的名字,完全自定義

write(*,*)nHellon!主程序

stop!終止程序

end[program[main]]!end用于封裝代碼,表示代碼編寫完畢。[]中的

內(nèi)容可省略,下同。

再看一段好用一些的程序,好有點(diǎn)感性相識(shí)。程序用于計(jì)算圓柱的表面積,要求

輸入底面半徑和。其中展示了Fortran的一些特色用法。程序摘自維基。其

實(shí)是一個(gè)叫的網(wǎng)上引的維基的網(wǎng)頁(yè)。舉薦去看看!能查到不少有意思的東西。

programcylinder!給主函數(shù)起個(gè)名字

!Calculatetheareaofacylinder.

!Declarevariablesandconstants.

!constants=pi

!variables=radiussquaredandheight

implicitnone!Requireallvariablestobeexplicitly

declared!這個(gè)一般都是要寫上的。下面會(huì)進(jìn)一步說(shuō)明。

integer::ierr

character::yn

real::radius,height,area

real,parameter::pi=3.1415926536!這是常量的聲明方法

interactive_loop:do!do循環(huán),F(xiàn)ortran中的循環(huán)可以加標(biāo)簽,如d前

面的!interactive」oop就是標(biāo)簽

!Prompttheuserforradiusandheightandreadthem.

write(*,*)1Enterradiusandheight.'!屏幕輸出

read,iostat=ierr)radius,height!鍵盤輸入。isotat的值用

推斷輸入勝利否。

!Ifradiusandheightcouldnotbereadfrominput,thencycle

throughtheloop.

if(ierr/=0)then

write(*,*)*Error,invalidinput.'

cycleinteractive_loop!cycle相當(dāng)于C里的continue

endif

!Computearea.The**means"raisetoapower.n

area=2*pi*(radias**2+radius*height)!指數(shù)運(yùn)算比C便

!Writetheinputvariables(radius,height)andoutput(area)

tothescreen.

write(3'(lx,f6.2,5x,a7,f6.2,5x,a5,f6.2),)&!〃&”表示續(xù)

行。這里還顯示了格式化輸出

1

,radius=*tradius,*height=,height,*area='tareayn='*

yn_loop:do!內(nèi)嵌的另一個(gè)do循環(huán)

write(*z*)'Performanothercalculation?y[n],

1

read(*z'(al))yn

if(yn==*y1.or.yn==,Y*)

exityn_loop

if(yn==1n'.or.yn=='N'.or.yn=='')

exitinteractive_loop

enddoyn_loop!結(jié)束內(nèi)嵌d。循環(huán)

enddointeractive_loopendprogramcylinder

Fortran程序的主要結(jié)隔是這樣了。一般還會(huì)有些module的部分在主函數(shù)前,

函數(shù)在主函數(shù)后。

三、數(shù)據(jù)類型及基本輸入輸出

1、數(shù)據(jù)類型,聲明及賦初值

(1)integer:短整型kind=2,長(zhǎng)整型kind=4

integer([kind=]2)::a=3假如聲明成integer::a,則默認(rèn)為長(zhǎng)整

型。!“::”在聲明并同時(shí)賦初值時(shí)必須要寫上;類型名后面有形容詞時(shí)也必需

保留::;其他狀況可略去!所謂形容詞,可以看一下這個(gè)。比如聲明常數(shù)real,

parameter::pi=3.1415926。parameter就是形容詞。

(2)real:?jiǎn)尉萲ind=4(默認(rèn)),雙精度kind=8

real([kind=]8)::a=3.0還有指數(shù)的形式,如1E10為單精度,1D10為

雙精度

(3)complex單精度和雙精度complex([kind=]4)b

(4)charactercharacter([len=]10)c!len為最大長(zhǎng)度

(5)logicallogical*2::d=.ture.(等價(jià)于

logical(2)::d=.ture.)

(6)自定義類型type:類似于C中的struct

Fortran77中給變量賦初值常用DATA吩咐,可同時(shí)給多個(gè)變量賦初值

dataa,b,string/l,2?0,*fortran'/

與C不同的是,F(xiàn)ortran中變量不聲明也能運(yùn)用,即有默認(rèn)類型(跟implicit

吩咐有關(guān))。依據(jù)默認(rèn)的定,以i,j,k,l,m,n開(kāi)頭的變量被定義為integer,

其余為real。取消該設(shè)置需在程序聲明部分之前implicitnone。彭國(guó)倫建

議一般都運(yùn)用該語(yǔ)句。

另一點(diǎn)關(guān)于聲明的不同是Fortran有”等價(jià)聲明":integera,b

equivalence(a,b)使得a,b運(yùn)用同一塊內(nèi)存。這樣可以節(jié)約內(nèi)存;有時(shí)可

精簡(jiǎn)代碼。如:equivalence(很長(zhǎng)名字的變量如三維數(shù)組的某個(gè)元素,a),之后

運(yùn)用a來(lái)編寫程序就簡(jiǎn)潔多了。

2、基本輸入輸出

輸入:read(*,*)a!從鍵盤讀入

輸出:write(*,*)"text"!在屏幕上輸出。

Fortran77用'text'Fortan90中-一般””和,'都可

print*,"text"!只能用于屏幕輸出(*,*)完整寫為(unit=*?fmt=*),,

其中unit為輸入/輸出位置,如屏幕,文件等;fmt為格式。如這兩項(xiàng)都寫成*,

則按默認(rèn)的方式進(jìn)行,即上面描述的。print后面的*表示按默認(rèn)格式輸出。

四、流程限制

1、運(yùn)算符

(1)邏輯運(yùn)算符

==/=>>=<<=!Fortran90用法

.EQ..NE..GT..GE..LT..LE.[Fortran77用法

(2)涉及相互關(guān)系的集合運(yùn)算符

.AND..OR..NOT..EQV..NEQV.!僅.NOT.連接一個(gè)表達(dá)式,其余左右兩邊都

要有表達(dá)式(可以是logical類型的變量)!.EQV.:當(dāng)兩邊邏輯運(yùn)算值相同時(shí)

為真,.NEQV.:當(dāng)兩邊邏輯運(yùn)算值不同時(shí)為真

2、IF

⑴基本:

if(邏輯推斷式)then

endif

假如then后面只有一句,可寫為

if(邏輯推斷式)……!then和endif可省略

(2)多重推斷:

if(條件1)then

elseif(條件2)then

elseif(條件3)then

else

endif

(3)嵌套:

if(邏輯推斷式)then

if(邏輯推斷式)then

if(邏輯推斷式)then

elseif(邏輯推斷式)then

else

endif

endif

endif

(4)算術(shù)推斷:

programexample

implicitnone

realc

write(*,*)ninputanumber0

read(*,*)c

if(c)10,20,30!10,20和30為行代碼,依據(jù)c小于/等于/大于0,執(zhí)行

10/20/30行的程

10write(*,*)

goto40!got。可實(shí)現(xiàn)跳到隨意前面或后面的行代碼處,但用多了破壞程序結(jié)

20write(*,*)nB"

goto40

30write(*,*)nC"

goto40

40stop

end

3、SELECTCASE

類似于c的switch語(yǔ)句

selectcase(變量)

case(數(shù)值1)!比如case(1:5)代表1<=變量<=5會(huì)執(zhí)行該模塊

……!case(1,3,5)代表變量等于1或3或5會(huì)執(zhí)行該模塊

case(數(shù)值2)!括號(hào)中數(shù)值只能是integer,character或logical型常

量,不能real型

casedefault

endcase

4、PAUSE,CONTINUE

pause暫停程序執(zhí)行,按enter可接著執(zhí)行

continue貌似沒(méi)什么用處,可用作封裝程序的標(biāo)記

五、循環(huán)

1、D0

docounter=初值,終值,增/減量!counter的值從初值到終值按增/減量

變,.…Counter每取一個(gè)值對(duì)應(yīng)著一次循環(huán)。增/減量不寫則認(rèn)為1

……!循環(huán)主體也沒(méi)有必要用{}

enddo

Fortran77中不是用enddo來(lái)終止,而是下面這樣子:

do循環(huán)最終一行的行代碼counter=初值,終值,增/減量

行代碼......!這是do的最終一行

2、DOWHILE

dowhile(邏輯運(yùn)算)

enddo類似于C中的while(邏輯運(yùn)算){……}。一起先那個(gè)計(jì)算圓柱表面

積的程序中,應(yīng)當(dāng)也算是這一類。不過(guò)它是通過(guò)內(nèi)部的if語(yǔ)句來(lái)限制循??磥?lái)

也是可以的,不過(guò)在這本書(shū)上沒(méi)看到這樣寫。其實(shí)應(yīng)當(dāng)也可以歸于下面這種。

3、沒(méi)看到和C里面的do{……}while(邏輯運(yùn)算);相對(duì)應(yīng)的循環(huán)語(yǔ)句,不過(guò)可

以這樣,保證

至少做一循環(huán):

dowhile(.ture.)

if(邏輯運(yùn)算)

exit!exit就好比C里面的break。C里的continue在Fortran里是

cycle

enddo

4、Fortran的一個(gè)特色:帶署名的循環(huán)可以這樣,不易出錯(cuò):

outer:doi=lz3

inner:doj=lz3

enddoinner

enddoouter

還可以這樣,很便利:

loop1:doi=l,3

loop2:doj=l,3

if(i==3)

exitloopl!exit終止整個(gè)循環(huán)工oopl

if(j==2)

cycleloop2!cycle跳出loop2的本次循環(huán),進(jìn)行工oop2的下次循環(huán)

write(*,*)izj

enddoloop2

enddoloopl

還有一些循環(huán)主要用于Fortran中的數(shù)組運(yùn)算,為Fortran特有,很好用。

六、數(shù)組

1、數(shù)組的聲明和C不同的是,F(xiàn)ortran中的數(shù)組元素的索引值寫在()內(nèi),

且高維的也只用一個(gè)(),如

integera(5)!聲明一個(gè)整型一維數(shù)組

real::b(3,6)!聲明一個(gè)實(shí)型二維數(shù)組

類型可以是integer,real,character,logical或type。最高可以到

7維。數(shù)組大小必需為常數(shù)。但是和C語(yǔ)言不同,F(xiàn)ortran也有方法運(yùn)用大小

可變的數(shù)組,方法如:

integer,allocatable::a(:)!聲明小可變經(jīng)過(guò)某個(gè)途徑得知所需數(shù)

組大小size之后,用下面的語(yǔ)句:allocate(a(size)).配置內(nèi)存空間之后

該數(shù)組和通過(guò)一般方法聲明的數(shù)組完全相同。與C不同,F(xiàn)ortran索引值默認(rèn)

為從1起先,而且可以在聲明時(shí)變更該規(guī)則:

integera(-3:1)!索弓I值為-3,-2,-1,0,1

integerb(2:3,-1:3)!b(2~3,-「3)為可運(yùn)用的元素

2、數(shù)組在內(nèi)存中的存放和C不同,F(xiàn)ortran中的數(shù)組比如a(2,2)在內(nèi)存中

存放依次為。(1,1),@(2,1),虱1,2),&(2,2)。原則是放低維的元素,再放高維

的元素。此規(guī)則稱為columnmajoro

3、賦初值

(1)最一般的做法:

integera(5)

dataa/I,2,3,4,5/

或integer::a⑸=(/l,2,3,4,5/)

若integer::a(5)=5,則5個(gè)元素均為5

對(duì)于integer::a(2,2)=(/I,2,3,4/)依據(jù)數(shù)組元素在內(nèi)存中存放的方

式,等價(jià)于賦值a(1,1)=1/a(2z1)=2,a(1,2)=3,a(2,2)=4

(2)利用Fortran的特色:隱含式循環(huán)??蠢泳兔靼琢恕?/p>

integera(5)

integeri

data(a(i),i=2,4)/2,3,4/!(a(i),i=2,4)表示i從2到4循環(huán),增量

為默認(rèn)值1還可以這樣:

integeri

integer::a(5)=(/I,(2,i=2,4),5/)!五個(gè)元素分別賦值為1,2,2,

2,5

integer::b(5)=(/i,1=1f5/)!五個(gè)元素分別賦值為1,2,3,4,還

可以嵌套

data

((a(i,j),i=l,2),j=l,2)=/l,2,3,4/!a(l,1)=1,1(2,1)=2,a(1,2)=3,

a(2,2)=4

4、操作整個(gè)數(shù)組

設(shè)a,b為相同類型、維數(shù)和大小的數(shù)組

a=5!全部元素賦值為5

a=(/l,2,3/)!這里假設(shè)a為一維,a(1)=1,a(2)=2,a(3)=3

a=b!對(duì)應(yīng)元素賦值,要求a,b,c維數(shù)和大小相同,下同

a=b+ca=b-ca=b*ca=b/ca=sin(b)!內(nèi)部函數(shù)都可以這樣用

5、操作部分?jǐn)?shù)組元素

a為一維數(shù)組

a(3:5)=(/3,4,5/)!a(3)=3,a(4)=4za(5)=5

a(1:5:2)=3!a(1)=3,a(3)=3,a(5)=3

a(3:)=5!a(3)以及之后的全部元素賦值為5

a(l:3)=b(4:6)!類似于這種的要求左右數(shù)組元素個(gè)數(shù)相同

a(:)=b(:,2)!a(l)=b(l,2),a(2)=b(2,2),以此類推

6、WHERE

where形式上類似于if,但只用于設(shè)置數(shù)組。

設(shè)有兩個(gè)同樣類型、維數(shù)和大小的數(shù)組a,b

where(a<3)b=a!a中小于3的元素賦值給b對(duì)應(yīng)位置的元素

endwhere

再如:

where(a(1:3)/=0)c=a!略去了endwhere,因?yàn)橹桓艘恍衱here可嵌,

也!可類似do循環(huán)有署名標(biāo)簽。

7、F0RALL

有點(diǎn)像C中的for循環(huán):

forall(tripletl[,triplet2[,triplets...]],mask)

其中triplet形如i=2:6:2,表示循環(huán),最終一個(gè)數(shù)字省略則增量為1

例如:

forall(i=l:5,j=l:5,a(izj)<10)a(izj)=1endforall

又如:

forall(i=l:5,j=l:5,a(i^j)/=0)a(i,j)=l/a(i,j)

forall也可以嵌套運(yùn)用,好比C中for循環(huán)的嵌套。

七、函數(shù)

Fortran中函數(shù)分兩類:子程序(subroutine)和自定義函數(shù)(function)o自

定義函數(shù)本質(zhì)上就是學(xué)上的函數(shù),一般要傳遞自變量給自定義函數(shù),返回函數(shù)

值。子程序不肯定是這樣,可以沒(méi)有返值。傳遞參數(shù)要留意類型的對(duì)應(yīng),這跟

C是一樣的。

1、子程序

目的:把某一段常常運(yùn)用的有特定功能的程序獨(dú)立出來(lái),可以便利調(diào)用。習(xí)慣

上一般都把子程序放在主程序結(jié)束之后。

形式:

subroutinename(parameterl,parameter2)!給子程序起一個(gè)有意

義的名字??梢詡鬟f參數(shù),這樣可以有返回值。括號(hào)內(nèi)也可以空著,代不傳遞

參數(shù)。

implicitnone

integer::parameterl,parameter2!須要定義一下接收參數(shù)的類型。

.…!接下來(lái)的程序編寫跟主程序沒(méi)有任何別。

……return■RC不同,這里表示子程序執(zhí)行后回到調(diào)用它的地方接著執(zhí)行下

面的程序。不肯定放在最終??梢苑旁谧映绦虻钠渌恢?,作用相同;子程序中

return之后的部分不執(zhí)行。

end[subroutinename]

調(diào)用:運(yùn)用call吩咐干脆運(yùn)用,不須要聲明。在調(diào)用處寫:

callsubroutinename(parameterlzparameter?)

留意點(diǎn):

a.子程序之間也可相互調(diào)用。干脆調(diào)用就是了,像在主程序中調(diào)用子程序一樣。

b.傳遞參數(shù)的原理和C中不同。Fortran里是傳址調(diào)用(callby

address/reference),就是傳遞時(shí)用參數(shù)和子程序中接收時(shí)用的參數(shù)運(yùn)用同一個(gè)

地址,盡管命名可以不同。這樣假如子程序的執(zhí)行改子程序中接收參數(shù)的值,所

傳遞的參數(shù)也相應(yīng)發(fā)生變更。

c.子程序各自內(nèi)部定義的變量具有獨(dú)立性,類似于C。各自的行代碼也具有獨(dú)立

性。因此各個(gè)子程序主程序中有相同的變量名、行代碼號(hào),并不會(huì)相互影響。

2、自定義函數(shù)

和子程序的明顯不同在于:須要在主程序中聲明之后才能運(yùn)月。調(diào)用方式也有差

別。另外依據(jù)慣例用函數(shù)不去變更自變量的值。假如要變更傳遞參數(shù)的值,習(xí)慣

上用子程序來(lái)做。

聲明方式:

real,external::function_name一般自定義函數(shù)也是放在主程序之

后。

形式:

functionfunction_name(parameterlzparameter2)

implicitnonereal::parameterlzparameter?!聲明函數(shù)參數(shù)類型,

這是必需的

real::functionname!聲明函數(shù)返回值類型,這是必需的

function_name=....!返回值的表達(dá)式

return

end

也可以這樣干脆聲明返回值類型,簡(jiǎn)潔些:

realfunctionfunction_name(parameterl,parameter2)

implicitnone

real::parameter1,parameter2!這個(gè)還是必需的

function_name=....!返回值表達(dá)式

return

end

調(diào)用:

function_name(parameter1zparameter2)不須要call吩咐。自定義

函數(shù)可以相互調(diào)用。調(diào)用時(shí)也須要事先聲明。總之,調(diào)用自定義函數(shù)前須要做

聲明,調(diào)用子程序則不須要。

3、關(guān)于函數(shù)中的變量

(1)留意類型的對(duì)應(yīng)。

Fortran中甚至可以傳遞數(shù)值常量,但只有跟函數(shù)定義的參數(shù)類型對(duì)應(yīng)才會(huì)到

想要的結(jié)果。如callShowReal(L0)就必需用1.0而不是1?

(2)傳遞數(shù)組參數(shù),也跟C?樣是傳地址,不過(guò)不肯定是數(shù)組首地址,而可以

是數(shù)組某個(gè)指定元素地址。比如有數(shù)組a(5),調(diào)用callfunction(a)則傳遞

a(1)的地址,調(diào)用callfunction(a(3))則遞a(3)的地址。

(3)多維數(shù)組作為函數(shù)參數(shù),跟C相反的是,最終一維的大小可以不寫,其他

維大小必需寫。這決于Fortran中數(shù)組元素columnmajor的存放方式。

(4)在函數(shù)中,假如數(shù)組是接收用的參數(shù),則在聲明時(shí)可以用變量賦值它的大

小,甚至可以不指定小。例如:subroutineArray(num,size)

implicitnone

integer::sizeintegernum(size)!可以定義一個(gè)數(shù)組,其大小是通

過(guò)傳遞過(guò)來(lái)的參數(shù)確定的。這很好用

return

end

(5)save吩咐:將函數(shù)中的變量值在調(diào)用之后保留下來(lái),下次調(diào)用此函數(shù)時(shí)

該變量的值就是上次保的值。只要在定義時(shí)加上save就行:

integer,save::a=l

(6)傳遞函數(shù)(包括自定義函數(shù)、庫(kù)函數(shù)、子程序都是可以的)。類似于C中

的函數(shù)指針須要在主程序和調(diào)用函數(shù)的函數(shù)中都聲明作為參數(shù)傳遞的函數(shù)。如

real,external::function!自定義函數(shù)

real,intrinsic::sin!庫(kù)函數(shù)

externalsub!子程序

(7)函數(shù)運(yùn)用接口(interface):一段程序模塊。以下?tīng)顩r必需:a.函數(shù)返

回值為數(shù)組b.指定參數(shù)位置來(lái)傳遞參數(shù)時(shí)c.所調(diào)用的函數(shù)參數(shù)個(gè)數(shù)不固定d.

輸入指標(biāo)參數(shù)時(shí)e.函數(shù)返回值為指針時(shí)。詳細(xì)用法結(jié)合例子簡(jiǎn)潔看懂。例子都

很長(zhǎng)??磿?shū)吧。

4、全局變量

功能就不用說(shuō)了。原理:依據(jù)聲明時(shí)的相對(duì)位置關(guān)系而取用,不同與C中依據(jù)變

量名運(yùn)用。

假如在主程序中定義:

integer::a,b

commona,b!就是這樣定義全局變量的

在子程序或自定義函數(shù)中定義:

integer::c,d

commonc,d

則a和c共用相同內(nèi)存,b和d共用相同內(nèi)存。

全局變量太多時(shí)會(huì)很麻煩??梢园阉鼈?nèi)藶闅w類,只需在定義時(shí)在common后面

加上區(qū)間名,如

common/groupel/a,

common/group2/bo

這樣運(yùn)用時(shí)就不必把全部全局變量都列出來(lái),再聲明common/groupel/c

就可以用a、c全局變量了。

可以運(yùn)用blockdata程序模塊。在主程序和函數(shù)中不能干脆運(yùn)用前面提到的

data吩咐給全

局變量賦初值。可以給它們各自賦初值;假如要運(yùn)用data吩咐必須要這樣

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論