Fortran程序設計基礎課件_第1頁
Fortran程序設計基礎課件_第2頁
Fortran程序設計基礎課件_第3頁
Fortran程序設計基礎課件_第4頁
Fortran程序設計基礎課件_第5頁
已閱讀5頁,還剩66頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第5章數組第1頁,共71頁。數組的概念 在實際問題中,往往遇到要處理的數據是一組或一批同類型的數據,而且它們是按一定次序進行排列的。如, 某班30名學生的單科成績: 85,79,81,68, (分) 某廠3個車間全年各季度的產量:一車間:15.8, 12.4,18.2,19.6二車間:8.7, 9.6, 10,8, 9.8 三車間:12.3, 14.8, 16.7, 11.3第2頁,共71頁。數組的概念 對上述問題,欲保留學生成績則需要定義30個變量;保留某廠各車間各季度的產量就需要十二個變量。并且某個變量所表示的數據的順序也無法確定。 若有1個班50人,或一個廠有10個車間,就需要定義大量變

2、量來保存這些數據,顯然這會使程序笨長,也不便于閱讀。 怎樣解決這一問題?數組。第3頁,共71頁。數組的概念數組:一組帶下標的變量如對成績:定義數組:x(30) x(1),x(2),x(3),x(30) 用于存放30名學生的成績。 數組名下標第4頁,共71頁。數組的概念如:對某廠三個車間的產量。 定義數組:q(3,4) q(1,1),q(1,2),q(1,3),q(1,4) q(2,1),q(2,2),q(2,3),q(2,4) q(3,1),q(3,2),q(3,3), q(3,4) 用于存放三個車間全年各季度的產量。 這里的x(i), q(i,j)稱為數組元素(或下標變量)。第5頁,共71頁

3、。數組的概念求30名學生的平均成績:用變量:定義變量x1,x2,x30存放30名學生成績 sum=0.0 sum=x1+x2+x3+x30 avg=sum/30用數組:定義數組:x(30)存放30名學生成績 sum=0.0 do i=1,30 sum=sum+x(i) enddo avg=sum/30第6頁,共71頁。數組的說明與引用 使用數組必須遵循“先說明,后使用”的原則。說明的目的是通知編譯系統為數組分配相應的存貯單元。 數組名 數組特性 維數,即下標的個數(17) 下標取值范圍(上界、下界) 類型,由數組名類型決定 用兩種方法說明數組: 用類型說明語句(“顯式說明”) 用dimensi

4、on語句(“隱式說明”)第7頁,共71頁。數組的說明與引用一、用類型語句說明數組 一般形式: 類型說明 數組說明符,其中,數組說明符的一般形式為: 數組名(維說明符, )其中,維說明符由“下標下界:下標上界”組成。第8頁,共71頁。數組的說明與引用例: real xn(1:10),w(1:2,1:3),kw(10:20) Integer bc(1:100),py(0:2,0:3,0:5)二、用dimension語句說明數組 一般形式: dimension 數組說明符,第9頁,共71頁。數組的說明與引用例1: dimension x1(1:10),nw(1:2,1:3)例2: dimension

5、 tk(1:100),imax(1:2,1:3) integer tk real imax例3: real(8),dimension(1:10):a,b,c Integer,dimension(4,5):d,e第10頁,共71頁。數組的說明與引用注意一下幾點:在數組說明符中,維說明符(下標)的個數稱為數組的維數。維數說明符只能使用整型常量或整型符號常量及表達式。例: parameter (i=1,j=10) real kx(i:j+5) read(*,*)n real sum(n) 違背了先說明的規則第11頁,共71頁。數組的說明與引用維說明符的下標下界為1時,可以省略。 例:integer

