FORTRAN語言第7章(共8章)_第1頁
FORTRAN語言第7章(共8章)_第2頁
FORTRAN語言第7章(共8章)_第3頁
FORTRAN語言第7章(共8章)_第4頁
FORTRAN語言第7章(共8章)_第5頁
已閱讀5頁,還剩138頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rè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ù)雜,這些程序的一個突出特點(diǎn)是所處理的數(shù)據(jù)量非常少,采用的數(shù)據(jù)類型都是簡單的內(nèi)部數(shù)據(jù)類型,使用的變量都是普通變量。然而在實(shí)際的科研數(shù)值計算中,往往遇到的是一些涉及大量數(shù)據(jù)的復(fù)雜問題,如:?思考:輸入某班50個學(xué)生的成績,統(tǒng)計平均成績以及高于平均分學(xué)生的人數(shù)。定義50個變量存放各個學(xué)生的成績?定義1個變量,循環(huán)讀入各個學(xué)生的成績,同時累計50個學(xué)生的總成績,進(jìn)而求出平均成績;當(dāng)統(tǒng)計高于平均分學(xué)生人數(shù)時,再次輸入50個成績?

不適宜可以不適宜解決方法:使用數(shù)組!第一節(jié)數(shù)組的概念求解100元一次方程組。求解高階微分方程。計算50

50階矩陣的轉(zhuǎn)置矩陣。對某班30名學(xué)生的學(xué)習(xí)成績進(jìn)行排序處理。以上問題都要涉及幾十、幾百、幾千,甚至上萬個數(shù)據(jù),如果在程序中采用簡單的內(nèi)部數(shù)據(jù)類型和變量來求解這類問題,其難度將大大增加,甚至無法設(shè)計和編寫程序。第一節(jié)數(shù)組的概念!統(tǒng)計15個數(shù)的平均值及大于平均值的數(shù)據(jù)個數(shù)。使用普通變量和順序結(jié)構(gòu)實(shí)現(xiàn)。REALa1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,sum,avINTEGERnumREAD*,a1,a2,a3,a4,a5,a6,a7,a8,aa9,a10,a11,a12,a13,a14,a15sum=a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14+a15av=sum/15;num=0IF(a1>av)num=num+1IF(a2>av)num=num+1IF(a15>av)num=num+1PRINT*,'平均值為:',av;PRINT*,'大于平均值的數(shù)據(jù)個數(shù):',numEND在輸入數(shù)據(jù)時,用不同的名字引用每一個存儲單元比較煩瑣。如果有100個數(shù)需要處理,將需要一個長的輸入語句,其中每個變量被列出一次。第一節(jié)數(shù)組的概念!統(tǒng)計15個數(shù)的平均值及大于平均值的數(shù)據(jù)個數(shù)。使用數(shù)組和循環(huán)結(jié)構(gòu)實(shí)現(xiàn)。PROGRAMexampleREALa(20),sum,avINTEGERnumsum=0.0DOi=1,15READ*,a(i)sum=sum+a(i)ENDDOav=sum/15!該程序變量少,程序短,數(shù)據(jù)輸入一遍。num=0DOi=1,15IF(a(i)>av)num=num+1ENDDOPRINT*,'平均值為:',avPRINT*,'大于平均值的數(shù)據(jù)個數(shù)為:,numEND簡單變量是用來代表一個數(shù)據(jù);而把具有相同類型的一批數(shù)據(jù)看成是一個整體,叫做數(shù)組。給數(shù)組取一個名字叫數(shù)組名,所以數(shù)組名代表一批數(shù)據(jù),數(shù)組中的每一個數(shù)據(jù)稱為數(shù)組元素,它可通過順序號(下標(biāo))來區(qū)分。一、變量與數(shù)組的區(qū)別第一節(jié)數(shù)組的概念只要給出數(shù)組名和下標(biāo)就可以表示某一數(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ù)組的元素需要一個順序號(下標(biāo)),故稱為一維數(shù)組;而區(qū)分S數(shù)組的元素需要兩個順序號,故稱為二維數(shù)組,其中第一個下標(biāo)代表元素所在行號,第二個下標(biāo)為該元素所在列號。一、變量與數(shù)組的區(qū)別二、數(shù)組的分類引入數(shù)組以后,讓一批同類型數(shù)據(jù)共享一個名字,不必為每一對象都取一個名字。數(shù)組元素是按順序號連續(xù)存放的,我們可以用循環(huán)語句控制下標(biāo)的變化,這給在同一方式下處理多個同類型數(shù)據(jù)帶來極大方便。例如:第一節(jié)數(shù)組的概念REALP(5),AVER!定義P數(shù)組DOI=1,5READ(*,*)P(I)!輸入成績并存入P數(shù)組AVER=AVER+P(I)!求成績之和ENDDOAVER=AVER/5!求平均成績一、數(shù)組說明的內(nèi)容第二節(jié)數(shù)組的說明與引用程序中所有數(shù)組都要先說明該數(shù)組的名字、類型、維數(shù)及大小,以便編譯系統(tǒng)給數(shù)組分配相應(yīng)的存儲單元。

1)數(shù)組名:數(shù)組和變量一樣,也用標(biāo)識符來命名;

2)數(shù)組的類型:數(shù)組的類型由數(shù)組元素的類型來決定;

3)數(shù)組的維數(shù):為了區(qū)分?jǐn)?shù)組元素所需順序號(下標(biāo))的個數(shù);

