(4) .eqv.與.neqv.這兩個(gè)運(yùn)算符按"先左后右"的原則進(jìn)行計(jì)算。
三、賦值語旬
賦值語句的一般格式為:
變量名=表達(dá)式
其中,連接變量名和表達(dá)式的符號(hào)" ="稱為賦值號(hào)。在fortran 77中,有三種賦值 語句:算術(shù)賦值語句,邏輯賦值語句和字符賦值語句。
(一)算術(shù)賦值語句
1.算術(shù)賦值語句中賦值號(hào)右邊是算術(shù)表達(dá)式。算術(shù)表達(dá)式可以是單個(gè)變量或數(shù)組元 素,可以是用算術(shù)運(yùn)算符號(hào)連接起來的數(shù)值計(jì)算過程。
(1)算術(shù)表達(dá)式中的各個(gè)數(shù)據(jù)量(常量或變量)的類型一般應(yīng)該一致。如果不一致, fortran程序在運(yùn)行中先將其進(jìn)行轉(zhuǎn)換,再進(jìn)行計(jì)算。例如實(shí)型變量和整型變量進(jìn)行 計(jì)算時(shí),整型變量的數(shù)值先被轉(zhuǎn)換為實(shí)型。
(2)算術(shù)表達(dá)式計(jì)算中,特別應(yīng)注意兩個(gè)整型量之間的除法(稱為整除)。例如,算術(shù)表達(dá)式10.0-2/4*10.0的計(jì)算過程是
10.0 – 0*10.0= 10.0 -0.0= 10.0
如果表達(dá)式寫為10.0-2/4.0*10.0,則計(jì)算過程是
10.0-2.0/4.0*10.0=10.0-0.5*10.0=5.0
因?yàn)?/4是整除,其結(jié)果為0,而進(jìn)行2/4.0的計(jì)算時(shí),整型量2先被轉(zhuǎn)化為實(shí)型。
2.算術(shù)賦值左邊只能是數(shù)值型變量名或數(shù)值型數(shù)組元素。如果賦值號(hào)左邊的變量與 右邊的表達(dá)式類型不一樣時(shí),系統(tǒng)將自動(dòng)把右邊表達(dá)式計(jì)算的結(jié)果轉(zhuǎn)換為與左邊變量的類 型一致后再賦給該變量。
(二)邏輯賦值語句
在邏輯賦值語句中,賦值號(hào)左邊為邏輯變量或邏輯型數(shù)組元素,右邊為一個(gè)邏輯表 達(dá)式。
(三)字符賦值語句
1.字符賦值語句賦值號(hào)的左邊為字符變量或字符型數(shù)組元素。
2.賦值號(hào)的右邊為字符表達(dá)式,可以是單個(gè)字符串或用字符運(yùn)算符連接起來的字符串。字符運(yùn)算符只有一個(gè),表示為礦,含義為連接該符號(hào)兩邊的字符串.
3.執(zhí)行字符賦值語句時(shí),應(yīng)注意字符串的長(zhǎng)度與賦值號(hào)右邊變量或數(shù)組元素的長(zhǎng)度的關(guān)系。例如:
character*4 a, b*6, c
a= 'file
b=a//’'name'
c=b (5:6)
定義字符型變量時(shí),根據(jù)類型說明語句的規(guī)定,a長(zhǎng)度為4,而變量b因有專門說明,其長(zhǎng)度為6。程序運(yùn)行后,變量a的長(zhǎng)度與賦值號(hào)右邊字符串長(zhǎng)一致,a的值為 ‘file' ;而b的長(zhǎng)度小于‘file'和‘name'兩個(gè)字符串長(zhǎng)度之和,因此多余的字 符被截去,b的值為‘filena'; c的結(jié)果為‘na__' ,其中最后兩格為空格符,這是 因?yàn)閏的長(zhǎng)度為4,大于字符串‘na'的長(zhǎng)度,于是在其右邊補(bǔ)上2個(gè)空格符后形成4 個(gè)字符長(zhǎng)再賦值給c.在上面的程序例中,出現(xiàn)表達(dá)式b (5:6),稱為"子串",表示取出字符串的一部分,本例中,表示將b的字符串‘filena'中的第5個(gè)字符至第6 個(gè)字符取出。
四、循環(huán)語句
(一)do語句
do語句的一般形式為:
do n v = el, e2, e3
n循環(huán)體
其中,n為語句標(biāo)號(hào);v為循環(huán)控制變量,它只能是簡(jiǎn)單變量(整型或?qū)嵭停?,不能是表 達(dá)式; el, e2, e3分別為循環(huán)控制變量的初值、終值與增量(步長(zhǎng)) ,它們都可以是表達(dá) 式,當(dāng)e3為1時(shí)可以省略不寫。循環(huán)體是若干語句的集合,其中最后一個(gè)語句稱為循環(huán) 終端語句;若循環(huán)體只有一個(gè)語句,則該語句也就是終端語句。終端語句必須有標(biāo)號(hào)n。
在do循環(huán)執(zhí)行時(shí),首先計(jì)算表達(dá)式el, e2, e3的值,并將它們化為與循環(huán)控制變量v的類型一致;然后將初值賦給循環(huán)控制變量v,并計(jì)算需要循環(huán)的次數(shù);最后根據(jù) 循環(huán)次數(shù)重復(fù)執(zhí)行循環(huán)體中的語句,并每次執(zhí)行完循環(huán)體后,將循環(huán)控制變量增值一次, 循環(huán)次數(shù)減少一次。當(dāng)循環(huán)次數(shù)為零時(shí),則結(jié)束循環(huán),轉(zhuǎn)向程序規(guī)定的下一個(gè)語句。
(二)繼續(xù)語句continue
continue是一個(gè)可執(zhí)行語句,其功能是使程序的流程繼續(xù)到邏輯上的下一個(gè)語句。
fortran 77規(guī)定,循環(huán)終端語句必須是一個(gè)可執(zhí)行語句,但不能是goto語句、 塊if語句、else語句、else if 語句、endif語句、00語句、stop語句、end語句。由于這些限制,通常用continue 語句作為循環(huán)的終端語句。當(dāng)然, continue 語句也可用在其他場(chǎng)合。
(三)循環(huán)嵌套
使用循環(huán)嵌套可以實(shí)現(xiàn)多重循環(huán)。這時(shí)應(yīng)注意各重循環(huán)的層次和循環(huán)變量的關(guān)系。例如,編寫一個(gè)計(jì)算乘法表的程序段,可以寫為:
do 10 1=1, 9
do 8 j=l, 9
ij = i*j
8 continue
10 continue
本例中,外層循環(huán)控制變量i初值為1,終值為9,內(nèi)層循環(huán)控制變量j初值為外層循環(huán) 控制變量i的當(dāng)前值,終值為9。外層的第1次循環(huán),內(nèi)層經(jīng)過9-1+1=9次循環(huán),依次 計(jì)算1×1=1,1×2=2,…,1×9=9,外層的第2次循環(huán),內(nèi)層經(jīng)過9-2+1=8次循 環(huán),依次計(jì)算2×2=4, 2×3=6,…, 2×9 = 18……
(四)使用循環(huán)語句應(yīng)注意的若干問題
1.正確選定循環(huán)變量的初值。比如,對(duì)累加問題和連乘問題,變量初值不正確,使 影響最終結(jié)果。
例如計(jì)算m=1!十2! +……十10! ,采用循環(huán)語句編寫程序,涉及到累加和連乘。 其程序可編寫如下:
m=0
n=1
do 20 i= 1, 10
n=n×i
m=m十n
20 continue
print*,m
end
例中, n用于存放連乘結(jié)果,其初值設(shè)定為1,而m用于存放累加結(jié)果,其初值設(shè)定為0。
2. do語句可以和轉(zhuǎn)換語句,條件語句等結(jié)合起來使用,此時(shí)應(yīng)注意從循環(huán)體內(nèi)可以 轉(zhuǎn)向循環(huán)體外,但不允許從循環(huán)體外轉(zhuǎn)向循環(huán)體內(nèi);從內(nèi)層循環(huán)中可以轉(zhuǎn)向外層循環(huán),但不允許從外層循環(huán)轉(zhuǎn)向內(nèi)層循環(huán)中。
3.當(dāng)內(nèi)外層循環(huán)體的終端語句相同,且兩個(gè)終端語句之間沒有其他語句時(shí),可以合 并使用一個(gè)終端語句。例如,前面計(jì)算乘法表的程序段可以寫為:
do 10 i=1. 9
do 10j=i,9
ij = i*j
10 continue
或?qū)憺?/span>
do 10 i=1,9
00 10 j=i, 9
10 ij=i*j
五、輸入輸出語旬
(一)表控輸入輸出
表控輸入輸出語句是一種隱含格式的輸入輸出語句,其格式由程序編譯系統(tǒng)提供,在 程序語句中不予表示。
1.表控輸出語句
fortran 77表控輸出語句有兩種方式:
print*,輸出量表
write (*,*)輸出量表
這兩種表控輸出語句的作用是相同的,但一般微機(jī)上的fortran 77子集不提供print 語句,所以通常使用write 語句。
2.表控輸入
fortran 77表控輸入語句有兩種型式:
read*,輸入量表
read (*,*)輸入量表
表控輸入又稱為自由格式輸入。表控輸入語句要求用戶在隱含的輸入設(shè)備(通常是鍵盤)上輸入所需的數(shù)據(jù),在輸入數(shù)據(jù)時(shí),各數(shù)據(jù)之間用逗號(hào)或空格分隔。
(二)格式輸入輸出
1.格式輸出數(shù)據(jù)語句write語句和format語句
write語句的一般形式為:
write (u, f)輸出量表
其中, u為部件說明符,用以指出在哪個(gè)設(shè)備上進(jìn)行輸出,通常也稱為通道號(hào),當(dāng)u為記號(hào)*時(shí),表示在顯示器(標(biāo)準(zhǔn)輸出設(shè)備)上進(jìn)行輸出。f為格式說明,它通常是一個(gè)格式語句的標(biāo)號(hào),用以指出輸出數(shù)據(jù)所采用的格式。
格式語句的一般形式為:
標(biāo)號(hào)format (格式說明)
例如:
write (*, 10) a, b, a*b
10 format (lx, f6.2, f7.3, f10.4)
format語句中,第一個(gè)"1x"稱為縱向控制符,它表示前進(jìn)一空格后再輸出后面的數(shù)據(jù),后面的三個(gè)項(xiàng)分別說明了三個(gè)實(shí)型數(shù)據(jù)輸出的,稱為格式編輯符。
fortran 77也允許在write語句中直接指定輸出格式,從而可以省略格式語句 format。例如,上面的輸出語句與格式語句可以合并成一個(gè),即:
write (*, i (1x , f6. 2, f7. 3, f10.4) ') a, b, a*b
2.格式編輯符 fortran常用的格式符有十幾種,詳細(xì)可參照任何一本fortran教材或?qū)S糜趦?cè)。
(三)隱循環(huán)的輸入輸出
數(shù)組元素的輸入輸出可以采用循環(huán)方式實(shí)現(xiàn)。 例如:
dimension x (20)
do 10 1= 1, 20
10 read*, x (i)
程序段執(zhí)行時(shí)進(jìn)行20次循環(huán),每次輸入1個(gè)數(shù)據(jù)。這個(gè)輸入程序段可以改寫如下: dimension x (20)
read*, (x (i), i = 1, 20)
其中第2句就是隱循環(huán)的輸入語句。循環(huán)控制變量i的初值為1,終值為20,步長(zhǎng)為1而 予以省略。隱循環(huán)語句的作用與do語句是相同的;但使用隱循環(huán)語句時(shí), 20個(gè)數(shù)據(jù)允 許一次性輸入,當(dāng)然,數(shù)據(jù)與數(shù)據(jù)之間要用空格符或逗號(hào)區(qū)別開來。
隱循環(huán)語句也用于輸出語句,也可使用多重循環(huán)。例如
dimension y (l0, 6)
read (*,*) ((y (i, j), j=1, 6), i=1, 10)
write (*, 5) ((y (i, j), j=1, 6), i=1, 10)
5 format (lx, 6f10.2)
運(yùn)行程序段時(shí),首先讀入60個(gè)數(shù)據(jù), y (1, 1), y (1,2),……, y (1, 6), y (2, 1), y (2, 2),……, y (2, 6),……, y (10, 1), y (10, 2),……, y (10, 6), 然后輸出60個(gè)數(shù)據(jù),每行輸出6個(gè)數(shù)據(jù),數(shù)據(jù)的排列順序與輸入時(shí)相同。
例:
1.fortran 語句: i=25 + 3.0**2 / 2 執(zhí)行后,整型變量 i 的值是()。
a . 29 . 5;
b . 30;
c . 29;
d . 28
【 解 】 由條件, i 為整型變量知 a 項(xiàng)不對(duì),應(yīng)排除。 i=25 + 3 . 0**2 / 2=29 ,所以應(yīng)選 c 項(xiàng)。
2.fortran 語句: b=10 . 0 -2/ 4 * 10 . 0 執(zhí)行后,變量 b 的值是()。
a . 10 . 0;
b . 5 . 0;
c . 10;
d . 5
【 解 】 由條件, b=10 . 0 -0×10 . 0=10 . 0 ,所以應(yīng)選 a 。
3.不等式 2 . 0≤y≤10.0對(duì)應(yīng)的 y表達(dá)式是(a)
a . 2 . 0 . le . y . and . y . le .10.0;
b . 2 . 0 . ge.y. le .10.0;
c. 2 . 0 . le.y. le .10.0;
d y . ge.2.0 . or.le.10.0
4.下列各符號(hào)中, 可作為 rortran77 合法變量名的是(c)
a . 112fa ;
b . f- 312;
c. abd;
d π
5.若有語句: integerb (-1:2 , 3:7 ) ,則數(shù)組 b 中所包含的元素個(gè)數(shù)為(c)。
a . 10;
b . 15;
c . 20;
d . 24
六、控制語句
一般情況下, fortran程序是按語句順序執(zhí)行的,但需要時(shí),可以改變這種順序。 這種改變可以通過各種控制轉(zhuǎn)移語句、邏輯條件語句等來實(shí)現(xiàn)。
(一)轉(zhuǎn)移語句
1.無條件轉(zhuǎn)移語句
無條件轉(zhuǎn)移語句的一般形式為:
goto n
當(dāng)程序流程到達(dá)goto語句時(shí),隨后就轉(zhuǎn)向語句標(biāo)號(hào)為n的語句。標(biāo)號(hào)為n的語句必須是可執(zhí)行語句,但它在程序中的排列位置,可以在引導(dǎo)到它的goto語句之后,也可以 在該goto 語句之前。無條件轉(zhuǎn)移語句常和其他控制語句結(jié)合起來使用。
2.算術(shù)條件轉(zhuǎn)移語句
算術(shù)條件轉(zhuǎn)移語句的一般形式為:
if (e) nl, n2, n3
其中, e必須是算術(shù)表達(dá)式,當(dāng)表達(dá)式運(yùn)算結(jié)果e<0時(shí),程序轉(zhuǎn)向標(biāo)號(hào)為n1的語句;當(dāng) e=0時(shí),轉(zhuǎn)向標(biāo)號(hào)為n2的語句;當(dāng)e>0時(shí),轉(zhuǎn)向標(biāo)號(hào)為n3的語句。
例如,計(jì)算邊長(zhǎng)為b的正方形中挖去半徑為r的圓后的面積,若b<2r,則給出相 關(guān)信息。該問題的fortran程序可用別遼條件轉(zhuǎn)移語句編寫如下。
c computation of area.
read*b.r
if (b-2*r) 5, 15, 15
5 write (*, 10)
10 format ('error message: b less than 2*r‘)
goto 20
15 area=b*b-3.14159*r*r
write *area
20 continue
end
本例中,在算術(shù)條件轉(zhuǎn)移語句的第1個(gè)分支后,使用了goto語句;倘沒有此語句,則 程序按順序仍會(huì)執(zhí)行標(biāo)號(hào)為15的語句,從而得出不正確的結(jié)果。
3.計(jì)算轉(zhuǎn)移語句
計(jì)算轉(zhuǎn)移語句的一般形式為:
goto (n1, n2,……, nm), e
其中, ni (i = 1, 2,……, m)是被轉(zhuǎn)向的語句標(biāo)號(hào),共m個(gè); e是一個(gè)整型算術(shù)表達(dá) 式,其值不得小于1且不得大于m。當(dāng)e的值等于1時(shí),程序轉(zhuǎn)向標(biāo)號(hào)nl的語句,當(dāng)e 的值等于2時(shí)轉(zhuǎn)向標(biāo)號(hào)n2的話句,當(dāng)e的值為m時(shí)轉(zhuǎn)向標(biāo)號(hào)為nm的語句。整型算術(shù)表 達(dá)式e前的逗號(hào)可以省略。計(jì)算轉(zhuǎn)移語句通常也和goto語句結(jié)合起來使用。 例如,有如下一個(gè)程序:
read*,m
goto (20, 30, 40, 50) m
20 n=m goto 60
30 n=m*2 goto 60
40 n=m*3 goto 60
50 n=m*4
60 write*,n
end
程序運(yùn)行時(shí),若輸入1,則轉(zhuǎn)向標(biāo)號(hào)為20的語句,x的值為1 ;若輸入2,則轉(zhuǎn)向標(biāo)號(hào)為 30的語句,x的值為4;輸入3,轉(zhuǎn)向標(biāo)號(hào)為40的語句,x的值為9,輸入4,轉(zhuǎn)向標(biāo)號(hào) 為50的語句,x的值為16
(二)邏輯條件語句
1.邏輯if語句
邏輯if 語句用來實(shí)現(xiàn)選擇結(jié)構(gòu)。它的一般形式為:
if (邏輯表達(dá)式)內(nèi)嵌語句
其中內(nèi)嵌語句是單獨(dú)的一個(gè)可執(zhí)行語句。邏輯if語句執(zhí)行時(shí),首先計(jì)算邏輯表達(dá)式的值, 如果邏輯表達(dá)式的值為"真",則執(zhí)行內(nèi)嵌語句,若內(nèi)嵌語句非轉(zhuǎn)移語句,則執(zhí)行該語句 后繼續(xù)按順序往下執(zhí)行,若內(nèi)嵌語句是轉(zhuǎn)移語句,則轉(zhuǎn)向指定的語句;如果邏輯表達(dá)式的值為"假",則不執(zhí)行內(nèi)嵌語句,而直接執(zhí)行該語句后面的語句。
例如,從鍵盤讀入一個(gè)代表百分制成績(jī)的數(shù)據(jù),如果數(shù)據(jù)在90-100之間就輸出 ‘excellent' ,在80-89之間輸出‘good' ,在60-79之間輸出‘pass' ,在60以下則輸出 ‘not pass' 。其程序可以如下編寫:
read (*.*) ipoint
if (ipoint. gt .100. or. ipoint. lt. 0) write (*,*) 'data error'
if (ipoint.ge.90.and. ipoint. le.100) write (*.*) 'excellent'
if (ipoint.ge.80.and.ipoint.le89) write ( * . *'good'
if (ipoint.ge.60.and. ipoint. le. 79) write (*.*) 'pass'
if (ipoint.ge.0.and. ipoint. le.59) write (*.*) 'not pass'
end
2.塊if結(jié)構(gòu)的各種形式
(1)塊if和endif形式
if (邏輯表達(dá)式) then
語句塊
endif
當(dāng)邏輯表達(dá)式的值為"真"時(shí),執(zhí)行語句塊,否則按順序執(zhí)行endif后的語句。例如, 如下程序段:
read*, rn, an
if (rn.ge.0.0.and.an.gt.0.0) then
stress=rn/an
write*rn,an,stress
endif
end
當(dāng)rn大于等于零且an大于零時(shí),執(zhí)行賦值語句和輸出語句。
(2)使用else的形式
if (邏輯表達(dá)式) then
語句塊1
else
語句塊2
endif
當(dāng)邏輯表達(dá)式的值為"真"時(shí),執(zhí)行語句塊1 ,當(dāng)邏輯表達(dá)式的值為"假"時(shí),執(zhí)行語句塊2。由此可見,使用else的形式,可以進(jìn)行兩個(gè)分支的選擇。
(3)使用else if的形式
if (邏輯表達(dá)式1) then
語句塊1
else if (邏輯表達(dá)式2) then
語句塊2
else
語句塊3
endif
這種形式,允許在三個(gè)分支中作出選擇。當(dāng)邏輯表達(dá)式1的值為"真"時(shí),執(zhí)行語句 塊1表示的分支;當(dāng)邏輯表達(dá)式1的值為"假"而邏輯表達(dá)式2的值為"真"時(shí),執(zhí)行語 句塊2表示的分支;當(dāng)邏輯表達(dá)式1的值和邏輯表達(dá)式2的值均為"假"時(shí),執(zhí)行語句塊 3表示的分支。
3.塊if結(jié)構(gòu)的嵌套
在一個(gè)塊if結(jié)構(gòu)的語句塊中,可以完整地包含另一個(gè)或多個(gè)塊if結(jié)構(gòu),稱為塊if 的嵌套。塊的嵌套可以多層。
七、函數(shù)與子程序(過程)
(一)內(nèi)部函數(shù)
內(nèi)部函數(shù)是預(yù)先編制的一些常用函數(shù)或算法的過程,由fortran語言提供,可以, 直接調(diào)用。內(nèi)部函數(shù)調(diào)用時(shí)的一般形式是:
內(nèi)部函數(shù)名(實(shí)元表)
實(shí)元表中元素的數(shù)據(jù)類型、個(gè)數(shù)是預(yù)先規(guī)定的。
常用內(nèi)部函數(shù)及其功能可查閱fortran教材或用戶手冊(cè)。
(二)語句函數(shù)
1.語句函數(shù)的定義
定義語句函數(shù)的語句稱為語句函數(shù)語句。其一般形式為:
函數(shù)名(形參表) =表達(dá)式。
其中,函數(shù)名的命名規(guī)則與一般變量名相同,所以它也可以用類型說明語句等來說明。形參又稱啞元,是一些變量名,一般應(yīng)出現(xiàn)在表達(dá)式中。
語句函數(shù)在程序單位中的位置,應(yīng)在所有可執(zhí)行語句之前。
2.語句函數(shù)的調(diào)用
調(diào)用語句函數(shù)的結(jié)果是得到一個(gè)函數(shù)值,因此,調(diào)用語句函數(shù)時(shí)代之以實(shí)際變量(又稱實(shí)元)。
(三)函數(shù)子程序
一個(gè)函數(shù)子程序是一個(gè)獨(dú)立的fortran程序單位。它的第一個(gè)語句必須是function語句,最后一個(gè)語句必須是end 語句。即函數(shù)子程序的一般結(jié)構(gòu)為:
[類型說明] function函數(shù)名(形參表)
語句塊
[return]
end
也可以寫為:
function函數(shù)名(形參表)
[類型說明函數(shù)名]
語句塊
[return]
end
其中函數(shù)名的命名規(guī)則與變量相間,而函數(shù)名的類型決定了函數(shù)值的類型。在函數(shù)子程序中,形參可以是變量名、數(shù)組名、外部過程名,而形參的命名與類型說明也與變量相同,形參數(shù)組也必須在函數(shù)子程序中予以定義。
函數(shù)子程序的函數(shù)值由函數(shù)名帶回到調(diào)用該函數(shù)子程序的程序,因此,在函數(shù)子程序 中必須對(duì)函數(shù)名賦值。在函數(shù)子程序中,函數(shù)名應(yīng)該像普通變量那樣來使用。在函數(shù)子程序中,所有的名字、語句標(biāo)號(hào)都可以和其他程序單位中的相同而彼此沒有 任何關(guān)系。
在函數(shù)子程序中, end語句的功能有兩個(gè):一是表示該程序單位的結(jié)束,二是具有返回語句return的功能。函數(shù)子程序中必須有并且只有一個(gè)end語句,而且只 能是子程序的最后一個(gè)語句。當(dāng)在子程序的其他位置須要返回時(shí),可以使用return 語句。
(四)子程序
1.子程序的結(jié)構(gòu)
一個(gè)子程序是一個(gè)獨(dú)立的fortran程序單位。
子程序的第一個(gè)語句必須是subroutine語句,最后一個(gè)語句必須是end 語句。 即子程序的一般結(jié)構(gòu)為:
subroutine子程序名(形參表)
語句塊
[return]
end
子程序名的命名規(guī)則與普通變量相同。但是子程序中的子程序名不能用于返回?cái)?shù)值,這與函數(shù)子程序是不同的。因此,子程序名沒有類型,它不能在本程序單位中使用。 subroutine 語句中的形參表可以省略。這時(shí)子程序名后的括弧不要保留。對(duì)子程序的其他有關(guān)規(guī)定與函數(shù)子程序相同。
2.子程序的調(diào)用
子程序調(diào)用通過call 語句實(shí)現(xiàn)。其形式為:
call子程序名(實(shí)參)
其他有關(guān)對(duì)子程序的調(diào)用規(guī)定與函數(shù)子程序相同。
八、程序單位間的數(shù)據(jù)傳遞
(一)虛實(shí)結(jié)合
虛實(shí)結(jié)合又稱啞實(shí)結(jié)合,是各程序單位(主程序和各種過程如函數(shù)子程序)之間傳遞數(shù)據(jù)的一種重要途徑。
1.變量的虛實(shí)結(jié)合
當(dāng)子程序等過程的形參為變量時(shí),則在調(diào)用時(shí)所對(duì)應(yīng)的實(shí)參可以是類型相同的常數(shù)、變量、數(shù)組元素或表達(dá)式;子程序調(diào)用后,其運(yùn)行的結(jié)果通過這些實(shí)參返回到調(diào)用者。在fortran77中,當(dāng)形參變量所對(duì)應(yīng)的實(shí)參是變量或數(shù)組元素時(shí),則它們之間的結(jié)合方 式是地址結(jié)合;而當(dāng)形參變量所對(duì)應(yīng)的實(shí)參是常數(shù)或表達(dá)式時(shí),其結(jié)合方法對(duì)于不同的 fortran系統(tǒng)有可能是不同的。
2.數(shù)組的虛實(shí)結(jié)合
當(dāng)子程序中的形參為數(shù)組名時(shí),則在調(diào)用時(shí)所對(duì)應(yīng)的實(shí)參必須是數(shù)組名或數(shù)組元素。
如果實(shí)參是數(shù)組名,則實(shí)參數(shù)組與形參數(shù)組按地址結(jié)合,實(shí)參數(shù)組與形參數(shù)組都從第 一個(gè)元素開始按列逐個(gè)對(duì)應(yīng)。例如,有主程序與子程序如下:
program main
integer a (0:5)
call sb (a)
end
subroutine sb (b)
integer b (-1:2)
end
則在主程序中使用call語句調(diào)用子程序sb時(shí),實(shí)參數(shù)組與形參數(shù)組的結(jié)合情況如下:
實(shí)參數(shù)組 形參數(shù)組
a (0)——b (-1)
a (1)一一b (0)
a (2)——b (1)
a (3)一一b (2)
a (4)
a (5)
也即調(diào)用sb時(shí),a數(shù)組的頭4個(gè)元素與b數(shù)組的元素對(duì)應(yīng),這些對(duì)應(yīng)元素實(shí)際上為同一 存儲(chǔ)地址。
如果實(shí)參是數(shù)組元素,則從該元素開始依次與形參數(shù)組的第一個(gè)元素起按列逐個(gè)對(duì)應(yīng),它們也是按地址結(jié)合。例如,有主程序與子程序如下:
program main
dimention a (8)
call sb (a(5))
end
subroutine sb (b)
dimension b (3)
end
則在調(diào)用語句執(zhí)行時(shí),實(shí)參數(shù)組a與形參數(shù)組b的結(jié)合情況如下: 實(shí)參數(shù)組形參數(shù)組
a (1)
a (2)
a (3)
a (4)
a (5)——b (1)
a (6)一一b (2)
a (7)——b (3)
a (8)
fortran 77規(guī)定,不管實(shí)參是數(shù)組名還是數(shù)組元素,用作實(shí)參的數(shù)組,其維數(shù)、各維下標(biāo)的上下限及數(shù)組中元素個(gè)數(shù)可以和與之結(jié)合的形參數(shù)組不同,但要求從與形參數(shù)組的第一個(gè)元素結(jié)合的實(shí)參數(shù)組元素算起,以后的實(shí)參數(shù)組元素的個(gè)數(shù)不能少于形參數(shù)組元素的個(gè)數(shù)。
多維數(shù)組或數(shù)組元素虛實(shí)結(jié)合時(shí),要特別注意fortran中數(shù)組按列存放的規(guī)定, 不要搞錯(cuò)存儲(chǔ)地址的對(duì)應(yīng)關(guān)系。例如:
program main
dimension a (3, 2)
call sb (a)
。。。
end
subroutine sb (b)
dimension b (2, 3)
。。。
end
這種情況下,數(shù)組元索地址的對(duì)應(yīng)關(guān)系是:
實(shí)參數(shù)組 形參數(shù)組
a (1, 1)一一b (1, 1)
a (2, 1)一一b (2, 1)
a (3, 1) 一一b (1, 2)
a (1, 2) 一一b (2, 2)
a (2, 2) 一一b (1, 3)
a (3, 2) 一一b (2, 3)
3.可調(diào)數(shù)組
在主程序中定義數(shù)組元素時(shí),定義說明符中各維下標(biāo)的上下限必須為整常數(shù),不能是 變量或算術(shù)表達(dá)式。但在子程序中定義數(shù)組時(shí),允許用變量來定義各維下標(biāo)的上下限。子程序中用變量來定義各維下標(biāo)上下限的數(shù)組稱為可調(diào)數(shù)組。但使用可調(diào)數(shù)組必須遵循以下 幾個(gè)原則。
(1)可調(diào)數(shù)組名必須是形參數(shù)組名。
(2)說明可調(diào)數(shù)組各維下標(biāo)上下限的表達(dá)式中只能出現(xiàn)整型變量,且這種變量必須是形參或出現(xiàn)在common 語句中。但在某些fortran 77子集中,定義可調(diào)數(shù)組各維下 標(biāo)上下限時(shí)只能是整型變量,而不能是任何算術(shù)表達(dá)式。
(3)可調(diào)數(shù)組的大小不得超過對(duì)應(yīng)實(shí)參數(shù)組的大小。
4.字符型變量的虛實(shí)結(jié)合
(1)當(dāng)子程序中的形參為字符型變量時(shí),對(duì)應(yīng)的實(shí)參必須是字符型變量、字符常數(shù)、字符型數(shù)組元素或字符表達(dá)式。字符型實(shí)參必須用character 語句加以說明。
(2)如果字符型形參的長(zhǎng)度小于對(duì)應(yīng)的實(shí)參長(zhǎng)度,則從實(shí)參中最左邊的字符開始與形參結(jié)合,而實(shí)參中右邊多余的字符被截去。例如:
character a*5
a=abcde'
call sb (a)
end
subroutine sb (x)
character x*3
write (* , *) x
end
程序執(zhí)行后的輸出結(jié)果為: abc。
(3)在fortran 77中,對(duì)字符型形參的長(zhǎng)度還可以用"*"號(hào)來說明,此時(shí),形 參字符變量自動(dòng)與對(duì)應(yīng)的實(shí)參取相同的長(zhǎng)度。例如在上面的子程序sb中,如果將character x*3改變?yōu)閏haracter x* (*) ,則執(zhí)行后,輸出的結(jié)果為: abcde。
(4)當(dāng)子程序中形參為字符型數(shù)組時(shí),如果形參字符型數(shù)組元素的長(zhǎng)度與對(duì)應(yīng)實(shí)參字符型數(shù)組元素長(zhǎng)度一致,則其虛實(shí)結(jié)合的情況與一般的數(shù)組虛實(shí)結(jié)合的情況相同。如果形參與實(shí)參的字符型數(shù)組元素長(zhǎng)度不同,則按字符依次對(duì)應(yīng)。例如,有主程序與子程序 如下:
character a (5) *3
data a(' abc', 'def', 'ghi', 'jkl', 'mno' )
call sb (a)
end
subroutine sb (d)
character d (4) *2
end
則形參數(shù)組d中元素的值為:
d (1):' ab'
d (2): 'cd'
d (3): 'ef'
d (4): 'gh'
(5)過程名的虛實(shí)結(jié)合 fortran允許子程序中的形參為過程名,此時(shí),調(diào)用程序中的實(shí)參必須是過程名.如果實(shí)參是外部過程名(如函數(shù)子程序名、子程序名) ,則該外部過程名在調(diào)用程序 中必須用external 語句說明。
如果實(shí)參是內(nèi)部過程名(如內(nèi)部函數(shù)名) ,則該內(nèi)部過程名在調(diào)用中必須用intrinsic語句說明。
(二)公用區(qū)語句
1.公用區(qū)語句的一般形式
common [公用區(qū)名l/]變量表1, [公用區(qū)名2/變量表2]…
沒有公用區(qū)名的就稱為無名公用區(qū),其他都是有名公用區(qū);一個(gè)完整的程序只能設(shè)置一個(gè)無名公用區(qū),但可以有多個(gè)有名公用區(qū);變量表中,可以是變量名、數(shù)組名、數(shù)組說明符,互相之間用逗號(hào)隔開。例如:
common a, b (3), c (2)
定義了b是3個(gè)元素的一維數(shù)組, c是2個(gè)元素的一維數(shù)組。這條語句與下面兩句語句是 等價(jià)的:
dimension b (3), c (2)
common a, b, c
2.利用公用區(qū)進(jìn)行數(shù)據(jù)傳遞時(shí),在元名公用區(qū)或同名的有名公用區(qū)中,位置排列相 同的變量、數(shù)組,實(shí)際上使用同一存儲(chǔ)地址,亦即共享同一數(shù)據(jù)。例如:
program main
common a, i (2) /coml/d, c
。。。
call sb
end
subroutine sb
common aa, ]k (2) /coml/f, g
end
其中,主程序中的變量a的數(shù)據(jù)與子程序的變量aa共享,數(shù)組1的數(shù)據(jù)與jk共享,而d, c的數(shù)據(jù)分別與f, g共享。由此可以知道,各個(gè)程序單位中common語句中的變量類型 必須按位置一一對(duì)應(yīng)一致才能正確傳遞數(shù)據(jù)。
九、文件
fortran程序輸入輸出的基本單位稱為記錄。記錄是數(shù)值或字符的序列。記錄的集合稱作文件。
(一)文件的存取方式
1.順序文件
順序文件中的記錄是一個(gè)接一個(gè)按順序存放的,即總從第1個(gè)記錄開始,然后是第2 個(gè)記錄,第3個(gè)記錄,…,要取任何一個(gè)記錄,都必須從第1個(gè)記錄開始。
2.直接文件
直接文件又稱直接存取文件,或隨機(jī)文件。它可以按任意順序讀寫某一記錄。直接文件中每個(gè)記錄的長(zhǎng)度都是相等的。
(二)文件操作語句
文件操作語句有打開文件的open語句和關(guān)閉文件的close 語句。此外還有文件的 讀寫語句read語句和write語句。
(三)文件定位
設(shè)想在文件的讀寫操作時(shí)存在一根指針。起先指針停在文件的開始處,隨著文件存取 的進(jìn)行,指針在文件中移動(dòng)??刂浦羔樀奈恢?即定位,在fortran中可以通過如下語句來實(shí)現(xiàn)。
i.rewind語句
rewind語句也稱回繞語句。它的形式是:
rewind設(shè)備號(hào)
它使與指定設(shè)備號(hào)相連的文件中的指針定位在文件的開頭。
在fortran中,用open語句打開一個(gè)文件,指針也是在文件的開頭位置。因此對(duì)一個(gè)已經(jīng)打開的文件,要使指針移到開頭,也可組合使用close和open 語句。
2.backspace語句
語句backspace的形式是:
backspace設(shè)備號(hào)
它使與指定設(shè)備號(hào)相連的文件中的指針退回一個(gè)記錄。
例題:
1.閱讀下列 fortran 程序:
integer sum
sum=0
do 10 i= 1 , 10 , 4
do 10 j = 5 , 100 , 20
do 10 k =-10 ,-5 ,2
10 sum = sum + 1
上面程序的運(yùn)行結(jié)果為(c)。
a . 15;
b .30;
c .45;
d .60
k取值3次,j取值5次,i取值3次,共取值45次
2.若有integer a (-2:2, 0: 3, 1: 2) ,按照在內(nèi)存中的存儲(chǔ)次序,數(shù)組a中第8號(hào)元素為(b)
(a) a (-1,0,2)
(b) a (0,1,1)
(c) a (2, 1,2)
(d) a (1, 1,1)
a中數(shù)據(jù)按列排序,a(5,4,2)第八個(gè)元素是a(3,2,1),對(duì)應(yīng)本題應(yīng)為a (0,1,1)
3.對(duì)下列程序段
read (*,*) x
if ( (x. lt. - 5.0) .or. (x.eq. -1.0)) then
y=0.0
elseif (x.lt.0.0) then
y=1.0/(x+1.0)
elseif (x. lt.5.0) then
y=1.0/(x+2.0)
else
y=0.0
endif
write (*,*) y
若輸入4.0,則結(jié)果為:(c)
(a) 0.0
(b) 1/5
(c) 1/6
(d) 1/4十2.0
輸入的是4,小于5,所以輸出結(jié)果為1/(2+4)=1/6
4.閱讀下列 fortran 程序:
dimension a ( 2 , 2 )
integer a , y
y =0
do 20 i=1,2
do 20 j = 1 , 2
a ( i , j ) = i * i + j*j
y = ( y + a ( i , j ) ) / 2
20 continue
write ( * ,*) y
end
此程序運(yùn)行的結(jié)果為(a)。
a . 6;
b . 9 ;
c . 10 ;
d 20
y1=2/2=1,y2=(1+5)/2=3,y3=(3+5)/2=4,y4=(4+8)/2=6
5.閱讀下列 fortran 程序:
k = 0
do 10 i= 1 , 6 , 2
do 10 j= 1 , 6 , 3
if ( k . lt . i * j )
k = i*j
10 continue write (*,* ) k
end
此程序執(zhí)行后的輸出結(jié)果為(c)。
a . 18;
b . 30;
c . 20 ;
d . 36
i,j乘積的最大值為4×5=20
6.以下程序段
dimension a (4)
read*,a
i=1
10 j = i + 1
20 if (a (i) . lt. a (j)) then
t=a (j)
a (j)=a (i)
a (i)=t
endif
j=j+l
if (j.le. 4) goto 20
i=i+1
if (1. le.3) goto 10
print*, a (4)
end
若輸入4, 2, 3, 5,則程序運(yùn)行結(jié)果為(b)
(a) 4
(b) 2
(c) 3
(d) 5
相當(dāng)于把數(shù)列從大到小排列,最后5,4,3,2,故選b
7.對(duì)下列程序段
parameter (n=3)
integer a (n, n)
read*,a
do 10 j=1, n
ls=0
do 20 1= 1, n
20 ls= ls+ a (i, j)
ls=ls/n
do 30 i=1, n
30 a (i, j) = a(i, j)-ls
10 continue
print*,a
end
若輸入2, 4, 6, 8, 10, 12, 14, 16, 18
則程序運(yùn)行后a (3, 2)為(c)
(a) -2
(b) 0
(c) 2
(d) 12
2 8 14
原數(shù)組注意是按列存儲(chǔ)數(shù)據(jù),a=4 10 16
6 12 18
每一列和除三,每個(gè)元素減去上述結(jié)果,a變?yōu)?/span>
-2 -2 -2
a= 0 0 0
2 2 2
a(3,2)為2