6、bc(1:100),w(1:2,1:10) integer bc(100),w(2,10)數組說明語句必須寫在所有可執行語句之前。數組名與同一程序單位中的變量名不能同名。第12頁,共71頁。2022/7/2913數組的說明與引用三、數組元素的引用程序中對數組元素的操作,與同類型的簡單變量相同。 一般形式: 數組名(下標,) 即要有確定的數組名和下標值。 例:xn(5)=10; w(1,3)= kw(1,2,3) 引用數組元素時,下標可用算術表達式。 例:bc(i)= py(i+j,k) ! i,j,k是維數定義范圍的具體值第13頁,共71頁。數組的說明與引用注意:下標表達式不能“越界”例如:

7、integer s(10) i=10 s(i+1)=s(i)*2 下標的個數要與對應的數組維說明符相同例如:dimension w(5,12) w(2,10)=123.4 w(4)=567.8 X 第14頁,共71頁。數組的邏輯結構和存儲結構 數組的邏輯結構數組所表示的實際數據結構。 數組的存儲結構數組在機內存儲時的排列結構。一、一維數組 此邏輯結構為一組依次排列的一串數據。 例:a(5) a(1),a(2),a(3),a(4),a(5) 此存儲結構為一組連續存放的一列數據塊。 例:a(5) a(1) a(2) a(3) a(4) a(5)第15頁,共71頁。16數組的邏輯結構和存儲結構二、二

8、維數組 此邏輯結構為一張二維表數據。 例:a(3,4)可以看作一張3行4列的二維表數據。即: a( 3, 4 ) 行 列a(1,1)a(1,2)a(1,3)a(1,4)a(2,1)a(2,2)a(2,3)a(2,4)a(3,1)a(3,2)a(3,3)a(3,4)第16頁,共71頁。數組的邏輯結構和存儲結構 此存儲結構為一組按列連續存放的數據塊。 例:a(3,4)a(1,1)a(3,2)a(2,4)a(1,4)a(3,3)a(2,3)a(1,2)a(3,1)a(2,1)a(1,3)a(2,2)a(3,4)第17頁,共71頁。2022/7/2918數組的邏輯結構和存儲結構三、三維數組 此邏輯結構

9、為若干張二維表數據。例:a(2,2,3) 2行2列的表,共3頁。即: 行 列 頁a(1,1,1)a(1,2,1)a(2,1,1)a(2,2,1)a(1,1,2)a(1,2,2)a(2,1,2)a(2,2,2)a(1,1,3)a(1,2,3)a(2,1,3)a(2,2,3)第二頁第三頁第一頁第18頁,共71頁。2022/7/2919數組的邏輯結構和存儲結構此存儲結構為一組按頁連續存放的數據塊。例:a(2,2,3) 了解數組的邏輯結構和存儲結構,對我們合理地選用數組和對數組進行輸入輸出有很大好處。a(1,1,1)a(2,1,2)a(1,2,3)a(2,1,3)a(1,1,3)a(2,2,2)a(2

10、,2,1)a(1,2,1)a(2,1,1)a(1,2,2)a(1,1,2)a(2,2,3)第19頁,共71頁。2022/7/2920數組的輸入和輸出有三種方式: 用數組名 用do循環 用隱含do循環第20頁,共71頁。2022/7/2921數組的輸入和輸出一、用數組名進行數組的輸入輸出 在用數組名進行數組的輸入輸出時,其順序要與數組元素在機內的存儲順序一致。 例如: dimension k(5) read *,k 對數組的整體進行操作等價于: read *,k(1),k(2),k(3),k(4),k(5)第21頁,共71頁。2022/7/2922數組的輸入和輸出例2:試輸入以下2名學生3門功課

11、的成績。 integer g(2,3) read *,g等價于: read *,g(1,1),g(2,1),g(1,2),g(2,2),g(1,3),g(2,3)鍵盤輸入(按列輸入): 86,87,75,70,72,83837087727586制圖英語數學第22頁,共71頁。2022/7/2923數組的輸入和輸出二、用do循環進行數組的輸入輸出例:試輸入以下2名學生3門功課的成績。837087727586制圖英語數學第23頁,共71頁。數組的輸入和輸出編程如下: integer g(2,3) do i=1,2 do j=1,3 read(*,*)g(i,j) enddo enddo end 鍵