4)數(shù)組的大?。簲?shù)組中包含數(shù)組元素的個數(shù),由數(shù)組每維下標(biāo)的上界和下界來決定。一、數(shù)組說明的內(nèi)容數(shù)組名、數(shù)組的維數(shù)和每一的上、下界的定義要用到數(shù)組說明符。其一般形式為:數(shù)組名(維說明符[,維說明符]…)維說明符的個數(shù)就是數(shù)組的維數(shù)。維說明符至少1個,最多7個。維說明符的一般形式為:[維下界:]維上界維下界與維上界之間用“:”分隔,下界為1時,可省略不寫。維下界與維上界都只能是整型表達(dá)式。維界表達(dá)式的值必須是整數(shù)值,而且維上界的值必須大于維下界的值。一、數(shù)組說明的內(nèi)容維說明符的一般形式為:[維下界:]維上界在維界表達(dá)式中,允許出現(xiàn)整型常量、整型變量或者星號“*”。不允許出現(xiàn)函數(shù)或數(shù)組元素。如果在維界表達(dá)式中出現(xiàn)整型變量名,那么該數(shù)組稱作可調(diào)數(shù)組。如果出現(xiàn)星號“*”,那么只能用星號作為維的上界,這樣的數(shù)組叫做假定大小的數(shù)組??烧{(diào)數(shù)組和假定大小數(shù)組只能出現(xiàn)在子程序,不允許在主程序中使用。說明方法一:用DIMENSION說明數(shù)組

DIMENSION數(shù)組說明符[,數(shù)組說明符]…例:DIMENSIONA(1:5),B(-1:2)二、數(shù)組說明的方法第二節(jié)數(shù)組的說明與引用注意:1)DIMENSION語句是非執(zhí)行語句,必須放在程序單位的可執(zhí)行語句之前;2)用DIMENSION語句只說明了數(shù)組的名字、維數(shù)、大小等特性,但不能說明數(shù)組的數(shù)據(jù)類型。此時,數(shù)組類型的說明方法與變量名相同。①如無特別指明,數(shù)組的類型服從I—N規(guī)那么②用類型說明語句指明數(shù)組的類型說明方法二:用類型說明語句說明數(shù)組

類型說明關(guān)鍵字?jǐn)?shù)組說明符[,數(shù)組說明符]…例:INTEGERA(1:5),B(-1:2)用類型說明語句可以直接說明數(shù)組的全部特性。二、數(shù)組說明的方法CHARACTER*8NAME(30)REALSCORE(5,30)說明了字符型數(shù)組NAME,數(shù)組元素的長度為8,還有實(shí)型數(shù)組SCORE。說明方法三:同時使用DIMENSION和類型說明語句說明數(shù)組其一般形式為:類型符,DIMENSION(維說明符)::數(shù)組名例:INTEGER,DIMENSION(1:5)::A,B(-1:2),CDIMENSION屬性統(tǒng)一說明大小名字后個別說明大小個別優(yōu)于統(tǒng)一REAL(4),DIMENSION(1:3,1:4)::D=0上例中說明了三個整型一維數(shù)組A,B,C,一個二維實(shí)型數(shù)組D,其中A,C各含有5個元素,B含有4個元素;D中含有12個元素。在說明數(shù)組時,可以在數(shù)組名后面給出維說明,這時以該數(shù)組名后的維說明為準(zhǔn)。二、數(shù)組說明的方法DIMENSIONA(1:5),B(-1:2),C(1:3,1:4)INTEGERA,BREALC數(shù)組說明符數(shù)組名維說明符1、維:代表下標(biāo)個數(shù);維數(shù)——逗號分隔,每維維界——下界d1:上界d2,下界為1時,可省略不寫。必須滿足d1<=d2,否則數(shù)組元素個數(shù)為零例:REAL,DIMENSION(5:1)::C2、維長:d2-d1+1,維上的元素個數(shù)3、大小:總的元素個數(shù),即各維維長的乘積4、數(shù)組不得重復(fù)說明例:INTEGER,DIMENSION(2)::AINTEGER,DIMENSION(2,3)::A三、數(shù)組元素的引用數(shù)組元素是通過數(shù)組元素名來引用的。數(shù)組元素名的一般形式是數(shù)組名〔下標(biāo)表達(dá)式[,下標(biāo)表達(dá)式]…〕其中:下標(biāo)表達(dá)式為整型表達(dá)式,如果不是整型,那么自動取整之后再使用;下標(biāo)表達(dá)式的個數(shù)必須等于該數(shù)組的維數(shù),每個下標(biāo)表達(dá)式的值必須在相應(yīng)的維下界到維上界之間。第二節(jié)數(shù)組的說明與引用注意:1、數(shù)組元素表示數(shù)組中每個成份的值,數(shù)組元素名表示數(shù)組元素的名字。但在實(shí)際使用中,數(shù)組元素與數(shù)組元素名并不加區(qū)分。由于數(shù)組元素名是用數(shù)組名后面帶下標(biāo)表示的,所以數(shù)組元素名叫下標(biāo)變量。下標(biāo)變量可以和簡單變量等同使用。三、數(shù)組元素的引用注意:2、數(shù)組元素名與數(shù)組說明符的區(qū)別REALA(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í)型二維數(shù)組,有9個元素。賦值語句中A(3,3)是數(shù)組元素名。三、數(shù)組元素的引用注意:3、在F77中,除了在I/O語句中之外,其他場合不允許對數(shù)組進(jìn)行整體操作,只能對數(shù)組的元素逐個進(jìn)行操作。但在F90中,允許對數(shù)組進(jìn)行整體操作。REALA(4,5)A(1:,:)=100.0A(:,1:5:2)=470.0是一個三元表達(dá)式,可作為數(shù)組元素的下標(biāo)表達(dá)式。其含義是從1變化到5,每次增加2。三元表達(dá)式更一般的形式如下:下標(biāo)三元組法:每一維是下標(biāo)三元組e1:e2:e3或常量例如二維數(shù)組:數(shù)組名〔行三元組或常量,列三元組或常量〕e1:起始下標(biāo)值,缺省為下界d1e2:終止下標(biāo)值,缺省為上界d2e3:步長值,缺省間隔為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ù)組按下標(biāo)從小到大的順序存放第三節(jié)數(shù)組元素的存儲結(jié)構(gòu)INTEGERA(5)A(1)A(2)A(3)A(4)A(5)對于二維以上數(shù)組FORTRAN規(guī)定:數(shù)組元素在內(nèi)存中是按列的順序連續(xù)存放的。INTEGERB(3,4)INTEGERB(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ù)組元素此方式的特點(diǎn)是:對于輸入,每執(zhí)行一個輸入語句輸入一個數(shù)組元素值;對于輸出,每執(zhí)行一個輸出語句輸出一個元素值。將輸入輸出語句放在DO循環(huán)中,利用循環(huán)控制變量作為數(shù)組元素的下標(biāo)來控制數(shù)組元素的輸入或輸出。REALA(4,5)DOI=1,4DOJ=1,5READ(*,*)A(I,J)ENDDOENDDO每輸入一個數(shù)要按一次回車鍵,A數(shù)組的20個數(shù)要輸入20次。第四節(jié)數(shù)組的輸入輸出一、使用DO循環(huán)輸入輸出數(shù)組元素DOI=1,5DOJ=1,4WRITE(*,*)A(J,I)ENDDOENDDOENDA數(shù)組共輸出20行DOI=1,100,2WRITE(*,*)A(I)ENDDO用戶可以自已控制輸入和輸出次序以及個數(shù)DOK=50,1,-1WRITE(*,*)M(K)ENDDO把M數(shù)組的50個元素按逆序打印出來將奇數(shù)(1,3,…,99)下標(biāo)的元素輸出一、使用DO循環(huán)輸入輸出數(shù)組元素DOI=1,20,5READ(*,*)A(I),A(I+1),A(I+2),A(I+3),A(I+4)這樣每次循環(huán)一次那么可輸入5個數(shù),每個數(shù)之間用逗號分隔。ENDDO可以多設(shè)置一些輸入項(xiàng)或輸出項(xiàng)例:一、使用DO循環(huán)輸入輸出數(shù)組元素第四節(jié)數(shù)組的輸入輸出二、以數(shù)組名作為輸入輸出項(xiàng)這種方式是要對整個數(shù)組的所有元素進(jìn)行輸入輸出操作,元素的個數(shù)和元素的操作次序都不能由自己控制,必須是對整個數(shù)組進(jìn)行操作。例:DIMENSIONX(10)READ(*,*)XWRITE(*,8)X8FORMAT(1X,5F6.2)(按8句格式將x數(shù)組的元素打印成兩行,每行打印5個數(shù))ENDREAD(*,*)X(1),X(2),X(3)

