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