12、盤輸入(按行輸入):86,75,72,87,70,83837087727586制圖英語數學第24頁,共71頁。數組的輸入和輸出 integer g(2,3) read(*,*)(g(i,j),j=1,3),i=1,2) write(*,*)(g(i,j),j=1,3),i=1,2) end do i=1,2 do j=1,3 read(*,*)g(i,j) enddoenddo內循環外循環等同于:read(*,*)g(1,1),g(1,2),g(1,3),g(2,1),g(2,2),g(2,3)由于是一個read語句,所以既可以一行輸入,也可以分多行輸入。鍵盤輸入如下: 86,75,72 87

13、,70,83第25頁,共71頁。數組的輸入和輸出 要記注:一個read語句可以分多行輸入,而有多個read語句時,每一個read語句必須從新的一行讀數。 將若干名學生的學號及五門課程的成績,編成一個較完整的輸入輸出程序如下:第26頁,共71頁。數組的輸入和輸出 parameter (m=30,n=5) dimension kd(m,n) character num(m)*5 定義一個字符型數組 read(*,*)(num(i),(kd(i,j),j=1,n),i=1,m) print *,序號 學號 語文 英語 數學 物理 化學 print 100,(i,num(i),(kd(i,j),j=1

14、,n),i=1,m)100 format(1x,i3,3x,a5,2x,5i4) end 第27頁,共71頁。read(*,*)(num(i),(kd(i,j),j=1,n),i=1,m)數組的輸入和輸出do i=1,m read(*,*)num(i), (kd(i,j),j=1,n)enddodo i=1,m read(*,*)num(i), kd(i,1), kd(i,2), kd(i,3), kd(i,4), kd(i,5) enddo第28頁,共71頁。數組的輸入和輸出10 format(1x,i3,3x,a5,2x,5i4) print 10,(i,num(i),(kd(i,j),j

15、=1,n),i=1,m) Do i=1,m print 10,i,num(i),(kd(i,j),j=1,n)EnddoDo i=1,m print 10,i,num(i),kd(i,1),kd(i,2),kd(i,3),kd(i,4),kd(i,5)enddo 第29頁,共71頁。7.4 數組的輸入和輸出輸出結果的形式為:序號 學號 語文 英語 數學 物理 化學 1 00101 78 84 90 80 91 2 00102 30 00130 第30頁,共71頁。給數組賦初值 在Fortran程序中,可用data語句給變量或數組賦初值。 一般形式: data 變量表/初值表/,變量表/初值表,

16、 功能:在程序編譯期間給變量或數組賦初值。 其中,變量表可以是變量名、數組名、數組元素、隱do循環;初值表只能是常量,不允許出現任何形式的表達式。第31頁,共71頁。2022/7/2932給數組賦初值例1: data x,y,z/15.7,42.4,108.5/例2: data a,b/7.85,9.1/,i,j,k/5,10,15/例3: dimension k(2,3) data(k(i,j),j=1,3),i=1,2)/90,23,20,42,14,32/或: data k/90,42,23,14,20,32/第32頁,共71頁。給數組賦初值例4: dimension a(10) dat

17、a a/10*-1.0/ (表示“10個-1.0”) 注:data語句屬說明語句,但它可以放在end語句之前的任意行。其作用相當于賦值。第33頁,共71頁。給數組賦初值使用數組賦值符賦初值 一般形式: 數組名=( /取值列表/ ) 例如: integer m(6) m=( /2,3,4,5,6,7/ ) 第34頁,共71頁。給數組賦初值 integer p(-1:8) p=(/3,0,(i,i=1,9,2),45,56,6+2*8/) print 100, (p(i),i=-1,8) 100 format (1x,10i5) end第35頁,共71頁。給數組賦初值Fortran 90 中,除了

