Fortran數(shù)組

2018-12-12 14:24 更新

陣列可以存儲(chǔ)相同類型的元件的固定大小的連續(xù)集合。數(shù)組是用于存儲(chǔ)數(shù)據(jù)的集合,但是認(rèn)為一個(gè)陣列的相同類型的變量的集合是往往更為有用。

所有陣列由連續(xù)存儲(chǔ)單元。最低的地址對(duì)應(yīng)于第一元件和最高地址的最后一個(gè)元素。

數(shù)字(1) 號(hào)(2) 數(shù)(3) 號(hào)(4) ...

數(shù)組可以是一維的(如向量),二維(如矩陣)和Fortran允許您創(chuàng)建多達(dá)7維數(shù)組。

聲明數(shù)組

數(shù)組聲明為維度屬性。

例如,要聲明一個(gè)一維數(shù)組命名編號(hào),包含5個(gè)元素的實(shí)數(shù),你寫的,

real, dimension(5) :: numbers

陣列的各個(gè)元件通過(guò)指定其下標(biāo)被引用。數(shù)組的第一元件具有一個(gè)的下標(biāo)。數(shù)組編號(hào)包含五個(gè)實(shí)變量 - 值(1),數(shù)字(2),數(shù)字(3),數(shù)字(4),和數(shù)字(5)。

要?jiǎng)?chuàng)建一個(gè)名為矩陣整數(shù)5×5二維數(shù)組,你寫的:

integer, dimension (5,5) :: matrix  

你也可以用聲明一些明確的下限,例如一個(gè)數(shù)組:

real, dimension(2:6) :: numbers
integer, dimension (-3:2,0:4) :: matrix  

賦值

您可以將值分配給各個(gè)成員一樣,

numbers(1) = 2.0

或者,你可以使用一個(gè)循環(huán),

do i=1,5
   numbers(i) = i * 2.0
end do

一維數(shù)組元素可以直接分配使用短手形符號(hào),被稱為數(shù)組構(gòu)造,如價(jià)值觀,

numbers = (/1.5, 3.2,4.5,0.9,7.2 /)

請(qǐng)注意,不存在允許的括號(hào)“(”和背面斜杠“/”之間的空間

下面的例子演示了上面討論的概念。

program arrayProg

   real :: numbers(5) !one dimensional integer array
   integer :: matrix(3,3), i , j !two dimensional real array
   
   !assigning some values to the array numbers
   do i=1,5
      numbers(i) = i * 2.0
   end do
   
   !display the values
   do i = 1, 5
      Print *, numbers(i)
   end do
   
   !assigning some values to the array matrix
   do i=1,3
      do j = 1, 3
         matrix(i, j) = i+j
      end do
   end do
   
   !display the values
   do i=1,3
      do j = 1, 3
         Print *, matrix(i,j)
      end do
   end do
   
   !short hand assignment
   numbers = (/1.5, 3.2,4.5,0.9,7.2 /)
   
   !display the values
   do i = 1, 5
      Print *, numbers(i)
   end do
   
end program arrayProg

當(dāng)上述代碼被編譯和執(zhí)行時(shí),它產(chǎn)生了以下結(jié)果:

 2.00000000    
 4.00000000    
 6.00000000    
 8.00000000    
 10.0000000    
         2
         3
         4
         3
         4
         5
         4
         5
         6
 1.50000000    
 3.20000005    
 4.50000000    
0.899999976    
 7.19999981    

某些陣列相關(guān)術(shù)語(yǔ)

下表給出了一些陣列相關(guān)的術(shù)語(yǔ):

術(shù)語(yǔ)含義
它是尺寸數(shù)組具有的數(shù)目。例如,對(duì)于在陣列命名矩陣,秩是2,和對(duì)于該陣列命名號(hào),等級(jí)為1。
程度它是沿著一維的元素的數(shù)量。例如,陣列數(shù)有程度5和命名矩陣陣列具有在兩個(gè)維度程度3。
形狀陣列的形狀是一維整數(shù)數(shù)組,包含在每一維的元素(的程度)的數(shù)量。例如,對(duì)于在陣列基質(zhì),形狀為(3,3)和數(shù)組編號(hào)是(5)。
尺寸它是一個(gè)數(shù)組包含的元素?cái)?shù)量。為陣列矩陣,它是9,和用于陣列的數(shù)字,它是5。