,X(4)…,X(10)WRITE(*,8)X(1),X(2),X(3)

,X(4)…,X(10)注:對于二維數(shù)組采用數(shù)組名方式進(jìn)行輸入和輸出時,因?yàn)槎S數(shù)組元素的存儲是按列存放,所以,在輸出時是按存儲順序來打印的。例:INTEGERY(2,3)READ(*,*)YWRITE(*,7)Y7FORMAT(1X,3i8)END假設(shè)Y數(shù)組的各元素值為:101112202122從鍵盤輸入各元素的值為:10,20,11,21,12,22102011211222Y(1,1)Y(2,1)Y(1,2)Y(2,2)Y(1,3)Y(2,3)執(zhí)行打印語句的打印結(jié)果是102011211222如果要打印出與數(shù)組的實(shí)際結(jié)構(gòu)相符的結(jié)果,最好用隱DO方式,即:WRITE(*,7)((Y(I,J),J=1,3),I=1,2)打印結(jié)果為:101112202122INTEGER,DIMENSION(3,3)::AREAD(*,*)AWRTIE(*,10)A10FORMAT(1X,3I5)END第四節(jié)數(shù)組的輸入輸出二、以數(shù)組名作為輸入輸出項(xiàng)數(shù)組元素按照它們在內(nèi)存中的排列順序輸入輸出。該方式要特別注意數(shù)據(jù)的組織。當(dāng)執(zhí)行READ語句時,從鍵盤依次鍵入賦給A的數(shù)據(jù)就可以了,但輸出A的數(shù)據(jù)時注意按“列”存儲的原那么,對二維以上數(shù)組要注意這個問題。比方從鍵盤輸入:1,2,3,4,5,6,7,8,9147258369三、利用隱含DO循環(huán)控制數(shù)組元素的輸入輸出隱DO循環(huán)只能用于輸入和輸出語句以及DATA語句中,它可以按要求來指定數(shù)組中需要輸入或輸出的局部,并且可以人為地規(guī)定輸入或輸出格式。隱式DO循環(huán)實(shí)際上是一種帶控制循環(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)的增量。如果省略本工程,那么默認(rèn)為1。隱式DO循環(huán)不是一種可以獨(dú)立存在的語句。它只能作為輸入輸出列表的一個組成局部,用來控制重復(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])當(dāng)e3=1時,可省略例:INTEGERx(5)READ(*,*)(x(I),I=1,5)

READ(*,*)x(1),x(2),x(3),x(4),x(5)可將5個元素的值一次性輸入,每個數(shù)之間用逗號分隔,也可以分假設(shè)干次輸入WRITE(*,*)(x(I),I=1,20)

WRITE(*,*)x(1),x(2),…,x(20)將20個元素按標(biāo)準(zhǔn)格式輸出WRITE(*,*)(x(I),I=1,5)

WRITE(*,*)x(1),x(2),x(3),x(4),x(5)

