با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، در این پست آموزشی دوره فرترن به بررسی آرایه ها در فرترن خواهیم پرداخت.آرایه ها در فرترن مجموعه ای از عناصر هم نوع است. تمام آرایه ها شامل مکان های حافظه مجاور نیز می باشد. پایین ترین آدرس مربوط به اولین عنصر و بالاترین آدرس به آخرین عنصر مربوط است. انتقال آرایه به رویه در فرترن ، فراخوانی آرایه ها در فرترن و توابع ذاتی آرایه در فرترن از جمله مباحثی است که به آن اشاره می شود.
یک آرایه برای ذخیره مجموعه ای از داده ها استفاده می شود،گاهی وقتها لازم است که یک سری از داده هم نوع را دریافت کرده و بروی آنها عملیات خاصی را مثل مقایسه یا مرتب کردن و … را انجام دهیم.
لذا باید آنها را بگونه ای خاص در کنار یکدیگر قرار دهیم که این مسئله در برنامه نویسی را با استفاده از آرایه ها حل خواهیم کرد .
… | عدد چهارم | عدد سوم | عدد دوم | عدد اول |
آرایه ها در فرترن می توانند یک بعدی (مثل بردار)، دو بعدی (مثل ماتریس ها) باشند.
Fortran به شما اجازه می دهد تا آرایه های ۷ بعدی را ایجاد کنید.
آرایه ها با ابعاد بعدی شان فراخوانی می شوند.
برای مثال، برای فراخوانی یک آرایه یک بعدی numbers ، که شامل اعداد حقیقی حاوی ۵ عنصر است، شما می نویسید :
1 | real, dimension(5) :: numbers |
دسترسی به هريک از اجزائ آرايه ها با استفاده از انديسهای آن صورت می گيرد.
البته دستوراتی در فرترن ۹۰ وجود دارد که کار با آرايه ها را سريعتر و کارآمدتر کرده است و در صورتی که چنين دستوراتی وجود داشته باشد، از آنها استفاده کنيد. مخصوصاً اگر برای استفاده از کامپيوترهای چند پردازنده ای برنامه نويسی می کنيد.عناصر فردی آرایه ها با مشخص کردن اندیس های آنها ارجاع داده می شوند.
اولین عنصر یک آرایه دارای یک اندیس است.
آرایه numbers شامل پنج متغیر واقعی : اعداد (۱)، اعداد (۲)، اعداد (۳)، اعداد (۴) و اعداد (۵) می باشد.
برای ایجاد یک آرایه دو بعدی ۵ * ۵ از اعداد صحیح به نام matrix، شما می نویسید :
1 | integer, dimension (5,5) :: matrix |
شما همچنین می توانید آرایه را با برخی از محدودیت های صریح اعلان کنید، مثلا :
1 2 | real, dimension(2:6) :: numbers integer, dimension (-3:2,0:4) :: matrix |
شما می توانید مقادیر را به اعضای فرد اختصاص دهید، مانند :
1 | numbers(1) = 2.0 |
همچنین می توانید از حلقه نیز استفاده کنید :
1 2 3 | do i =1,5 numbers(i) = i * 2.0 end do |
عناصر آرایه ی یک بعدی می توانند به طور مستقیم مقادیر را با استفاده از نماد short hand اختصاص دهند، این عمل سازنده آرایه نامیده می شود، مانند :
1 | numbers = (/1.5, 3.2,4.5,0.9,7.2 /) |
لطفا توجه داشته باشید که فضاهای خالی بین براکت و بک اسلش وجود نداشته باشد.
مثال زیر مفاهیم مورد بحث در بالا را نشان می دهد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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 |
بهد از کامپایل و اجرای کد بالا،نتیجه زیر حاصل می شود :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 |
در بیشتر موارد شما می خواهيد که يک آرايه را به يک تابع ارسال کنيد, تنها مشکل عدم اطلاع آرايه از اندازه خودش می باشد. پس بايد آرايه فرستاده شده به تابع دارای اندازه ثابت باشد (array size-fixed)يا بايد اندازه آرايه را هم بعنوان يک پارامتر ديگر به تابع ارسال کنيم تا مبادا از مرزهای آرايه فراتر برويم!
اگر اندازه آرايه مشخص نباشد می توانيم آن آرايه را با آرگومان * برای آخرين پارامتر آرايه (فقط يک بعد از آرايه را می توان به اين شکل تعريف کرد) به تابع ارسال کنيم.
در هر حال بخاطر داشته باشيد که مترجم برنامه از طول آرايه اطلاع نخواهد داشت و شما خودتان بايد مطمئن شويد که فراتر از محدوده اعضاء آرايه نرويد.
جدول زیر برخی از شرایط مرتبط با آرایه را می دهد :
واژه | معنی |
Rank | تعداد ابعاد یک آرایه است. به عنوان مثال، برای آرایه matrix، مقدار Rank برابر۲ است و برای آرایه numbers، رتبه ۱ است. |
Extent | تعداد عناصر در امتداد ابعاد است. به عنوان مثال، در آرایه numbers برابر ۵ است و آرایه matrix درهر دو بعد ۳ است. |
Shape | شکل یک آرایه یک آرایه عددی یک بعدی است که حاوی تعداد عناصر (محدوده) در هر ابعاد است. به عنوان مثال، در آرایه matrix، مقدار Shape برابر (۳، ۳) و در آرایه numbers مقدارShape برابر (۵). |
size | تعداد عناصر یک آرایه است. در آرایه matrixبرابر، ۹ است، و برای آرایه numbers مقدار آن ۵ است. |
شما می توانید یک آرایه را به یک رویه به عنوان یک استدلال منتقل کنید.
مثال زیر مفهوم انتقال آرایه به رویه در فرترن را نشان می دهد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 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 |
بعد از کامپایل و اجرا خروجی زیرا مشاهده خواهید کرد :
1 2 3 4 5 | 1 2 3 4 5 |
در مثال فوق، فرآیند fillArray و printArray زیر را فقط می توان با آرایه هایی با ابعاد ۵ فراخوانی کرد.
با این حال، برای نوشتن دستورالعمل هایی که می توانند برای آرایه های هر اندازه استفاده شوند، می توانید آن را با استفاده از تکنیک زیر بازنویسی کنید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 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 |
لطفا توجه داشته باشید که برنامه از اندازه تابع برای اندازه آرایه استفاده می کند.
وقتی کد بالا کامپایل و اجرا می شود، نتیجه زیر را تولید می کند :
1 2 3 4 5 6 7 8 9 10 | 1 2 3 4 5 6 7 8 9 10 |
تا کنون به کل آرایه اشاره شده است، Fortran یک راه آسان برای ارجاع چندین عنصر یا یک بخش از یک آرایه را با استفاده از یک عبارت ساده فراهم می کند.
برای دسترسی به یک بخش آرایه، شما باید برای تمام ابعاد، قسمت پایین و بالای بخش و همچنین قدم (افزایش) را فراهم کنید.
این علامت گذاری subscript triplet نامیده می شود:
1 | array ([lower]:[upper][:stride], ...) |
وقتی که در حوزه فراخوانی تان مرزهای پایین و بالا وجود نداشته باشند،به طور پیش فرض مقدار گام برابر با ۱ است.مثال زیر این مفهوم را نشان می دهد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 |
وفتی کد بالا کامپایل و اجرا شود خروجی زیر تولید می شود :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 |
Fortran 90/95 چندین تابع ذاتی را فراهم می کند. به طور کلی توابع ذاتی آرایه در فرترن را می توان به ۷ دسته تقسیم کرد.
يکی از مهمترين ساختارهای داده در برنامه نويسی مهندسی آرايه ها هستند مخصوصاً وقتی با تعداد زيادی عدد در نقاط مختلف کار میکنيم. ساختار آرايه ها مانند انواع ديگر داده ها می باشد فقط تعداد داده ها مشخص می گردد. البته در شرايطی که می خواهيم که تعداد بصورت پویا اختصاص داده شود، تعداد را مشخص نمی کنيم. آموزش انتقال آرایه به رویه در فرترن و توابع ذاتی آرایه در فرترن به پایان رسید، در جلسه به مبحث آرایه های پویا در فرترن می پردازیم. با ما همراه باشید…