將數(shù)組傳遞給過(guò)程

你可以傳遞一個(gè)數(shù)組一個(gè)過(guò)程作為參數(shù)。下面的例子演示了這個(gè)概念:

program arrayToProcedure      
implicit none      

   integer, dimension (5) :: myArray  
   integer :: i
   
   call fillArray (myArray)      
   call printArray(myArray)
   
end program arrayToProcedure


subroutine fillArray (a)      
implicit none      

   integer, dimension (5), intent (out) :: a
   
   ! local variables     
   integer :: i     
   do i = 1, 5         
      a(i) = i      
   end do  
   
end subroutine fillArray 


subroutine printArray(a)

   integer, dimension (5) :: a  
   integer::i
   
   do i = 1, 5
      Print *, a(i)
   end do
   
end subroutine printArray

當(dāng)上述代碼被編譯和執(zhí)行時(shí),它產(chǎn)生了以下結(jié)果:

1
2
3
4
5

在上面的例子中,子程序fillArray和printArray只能與維5.陣列稱為然而,為了編寫可用于任何大小的陣列子程序,則可以使用以下技術(shù)重寫:

program arrayToProcedure      
implicit  none    

   integer, dimension (10) :: myArray  
   integer :: i
   
   interface 
      subroutine fillArray (a)
         integer, dimension(:), intent (out) :: a 
         integer :: i         
      end subroutine fillArray      

      subroutine printArray (a)
         integer, dimension(:) :: a 
         integer :: i         
      end subroutine printArray   
   end interface 
   
   call fillArray (myArray)      
   call printArray(myArray)
   
end program arrayToProcedure


subroutine fillArray (a)      
implicit none      
   integer,dimension (:), intent (out) :: a      
   
   ! local variables     
   integer :: i, arraySize  
   arraySize = size(a)
   
   do i = 1, arraySize         
      a(i) = i      
   end do  
   
end subroutine fillArray 


subroutine printArray(a)
implicit none

   integer,dimension (:) :: a  
   integer::i, arraySize
   arraySize = size(a)
   
   do i = 1, arraySize
     Print *, a(i)
   end do
   
end subroutine printArray

請(qǐng)注意,該程序正在使用尺寸函數(shù)獲取陣列的大小。

當(dāng)上述代碼被編譯和執(zhí)行時(shí),它產(chǎn)生了以下結(jié)果:

1
2
3
4
5
6
7
8
9
10

陣列部分

到目前為止,我們已經(jīng)提到了整個(gè)數(shù)組,F(xiàn)ortran語(yǔ)言提供了一種簡(jiǎn)單的方法來(lái)指多個(gè)元素,或陣列的部分,使用一個(gè)單獨(dú)的語(yǔ)句。

訪問(wèn)的陣列部分中,需要提供的下限和上限的部分,以及一個(gè)步幅(增量),對(duì)于所有的尺寸。這種表示法被稱為下標(biāo)三元組:

array ([lower]:[upper][:stride], ...)

當(dāng)沒(méi)有下限和上限被提及,它默認(rèn)為你聲明的跨越和邁進(jìn)值默認(rèn)為1。

下面的例子演示了這個(gè)概念:

program arraySubsection

   real, dimension(10) :: a, b
   integer:: i, asize, bsize
   
   a(1:7) = 5.0 ! a(1) to a(7) assigned 5.0
   a(8:) = 0.0  ! rest are 0.0 
   b(2:10:2) = 3.9
   b(1:9:2) = 2.5
   
   !display
   asize = size(a)
   bsize = size(b)
   
   do i = 1, asize
      Print *, a(i)
   end do
   
   do i = 1, bsize
      Print *, b(i)
   end do
   
end program arraySubsection

當(dāng)上述代碼被編譯和執(zhí)行時(shí),它產(chǎn)生了以下結(jié)果:

5.00000000    
5.00000000    
5.00000000    
5.00000000    
5.00000000    
5.00000000    
5.00000000    
0.00000000E+00
0.00000000E+00
0.00000000E+00
2.50000000    
3.90000010    
2.50000000    
3.90000010    
2.50000000    
3.90000010    
2.50000000    
3.90000010    
2.50000000    
3.90000010 

陣列內(nèi)部函數(shù)

Fortran的90/95提供了一些固有的程序。它們可分為7類。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)