輸出X數(shù)組中的局部元素WRITE(*,*)(x(I),I=1,20,2)

WRITE(*,*)x(1),x(3),…,x(19)有選擇地輸出X數(shù)組中的元素注:當(dāng)只需要給X數(shù)組中的前N個元素輸入值時,可以寫成READ(*,*)N,(X(I),I=1,N)但N不能放在隱含DO循環(huán)內(nèi),以下語句是錯誤的:READ(*,*)(N,X(I),I=1,N)因?yàn)樵谶M(jì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),J=1,3),I=1,2)例:相當(dāng)于執(zhí)行下面語句:READ(*,*)B(1,1),B(1,2),B(1,3),B(2,1),B(2,2),B(2,3)輸入數(shù)據(jù)時,你可以一次輸入完畢,也可以分成假設(shè)干次來輸入WRITE(*,*)((B(I,J),J=1,3),I=1,2)例:輸出數(shù)據(jù)時,打印成一行,也可用格式的方式,將其打印成二行WRITE(*,10)((B(I,J),J=1,3),I=1,2)10FORMAT(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輸入:123456②DOI=1,2READ〔*,*〕〔A〔I,J〕,J=1,3〕ENDDO行顯DO列隱DO的輸入:1,2,34,5,6輸入格式:一行輸入輸入格式:與外觀一致第四節(jié)數(shù)組的輸入輸出要注意使用DO循環(huán)和隱DO循環(huán)在控制數(shù)組I/O時,在I/O格式上的差異。如:第四節(jié)數(shù)組的輸入輸出WRITE(*,*)(A(I),I=2,14,3)DOI=2,14,3WRITE(*,*)A(I)ENDDODO循環(huán)控制執(zhí)行一次輸出語句,就要輸出一行(一條記錄),且每行上僅有一個數(shù)組元素的值;而執(zhí)行一次隱DO循環(huán)的輸出語句,就把數(shù)組A的假設(shè)干個元素同時輸出到一行上,即它等價于WRITE(*,*)A(2),A(5),A(8),A(11),A(14)。WRITE(*,’(1X,F6.2)’)(A(I),I=2,14,3)例:編寫程序,形成以下形式的二維數(shù)組。分析:從數(shù)組元素的取值分析,元素的值與其下標(biāo)值有一種對應(yīng)關(guān)系。如果數(shù)組元素的兩個下標(biāo)用i、j表示,當(dāng)i≤j時數(shù)組元素值為1;當(dāng)i>j時,數(shù)組元素值為i-j+1。INTEGERA(5,5)DOI=1,5DOJ=1,5IF(I<=J)THENA(I,J)=1ELSEA(I,J)=I-J+1ENDIFENDDOENDDOWRITE(*,10)&((A(I,J),J=1,5),I=1,5)FORMAT(1x,5I6)ENDA(I,J)=1IF(i>j)A(I,j)=I-J+1第五節(jié)給數(shù)組賦初值DATA語句是專門給變量、數(shù)組和字符子串賦初值的,其一般格式為:nlist:由變量名、數(shù)組名、數(shù)組元素名和字符子串組成.名字之間以逗號(,)分隔clist:常數(shù)和符號常數(shù)組成.

整數(shù)數(shù)據(jù)項(xiàng)間以,分隔

每項(xiàng)數(shù)據(jù)與寫上

與無符號數(shù)字,代表說常數(shù)重復(fù)r次,nlist與clist按從左到右的順序一一對應(yīng)。變量表列初值表1.格式:DATAnlist/clist/[[,]nlist/clist/]..3.與賦值語句的區(qū)別DATA語句賦值語句非執(zhí)行語句執(zhí)行語句賦值在編譯過程完成賦值在執(zhí)行語句時完成2.功能給變量、數(shù)組、數(shù)組元素和字符子串提供初值。4.例:DATAI,R,D,C/1.2,0.3,3.0DO,(4.0,5.0)/等價于

DATAI/1/,R/2.0/,D/3.0DO/,C/(4.0,5.0)/DATAI/1/DATAR/2.0/DATAD/3.0DO/DATAC/(4.0,5.0)/有S和K數(shù)組需賦初值DIMENSIONS(5),K(2,3)DATAS/1.2,2.3,3.0,4.5,2.8/,K/1,2,3,4,5,6/K數(shù)組按列有存放,即246135DATA(S(I),I=1,5)/1.2,2.3,3.0,4.5,2.8/,((K(I,J),J=1,3),I=1,2)/1,3,5,2,4,6/DATAS,K/1.2,2.3,3.0,4.5,2.8,1,2,3,4,5,6/DIMENSIONS(5),K(2,3)DIMENSIONS(5),K(2,3)5.注意:(1)變量表列中的變量與初值表中的常量在個數(shù)、類型等方面要一一對應(yīng)。例如,以下各DATA語句都是錯誤的:

DATAA,B,C/2.0,–5.8/

DATAA,B,C/2.0,–5.6,3.5,10.0/

DATAI,K,X/3.6,4.5,–4.5/初值表中的數(shù)據(jù)個數(shù)少于變量表列中變量的個數(shù)初值表中的數(shù)據(jù)個數(shù)多于變量表列中變量的個數(shù)變量表列中的前兩個變量是整型,而初值表中的前兩個常量為常數(shù),即它們的類型不一致。假設(shè)K的初值是10,C的初值是“FORTRAN77”,A數(shù)組有4個元素CHARACTERC*10DIMENSIONA(4)DATAK/10/,C/‘FORTRAN77’/DATAA/1.23,0.5,3.3,1.45/或DATAk,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語句

REALA(3,2),BDATAA,B/1.0,-1.0,0.0,0.0,-1.0,-1.0,-1.0/

可以寫成

DATAA,B/1.0,-1.0,20.0,3-1.0/(20.0表示兩個連續(xù)的0.0,3–1.0也表示三個連續(xù)的–1.0)但特別要注意,3–1.0不能寫成3(–1.0),因?yàn)?(–1.0)是一個表達(dá)式。假設(shè)M數(shù)組有100個元素,它的前50個元素的初值為0,后50個元素的初值是1,表示如下:DATA(M(I),I=1,50)/50*0/,(M(I),I=51,100)/50*1/DIMENSIONM(100)或者