18、可以對一個一個的元素慢慢來設定初值外,還可以一口氣把整個數組內容設置為同一個數值。Integer: A(3)=3!A(1)=A(2)=A(3)=3第36頁,共71頁。數組應用舉例例:從鍵盤輸入10個整數,然后將最大數與第一個數交換,最小數與最后一個數交換。integer, dimension(10): ainteger m,kdo k=1,10 read(*,*) a(k)enddom=1do k=2,10 if(a(m)a(k) m=k enddo n=a(m);a(m)=a(10);a(10)=n print 100, (a(k),k=1,10)100 format(1x,10i6) en

19、d第38頁,共71頁。數組應用舉例例7.10:設有一個45矩陣。(1)求下面矩陣的所有元素之和及平均值。(2)保留所有大于平均值的元素,其余元素清零第39頁,共71頁。 integer a(4,5)data a/2,5,12,7,6,-1,0,6,4,3,4,-9,9,8,10,5,-13,7,2,3/sum=0do i=1,4 do j=1,5 sum=sum+a(i,j) enddoenddoaverage=sum/(4*5)print *,sum=,sumprint*,average=,average第40頁,共71頁。 do i=1,4 do j=1,5 if (a(i,j)C第47頁

20、,共71頁。題目5.1 輸入若干學生一門課的成績,統計各分數段的人數。凡不及格(60)都由一個計數器來統計,其他以10分一個分數段。題目5.2 輸入54矩陣,求出每行元素之和,并把和值最大的那一行元素和第一行元素對調。第48頁,共71頁。部分數組運算A(3:5)=5A(3:)=5A(3:5)=(/3,4,5/)A(1:3)=b(4:6)A(1:5:2)=3 隱式循環A(1:10)=a(10:1:-1)A(:)=b(:,2)A(:,:)=b(:,:,1)等號兩邊所使用的數組元素數目要一樣多同時使用多個隱式循環時,較低維度的循環可以想象為內層循環Intetger: a(2,2), b(2,2)B=

21、a(2:1:-1, 2:1:-1)B(1,1)=a(2,2) B(2,1)=a(1,2)B(1,2)=a(2,1) B(2,2)=a(1,1)第49頁,共71頁。常用內在函數Fortran語言中的內在函數通常都可以接受數組作為參數來進行運算,此外還有一些專用的函數適用于處理數組所特有的運算。本節就將介紹這些內在函數在數組領域的應用。第50頁,共71頁。內部基本函數在Fortran語言的數組表達式中,允許將數組作為內部基本函數的參數。此時,內部基本函數的函數值就是一個同參數數組形狀相同的數組,它的每個位置上的元素值就是被操作數組對應位置上的數組元素取該基本函數所得的值。例如數組A和B都是形狀相同

22、的一維數組,則語句B=SQRT(A)的執行結果可以表示如下:第51頁,共71頁。矩陣乘積函數該函數的作用是執行數值型或邏輯型數組A與B的矩陣乘法。函數的原型為:C = MATMUL(A, B)使用時,數組A和B必須是秩為1或2(也就是一維或二維)的數值型或邏輯型的有值數組,且數組A和B中至少有一個的秩為2。傳入矩陣乘積函數的數組A與B的類型必須相同。數組A與B的矩陣乘積規則和結果與數學上的矩陣乘法定義一致,也就是說數組A的最后一維的長度必須和數組B的第一維的長度相同。結果數組C的秩和形狀取決于參數數組的秩和形狀:如果A的形狀為(n,m),B的形狀為(m,k),則結果數組C的秩為2,形狀為(n,

23、k)。如果A的形狀為(m),B的形狀為(m,k),則結果數組C的秩為1,形狀為(k)。如果A的形狀為(n,m),B的形狀為(m),則結果數組C的秩為1,形狀為(n)。 第52頁,共71頁。向量點乘函數該函數的作用是執行數值型或邏輯型數組A與B的點積乘法。函數的原型為:C = DOT_PRODUCT(A,B)使用時,數組A和B必須是秩為1(即數學上所說的向量,也即一維數組)的數值型或邏輯型的有值數組,且數組A與B的類型必須相同。一維數組A與B點乘的結果是標量,函數的點乘規則和結果值與數學上的定義相同。如果一維數組A和B中有一個的長度為0,且數組為數值型數組,則結果為0;如果數組為邏輯型數組,則結

24、果為.FALSE.。例如DOT_PRODUCT(/1,2,3/),(/3,4,5/)的結果為26,計算過程為(1 x 3)+(2 x 4)+(3 x 5)=26。第53頁,共71頁。元素求和函數元素求和函數屬于數組規約函數中的一種。數組規約函數是一組功能類似的數組函數的統稱。這組函數的主要作用就是沿著數組中的某一維,對在屏蔽表達式中值為.TRUE.的所有數組元素進行某種操作。這組函數包括SUM、PRODUCT、MAXVAL、MINVAL、COUNT、ANY和ALL函數。元素求和函數的主要作用是沿著數組中的某一維,對在屏蔽表達式中值為.TRUE.的所有元素求和。函數的原型為:C = SUM(A,

25、DIM,MASK)第54頁,共71頁。元素連乘求積函數該函數的主要作用是沿著數組中的某一維,對在屏蔽表達式中值為.TRUE.的所有數組元素求連乘積。函數的原型為:C = PRODUCT(A,DIM,MASK)其中的注意事項和說明同元素求和函數。下面是一些實例。比如數組A=(/2,4,6/),則PRODUCT(A)的值是48;又如PRODUCT(B,MASK=B5), all (ab)Any(mask, dim) 對數組做邏輯運算,如果任意元素合乎條件就返回真值,否則返回假值,例如all(a5), all (ab)count(mask, dim) 對數組做邏輯運算,返回合乎條件的元素的數目第56

26、頁,共71頁。數組大小查詢函數該函數是數組查詢函數中的一種。數組查詢函數一組功能類似于數組函數的統稱。這組函數包括:SIZE、SHAPE、ALLOCATED、LBOUND和UBOUND函數。這里只介紹其中的兩種:數組大小查詢函數和數組形狀查詢函數。數組大小查詢函數的作用是求數組沿著某一維的長度或者數組元素的總數目。函數原型為:C = SIZE(A,DIM)其中A是被查詢數組,可以是假定大小數組,但不能是未定義的指針數組或未分配空間的可分配數組。當DIM等于1時,表示查詢數組有幾行;當DIM等于2時,表示查詢數組有幾列;當DIM被省略時,表示查詢數組有多大(即有多少個元素)。Shape(a) 返

27、回數組的維數及大小,假設a為n維數組,返回值為大小為n的一維數組Lbound(a,dim) ubound(a,dim) 返回數組聲明時的下限和上限值第57頁,共71頁。數組形狀查詢函數該函數的功能就是求數組或標量的形狀。函數的原型為:C = SHAPE(A)其中,A表示被查詢對象,可以是標量或數組,但不能是假定大小數組、未定義的指針或未分配空間的可分配數組;C保存查詢結果,是一個一維整型數組。比如SHAPE(2)將返回一個零長度一維數組;如果對數組B(-2:5,9:10)進行查詢,則SHAPE(B)將返回一維數組(8,2)。第58頁,共71頁。數組合并函數數組合并函數是數組構造函數中的一種。數

28、組構造函數也是一系列功能相似的函數的總稱,它們用于從已有數組的元素構造出新數組。這組函數包括:MERGE、PACK,UNPACK和SPREAD函數。數組合并函數的只要用途就是在屏蔽表達式的控制下,對兩個獨立數組進行合并操作。該函數的原型為:C = MERGE(TSOURCE,FSOURCE,MASK)其中,TSOURCE可以是任意類型的數組或標量,FSOURCE是必須與TSOURCE具有相同的類型和類型參數的數組或標量。屏蔽表達式MASK必須是邏輯型數組;若MASK值為真,則結果是TSOURCE,若MASK值為假,則結果是FSOURCE。第59頁,共71頁。數組壓縮函數該函數的作用就是在屏蔽表

29、達式的控制下,將數組壓縮成向量數組。數組的原型為:C = PACK(A,MASK,VECTOR)A表示被壓縮對象,可是任意類型的數組;屏蔽表達式MASK必須是邏輯型數組,并且與數組A相容(也就是形狀相同);VECTOR是可選參數,必須為向量數組,并且與數組A具有相同的類型和類型參數。根據數組在內存中的排列順序,按照mask的運算值,把判斷成立的數值從A中取出,放到返回值的一維數組中。當vector沒有輸入時,返回值數組大小為a中成立的數值數目。Vector 有輸入時,返回值數組大小與vector相同。第60頁,共71頁。數組形狀擴展和重構形函數這是一個由兩個函數組成的函數族,包括SPREAD函

30、數與RESHAPE函數,用于完成數組形狀重構和擴展的任務。SPREAD函數的主要功能就是將數組沿著某一維的方向拷貝規定次數后擴展成一個新的數組。函數的原型為:C = SPREAD(A,DIM,NCOPIES)其中,A為被拷貝對象,可以是標量或任意類型的數組。當DIM等于1時,表示沿著第一維下標變化的方向擴展,也稱為向下擴展;當DIM等于2時,表示沿著第二維下標變化方向擴展,也稱為向右擴展。NCOPIES用于指定拷貝的次數。 第61頁,共71頁。數組轉置函數數組轉置函數是數組運算函數中的一種。數組運算函數是數組函數中同矩陣運算相關的一組函數的總稱,這組函數包括:TRANSPOSE、EOSHIFT

31、和CSHIFT三個函數。數組轉置函數的用途就是對秩為2的數組(就是二維數組)進行轉置操作。函數的原型為:C = TRANSPOSE(MATRIX)其中,數組MATRIX必須是一個二維數組。轉置后的結果數組C的形狀正好與數組MATRIX的形狀相反。也就是說MATRIX(n,m)轉置后的結果為C(m,n)。 第62頁,共71頁。去端移動函數該函數的作用是對秩為1的數組作去端移位處理,或沿著某一維對秩大于1的數組在所有秩為1的完整數組片段上作去端移位處理。函數的原型為:C = EOSHIFT(A,SHIFT,BOUNDARY,DIM)其中,A為被進行去端移位處理的數組。SHIFT表示移動的位數,必須

32、為整數;當SHIFT為正時,表示去端左移,當SHIFT為負時,表示去端右移。在數組或數組片段的一端被移出的元素被丟棄,并在另一端移入相同數量的BOUNDARY的值。DIM表示要進行去端移位處理的數組的維,默認為1。不同的片段可以有不同的BOUNDARY值,并可在不同的方向上移動不同的位數。 Boundary未賦值時,會自動填充0第63頁,共71頁。循環替換函數該函數的作用是將秩為1的數組的所有元素或高維數組的指定維上的元素進行循環移動。在一端上移走的元素被插到另一端。函數的原型為:C = CSHIFT(A,SHIFT,DIM)其中,A為被操作數組。SHIFT為正值時被移向左端,負值時則移向右端。DIM可以指定要進行操作的數組的維,默認值為1。比如數組A=1,2,3,4,5,6,則CSHIFT(A,SHIFT=2)的結果是3,4,5,6,1,2;而CSHIFT(A,SHIFT=-2)的結果則5,6,1,2,3,4。第64頁,共71頁。最大值元素定位函數該函數是兩個數組定位函數之一,另一個不用說也知道是最小值元素定位函數(MINLOC)。函數的原型為:C = MAXLOC(A,DIM,MASK)函數根據屏蔽表達式MASK的真值條件確定數組A中的所有元素或沿某一維DIM所有元素中第一個最大值元素出現的位置。結果C的形式取決于數組A的秩:當秩為1時,C為標量;當秩不為1時,C

溫馨提示

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

評論

0/150

提交評論