




已閱讀5頁,還剩138頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
FOTRAN77/90程序設(shè)計,土木工程學(xué)院 2008.11,第一節(jié) 數(shù)組概念,第二節(jié) 數(shù)組的說明與引用,第三節(jié) 數(shù)組元素的存儲結(jié)構(gòu),第四節(jié) 數(shù)組的輸入輸出,第五節(jié) 數(shù)組應(yīng)用-程序舉例,第七講 數(shù)組,第一節(jié) 數(shù)組的概念,前面章節(jié)涉及的問題都是比較簡單,編寫的程序也不復(fù)雜,這些程序的一個突出特點是所處理的數(shù)據(jù)量非常少,采用的數(shù)據(jù)類型都是簡單的內(nèi)部數(shù)據(jù)類型,使用的變量都是普通變量。然而在實際的科研數(shù)值計算中,往往遇到的是一些涉及大量數(shù)據(jù)的復(fù)雜問題,如:,?思考:輸入某班50個學(xué)生的成績,統(tǒng)計平均成績以及高于平均分學(xué)生的人數(shù)。 定義50個變量存放各個學(xué)生的成績? 定義1個變量,循環(huán)讀入各個學(xué)生的成績,同時累計50個學(xué)生的總成績,進而求出平均成績; 當統(tǒng)計高于平均分學(xué)生人數(shù)時,再次輸入50個成績?,不合適,可以,不合適,解決方法:使用數(shù)組!,第一節(jié) 數(shù)組的概念,求解100元一次方程組。 求解高階微分方程。 計算5050階矩陣的轉(zhuǎn)置矩陣。 對某班30名學(xué)生的學(xué)習成績進行排序處理。 以上問題都要涉及幾十、幾百、幾千,甚至上萬個數(shù)據(jù),如果在程序中采用簡單的內(nèi)部數(shù)據(jù)類型和變量來求解這類問題,其難度將大大增加,甚至無法設(shè)計和編寫程序。,第一節(jié) 數(shù)組的概念,在輸入數(shù)據(jù)時,用不同的名字引用每一個存儲單元比較煩瑣。如果有100個數(shù)需要處理,將需要一個長的輸入語句,其中每個變量被列出一次。,第一節(jié) 數(shù)組的概念,簡單變量是用來代表一個數(shù)據(jù);而把具有相同類型的一批數(shù)據(jù)看成是一個整體,叫做數(shù)組。給數(shù)組取一個名字叫數(shù)組名,所以數(shù)組名代表一批數(shù)據(jù),數(shù)組中的每一個數(shù)據(jù)稱為數(shù)組元素,它可通過順序號(下標)來區(qū)分。,一、變量與數(shù)組的區(qū)別,第一節(jié) 數(shù)組的概念,只要給出數(shù)組名和下標就可以表示某一數(shù)組元素。例如: 一個班30個學(xué)生的FORTRAN語言課程成績組成一個數(shù)組G,每個學(xué)生的成績可表示為: G(1),G(2),G(3),G(i),G(30),例:30個學(xué)生4門課程的成績 S(1,1),S(1,2),S(1,3),S(1,4) S(2,1),S(2,2),S(2,3),S(2,4) S(30,1),S(30,2),S(30,3),S(30,4),在上例中,區(qū)分G數(shù)組的元素需要一個順序號(下標),故稱為一維數(shù)組;而區(qū)分S數(shù)組的元素需要兩個順序號,故稱為二維數(shù)組,其中第一個下標代表元素所在行號,第二個下標為該元素所在列號。,一、變量與數(shù)組的區(qū)別,二、數(shù)組的分類,引入數(shù)組以后,讓一批同類型數(shù)據(jù)共享一個名字,不必為每一對象都取一個名字。數(shù)組元素是按順序號連續(xù)存放的,我們可以用循環(huán)語句控制下標的變化,這給在同一方式下處理多個同類型數(shù)據(jù)帶來極大方便。例如:,第一節(jié) 數(shù)組的概念,REAL P(5),AVER !定義P數(shù)組 DO I=1,5 READ(*,*)P(I) !輸入成績并存入P數(shù)組 AVER=AVER+P(I) !求成績之和 ENDDO AVER=AVER/5 !求平均成績,一、數(shù)組說明的內(nèi)容,第二節(jié) 數(shù)組的說明與引用,程序中所有數(shù)組都要先說明該數(shù)組的名字、類型、維數(shù)及大小,以便編譯系統(tǒng)給數(shù)組分配相應(yīng)的存儲單元。 1)數(shù)組名:數(shù)組和變量一樣,也用標識符來命名; 2)數(shù)組的類型:數(shù)組的類型由數(shù)組元素的類型來決定; 3)數(shù)組的維數(shù):為了區(qū)分數(shù)組元素所需順序號(下標)的個數(shù); 4)數(shù)組的大?。簲?shù)組中包含數(shù)組元素的個數(shù),由數(shù)組每維下標的上界和下界來決定。,一、數(shù)組說明的內(nèi)容,數(shù)組名、數(shù)組的維數(shù)和每一的上、下界的定義要用到數(shù)組說明符。其一般形式為: 數(shù)組名(維說明符 ,維說明符),維說明符的個數(shù)就是數(shù)組的維數(shù)。 維說明符至少1個,最多7個。,維說明符的一般形式為: 維下界: 維上界 維下界與維上界之間用“ :”分隔,下界為1時,可省略不寫。維下界與維上界都只能是整型表達式。維界表達式的值必須是整數(shù)值,而且維上界的值必須大于維下界的值。,一、數(shù)組說明的內(nèi)容,維說明符的一般形式為: 維下界: 維上界 在維界表達式中,允許出現(xiàn)整型常量、整型變量或者星號“ * ”。不允許出現(xiàn)函數(shù)或數(shù)組元素。 如果在維界表達式中出現(xiàn)整型變量名,則該數(shù)組稱作可調(diào)數(shù)組。如果出現(xiàn)星號“ * ”,則只能用星號作為維的上界,這樣的數(shù)組叫做假定大小的數(shù)組。 可調(diào)數(shù)組和假定大小數(shù)組只能出現(xiàn)在子程序,不允許在主程序中使用。,說明方法一:用DIMENSION說明數(shù)組 DIMENSION 數(shù)組說明符 ,數(shù)組說明符 例:DIMENSION A(1:5), B(-1:2),二、數(shù)組說明的方法,第二節(jié) 數(shù)組的說明與引用,注意:1)DIMENSION語句是非執(zhí)行語句,必須放在程序單位的可執(zhí)行語句之前; 2)用DIMENSION語句只說明了數(shù)組的名字、維數(shù)、大小等特性,但不能說明數(shù)組的數(shù)據(jù)類型。此時,數(shù)組類型的說明方法與變量名相同。 如無特別指明,數(shù)組的類型服從IN規(guī)則 用類型說明語句指明數(shù)組的類型,說明方法二:用類型說明語句說明數(shù)組 類型說明關(guān)鍵字 數(shù)組說明符,數(shù)組說明符 例: INTEGER A(1:5), B(-1:2),用類型說明語句可以直接說明數(shù)組的全部特性。,二、數(shù)組說明的方法,CHARACTER*8 NAME(30) REAL SCORE(5, 30) 說明了字符型數(shù)組NAME,數(shù)組元素的長度為8,還有實型數(shù)組SCORE。,說明方法三:同時使用DIMENSION和類型說明語句說明數(shù)組 其一般形式為:類型符,DIMENSION(維說明符):數(shù)組名 例:INTEGER , DIMENSION(1:5) : A, B(-1:2),C,DIMENSION屬性統(tǒng)一說明大小,名字后個別說明大小 個別優(yōu)于統(tǒng)一,REAL(4), DIMENSION(1:3,1:4) : D=0 上例中說明了三個整型一維數(shù)組A,B,C,一個二維實型數(shù)組D,其中A,C各含有5個元素,B含有4個元素;D中含有12個元素。 在說明數(shù)組時,可以在數(shù)組名后面給出維說明,這時以該數(shù)組名后的維說明為準。,二、數(shù)組說明的方法,DIMENSION A(1:5), B(-1:2),C(1:3,1:4) INTEGER A,B REAL C,三、數(shù)組元素的引用,數(shù)組元素是通過數(shù)組元素名來引用的。數(shù)組元素名的一般形式是,數(shù)組名(下標表達式,下標表達式) 其中:下標表達式為整型表達式,如果不是整型,則自動取整之后再使用;下標表達式的個數(shù)必須等于該數(shù)組的維數(shù),每個下標表達式的值必須在相應(yīng)的維下界到維上界之間。,第二節(jié) 數(shù)組的說明與引用,注意:1、數(shù)組元素表示數(shù)組中每個成份的值,數(shù)組元素名表示數(shù)組元素的名字。但在實際使用中,數(shù)組元素與數(shù)組元素名并不加區(qū)分。由于數(shù)組元素名是用數(shù)組名后面帶下標表示的,所以數(shù)組元素名叫下標變量。下標變量可以和簡單變量等同使用。,三、數(shù)組元素的引用,注意:2、數(shù)組元素名與數(shù)組說明符的區(qū)別 REAL A(3,3) S1=A(1,1)+A(1,2)+A(1,3) S2=A(2,1)+A(2,2)+A(2,3) S3=A(3,1)+A(3,2)+A(3,3),兩個語句中都有A(3,3),由于它出現(xiàn)在兩個不同類型的語句中,所以含義截然不同。REAL語句中的A(3,3)是數(shù)組說明符,其含義是定義了一個實型二維數(shù)組,有9個元素。賦值語句中A(3,3)是數(shù)組元素名。,三、數(shù)組元素的引用,注意:3、在F77中,除了在I/O語句中之外,其他場合不允許對數(shù)組進行整體操作,只能對數(shù)組的元素逐個進行操作。但在F90中,允許對數(shù)組進行整體操作。 REAL A(4,5) A(1:,:)=100.0 A(:,1:5:2)=470.0,是一個三元表達式,可作為數(shù)組元素 的下標表達式。其含義是從1變化到 5,每次增加2。三元表達式更一般的 形式如下:,下標三元組法:每一維是下標三元組e1:e2:e3或常量 例如二維數(shù)組:數(shù)組名(行三元組或常量,列三元組或常量) e1:起始下標值,缺省為下界d1 e2:終止下標值 ,缺省為上界d2 e3:步長值,缺省間隔為1,例:片段A(3:6)所含的元素為: A(3),A(4), A(5), A(6) 例: INTEGER,DIMENSION(6:50):A 則下列片段含有的元素為哪些? A(10:30:1) A(:20:5) A(8:10),第二節(jié) 數(shù)組的說明與引用,例:integer,dimension(11,6,4):B 片段B(6:11:2 , 5, 2:3)包含的元素為:,5為常量,B(6,5,2),B(6,5,3) B(8,5,2),B(8,5,3) B(10,5,2),B(10,5,3) 注意: 片段包含的元素不一定連續(xù) 片段將組成一個新的數(shù)組,第二節(jié) 數(shù)組的說明與引用,高級語言編譯系統(tǒng)為一個數(shù)組分配一片連續(xù)的內(nèi)存單元,每個存儲單元存放一個數(shù)組元素。 對于一維數(shù)組按下標從小到大的順序存放,第三節(jié) 數(shù)組元素的存儲結(jié)構(gòu),INTEGER A(5),A(1),A(2),A(3),A(4),A(5),對于二維以上數(shù)組FORTRAN規(guī)定:數(shù)組元素在內(nèi)存中是按列的順序連續(xù)存放的。,INTEGER B(3,4),INTEGER B (3,4),A(1,1),A(2,1),A(3,1),A(1,2),A(2,2),A(3,2),A(1,4),A(2,4),A(3,4),第三節(jié) 數(shù)組元素的存儲結(jié)構(gòu),在組織數(shù)組I/O時,對數(shù)組元素存儲時的排列順序要有清楚的了解。,第四節(jié) 數(shù)組的輸入輸出,一、使用DO循環(huán)輸入輸出數(shù)組元素,此方式的特點是:對于輸入,每執(zhí)行一個輸入語句輸入一個數(shù)組元素值;對于輸出,每執(zhí)行一個輸出語句輸出一個元素值。,將輸入輸出語句放在DO循環(huán)中,利用循環(huán)控制變量作為數(shù)組元素的下標來控制數(shù)組元素的輸入或輸出。,REAL A(4,5) DO I=1,4 DO J=1,5 READ(*,*) A(I,J) ENDDO ENDDO,每輸入一個數(shù)要按一次回車鍵,A數(shù)組的20個數(shù)要輸入20次。,第四節(jié) 數(shù)組的輸入輸出,一、使用DO循環(huán)輸入輸出數(shù)組元素,DO I=1,5 DO J=1,4 WRITE(*,*) A(J,I) ENDDO ENDDO END,A數(shù)組共輸出20行,DO I1,100,2,WRITE(*,*) A(I),ENDDO, 用戶可以自已控制輸入和輸出次序以及個數(shù),DO K50,1,1,WRITE(*,*) M(K),ENDDO,把M數(shù)組的50個元素按逆序打印出來,將奇數(shù)(1, 3, , 99) 下標的元素輸出,一、使用DO循環(huán)輸入輸出數(shù)組元素,DO I1,20,5,READ(*,*) A(I), A(I+1), A(I+2), A(I+3), A(I+4),這樣每次循環(huán)一次則可輸入5個數(shù),每個數(shù)之間用逗號分隔。,ENDDO, 可以多設(shè)置一些輸入項或輸出項,例:,一、使用DO循環(huán)輸入輸出數(shù)組元素,第四節(jié) 數(shù)組的輸入輸出,二、以數(shù)組名作為輸入輸出項,這種方式是要對整個數(shù)組的所有元素進行輸入輸出操作,元素的個數(shù)和元素的操作次序都不能由自己控制,必須是對整個數(shù)組進行操作。,READ (*,*) X(1),X(2) ,X(3) ,X(4) ,X(10),WRITE (*,8) X(1),X(2) ,X(3) ,X(4) ,X(10),注:對于二維數(shù)組采用數(shù)組名方式進行輸入和輸出時,因為二維數(shù)組元素的存儲是按列存放,所以,在輸出時是按存儲順序來打印的。,例:,INTEGER Y(2,3),READ (*,*) Y,WRITE (*,7) Y,7 FORMAT (1X,3i8),END,假設(shè)Y數(shù)組的各元素值為:10 11 12,20 21 22,從鍵盤輸入各元素的值為:10,20,11,21,12,22,執(zhí)行打印語句的打印結(jié)果是,10 20 11,21 12 22,如果要打印出與數(shù)組的實際結(jié)構(gòu)相符的結(jié)果,最好用隱DO方式,即:,WRITE(*,7) (Y(I,J),J=1,3),I=1,2),打印結(jié)果為:10 11 12,20 21 22,INTEGER,DIMENSION(3,3):A READ(*,*) A WRTIE(*,10) A 10 FORMAT(1X,3I5) END,第四節(jié) 數(shù)組的輸入輸出,二、以數(shù)組名作為輸入輸出項,數(shù)組元素按照它們在內(nèi)存中的排列順序輸入輸出。該方式要特別注意數(shù)據(jù)的組織。,當執(zhí)行READ語句時,從鍵盤依次鍵入賦給A的數(shù)據(jù)就可以了,但輸出A的數(shù)據(jù)時注意按“列”存儲的原則,對二維以上數(shù)組要注意這個問題。比如從鍵盤輸入:1,2,3,4,5,6,7,8,9,1 4 7 2 5 8 3 6 9,三、利用隱含DO循環(huán)控制數(shù)組元素的輸入輸出,隱DO循環(huán)只能用于輸入和輸出語句以及DATA語句中,它可以按要求來指定數(shù)組中需要輸入或輸出的部分,并且可以人為地規(guī)定輸入或輸出格式。,隱式DO循環(huán)實際上是一種帶控制循環(huán)變量的DO循環(huán),但簡化成只有DO循環(huán)的第一句,并且把關(guān)鍵字DO隱去。隱式DO循環(huán)的一般形式如下: I = m1, m2, m3 其中,m1表示循環(huán)的初值;m2表示循環(huán)的終值;m3表示循環(huán)的增量。如果省略本項目,則默認為1。,隱式DO循環(huán)不是一種可以獨立存在的語句。它只能作為輸入輸出列表的一個組成部分,用來控制重復(fù)讀寫的次數(shù)。它的應(yīng)用形式如下: (I/O列表, 循環(huán)變量名 = 循環(huán)初值, 循環(huán)終值, 循環(huán)增值),也就是把I/O列表與循環(huán)控制部分一起用括號括起,中間用逗號分開,稱為隱式DO循環(huán)列表,寫在讀寫語句后面作為讀寫對象。,三、利用隱含DO循環(huán)控制數(shù)組元素的輸入輸出,WRITE(*,*)(A,B,N=1,5),WRITE(*,*)A,B, A,B, A,B, A,B, A,B,(1) 單重隱DO結(jié)構(gòu) (iotable,i=e1,e2 ,e3 ),當e31時,可省略,例:,INTEGER x(5),READ(*,*) (x(I),I1,5) READ(*,*) x(1), x(2), x(3), x(4) ,x(5),可將5個元素的值一次性輸入,每個數(shù)之間用逗號分隔,也可以分若干次輸入,WRITE(*,*) (x(I),I1,20) WRITE (*,*) x(1), x(2), x(20),將20個元素按標準格式輸出,WRITE(*,*) (x(I),I1,5) WRITE(*,*) x(1), x(2), x(3), x(4) , x(5),輸出X數(shù)組中的部分元素,WRITE(*,*) (x(I),I1,20,2) WRITE(*,*) x(1), x(3), x(19),有選擇地輸出X數(shù)組中的元素,注:當只需要給X數(shù)組中的前N個元素輸入值時,可以寫成 READ(*,*) N, (X(I),I1,N),但N不能放在隱含DO循環(huán)內(nèi),以下語句是錯誤的:READ(*,*) (N, X(I),I1,N),因為在進入循環(huán)之前,循環(huán)終值N必須有確定的值。,(2) 雙重隱DO結(jié)構(gòu),(iotable,j=e1,e2,e3),I=p1,p2,p3),內(nèi)層隱 DO循環(huán),外層隱 DO循環(huán),READ(*,*)( B(I,J),J1,3),I1,2),例:,相當于執(zhí)行下面語句:,READ(*,*) B(1,1), B(1,2), B(1,3), B(2,1), B(2,2), B(2,3),輸入數(shù)據(jù)時,你可以一次輸入完畢,也可以分成若干次來輸入,WRITE(*,*)( B(I,J),J1,3),I1,2),例:,輸出數(shù)據(jù)時,打印成一行,也可用格式的方式,將其打印成二行,WRITE(*,10) (B(I,J), J=1,3),I=1,2),10 FORMAT (10X,3I6),READ(*,*)((A(I,J),J=1,3),I=1,2) 行在外按行序,一個READ語句一行輸入:1,2,3,4,5,6 與外觀一致的輸入輸出格式 READ(*,*)((A(I,J),J=1,3),I=1,2) 格式隱DO輸入:1 2 3 4 5 6 DO I=1,2 READ(*,*)(A(I,J),J=1,3) ENDDO 行顯DO列隱DO的輸入:1,2,3 4,5,6,輸入格式:一行輸入,輸入格式:與外觀一致,第四節(jié) 數(shù)組的輸入輸出,要注意使用DO循環(huán)和隱DO循環(huán)在控制數(shù)組I/O時,在I/O格式上的差異。如:,第四節(jié) 數(shù)組的輸入輸出,WRITE(*,*) (A(I),I=2,14,3),DO I=2,14,3 WRITE(*,*) A(I) ENDDO,DO循環(huán)控制執(zhí)行一次輸出語句,就要輸出一行(一條記錄),且每行上僅有一個數(shù)組元素的值;而執(zhí)行一次隱DO循環(huán)的輸出語句,就把數(shù)組A的若干個元素同時輸出到一行上,即它等價于WRITE(*,*) A(2), A(5), A(8), A(11), A(14)。,WRITE(*,(1X,F6.2) (A(I),I=2,14,3),例:編寫程序,形成以下形式的二維數(shù)組。,分析:從數(shù)組元素的取值分析,元素的值與其下標值有一種對應(yīng)關(guān)系。如果數(shù)組元素的兩個下標用i、j表示,當ij時數(shù)組元素值為1;當ij時,數(shù)組元素值為i-j+1。,INTEGER A(5,5) DO I=1,5 DO J=1,5 IF(I=J)THEN A(I,J)=1 ELSE A(I,J)=I-J+1 ENDIF ENDDO ENDDO,WRITE(*,10) & (A(I,J), J=1,5),I=1,5) FORMAT(1x,5I6) END,A(I,J)=1 IF(ij)A(I,j)=I-J+1,第五節(jié) 給數(shù)組賦初值,DATA語句是專門給變量、數(shù)組和字符子串賦初值的,其一般格式為:,nlist:由變量名、數(shù)組名、數(shù)組元素名和字符子串組成. 名字之間以逗號(,) 分隔 clist:常數(shù)和符號常數(shù)組成. 整數(shù)數(shù)據(jù)項間以 , 分隔 每項數(shù)據(jù)與寫上與無符號數(shù)字,代表說常數(shù)重復(fù)r次,nlist 與clist按從左到右的順序一一對應(yīng)。,變量表列,初值表,1格式:DATA nlist /clist/,nlist/clist/,3與賦值語句的區(qū)別,2功能 給變量、數(shù)組、數(shù)組元素和字符子串提供初值。,4例:,DATA I,R,D,C/1.2,0.3,3.0DO,(4.0,5.0)/ 等價于 DATA I/1/,R/2.0/,D/3.0DO/,C/(4.0,5.0)/ DATA I/1/ DATA R/2.0/ DATA D/3.0DO/ DATA C/(4.0,5.0)/,有S和K數(shù)組需賦初值,DIMENSION S(5),K(2,3),DATA S/1.2,2.3,3.0,4.5,2.8/,K/1,2,3,4,5,6/,DATA (S(I),I1,5)/1.2,2.3,3.0,4.5,2.8/,(K(I,J),J1,3),I1,2)/1,3,5, 2, 4, 6/,DATA S,K/1.2,2.3,3.0,4.5,2.8,1,2,3,4,5,6/,DIMENSION S(5),K(2,3),DIMENSION S(5),K(2,3),5注意:,(1) 變量表列中的變量與初值表中的常量在個數(shù)、類型等方面要一一對應(yīng)。,例如,下列各DATA語句都是錯誤的: DATA A, B, C/2.0, 5.8/ DATA A, B, C/2.0, 5.6, 3.5, 10.0/ DATA I, K, X/3.6, 4.5, 4.5 /,初值表中的數(shù)據(jù)個數(shù)少于變量表列中變量的個數(shù),初值表中的數(shù)據(jù)個數(shù)多于變量表列中變量的個數(shù),變量表列中的前兩個變量是整型,而初值表中的前兩個常量為常數(shù),即它們的類型不一致。,若K的初值是10,C的初值是“ FORTRAN 77”,A數(shù)組有4個元素,或DATA k,C,A/10, FOTRAN77,1.23,0.5,3.3,1.45/,(1) 變量表中變量的個數(shù)與對應(yīng)的初值個數(shù)必須相同,(2) 變量的類型與初值的類型必須按順序一一對應(yīng),(2) 在初值表中如果有n個連續(xù)的常量相同,則可以簡寫為: n常量,例如,DATA語句 REAL A(3,2),B DATA A,B/1.0, -1.0, 0.0, 0.0, -1.0, -1.0, -1.0/ 可以寫成 DATA A, B/1.0, -1.0, 20.0, 3-1.0/,(20.0表示兩個連續(xù)的0.0, 31.0也表示三個連續(xù)的1.0) 但特別要注意,31.0不能寫成3(1.0),因為 3(1.0)是一個表達式。,若M數(shù)組有100個元素,它的前50個元素的初值為0,后50個元素的初值是1,表示如下:,DATA (M(I),I1,50)/50*0/,(M(I),I51,100)/50*1/,DIMENSION M (100),或者 DATA (M(I),I1,50),(M(I),I=51,100)/50*0 ,50*1/,或者 DATA M/50*0,50*1/,下列DATA語句都是錯誤的: DATA A, B, C, Y, Z/1.0, 1.0, 20.0, 2(1.0)/ 在此語句中,2(1.0),原意可能是表示兩個連續(xù)的1.0,但實際上這是一個表達式; DATA X, Y, Z/1.0/3.0, 1.32.5, 4.01.234/ 在此語句中,初值表中出現(xiàn)了三個表達式1.0/3.0、 1.32.5與4.01.234。 正確寫法是 DATA X, Y, Z/0.3333333, 3.25, 2.766/,(3) 在初值表中不允許出現(xiàn)任何形式的表達式。,例如,在一個程序單位中依次下三個DATA語句: DATA A, B, C, /1.0, 2.0, 3.0/ DATA K, S, B/10, 4.0, 5.0/ DATA A, K, B/2.4, 6, 10.0/ 其中變量A分別在第一和第三個DATA語句中賦了初值, 此時以第三個DATA語句中賦的初值為準,即變量A的最后初值為2.4。 同樣的道理,變量K的最后初值為6,變量B的最后初值為10.0。,(4) 如果在一個程序單位中有多個DATA語句給同一變量初值,則以最后一個DATA語句中所賦的初值為準。,(5) FORTRAN77中DATA語句的作用是賦初值,它本身不是可執(zhí)行語句。,系統(tǒng)在對FORTRAN77源程序進行編譯的過程中就完成了這個賦初值的操作。并且,用DATA語句為變量賦初值后,在程序中還可以對賦過初值的變量重新賦值。,靜態(tài)數(shù)組優(yōu)點是存儲分配算法簡單,運行速度快,缺點是存儲開銷較大。 在元素個數(shù)不確定時,為考慮最壞情況,靜態(tài)數(shù)組聲明的很大,導(dǎo)致浪費。 動態(tài)數(shù)組優(yōu)點是存儲開銷小,缺點是存儲分配算法復(fù)雜,運行速度慢。 示例:統(tǒng)計學(xué)生成績,人數(shù)不定。 PROGRAM example871 !使用靜態(tài)數(shù)組程序 INTEGER score(100),i,j,n,x REAL : av,sum=0.0 WRITE(*,“(1X,請輸入班級學(xué)生人數(shù):,)”) READ*,n WRITE(*,“(1X,請輸入,I3,名學(xué)生成績:)”) n READ*,(score(i),i=1,n) DO i=1,n sum=sum+score(i) ENDDO av=sum/n WRITE(*,“(1X,該班學(xué)生平均成績是:,F5.1)“) av END,第六節(jié) 動態(tài)數(shù)組,第六節(jié) 動態(tài)數(shù)組,PROGRAM example872 !使用動態(tài)數(shù)組程序 INTEGER,DIMENSION(:),ALLOCATABLE : score(:) INTEGER i,j,n,x REAL : av,sum=0.0 WRITE(*,“(1X,請輸入班級學(xué)生人數(shù):,)”) READ*,n ALLOCATE(score(n) WRITE(*,“(1X,請輸入,I3,名學(xué)生成績:)”) n READ*,(score(i),i=1,n) DO i=1,n sum=sum+score(i) ENDDO av=sum/n WRITE(*,“(1X,該班學(xué)生平均成績是:,F5.1)“) av END PROGRAM,使用動態(tài)數(shù)組,需進行聲明。聲明時不指定大小。 一般格式: 類型聲明符,DIMENSION(:,:),ALLOCATABLE:數(shù)組名,數(shù)組名 或者 類型聲明符,ALLOCATABLE : 數(shù)組名(:,:),數(shù)組名(:,:) 示例: INTEGER,DIMENSION(:),ALLOCATABLE : num,score REAL,DIMENSION(:,:),ALLOCATABLE : A,B INTEGER,ALLOCATABLE : num(:),score(:) REAL,ALLOCATABLE : A(:,:),B(:,:),第六節(jié) 動態(tài)數(shù)組,動態(tài)數(shù)組聲明后,使用ALLOCATE語句為分配存儲空間,指定維下界和上界。 一般格式: ALLOCATE(數(shù)組名(維說明符),數(shù)組名(維說明符) ALLOCATE語句維說明符中的下界和上界可以是整型變量或整型表達式。 ALLOCATE語句中指定數(shù)組維數(shù)與聲明的數(shù)組維數(shù)相同,否則產(chǎn)生語法錯誤。 ALLOCATE通過狀態(tài)變量獲得執(zhí)行狀態(tài),若成功,則狀態(tài)為0,否則為錯誤號。 示例: INTEGER,DIMENSION(:),ALLOCATABLE : num ! num為一維動態(tài)數(shù)組 REAL,DIMENSION(:,:),ALLOCATABLE : arr ! arr為二維動態(tài)數(shù)組 CHARACTER*10,ALLOCATABLE : book(:,:,:),name(:) !定義三維和一維動態(tài)數(shù)組 n=4; m=5; READ *,k ALLOCATE(num(5),arr(n,m),book(35,4,k),name(n+m+k) ALLOCATE(num(n),arr(-5:n,m:m+10),book(m,n,k) ALLOCATE(num(n),arr(-5:n,m:m+10),book(m,n,k) ALLOCATE(num(:n),arr(-5:n,m:m+10),book(m+1,n+2,k+3),STAT=ierr),為動態(tài)數(shù)組分配存儲空間,8.7 動態(tài)數(shù)組/示例,例從鍵盤輸入數(shù)目不確定的一批正整數(shù),將這批整數(shù)保存在數(shù)組中,然后反序輸出這批整數(shù)。分別采用靜態(tài)數(shù)組和動態(tài)數(shù)組編寫程序?qū)崿F(xiàn)之。 !使用靜態(tài)數(shù)組程序 PROGRAM static_array PARAMETER(max=200) INTEGER : i, n=0, array(max) READ *,i DO WHILE (i.NE.-1) n=n+1 array(n)=I READ *,i ENDDO PRINT *,data_number=,n PRINT *,(array(i),i=n,1,-1) END,第八章 數(shù)組及經(jīng)用,!使用動態(tài)數(shù)組程序 PROGRAM dynamic_array INTEGER,ALLOCATABLE : array(:) INTEGER : i,n=0,m READ *, m ALLOCATE(array(m) READ *,i DO WHILE (i.NE.-1) n=n+1 array(n)=i READ *,i,ENDDO PRINT *,data_number=,n PRINT *,(array(i),i=n,1,-1) END,DEALLOCATE(ARRAY) END,例1 輸入10個整數(shù),并按輸入時的逆序輸出,每行5個數(shù)。,PROGRAM MAIN IMPLICIT NONE INTEGER,DIMENSION(10):A READ*,A WRITE(*,(5I3) A(10:1:-1) END 或WRITE(*, (5I3) (A(I),I=10,1,-1),一批數(shù)據(jù)的處理引入數(shù)組,程序結(jié)構(gòu): 單位定義 說明所有數(shù)組 輸入數(shù)組 數(shù)組的處理 輸出數(shù)組 END,第五節(jié) 數(shù)組的應(yīng)用,蘇州科技大學(xué)計算中心,第八章 數(shù)組及應(yīng)用,輸入數(shù)據(jù):以行為主輸入 12 個矩陣數(shù)據(jù),每行輸入一個數(shù)據(jù): 12.5 23.8 54.2 78.9 92.4 45.3 0 24.4 84.2 32.8 72.8 43.2 輸出結(jié)果:輸出轉(zhuǎn)置后數(shù)組: 12.5 92.4 84.2 23.8 45.3 32.8 54.2 0.0 72.8 78.9 24.4 43.2,第五節(jié) 數(shù)組的應(yīng)用,使用隱含DO循環(huán)輸入輸出數(shù)組,蘇州科技大學(xué)計算中心,第八章 數(shù)組及應(yīng)用,輸入數(shù)據(jù):輸入 5 名學(xué)生的成績,每行輸入多個成績: 85,94,78,51,35 輸入第奇數(shù)個學(xué)生新成績: 11,33,55 輸出結(jié)果: 5名學(xué)生的最新成績是: 11.0, 94.0, 33.0, 51.0, 55.0 更新前平均成績是: 68.60 更新后平均成績是: 48.80,REAL A(0:9,0:9) DO I=0,9 DO J=0,9 A(i,j)=SQRT(10.*I+J) ENDDO ENDDO WRITE(*,10)(I,I=0,9) 10 FORMAT(7X,10(I1,6x) DO I=0,9 WRITE(*,20)I,(A(I,J),J=0,9) 20 FORMAT(1X,I1,2X,10(F5.3,2X) ENDDO END,按如下格式打印100以內(nèi)整數(shù)的平方根表。,例計算N個測試數(shù)據(jù)的平均值和標準偏差。測試數(shù)據(jù)個數(shù)不定。 解:已知:N個測試數(shù)據(jù)data為:X1,X2,X3,Xn。從鍵盤輸入。實型。 求:平均值Xa和標準偏差Xs。實型。 平均值計算公式為: Xa=(X1+X2+X3+Xn)/N 標準偏差計算公式為:Xs= 測試數(shù)據(jù)用一個一維數(shù)組X表示,平均值用變量Xa表示,標準偏差用變量Xs表示。測試數(shù)據(jù)個數(shù)不確定,假設(shè)最大個數(shù)max為50,實際個數(shù)為N。從鍵盤輸入數(shù)據(jù),數(shù)據(jù)以非數(shù)值字符為結(jié)束標志。 輸入數(shù)據(jù):25.32,18.35,44.78,57.39,85.2,A 輸出結(jié)果:測試數(shù)據(jù): 25.32 18.35 44.78 57.39 85.20 平均值 : 46.21 標準偏差: 26.74,例已知8個無序整數(shù),將這組整數(shù)由小到大(或由大到?。┡判?。,解:已知:無序整數(shù)A,數(shù)組,用DATA語句賦初值。數(shù)據(jù)個數(shù)為N,假定N=8。 求:將一組無序整數(shù)A從小到大排序。 采用選擇法排序。基本思想:從第1個數(shù)據(jù)起在N個待排序數(shù)據(jù)中選擇一個最小數(shù),將最小數(shù)與第1個數(shù)據(jù)交換,稱該步為第1趟排序;在從第2個數(shù)據(jù)起在剩余的N-1個數(shù)據(jù)中選擇一個次最小數(shù),將次最小數(shù)與第2個數(shù)據(jù)交換,稱該步為第2趟排序;依次類推,直到在從第N-1個數(shù)據(jù)起在剩余的2個數(shù)據(jù)中選擇一個較小數(shù),將較小數(shù)與第N-1個數(shù)據(jù)交換,稱該步為第N-1趟排序,直至排序任務(wù)完成,得到一組有序數(shù)據(jù)。 排序前數(shù)據(jù): 51 34 37 54 72 12 58 40 排序后數(shù)據(jù): 12 34 37 40 51 54 58 72,排序過程示意如圖所示。,a(1,1),a(1,2),.,a(1,p) . a(i,1),a(i,2),.,a(i,p) . a(m,1),a(m,2),.,a(m,p),b(1,1) b(1, j) b(1,n) b(2,1) b(2, j) b(2,n) . b(p,1) b(p, j) b(p,n),A矩陣(m*p),B矩陣(p*n),C(i, j)=a(i,1)*b(1, j)+a(i,2)*b(2, j)+a(i,p)*b(p, j),Sum=0 DO k = 1 , p A的列數(shù)或B的行數(shù) Sum = Sum + a(i, k) * b(k, j) ENDDO c(i, j) = Sum,i,j,例 矩陣乘法:(矩陣A和B相乘時,A的列數(shù)應(yīng)和B的行數(shù)相等.),Sum=0 DO k = 1 , p A的列數(shù)或B的行數(shù) Sum = Sum + a(i, k) * b(k, j) ENDDO c(i, j) = Sum,DO i=1 , m DO j=1 , n,ENDDO ENDDO,a(1,1),a(1,2),.,a(1,p) . a(i,1),a(i,2),.,a(i,p) . a(m,1),a(m,2),.,a(m,p),b(1,1) b(1, j) b(1,n) b(2,1) b(2, j) b(2,n) . b(p,1) b(p, j) b(p,n),A矩陣(m*p),B矩陣(p*n),i,j,例 矩陣乘法:(矩陣A和B相乘時,A的列數(shù)應(yīng)和B的行數(shù)相等.),楊輝三角形實際是由二項式(X+Y)n展開式各項的系數(shù)構(gòu)成,第i行就是(X+Y)i展開式的各項系數(shù)。從右圖可看出三角形中各元素的規(guī)律。除第一列和主對角線元素全為1外,其余元素是它的上行的前一列元素與上一行本列元素之和。如果將這些數(shù)看成一個10行10列的數(shù)組(上三角視為全零),i表示行,j表示列,則有,例:打印揚輝三角,1 1 1 2 1 1 3 3 1 1 4 6 4 1 ,INTEGER,DIMENSION(10,10): A DO I=1,10 A(I,I)=1 A(I,1)=1 ENDDO DO I=3,10 DO J=2,I-1 A(I,J)=A(I-1,J-1)+A(I-1,J) ENDDO ENDDO DO K=1,10 WRITE(*,(10I6))(A(K,J),J=1,K) ENDDO END,例:打印揚輝三角,1 1 1 2 1 1 3 3 1 1 4 6 4 1 ,注意打印格式,打印“魔幻方陣。魔幻方陣是指方陣的每一行、每一列、對角線元素之和均相等,其值為n(n2+1)/2,n代表方陣的行數(shù)和列數(shù)。一個n階奇數(shù)方陣由1到n2個自然數(shù)構(gòu)成。其組成規(guī)律是: (1)將1放在第1行的中間一列; (2)由1開始依次從左下到右上方向放連續(xù)數(shù),如m放在A(i,j),則m+1放在A(i-1,j+1); (3)如果i-1n,則j+1為1; (5)如果A(i-1,j+1)已放數(shù),則將數(shù)放在A(i+1,j)中。 以下是五階魔幻方陣: 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9,例:在一有序數(shù)列中,插入一數(shù),使插 PARAMETER(N=30) 入后的數(shù)列仍然有序. INTEGER A(N) A 3 , 5 , 11, 22, 28, 56, 76, 88 READ*,N1 X=45 READ*,(A(I),I=1,N1) 第一步,先找插入的位置P READ*,X P=1 P=1 DO WHILE(X.GT.A(P).AND.P.LE.N1) DO WHILE(X.GT.A(P).AND.P.LE.N1) P=P+1 P=P+1 END DO END DO 第二步,完成插入 DO I=N1,P,-1 DO I=N1,P,-1 A(I+1)=A(I) A(I+1)=A(I) END DO; A(P)=X END DO N1=N1+1 A(P)=X N1=N1+1 PRINT*,(A(I),I=1,N1) END,例:求二維數(shù)組的鞍點,即該點在行上最小,列上最大。 求第I行最小元素的程序段為: Q=1 DO J=2,N IF(A(I,Q).GT.A(I,J)Q=J END DO 求第Q列最大元素的程序段為: P=1 DO K=2,M IF(A(P,Q).LT.A(K,Q)P=K END DO 如果P=I,說明元素A(P,Q)是鞍點,Subroutine sub(a,m,n,l) Logical :L=.FALSE. Real a(m,n) Integer p,q Do I=1,m Q=1 DO J=2,N IF(A(I,Q).GT.A(I,J)Q=J END DO P=1 DO K=2,M IF(A(P,Q).LT.A(K,Q)P=K END DO If(p.eq.I)then print*, p,q,是鞍點 L=.true. End do End Subroutine sub,例如:輸入一個45的矩陣,求其鞍點 Parameter(m=4,n=5) Real,dimension(m:n):a Logical:L=.false. Read*,(a(I,j),j=1,5),I=1,4) !按行輸入 Call sub(a,m,n,L) If(.not.L)print*,沒有鞍點 end,例 1,第五節(jié) 數(shù)組的應(yīng)用,選擇排序法的原理很簡單,步驟如下: 1)找出全部N個數(shù)據(jù)中最小的一個,把它和數(shù)列的第1個數(shù)字交換位置。 2)找出剩下N1個數(shù)據(jù)中最小的一個,把它和數(shù)列的第2個數(shù)字交換位置。 3)找出剩下N2個數(shù)據(jù)中最小的一個,把它和數(shù)列的第3個數(shù)字交換位置。 4),一直做到只剩下一個數(shù)據(jù)為止 。 下面以3 ,2, 5 ,1,4這組數(shù)字闡述選擇排序法的排序過程:,例 1,第一輪掃描 3,2, 5,1,4,發(fā)現(xiàn)1最小,把它跟第1個數(shù)字交換位置,數(shù)據(jù)變成1,3,2, 5,4。,第二輪掃描 掃描的數(shù)據(jù)為剩下的3,2, 5,4,發(fā)現(xiàn)2最小,把它跟第2個數(shù)字交換位置,數(shù)據(jù)變成1,2,3,5,4。,第三輪掃描 掃描的數(shù)據(jù)為剩下的3,5,4,發(fā)現(xiàn)3最小,把它跟第3個數(shù)字交換位置,數(shù)據(jù)變成1,2,3,5,4。,第四輪掃描 掃描的數(shù)據(jù)為剩下的5,4,發(fā)現(xiàn)4最小,把它跟第4個數(shù)字交換位置,數(shù)據(jù)變成1,2,3,4,5。,PARAMETER(N=5) INTEGER A(N),TEMP DATA A/3,2,5,1,4/ DO I=1, N MIN=A(I) DO J=11, N IF(MINA(J)THEN TEMP=A(J) A(J)=A(I) A(I)=TEMP MIN=A(I) ENDIF ENDDO ENDDO PRINT*,A END,! 暫時令A(yù)(I)是最小值,! 發(fā)現(xiàn)A(I)不是最小,! 把A(I)、A(J) 這兩個數(shù)值交換,例 1,第五節(jié) 數(shù)組的應(yīng)用,冒泡排序法的步驟: 1)從第1個數(shù)字開始,依序把兩個相鄰的數(shù)值互相比較大小。如果前一個數(shù)字比后一個數(shù)字大,就把它們的位置互相交換。 2)一直做到每一對相鄰的數(shù)字都比較過后才結(jié)束這一輪的工作。 3)回到第1步,再做下一循環(huán)的比較。如果有N個數(shù)字要排序,就需要重復(fù)N1次的掃描工作。 下面以3 ,2,5 ,1,4這組數(shù)字闡述冒泡排序的過程:,例 1,第一輪掃描:,經(jīng)過第一輪掃描后,會找出最大的數(shù)值5,并把它放在數(shù)值的最后面。 第二輪掃描:,在第二輪掃描中,可以不去比較數(shù)列的最后一個數(shù)字,因為在第一輪中,就已經(jīng)確定它是數(shù)列中的最大數(shù)值。如果硬是要比較的話,仍然可以排列出正確的結(jié)果,只不過會降低程序效率。在這一輪掃描中,可以找出數(shù)列的第2大數(shù)值,并且把它放在數(shù)列的倒數(shù)第2個位置上。,例 1,第三輪掃描:,這一輪中,不需再比較3,4的大小,因為在上一輪中,就已經(jīng)確立了43的事實。因為4是數(shù)列中第2大的數(shù)字,而最大的數(shù)字又已經(jīng)排在4的后面。同樣地,在這一輪掃描中,確立了數(shù)列的第3大數(shù)值是3,并且把它安置在數(shù)列的倒數(shù)第3個位置上。 第四輪掃描:,雖然表面上看起來已經(jīng)排序完畢,但是還是要經(jīng)過這一輪的掃描后才能確定。因為在這次掃描后才會確定數(shù)列的第4大數(shù)值。而找出第4大數(shù)值后,因為總共只有5個數(shù)字,最小的數(shù)值也會跟著找出來,排序結(jié)束。 可以由上面的過程看到,冒泡排序法可以想像成是讓重的東西向下沉,輕的東西向上浮。等到狀態(tài)穩(wěn)定,就會得到排序結(jié)果。,PARAMETER(N=5) INTEGER A(N),TEMP DATA A/3,2,5,1,4/ DO I=N-1, 1, -1 DO J=1, I IF(A(J)A(J+1)THEN TEMP=A(J) A(J)=A(J+1) A(J+1)=TEMP ENDIF ENDDO ENDDO PRINT*,A END,! 開始做N1次的掃描,! 一對一對的來比較,I之后的數(shù)字不用比較,! 如果A(J)A(J+1)就把這兩個數(shù)值交換,例 1,49,38,65,97,13,76,27,49,第五節(jié) 數(shù)組的應(yīng)用,49,38,65,97,13,76,27,49,例 1,38,49,65,97,13,76,27,49,例 1,38,49,65,97,13,76,27,49,例 1,38,49,65,97,13,76,27,49,例 1,38,49,65,97,13,76,27,49,例 1,38,49,65,76,13,97,27,49,例 1,38,49,65,76,13,97,27,49,例 1,38,49,65,76,97,13,27,49,例 1,38,49,65,76,97,13,27,49,例 1,38,49,65,76,27,13,97,49,例 1,38,49,65,76,27,13,97,49,例 1,38,49,65,76,27,13,49,97,例 1,38,49,65,76,27,13,49,97,例 1,DO j=1, n-1 if (a(j)a(j+1) then 交換 a(j),a(j+1) end if ENDDO,38,49,65,76,27,13,49,97,38,49,65,76,27,13,49,例 1,38,49,65,76,27,13,49,97,38,49,65,76,27,13,49,例 1,38,49,65,76,27,13,49,97,38,49,65,76,27,13,49,例 1,38,49,65,76,27,13,49,97,38,49,65,76,27,13,49,例 1,38,49,65,76,27,13,49,97,38,49,65,76,27,13,49,例 1,38,49,65,76,27,13,49,97,38,49,65,13,27,76,49,例 1,38,49,65,76,27,13,49,97,38,49,65,13,27,76,49,例 1,38,49,65,76,27,13,49,97,38,49,65,13,76,27,49,例 1,38,49,65,76,27,13,49,97,38,49,65,13,76,27,49,例 1,38,49,65,76,27,13,49,97,38,49,65,13,49,27,76,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 榕江縣社會實踐報告范文
- 鉗工認知報告范文
- 汽車座椅對標報告范文
- 二零二五年度年委托付款協(xié)議書(跨境金融結(jié)算與風險管理服務(wù)協(xié)議)
- 二零二五年度股東持股比例調(diào)整與公司分紅政策協(xié)議
- 2025年度智能化勞務(wù)安全協(xié)議書
- 2025年度高科技產(chǎn)業(yè)合伙投資合同協(xié)議書
- 二零二五年度現(xiàn)代化辦公區(qū)域保潔與安保綜合服務(wù)合同
- 二零二五年度玉米收購資金托管服務(wù)合同
- 二零二五年度個人借公司資金用于購房的貸款合同
- 小學(xué)生日常行為規(guī)范實施方案
- 2024-2025學(xué)年九年級化學(xué)人教版上冊檢測試卷(1-4單元)
- 2024年遼寧省鞍山岫巖滿族自治縣事業(yè)單位招聘(150人)歷年高頻難、易錯點500題模擬試題附帶答案詳解
- DBJ46-070-2024 海南省民用建筑外門窗工程技術(shù)標準
- 金屬冶煉安全生產(chǎn)實務(wù)注冊安全工程師考試(初級)試題與參考答案
- 無縫氣瓶檢驗作業(yè)指導(dǎo)書2024
- 《改革開放史》教學(xué)大綱
- 大學(xué)生就業(yè)指導(dǎo) 課件 第六單元 就業(yè)權(quán)益保護
- 2024年高職高考語文必背古詩
- 護理質(zhì)控護士競聘
- 醫(yī)學(xué)課件炎癥性腸病4
評論
0/150
提交評論