DATA(M(I),I=1,50),(M(I),I=51,100)/50*0,50*1/或者DATAM/50*0,50*1/以下DATA語句都是錯誤的:DATAA,B,C,Y,Z/1.0,–1.0,20.0,2(–1.0)/在此語句中,2(–1.0),原意可能是表示兩個連續(xù)的–1.0,但實(shí)際上這是一個表達(dá)式;DATAX,Y,Z/1.0/3.0,1.32.5,4.0–1.234/在此語句中,初值表中出現(xiàn)了三個表達(dá)式1.0/3.0、 1.32.5與4.0–1.234。

正確寫法是

DATAX,Y,Z/0.3333333,3.25,2.766/(3)在初值表中不允許出現(xiàn)任何形式的表達(dá)式。例如,在一個程序單位中依次下三個DATA語句:

DATAA,B,C,/1.0,2.0,3.0/

DATAK,S,B/10,4.0,5.0/

DATAA,K,B/2.4,6,10.0/其中變量A分別在第一和第三個DATA語句中賦了初值,

此時以第三個DATA語句中賦的初值為準(zhǔn),即變量A的最后初值為2.4。

同樣的道理,變量K的最后初值為6,變量B的最后初值為10.0。(4)如果在一個程序單位中有多個DATA語句給同一變量初值,那么以最后一個DATA語句中所賦的初值為準(zhǔn)。(5)FORTRAN77中DATA語句的作用是賦初值,它本身不是可執(zhí)行語句。系統(tǒng)在對FORTRAN77源程序進(jìn)行編譯的過程中就完成了這個賦初值的操作。并且,用DATA語句為變量賦初值后,在程序中還可以對賦過初值的變量重新賦值。靜態(tài)數(shù)組優(yōu)點(diǎn)是存儲分配算法簡單,運(yùn)行速度快,缺點(diǎn)是存儲開銷較大。在元素個數(shù)不確定時,為考慮最壞情況,靜態(tài)數(shù)組聲明的很大,導(dǎo)致浪費(fèi)。動態(tài)數(shù)組優(yōu)點(diǎn)是存儲開銷小,缺點(diǎn)是存儲分配算法復(fù)雜,運(yùn)行速度慢。例如:統(tǒng)計學(xué)生成績,人數(shù)不定。PROGRAMexample871!使用靜態(tài)數(shù)組程序INTEGERscore(100),i,j,n,xREAL::av,sum=0.0WRITE(*,“(1X,‘請輸入班級學(xué)生人數(shù):’,\)”)READ*,nWRITE(*,“(1X,‘請輸入’,I3,‘名學(xué)生成績:’)”)nREAD*,(score(i),i=1,n)DOi=1,nsum=sum+score(i)ENDDOav=sum/nWRITE(*,"(1X,'該班學(xué)生平均成績是:',F5.1)")avEND第六節(jié)動態(tài)數(shù)組第六節(jié)動態(tài)數(shù)組

