Fortran - Massivlər

Fortranda Massivlər

Massivlər eyni tipli elementlərdən ibarət, sabit ölçülü ardıcıl kolleksiyanı saxlamaq üçün istifadə olunur. Massivlər məlumat toplama üçün yararlıdır, lakin onları eyni tipli dəyişənlərin kolleksiyası kimi düşünmək daha faydalıdır.

Bütün massivlər ardıcıl yaddaş sahələrindən ibarətdir. Ən aşağı ünvan birinci elementə, ən yüksək ünvan isə sonuncu elementə uyğun gəlir.

Numbers(1)  Numbers(2)  Numbers(3)  Numbers(4)  … 

Massivlər birölçülü (vektorlar kimi), ikiölçülü (matrislər kimi) ola bilər və Fortran 7-ölçüyə qədər massivlər yaratmağa imkan verir.

Massivlərin Elan Edilməsi

Massivlər dimension atributu ilə elan edilir.

Məsələn, numbers adlı və real rəqəmlərdən ibarət, 5 elementə malik birölçülü massiv elan etmək üçün:

real, dimension(5) :: numbers

Massivin ayrı-ayrı elementlərinə indekslər vasitəsilə müraciət edilir. Massivin ilk elementi indeks 1-ə malikdir. numbers massivi 5 real dəyişəndən ibarətdir: numbers(1), numbers(2), numbers(3), numbers(4)numbers(5).

5 x 5 ölçülü, tam ədədlərdən ibarət ikiölçülü massiv elan etmək üçün:

integer, dimension(5,5) :: matrix

Aşağı həddi açıq şəkildə təyin edərək massiv yaratmaq da mümkündür:

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

Dəyərlərin Təyin Edilməsi

Massivin fərdi elementlərinə dəyər vermək mümkündür:

numbers(1) = 2.0

Yaxud dövr (loop) istifadə edə bilərsiniz:

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

Birölçülü massiv elementlərinə qısa yazılışla dəyər təyin etmək də mümkündür:

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

Qeyd: Qapaq mötərizəsi ‘(’ ilə əks əyrixət ‘/’ arasında boşluq buraxılmamalıdır.

Nümunə

Aşağıdakı nümunədə qeyd edilən konsepsiyalar təsvir olunur.

Kod Nümunəsi

program arrayProg
   real :: numbers(5) ! birölçülü massiv
   integer :: matrix(3,3), i, j ! ikiölçülü massiv

   ! numbers massivinə dəyərlər təyin edilməsi
   do i=1,5
      numbers(i) = i * 2.0
   end do

   ! dəyərlərin ekrana çıxarılması
   do i = 1, 5
      Print *, numbers(i)
   end do

   ! matrix massivinə dəyərlər təyin edilməsi
   do i=1,3
      do j = 1, 3
         matrix(i, j) = i + j
      end do
   end do

   ! dəyərlərin ekrana çıxarılması
   do i=1,3
      do j = 1, 3
         Print *, matrix(i, j)
      end do
   end do

   ! qısa yazılışla təyinat
   numbers = (/1.5, 3.2, 4.5, 0.9, 7.2/)

   ! dəyərlərin ekrana çıxarılması
   do i = 1, 5
      Print *, numbers(i)
   end do
end program arrayProg

Kodun icra nəticəsi belə olacaq:

 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    

Massivlərlə Əlaqədar Termlər

TermMənası
RankMassivin ölçülərinin sayı. Məsələn, matrix massivi üçün rank 2, numbers massivi üçün rank 1-dir.
ExtentBir ölçü boyunca elementlərin sayı. numbers massivi üçün extent 5, matrix üçün isə hər ölçüdə 3-dür.
ShapeMassivin ölçülərini göstərən birölçülü tam ədədlər massivi. Məsələn, matrix üçün shape (3, 3), numbers üçün isə (5)-dir.
SizeMassivin cəmi elementlərinin sayı. matrix üçün size 9, numbers üçün isə 5-dir.

Massivlərin Prosedurlara Göndərilməsi

Massivləri prosedura arqument kimi göndərmək mümkündür. Nümunə:

Kod Nümunəsi

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
   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

Kodun icra nəticəsi:

1
2
3
4
5

Massiv Seqmentləri

Massivin bir hissəsinə müraciət etmək üçün subscript triplet adlanan xüsusi notasiya istifadə olunur:

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

Massiv seqmentlərindən istifadə nümunəsi:

program arraySubsection

   real, dimension(10) :: a, b
   integer :: i

   a(1:7) = 5.0 ! a(1) - a(7) arası 5.0
   a(8:) = 0.0  ! qalanlar 0.0
   b(2:10:2) = 3.9
   b(1:9:2) = 2.5
   
   do i = 1, 10
      Print *, a(i)
   end do

   do i = 1, 10
      Print *, b(i)
   end do
end program arraySubsection

Nəticə:

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