PROGRAMexample872!使用動態(tài)數(shù)組程序INTEGER,DIMENSION(:),ALLOCATABLE::score(:)INTEGERi,j,n,xREAL::av,sum=0.0WRITE(*,“(1X,‘請輸入班級學(xué)生人數(shù):’,\)”)READ*,nALLOCATE(score(n))WRITE(*,“(1X,‘請輸入’,I3,‘名學(xué)生成績:’)”)nREAD*,(score(i),i=1,n)DOi=1,nsum=sum+score(i)ENDDOav=sum/nWRITE(*,"(1X,'該班學(xué)生平均成績是:',F5.1)")avENDPROGRAM使用動態(tài)數(shù)組,需進(jìn)行聲明。聲明時不指定大小。一般格式:[類型聲明符,]DIMENSION(:[,:]),ALLOCATABLE::數(shù)組名[,數(shù)組名]或者[類型聲明符,]ALLOCATABLE::數(shù)組名(:[,:])[,數(shù)組名(:[,:])]例如:INTEGER,DIMENSION(:),ALLOCATABLE::num,scoreREAL,DIMENSION(:,:),ALLOCATABLE::A,BINTEGER,ALLOCATABLE::num(:),score(:)REAL,ALLOCATABLE::A(:,:),B(:,:)第六節(jié)動態(tài)數(shù)組動態(tài)數(shù)組聲明后,使用ALLOCATE語句為分配存儲空間,指定維下界和上界。一般格式:ALLOCATE(數(shù)組名(維說明符)[,數(shù)組名(維說明符)]…)ALLOCATE語句維說明符中的下界和上界可以是整型變量或整型表達(dá)式。ALLOCATE語句中指定數(shù)組維數(shù)與聲明的數(shù)組維數(shù)相同,否那么產(chǎn)生語法錯誤。ALLOCATE通過狀態(tài)變量獲得執(zhí)行狀態(tài),假設(shè)成功,那么狀態(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*,kALLOCATE(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ù)組程序PROGRAMstatic_arrayPARAMETER(max=200)INTEGER::i,n=0,array(max)READ*,iDOWHILE(i.NE.-1)n=n+1array(n)=IREAD*,iENDDOPRINT*,'data_number=',nPRINT*,(array(i),i=n,1,-1)END第八章數(shù)組及經(jīng)用!使用動態(tài)數(shù)組程序PROGRAMdynamic_arrayINTEGER,ALLOCATABLE::array(:)INTEGER::i,n=0,mREAD*,mALLOCATE(array(m))READ*,iDOWHILE(i.NE.-1)n=n+1array(n)=iREAD*,iENDDOPRINT*,'data_number=',nPRINT*,(array(i),i=n,1,-1)END動態(tài)數(shù)組不同使用時,應(yīng)及時通過DEALLOCATE語句釋放存儲空間。其一般格式是:DEALLOCATE(數(shù)組名[,數(shù)組名]…)DEALLOCATE(ARRAY)END例1輸入10個整數(shù),并按輸入時的逆序輸出,每行5個數(shù)。PROGRAMMAINIMPLICITNONEINTEGER,DIMENSION(10)::AREAD*,AWRITE(*,’(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)用[例]:已知矩陣A,輸入矩陣數(shù)據(jù)并轉(zhuǎn)置輸出該矩陣。12.523.854.278.992.445.30.024.484.232.872.843.2PARAMETER(M=3,N=4)REALA(M,N)WRITE(*,“(‘按邏輯結(jié)構(gòu)輸入',I3,'個矩陣數(shù)據(jù):')")M*NREAD*,((A(i,j),j=1,N),i=1,M)PRINT*,‘輸出轉(zhuǎn)置后數(shù)組:’WRITE(*,"(<M>('',F4.1,''))")((A(i,j),i=1,M),j=1,N)END矩陣A輸入數(shù)據(jù):以行為主輸入12個矩陣數(shù)據(jù),每行輸入一個數(shù)據(jù):12.523.854.278.9↙92.445.3024.4↙84.232.872.843.2↙輸出結(jié)果:輸出轉(zhuǎn)置后數(shù)組:12.592.484.223.845.332.854.20.072.878.924.443.2第五節(jié)數(shù)組的應(yīng)用使用隱含DO循環(huán)輸入輸出數(shù)組蘇州科技大學(xué)計算中心第八章數(shù)組及應(yīng)用[例]:已知5個學(xué)生成績:85,94,78,51,35。按序輸入,統(tǒng)計平均成績,然后修改第1,3,5個學(xué)生成績,再統(tǒng)計平均成績,輸出5個學(xué)生最新成績及修改前后平均成績。PARAMETER(N=5)REAL::sum=0,av1,av2,score(N)WRITE(*,“(‘輸入’,I2,‘名學(xué)生的成績,每行輸入多個成績:')")NREAD*,(score(i),i=1,N)DOi=1,Nsum=sum+score(i)ENDDOav1=sum/NPRINT*,‘輸入第奇數(shù)個學(xué)生新成績:'READ*,(score(i),i=1,N,2)sum=0DOi=1,Nsum=sum+score(i)ENDDOav2=sum/NPRINT*,N,'名學(xué)生的最新成績是:'WRITE(*,"(F5.1,',',\)“)(score(i),i=1,N-1)WRITE(*,"(F5.1)")score(N)WRITE(*,"('更新前平均成績是:',F7.2)")av1WRITE(*,"('更新后平均成績是:',F7.2)")av2END輸入數(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.80REALA(0:9,0:9)DOI=0,9DOJ=0,9A(i,j)=SQRT(10.*I+J)ENDDOENDDOWRITE(*,10)(I,I=0,9)10FORMAT(7X,10(I1,6x))DOI=0,9WRITE(*,20)I,(A(I,J),J=0,9)20FORMAT(1X,I1,2X,10(F5.3,2X))ENDDOEND按如下格式打印100以內(nèi)整數(shù)的平方根表。[例]計算N個測試數(shù)據(jù)的平均值和標(biāo)準(zhǔn)偏差。測試數(shù)據(jù)個數(shù)不定。解::N個測試數(shù)據(jù)data為:X1,X2,X3,…,Xn。從鍵盤輸入。實(shí)型。求:平均值Xa和標(biāo)準(zhǔn)偏差Xs。實(shí)型。平均值計算公式為:Xa=(X1+X2+X3+…+Xn)/N

標(biāo)準(zhǔn)偏差計算公式為:Xs=

測試數(shù)據(jù)用一個一維數(shù)組X表示,平均值用變量Xa表示,標(biāo)準(zhǔn)偏差用變量Xs表示。測試數(shù)據(jù)個數(shù)不確定,假設(shè)最大個數(shù)max為50,實(shí)際個數(shù)為N。從鍵盤輸入數(shù)據(jù),數(shù)據(jù)以非數(shù)值字符為結(jié)束標(biāo)志。輸入數(shù)據(jù):25.32,18.35,44.78,57.39,85.2,A輸出結(jié)果:測試數(shù)據(jù):25.3218.3544.7857.3985.20平均值:46.21標(biāo)準(zhǔn)偏差:26.74PROGRAMarray881!說明變量和數(shù)組PARAMETER(max=50)INTEGER::N=0REAL::X(max),Xa,Xs,sum=0.0,data!從鍵盤輸入數(shù)據(jù)并求和DOWHILE(.TRUE.)READ(*,*,IOSTAT=io)dataIF(io<>0)EXITN=N+1X(N)=datasum=sum+dataENDDOXa=sum/Nsum=0.0DOi=1,Nsum=sum+(X(i)-Xa)**2ENDDOXs=SQRT(sum/(N-1))WRITE(*,"(1X,'測試數(shù)據(jù):',<N>F10.2)")(X(i),i=1,N)WRITE(*,"(1X,'平均值:',F10.2)")XaWRITE(*,"(1X,'標(biāo)準(zhǔn)偏差:',F10.2)")XsEND[例]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ù):5134375472125840排序后數(shù)據(jù):1234374051545872排序過程示意如下圖。i=2p=2A(1)A(2)A(3)A(4)A(5)A(6)A(7)A(8)1234375472515840i=8第2趟排序A(2)與A(2)交換A(1)A(2)A(3)A(4)A(5)A(6)A(7)A(8)5134375472125840i=1i=8第1趟排序p=6A(6)與A(1)交換i=3p=3A(1)A(2)A(3)A(4)A(5)A(6)A(7)A(8)1234375472515840i=8第3趟排序A(3)與A(3)交換i=8p=8i=4A(1)A(2)A(3)A(4)A(5)A(6)A(7)A(8)1234375472515840第4趟排序A(8)與A(4)交換i=5A(1)A(2)A(3)A(4)A(5)A(6)A(7)A(8)1234374072515854第5趟排序A(6)與A(5)交換p=6i=8i=6A(1)A(2)A(3)A(4)A(5)A(6)A(7)A(8)1234374051725854第6趟排序A(8)與A(6)交換i=8p=8i=8A(1)A(2)A(3)A(4)A(5)A(6)A(7)A(8)1234374051545872第7趟排序A(7)與A(7)交換i=7p=7A(1)A(2)A(3)A(4)A(5)A(6)A(7)A(8)1234374051545872排序結(jié)果PARAMETER(N=8)INTEGER::temp,p,i,j,A(N)DATAA/51,34,37,54,72,12,58,40/PRINT*,'排序前數(shù)據(jù):'WRITE(*,100)(A(i),i=1,N)DOi=1,N-1p=IDOj=i,N!查找最小數(shù)位IF(A(j)<A(p))p=jENDDOtemp=A(p);A(p)=A(i);A(i)=tempENDDOPRINT*,‘排序后數(shù)據(jù):’WRITE(*,”(1X,<N>I4)”)(A(i),i=1,N)ENDa(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=0DOk=1,p‘A的列數(shù)或B的行數(shù)Sum=Sum+a(i,k)*b(k,j)ENDDOc(i,j)=Sumij例矩陣乘法:(矩陣A和B相乘時,A的列數(shù)應(yīng)和B的行數(shù)相等.)Sum=0DOk=1,p‘A的列數(shù)或B的行數(shù)Sum=Sum+a(i,k)*b(k,j)ENDDOc(i,j)=SumDOi=1,mDOj=1,nENDDOENDDOa(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)ij例矩陣乘法:(矩陣A和B相乘時,A的列數(shù)應(yīng)和B的行數(shù)相等.)楊輝三角形實(shí)際是由二項(xiàng)式(X+Y)n展開式各項(xiàng)的系數(shù)構(gòu)成,第i行就是(X+Y)i展開式的各項(xiàng)系數(shù)。從右圖可看出三角形中各元素的規(guī)律。除第一列和主對角線元素全為1外,其余元素是它的上行的前一列元素與上一行本列元素之和。如果將這些數(shù)看成一個10行10列的數(shù)組(上三角視為全零),i表示行,j表示列,那么有例:打印揚(yáng)輝三角1112113

3114641……INTEGER,DIMENSION(10,10)::ADOI=1,10A〔I,I〕=1A〔I,1〕=1ENDDODOI=3,10DOJ=2,I-1A〔I,J〕=A〔I-1,J-1〕+A〔I-1,J〕ENDDOENDDODOK=1,10WRITE〔*,’(10I6)’〕〔A〔K,J〕,J=1,K〕ENDDOEND例:打印揚(yáng)輝三角1112113

3114641……注意打印格式打印“魔幻方陣。魔幻方陣是指方陣的每一行、每一列、對角線元素之和均相等,其值為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-1<1,那么i-1為n;(4)如果j+1>n,那么j+1為1;(5)如果A(i-1,j+1)已放數(shù),那么將數(shù)放在A(i+1,j)中。以下是五階魔幻方陣:17241815235714164613202210121921311182529例:在一有序數(shù)列中,插入一數(shù),使插 PARAMETER(N=30)入后的數(shù)列仍然有序. INTEGERA(N) A3,5,11,22,28,56,76,88 READ*,N1X=45 READ*,(A(I),I=1,N1)第一步,先找插入的位置P READ*,XP=1 P=1DOWHILE(X.GT.A(P).AND.P.LE.N1) DOWHILE(X.GT.A(P).AND.P.LE.N1) P=P+1 P=P+1ENDDO ENDDO第二步,完成插入 DOI=N1,P,-1DOI=N1,P,-1 A(I+1)=A(I)A(I+1)=A(I) ENDDO;A(P)=XENDDO N1=N1+1A(P)=XN1=N1+1 PRINT*,(A(I),I=1,N1) END例:求二維數(shù)組的鞍點(diǎn),即該點(diǎn)在行上最小,列上最大。求第I行最小元素的程序段為:Q=1DOJ=2,NIF(A(I,Q).GT.A(I,J))Q=JENDDO求第Q列最大元素的程序段為:P=1DOK=2,MIF(A(P,Q).LT.A(K,Q))P=KENDDO如果P=I,說明元素A(P,Q)是鞍點(diǎn)Subroutinesub(a,m,n,l)Logical::L=.FALSE.Reala(m,n)Integerp,qDoI=1,mQ=1DOJ=2,NIF(A(I,Q).GT.A(I,J))Q=JENDDOP=1DOK=2,MIF(A(P,Q).LT.A(K,Q))P=KENDDOIf(p.eq.I)thenprint*,p,q,’是鞍點(diǎn)’L=.true.EnddoEndSubroutinesub例如:輸入一個4×5的矩陣,求其鞍點(diǎn)Parameter(m=4,n=5)Real,dimension(m:n)::aLogical::L=.false.Read*,((a(I,j),j=1,5),I=1,4)!按行輸入Callsub(a,m,n,L)If(.not.L)print*,’沒有鞍點(diǎn)’end例1第五節(jié)數(shù)組的應(yīng)用選擇排序法的原理很簡單,步驟如下:1〕找出全部N個數(shù)據(jù)中最小的一個,把它和數(shù)列的第1個數(shù)字交換位置。2〕找出剩下N-1個數(shù)據(jù)中最小的一個,把它和數(shù)列的第2個數(shù)字交換位置。3〕找出剩下N-2個數(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)INTEGERA(N),TEMPDATAA/3,2,5,1,4/DOI=1,NMIN=A(I)

DOJ=1+1,N

IF(MIN>A(J))THENTEMP=A(J)A(J)=A(I)A(I)=TEMPMIN=A(I)ENDIF

ENDDOENDDOPRINT*,AEND!暫時令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ù)N-1次的掃描工作。下面以{3,2,5,1,4}這組數(shù)字闡述冒泡排序的過程:例1第一輪掃描:第1次{[3,2],5,1,4}比較[3,2],因?yàn)?>2,所以這對數(shù)據(jù)要交換。數(shù)列變成{2,3,5,1,4}第2次{2,[3,5],1,4}比較[3,5],因?yàn)?<5,不需要交換。第3次{2,3,[5,1],4}比較[5,1],因?yàn)?>1,需要交換,數(shù)列變成{2,3,1,5,4}。第4次{2,3,1,[5,4]}比較[5,4],因?yàn)?>4,需要交換,數(shù)列變成{2,3,1,4,5}。經(jīng)過第一輪掃描后,會找出最大的數(shù)值5,并把它放在數(shù)值的最后面。第二輪掃描:第1次{[2,3],1,4,5}比較[2,3],因?yàn)?<3,不需要交換。第2次{2,[3,1],4,5}比較[3,1],因?yàn)?>1,需要交換,數(shù)列變成{2,1,3,4,5}。第3次{2,1,[3,4],5}比較[3,4],因?yàn)?<4,不需要交換。在第二輪掃描中,可以不去比較數(shù)列的最后一個數(shù)字,因?yàn)樵诘谝惠喼?,就已?jīng)確定它是數(shù)列中的最大數(shù)值。如果硬是要比較的話,仍然可以排列出正確的結(jié)果,只不過會降低程序效率。在這一輪掃描中,可以找出數(shù)列的第2大數(shù)值,并且把它放在數(shù)列的倒數(shù)第2個位置上。例1第三輪掃描:第1次{[2,1],3,4,5}比較[2,1],因?yàn)?>1,要交換。數(shù)列變成{1,2,3,4,5}第2次{1,[2,3],4,5}比較[2,3],因?yàn)?<3,不需要交換。這一輪中,不需再比較[3,4]的大小,因?yàn)樵谏弦惠喼?,就已?jīng)確立了4>3的事實(shí)。因?yàn)?是數(shù)列中第2大的數(shù)字,而最大的數(shù)字又已經(jīng)排在4的后面。同樣地,在這一輪掃描中,確立了數(shù)列的第3大數(shù)值是3,并且把它安置在數(shù)列的倒數(shù)第3個位置上。第四輪掃描:第1次{[1,2],3,4,5}比較[1,2],因?yàn)?<2,不需要交換。雖然外表上看起來已經(jīng)排序完畢,但是還是要經(jīng)過這一輪的掃描后才能確定。因?yàn)樵谶@次掃描后才會確定數(shù)列的第4大數(shù)值。而找出第4大數(shù)值后,因?yàn)榭偣仓挥?個數(shù)字,最小的數(shù)值也會跟著找出來,排序結(jié)束??梢杂缮厦娴倪^程看到,冒泡排序法可以想像成是讓重的東西向下沉,輕的東西向上浮。等到狀態(tài)穩(wěn)定,就會得到排序結(jié)果。PARAMETER(N=5)INTEGERA(N),TEMPDATAA/3,2,5,1,4/DOI=N-1,1,-1

DOJ=1,I

IF(A(J)>A(J+1))THENTEMP=A(J)A(J)=A(J+1)A(J+1)=TEMPENDIF

ENDDOENDDOPRINT*,AEND!開始做N-1次的掃描!一對一對的來比較,I之后的數(shù)字不用比較!如果A(J)>A(J+1)就把這兩個數(shù)值交換例14938659713762749第五節(jié)數(shù)組的應(yīng)用4938659713762749例13849659713762749例13849659713762749例13849659713762749例13849659713762749例13849657613972749例13849657613972749例13849657697132749例13849657697132749例13849657627139749例13849657627139749例13849657627134997例13849657627134997例1DOj=1,n-1if(a(j)>a(j+1))then

交換a(j),a(j+1)endifENDDO384965762713499738496576271349例1384965762713499738496576271349例1384965762713499738496576271349例1384965762713499738496576271349例1384965762713499738496576271349例1384965762713499738496513277649例1384965762713499738496513277649例1384965762713499738496513762749例1384965762713499738496513762749例1384965762713499738496513492776例1384965762713499738496513492776例1DOj=1,n-2if(a(j)>a(j+1))then

交換a(j),a(j+1)endifENDDO384965762713499738496513492776384965134927例1384965762713499738496513492776384965134927例1384965762713499738496513492776384965134927例1384965762713499738496513492776384965134927例1384965762713499738496513492776384913654927例1384965762713499738496513492776384913654927例1384965762713499738496513492776384913274965例1384965762713499738496513492776384913274965例138

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論