اسلایدهای فصل چهارم

Download Report

Transcript اسلایدهای فصل چهارم

‫متغیرهای اندیسدار یا زیرنویسدار‬
‫موسوی ندوشنی‬
‫ویراست بهار‪91‬‬
‫‪1‬‬
‫دانشگاه صنعت آب و برق‬
‫آرایه (‪)Array‬‬
‫‪ ‬آرایه گروهی از متغیرها یا ثابتها هستند که نوع آنها‬
‫یکی است و با اسم واحدی نامیده میشوند‪.‬‬
‫‪‬‬
‫)‪a(1‬‬
‫)‪a(2‬‬
‫‪Array a‬‬
‫)‪a(3‬‬
‫)‪a(4‬‬
‫)‪a(5‬‬
‫‪‬‬
‫‪2‬‬
‫دانشگاه صنعت آب و برق‬
‫حافظه رایانه‬
‫نمایش متغیر به صورت آرایه‬
‫‪Do i = 1, 100‬‬
‫))‪a(i) = SQRT(a(i‬‬
‫‪End do‬‬
‫جزییات حلقه فوق به صورت زیر است‪:‬‬
‫))‪a(1) = SQRT(a(1‬‬
‫))‪a(2) = SQRT(a(2‬‬
‫‪‬‬
‫))‪a(100) = SQRT(a(100‬‬
‫‪3‬‬
‫دانشگاه صنعت آب و برق‬
‫دستور اعالم متغیر اندیسدار‬
‫‪ Real, Dimension(10) :: X‬‬
‫& ‪ Character(len = 20), Dimension(50) ::‬‬
‫‪last_name‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫آرایه میتواند با یک یا چند بعد معرفی شود‪ .‬تعداد ابعاد یک آرایه‬
‫را رتبه (‪ )rank‬نامند‪ .‬در مثال فوق رتبه متغیرهای ‪ X‬و‬
‫‪ last_name‬برابر یک است‪.‬‬
‫تعداد عناصر یک بعد را ‪ extent‬آن گویند‪ .‬در متغیر ‪ X‬برابر‬
‫‪ 10‬و در متغیر ‪ last_name‬برابر ‪ 50‬است‪.‬‬
‫ترکیبی از ‪ rank‬و ‪ extent‬هر آرایه را شکل (‪ )shape‬آن آرایه‬
‫نامند‪ .‬بنابراین دو آرایه دارای یک شکل هستند‪ ،‬اگر رتبه و تعداد‬
‫عناصر هر بعد آرایه با هم یکسان باشد‪.‬‬
‫به تعداد کل درایههای یک آرایه اندازه (‪ )size‬آن آرایه گویند‪.‬‬
‫‪4‬‬
‫دانشگاه صنعت آب و برق‬
‫مثال اعالم متغیر اندیسدار‪ ،‬یک بعد و بیش از یک بعد‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪Real, Dimension(100) :: R‬‬
‫‪Real, Dimension(10,10) :: S‬‬
‫)‪Real :: T(10,10‬‬
‫)‪Integer, Dimension :: L(2,3‬‬
‫)‪Integer, Dimension(5) :: A, B(2,3‬‬
‫‪Real, Dimension(15) :: X‬‬
‫‪Real, Dimension(3,5) :: Y, Z‬‬
‫به دو مثال اخیر توجه کنید‪ .‬متغیر ‪ X‬دارای رتبه یک و متغیرهای‬
‫‪ Y,Z‬دارای رتبه دو هستند‪.‬‬
‫اندازه متغیرهای ‪ X‬و ‪ Y,Z‬با هم برابرند‪.‬‬
‫متغیرهای ‪ X‬و ‪ Y,Z‬دارای شکل یکسان نیستند‪.‬‬
‫‪ extent‬بعد دوم متغیرهای ‪ Y,Z‬برابر ‪ 5‬است‪.‬‬
‫‪5‬‬
‫دانشگاه صنعت آب و برق‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫انواع اندیسها‬
‫‪ ‬فرم کلی اندیسها به صورت زیر است‪.‬‬
‫‪ Real,Dimension(lower_bound:upper_bound) :: array‬‬
‫‪ ‬به شرط آن که‬
‫‪ lower_bound <= upper_bound‬‬
‫‪ ‬به مثالهای زیر توجه کنید‪.‬‬
‫‪ Real, Dimension(5) :: a1‬‬
‫‪ Real, Dimension(-2:2) :: b1‬‬
‫‪ Real, Dimension(5:9) :: c1‬‬
‫‪ ‬هر سه آرایه دارای شکل (‪ )shape‬یکسان هستند‪ .‬زیرا دارای ابعاد و ‪extent‬‬
‫برابرند‪.‬‬
‫‪ ‬در حالت کلی تعداد درایه در هر بعد را‪ ،‬میتوان با استفاده از رابطه ساده زیر‬
‫بدست آورد‪.‬‬
‫‪ Extent = upper_bound – lower_bound+1‬‬
‫)‪ Real, Dimension(-2:2, 0:3‬‬
‫‪ ‬همانطور که مالحظه میشود هر بعد گستره مربوط به خود را دارد‪ .‬گستره بعد اول‬
‫‪ 5‬و گستره بعد دوم ‪ 4‬است‪.‬‬
‫‪6‬‬
‫دانشگاه صنعت آب و برق‬
‫استفاده از عناصر متغیرهای اندیسدار مانند متغیرهای عادی‬
‫‪ ‬هر درایه از آرایهای را میتوان به صورت یک متغیر‬
‫معمولی به کار برد‪ .‬به مثال زیر توجه کنید‪.‬‬
‫‪Integer, Dimension(10) :: index‬‬
‫‪Real, Dimension(3) :: temp‬‬
‫‪ ‬دستورات کامال درست هستند‪.‬‬
‫‪Index(10) = 5‬‬
‫‪Temp(3) = Real(index(1)) / 4.‬‬
‫)‪Write(*,*) 'index(1) =', index(1‬‬
‫‪7‬‬
‫دانشگاه صنعت آب و برق‬
‫مقداردهی اولیه درایههای یک آرایه یک بعد‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫همانطور که قبال هم ذکر شد‪ ،‬خیلی از زمانها الزم است که متغیرها را مقداردهی شوند‪.‬‬
‫به مثال زیر توجه کنید‪.‬‬
‫‪Real, Dimension(10) :: array1‬‬
‫‪Do i = 1, 10‬‬
‫)‪• array1(i) = real(i‬‬
‫‪End do‬‬
‫دستورات زیر معادل کدهای فوق است‪.‬‬
‫‪Real, Dimension(10) :: array1‬‬
‫)‪array1 = (/1.,2.,3.,4.,5.,6.,7.,8.,9.,10./‬‬
‫و باالخره میتوان عمل مقداردهی را به صورت زیر انجام داد‪.‬‬
‫‪Real, Dimension(10) :: array1‬‬
‫‪array1 = 0.‬‬
‫میتوان عمل مقداردهی را حتی در دستور اعالم نیز گنجاند‪.‬‬
‫)‪Integer, Dimension(5) :: array2 = (/1,2,3,4,5/‬‬
‫‪8‬‬
‫دانشگاه صنعت آب و برق‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫ادامه مقداردهی اولیه درایههای یک آرایه یک بعد‬
‫‪ ‬می توان بهصورت عبارت هم مقداردهی نمود‪ .‬به مثال‬
‫زیر توجه کنید‪.‬‬
‫‪ Integer, parameter :: N = 3, M = 6, P = 12‬‬
‫)‪ Integer :: arr(1:3) = (/ N, M/N, P/N /‬‬
‫‪ ‬توجه کنید که در مثال باال‪ ،‬گذاشتن ‪ parameter‬اجباری است‪.‬‬
‫ضمنا ً نمیتوان در مقداردهی )‪ (/…/‬از توابع استفاده نمود‪ .‬اکنون‬
‫مثال باال را کمی تغییر می دهیم‪.‬‬
‫‪ Integer, Dimension(3) :: arr‬‬
‫‪ Integer :: N = 3, M = 6, P = 12‬‬
‫)‪ arr = (/ N, M/N, P/N /‬‬
‫‪9‬‬
‫دانشگاه صنعت آب و برق‬
‫خطای مازاد اندیسهای آرایه‬
‫‪ ‬هر درایه یک آرایه به یک اندیس که عدد صحیح است‬
‫نسبت داده میشود‪ .‬محدوده را دستور اعالم مشخص‬
‫میکند‪.‬‬
‫‪ Real, Dimension(5) :: a‬‬
‫‪ ‬در این مثال اندیسها‪ ،‬اعداد از ‪ 1‬تا ‪ 5‬میباشند‪ .‬اگر در‬
‫محاسبات درایه )‪ a(6‬رخ دهد‪ .‬شما خطای ‪out of‬‬
‫‪ bound‬را دریافت میکنید‪.‬‬
‫‪ ‬این خطای را میتوان جزء خطاهای رایج کار با آرایهها‬
‫محسوب نمود‪ .‬یافتن این خطا در پارهای از موارد کار‬
‫سادهای نیست‪.‬‬
‫‪10‬‬
‫دانشگاه صنعت آب و برق‬
‫استفاده از مقدار ثابت در اعالم آرایه‬
‫همانطور که مالحظه شد در ابعاد آرایه میتوان اعداد صحیح مختلف‬
.‫را بهکار برد‬
.‫همچنین میتوان از یک پارامتر و یا عبارت ثابت نیز استفاده نمود‬
:1 ‫مثال‬
Integer, Parameter :: max_size = 100
Real, Dimension(max_size) :: array1
Real, Dimension(max_size) :: array2
Real, Dimension(max_size) :: array3
:2 ‫مثال‬




Integer, Parameter :: max_size = 100
Integer, Dimension(max_size/4) :: array1
Real, Dimension(int(log(Real(max_size)))) :: &
array2
‫دانشگاه صنعت آب و برق‬
11
‫ برای تخصیص حداکثر‬1 ‫مثال‬





Program REVERSE
Integer :: i, n
Real, Dimension(1000) :: X
Read*, n, (X(i), i=1, n)
Do i = n, 1, -1
• Print *, X(i)
 End do
 End program REVERSE
‫دانشگاه صنعت آب و برق‬
12
‫ برای تخصیص حداکثر‬2 ‫مثال‬
.‫ اعالنهای زیر مفروض است‬
 Integer, parameter :: L_BOUND = 3, U_BOUND = 10
 Integer, Dinemsion(L_BOUND:U_BOUND) :: x
Do i = L_BOUND, U_BOUND
x(i) = i
End do
array x() has 3,4,5,…, 10
Do i = L_BOUND, U_BOUND
if (MOD(i,2) == 0) Then
x(i) = 0
Else
x(i) = 1
End if
End do
array x() 1 0 1 0 1 0 1 0
‫دانشگاه صنعت آب و برق‬
13
)1( ‫عملیات آرایهای‬
Implicit none
Integer :: I
Real, Dimension(4) :: a = (/1.,2.,3.,4./)
Real, Dimension(4) :: b = (/5.,6.,7.,8./)
Real, Dimension(4) :: c, d
! Element by Element addition
Do i = 1, 4
c(i) = a(i) + b(i)
End do
‫دانشگاه صنعت آب و برق‬
14
‫عملیات آرایهای (‪)2‬‬
‫‪! Whole array addition‬‬
‫‪d = a + b‬‬
‫‪! Write out results‬‬
‫‪Write(*,100) 'c', c‬‬
‫‪Write(*,100) 'd', d‬‬
‫))‪100 format(' ', A, '=', 4(F6.1,1X‬‬
‫‪End‬‬
‫در این مثال آرایهها حتما باید دارای شکل (‪ )shape‬یکسان باشند‪.‬‬
‫‪15‬‬
‫دانشگاه صنعت آب و برق‬
‫عملیات آرایهای (‪)3‬‬
‫‪ ‬به مثال زیر توجه کنید که یک ضرب عدد در آرایه است‪.‬‬
‫& = ‪ Real, Dimension(4) :: a‬‬
‫‪(/1.,2.,3.,4./), c, d‬‬
‫‪ Real :: b = 10‬‬
‫یکسان‬
‫‪ c = a*b‬‬
‫‪ d = b*a‬‬
‫‪ ‬حتی میتوان از توابع کتابخانهای نیز به صورت زیر استفاده‬
‫نمود‪.‬‬
‫)‪ Real,Dimension(4) :: a=(/-1.,2.,-3.,4./‬‬
‫)‪ write(*,*) ABS(a‬‬
‫‪16‬‬
‫دانشگاه صنعت آب و برق‬
‫ورودی و خروجی در آرایهها (‪)2‬‬
‫)‪ Write(*,1000) (i, 2*i, 3*i, i = 1, 3‬‬
‫)‪ 1000 format(1X, 9I6‬‬
‫‪ ‬پاسخ در یک سطر به صورت زیر چاپ میشود‪.‬‬
‫‪3‬‬
‫‪2‬‬
‫‪4‬‬
‫‪6‬‬
‫‪3‬‬
‫‪6‬‬
‫‪9‬‬
‫‪ ‬حلقه ‪ do‬ضمنی میتواند تودرتو باشد‪ .‬به مثال زیر توجه کنید‪.‬‬
‫)‪Write(*,100) ((i, j, j = 1, 3), i = 1, 2‬‬
‫)‪100 format(1X, I5, 1X, I5‬‬
‫‪ ‬پاسخ به صورت زیر است‪.‬‬
‫‪1‬‬
‫‪1‬‬
‫‪1‬‬
‫‪2‬‬
‫‪1‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪2‬‬
‫‪2‬‬
‫‪2‬‬
‫‪3‬‬
‫‪17‬‬
‫دانشگاه صنعت آب و برق‬
‫‪2‬‬
‫‪ 1‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫تفاوت بین حلقه ‪ do‬عادی و حلقه ‪ do‬ضمنی‬
‫‪ ‬همانطور که مالحظه میشود‪ ،‬دو نوع حلقه ‪ do‬وجود دارد که‬
‫اکنون با مثال زیر میتوان تفاوت بین آنها را مشاهده نمود‪.‬‬
‫)‪ Integer, Dimension(5) :: arr = (/1,2,3,4,5/‬‬
‫‪ Do i=1,5‬‬
‫)‪• Write(*,1000) arr(i), 2*arr(i), 3*arr(i‬‬
‫)‪• 1000 format(1X, 6I6‬‬
‫‪ End do‬‬
‫‪ ‬اکنون به همین مثال به شکل دیگر توجه کنید‪.‬‬
‫= ‪ Write(*,1000) (arr(i), 2*arr(i), 3*arr(i), i‬‬
‫)‪1,5‬‬
‫)‪ 1000 format(1X,6I6‬‬
‫‪18‬‬
‫دانشگاه صنعت آب و برق‬
‫تفاوت بین حلقه ‪ do‬عادی و حلقه ‪ do‬ضمنی‬
‫‪ ‬پاسخ ‪ do‬عادی‬
‫‪3‬‬
‫‪6‬‬
‫‪9‬‬
‫‪12‬‬
‫‪15‬‬
‫‪2‬‬
‫‪4‬‬
‫‪6‬‬
‫‪8‬‬
‫‪10‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪ ‬پاسخ ‪ do‬ضمنی‬
‫‪6‬‬
‫‪12‬‬
‫‪19‬‬
‫‪4‬‬
‫‪8‬‬
‫دانشگاه صنعت آب و برق‬
‫‪2‬‬
‫‪4‬‬
‫‪3‬‬
‫‪9‬‬
‫‪15‬‬
‫‪2‬‬
‫‪6‬‬
‫‪10‬‬
‫‪ 1‬‬
‫‪ 3‬‬
‫‪ 5‬‬
‫نحوه تخصیص حافظه در آرایه دو بعدی‬
‫‪ ‬به ماتریس زیر توجه کنید‪.‬‬
‫)‪A(1,1‬‬
‫)‪A(2,1‬‬
‫)‪A(1,1) A(1,2‬‬
‫)‪A(3,1‬‬
‫)‪A(2,1) A(2,2‬‬
‫)‪A(1,2‬‬
‫)‪A(3,1) A(3,2‬‬
‫)‪A(2,2‬‬
‫آرایه دو بعدی‬
‫)‪A(3,2‬‬
‫نحوه قرار گرفتن در حافظه‬
‫‪20‬‬
‫دانشگاه صنعت آب و برق‬
‫‪Page two‬‬
‫‪Do i=1,2‬‬
‫‪Do j=1,2‬‬
‫‪Do k=1,2‬‬
‫‪………..‬‬
‫…………‬
‫‪End do‬‬
‫‪End do‬‬
‫‪End do‬‬
‫‪Page one‬‬
‫نحوه تخصیص حافظه در آرایه سه بعدی‬
‫‪1,1,1‬‬
‫‪2,1,1‬‬
‫‪1,2,1‬‬
‫‪2,2,1‬‬
‫‪1,1,2‬‬
‫‪2,1,2‬‬
‫‪1,2,2‬‬
‫‪2,2,2‬‬
‫‪  ‬آرایه سه بعدی ‪22 2‬‬
‫‪‬‬
‫‪‬‬
‫‪1,1,2 1,2,2‬‬
‫‪‬‬
‫‪2,1,2‬‬
‫‪‬‬
‫‪2,2,2‬‬
‫‪1,1,1 1,2,1‬‬
‫‪‬‬
‫‪‬‬
‫‪2,1,1 2,2,1‬‬
‫‪‬‬
‫‪3‬‬
‫‪21‬‬
‫دانشگاه صنعت آب و برق‬
‫‪1‬‬
‫‪2‬‬
‫مقداردهی آرایههای دو بعدی (‪)1‬‬
‫‪ ‬مقداردهی با استفاده از نسبت دادن‬
‫‪ ‬به مثال زیر توجه کنید‪.‬‬
‫‪3‬‬
‫‪3‬‬
‫‪22‬‬
‫‪ Integer, Dimension(4,3) :: istat‬‬
‫‪ Do i = 1, 4‬‬
‫‪• Do j = 1, 3‬‬
‫‪1‬‬
‫‪2‬‬
‫‪ istat(i, j) = j‬‬
‫‪1‬‬
‫‪2‬‬
‫‪• End do‬‬
‫‪ End do‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫دانشگاه صنعت آب و برق‬
‫مقداردهی آرایههای دو بعدی (‪)2‬‬
‫‪ ‬مقداردهی با استفاده از دستور ‪ ،read‬به مثال زیر توجه‬
‫کنید‪.‬‬
‫‪ ‬فرض کنید که دادهها از روی فایلی به نام ‪initial.dat‬‬
‫خوانده شود که دارای ساختار زیر است‪.‬‬
‫‪ 1 1 1 1 2 2 2 2 3 3 3 3‬‬
‫‪ ‬کدهای برنامه به صورت زیر است‪.‬‬
‫‪ Integer, Dimension(4,3) :: istat‬‬
‫)'‪ Open(7, file = 'initial.dat‬‬
‫‪ Read(7,*) istat‬‬
‫‪23‬‬
‫دانشگاه صنعت آب و برق‬
‫مقداردهی آرایههای دو بعدی (‪)4‬‬
‫‪ ‬اما اگر ساختار فایل ورودی به شکل زیر بود‪.‬‬
‫‪ 1 2 3 1 2 3 1 2 3 1 2 3‬‬
‫‪ ‬کدهای برنامه به صورت زیر است‪.‬‬
‫‪Integer :: i, j‬‬
‫‪Integer, Dimension(4,3) :: istat‬‬
‫)'‪Open(7, file = 'initial.dat‬‬
‫‪Read(7,*) ((istat(i,j), j = 1, 3),‬‬
‫)‪i = 1, 4‬‬
‫‪24‬‬
‫دانشگاه صنعت آب و برق‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫زیر آرایهها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫تاکنون عملیات روی کل درایهها یک آرایه انجام شد‪ .‬اما‬
‫میتوان عملیات را روی زیرمجموعهای از درایههای‬
‫یک آرایه متمرکز نمود‪ .‬فرم کلی آن به صورت زیر‬
‫است‪.‬‬
‫]‪ subscript_1 : subscript_2 [: stride‬‬
‫‪ subscript_1‬نشاندهنده اولین اندیس است‪.‬‬
‫‪ subscript_2‬نشاندهنده آخرین اندیس است‪.‬‬
‫‪ stride‬نشاندهنده گامهای افزایش است‪.‬‬
‫در واقع این رویه مانند یک حلقه ‪ do‬عمل میکند‪.‬‬
‫‪25‬‬
‫دانشگاه صنعت آب و برق‬
‫مثال زیر آرایه در یک بعد‬
‫‪Integer :: i = 3, j = 7‬‬
‫‪Real, Dimension(10) :: a = (/1.,-2.,3.,-4.,5.,-6.,7.,‬‬‫)‪8.,9.,-10./‬‬
‫اکنون به پاسخ زیر ارایههای زیر توجه کنید‪.‬‬
‫‪a(:)  1.,-2.,3.,-4.,5.,-6.,7.,-8.,9.,-10.‬‬
‫‪a(i:j)  3.,-4.,5.,-6.,7.‬‬
‫‪a(i:j:i)  3.,-6.‬‬
‫‪a(i:j:j)  3.‬‬
‫‪a(i:)  3.,-4.,5.,-6.,7.,-8.,9.,-10.‬‬
‫‪a(:j)  1.,-2.,3.,-4.,5.,-6.,7.‬‬
‫‪a(::i)  1.,-4.,7.,-10.‬‬
‫‪26‬‬
‫دانشگاه صنعت آب و برق‬
‫مثال زیر آرایه در یک بعد‬
‫‪Integer :: i = 3, j = 7‬‬
‫‪Real, Dimension(10) :: a = (/1.,-2.,3.,-4.,5.,-6.,7.,‬‬‫)‪8.,9.,-10./‬‬
‫اکنون به پاسخ زیر ارایههای زیر توجه کنید‪.‬‬
‫‪a(:)  1.,-2.,3.,-4.,5.,-6.,7.,-8.,9.,-10.‬‬
‫‪a(i:j)  3.,-4.,5.,-6.,7.‬‬
‫‪a(i:j:i)  3.,-6.‬‬
‫‪a(i:j:j)  3.‬‬
‫‪a(i:)  3.,-4.,5.,-6.,7.,-8.,9.,-10.‬‬
‫‪a(:j)  1.,-2.,3.,-4.,5.,-6.,7.‬‬
‫‪a(::i)  1.,-4.,7.,-10.‬‬
‫‪27‬‬
‫دانشگاه صنعت آب و برق‬
‫مثال زیر آرایه در دو بعد‬
‫‪ ‬به مثال زیر توجه کنید‪.‬‬
‫‪é1 ù‬‬
‫‪ê ú‬‬
‫‪ê6 ú‬‬
‫‪ê ú‬‬
‫‪ê ú‬‬
‫‪A ( :, 1) = ê11 ú‬‬
‫‪ê ú‬‬
‫‪ê16 ú‬‬
‫‪ê ú‬‬
‫‪ê ú‬‬
‫‪ê21 ú‬‬
‫‪ë û‬‬
‫‪28‬‬
‫‪5 ù‬‬
‫‪ú‬‬
‫‪10 ú‬‬
‫‪ú‬‬
‫‪ú‬‬
‫‪15 ú‬‬
‫‪ú‬‬
‫‪20 ú‬‬
‫‪ú‬‬
‫‪ú‬‬
‫‪25 ú‬‬
‫‪û‬‬
‫دانشگاه صنعت آب و برق‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪9‬‬
‫‪8‬‬
‫‪7‬‬
‫‪14‬‬
‫‪13‬‬
‫‪12‬‬
‫‪19‬‬
‫‪18‬‬
‫‪17‬‬
‫‪24‬‬
‫‪23‬‬
‫‪22‬‬
‫‪é1‬‬
‫‪ê‬‬
‫‪ê6‬‬
‫‪ê‬‬
‫‪ê‬‬
‫‪A = ê11‬‬
‫‪ê‬‬
‫‪ê16‬‬
‫‪ê‬‬
‫‪ê‬‬
‫‪ê21‬‬
‫‪ë‬‬
‫دنباله مثال قبل‬
é1
ê
ê6
ê
ê
A = ê11
ê
ê16
ê
ê
ê21
ë
2
3
4
7
8
9
12
13
14
17
18
19
22
23
24
5 ù
ú
é1
A
(1,
:)
=
êë
10 ú
ú
ú
15 ú
ú
20 ú
ú
ú
25 ú
û
‫دانشگاه صنعت آب و برق‬
2
3
5ù
ú
û
4
29
‫دنباله مثال قبل‬
é1
ê
ê6
ê
ê
A = ê11
ê
ê16
ê
ê
ê21
ë
2
3
4
7
8
9
12
13
14
17
18
19
22
23
24
5 ù
ú
10 ú
ú
ú
15 ú
ú
20 ú
ú
ú
25 ú
û
é1
ê
ê
A (1 : 3, 1 : 5 : 2) = ê 6
ê
ê11
êë
‫دانشگاه صنعت آب و برق‬
3
8
13
30
5ù
ú
ú
10 ú
ú
15 ú
ú
û
‫تناظر درآیه به درآیه دو ماتریس در تساوی کلی‬
 Real, Dimension(1:3,1:2) :: matrice1
 Real, Dimension(-1:1,0:1) :: matrice2
 matrice1 = matrice2
‫ اکنون اگر بخواهید در عملگر انتساب تفکیک درایه به درایه‬
.‫ به بسط زیر توجه نمایید‬،‫دو ماتریس باال را مالحظه کنید‬
 matrice1(1,1) = matrice2(-1,0)
 matrice1(2,1) = matrice2(0,0)
 matrice1(3,1) = matrice2(1,0)
 matrice1(1,2) = matrice2(-1,1)
 matrice1(2,2) = matrice2(0,1)
 matrice1(3,2) = matrice2(1,1)
‫دانشگاه صنعت آب و برق‬
31
‫سازگاری زیرآرایهها‬
:1 ‫ مثال‬
 REAL :: A(1:6, 1:8), B(0:3, -5:5), C(0:10)
 A(2:5, 1:7) = B(:, -3:3) ! both have shape (4, 7)
 A(4, 2:5) = B(:, 0) + C(7:) ! all have shape (4)
 C(:) = B(2, :) ! both have shape (11)
:2 ‫ مثال‬




INTEGER :: arr1(1:100), arr2(1:50), arr3(1:50)
arr1(1:100:2) = arr2
! Sets every odd element
arr1(100:1:-2) = arr3
! Even elements, reversed
arr1 = arr1(100:1:-1)
! Reverses the order of arr1
‫دانشگاه صنعت آب و برق‬
32
‫توابع کتابخانهای آرایهها‬














‫ که‬.‫ توابع کتابخانهای قابل مالحظهای مربوط به بردارها تعبیه شده است‬90 ‫ در فرترن‬
.‫برخی از آنها به شرح زیر است‬
SHAPE(x) ! The shape of x
RESHAPE(x, shape[, pad][, order])
SIZE(x [, Dim ]) ! The size of x
LBOUND(x [, Dim]) ! The nth lower bound of x
UBOUND(x [, Dim]) ! The nth upper bound of x
MINVAL(x) ! The minimum of all elements of x
MINLOC(x) ! The index of the minimum
MAXVAL(x) ! The maximum of all elements of x
MAXLOC(x) ! The index of the maximum
SUM(x [, Dim]) ! The sum of all elements of x
PRODUCT(x [, Dim]) ! The product of all elements of x
TRANSPOSE(x) ! The transposition of x
DOT_PRODUCT(x, y) ! The dot product of x and y
MATMUL(x, y) ! Matrix multiplication
‫دانشگاه صنعت آب و برق‬
33
‫تابع ‪shape‬‬
‫‪ ‬این تابع شکل آرایه (بعد و گستره) را نشان میدهد‪ .‬شکل‬
‫عمومی به صورت زیر است‪.‬‬
‫)‪ shape(source‬‬
‫‪ ‬مثال‪:‬‬
‫‪ Integer, Dimension(-2:27,0:49) :: t‬‬
‫)‪ print*, shape(t‬‬
‫‪ ‬خروجی عبارتست از‪:‬‬
‫‪ 30 50‬‬
‫‪34‬‬
‫دانشگاه صنعت آب و برق‬
‫تابع ‪Reshape‬‬
‫‪ ‬این تابع شکل یک آرایه را عوض میکند‪ .‬شکل عمومی‬
‫به صورت زیر است‪.‬‬
‫)]‪ Reshape(source, shape[, pad][, order‬‬
‫‪ ‬مثال ‪:1‬‬
‫‪ Integer, Dimension(2,2) :: A‬‬
‫))‪ A = Reshape((/1,2,3,4/), (/2,2/‬‬
‫‪3‬‬
‫‪4‬‬
‫‪35‬‬
‫‪1‬‬
‫‪2‬‬
‫دانشگاه صنعت آب و برق‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
Reshape ‫دنباله تابع‬
:2 ‫ مثال‬
 Integer, Dimension(2,2) :: A
 A = Reshape((/ 1,2,3,4/), (/2,2/), order=(/2,1/))
1
2
3
4
1
3
2
4
:3 ‫ مثال‬
 B = Reshape((/ 1,2,3,4,5,6/), (/2,4/), (/0/),(/2,1/))
1 2 3 4 5 6
1 2 3 4
5 6 0 0
‫دانشگاه صنعت آب و برق‬
36
‫تابع ‪Size‬‬
‫‪ ‬در این تابع میتوان تعداد کل عناصر یک آرایه و یا یکی‬
‫از ابعاد آن را به دست آورد‪ .‬نحوه آن عبارتست از‪:‬‬
‫)]‪ Size(source[, Dim‬‬
‫‪ ‬مثال‪:‬‬
‫)‪ Real A(2, 3, 5‬‬
‫‪• Size(A, 1)  2‬‬
‫‪• Size(A)  30‬‬
‫‪37‬‬
‫دانشگاه صنعت آب و برق‬
‫تابع ‪ Sum‬در یک بعد‬
‫‪ ‬در این تابع میتوان مجموع عناصر یک آرایه و یا یکی‬
‫از ابعاد آن را به دست آورد‪ .‬نحوه آن عبارتست از‪:‬‬
‫)]‪ Sum(source[, dim] [, mask‬‬
‫)‪• Integer :: w(1:11) = (/7,9,-2,4,8,10,2,7,10,2,1/‬‬
‫)‪• Print*, sum(w‬‬
‫‪• End‬‬
‫)‪Sum(w‬‬
‫‪1‬‬
‫‪2‬‬
‫‪+‬‬
‫‪+‬‬
‫‪7 10‬‬
‫‪+‬‬
‫‪+‬‬
‫‪2‬‬
‫‪10‬‬
‫‪+‬‬
‫‪+‬‬
‫‪8‬‬
‫‪4‬‬
‫‪-2‬‬
‫‪9‬‬
‫‪7‬‬
‫‪+‬‬
‫‪+‬‬
‫‪+‬‬
‫‪+‬‬
‫‪+‬‬
‫‪=58‬‬
‫‪38‬‬
‫دانشگاه صنعت آب و برق‬
‫ در دو بعد‬Sum ‫تابع‬
Dimension 1
 Integer w(2,11)
 w = reshape((/7, 9, -2, 4, 8, 10, 2, 7, 10, 2, 1,
10, 7, 7, 1, &
 10,-2, -2, 7, 2, 9, -2/), (/2,11/), order = (/2,1/))
 print*, sum(w,dim=1)
 End
Sum(w,dim=1)
7 9 -2 4 8 10 2
10 7 7 1 10 -2 -2
17 16
7 10 2 1
+
7 2 9 -2
5 5 18 8 0 14 12 11 -1
‫دانشگاه صنعت آب و برق‬
39
‫تابع ‪Product‬‬
‫‪ ‬در این تابع میتوان حاصلضرب عناصر یک آرایه و یا‬
‫یکی از ابعاد آن را به دست آورد‪ .‬نحوه آن عبارتست از‪:‬‬
‫‪ ‬مثال‪:‬‬
‫)]‪ Product(source[, dim][, mask‬‬
‫‪ Print*, Product(A, dim=1) 2 12 30‬‬
‫‪ Print*, Product(A, dim=2) 15 48‬‬
‫‪1 3 5 ‬‬
‫‪A ‬‬
‫‪‬‬
‫‪2 4 6‬‬
‫‪40‬‬
‫دانشگاه صنعت آب و برق‬
‫‪All‬‬
‫‪ ‬دو ماتریس ‪ A‬و ‪ B‬به صورت زیر هستند‪.‬‬
‫‪5‬‬
‫‪‬‬
‫‪8‬‬
‫‪3‬‬
‫‪4‬‬
‫‪0‬‬
‫‪B ‬‬
‫‪7‬‬
‫‪1 3 5 ‬‬
‫‪A ‬‬
‫‪‬‬
‫‪2 4 6‬‬
‫‪ ‬تابع کتابخانهای ‪ All‬به صورت زیر است‪.‬‬
‫)]‪ All(mask[, dim‬‬
‫‪ ‬مقایسه روی ستون‬
‫‪ Print*, All(A/=B,dim=1) T F F‬‬
‫‪ ‬مقایسه روی سطر‬
‫‪ Print*, All(A/=B,dim=2)  F F‬‬
‫‪41‬‬
‫دانشگاه صنعت آب و برق‬
‫‪Any‬‬
‫‪ ‬دو ماتریس ‪ A‬و ‪ B‬به صورت زیر هستند‪.‬‬
‫‪5‬‬
‫‪‬‬
‫‪8‬‬
‫‪3‬‬
‫‪4‬‬
‫‪0‬‬
‫‪B ‬‬
‫‪7‬‬
‫‪1 3 5 ‬‬
‫‪A ‬‬
‫‪‬‬
‫‪2 4 6‬‬
‫‪ ‬تابع کتابخانهای ‪ Any‬به صورت زیر است‪.‬‬
‫)]‪ Any(mask[, dim‬‬
‫‪ ‬مقایسه روی ستون‬
‫‪ Print*, Any(A/=B, dim=1)  T F T‬‬
‫‪ ‬مقایسه روی سطر‬
‫‪ Print*, Any(A/=B, dim=2)  T T‬‬
‫‪42‬‬
‫دانشگاه صنعت آب و برق‬
‫ترانهاده یک ماتریس‬
‫‪ ‬تابع ذاتی ‪ transpose‬یک ماتریس را ترانهاده مینماید‪.‬‬
‫‪ TRANSPOSE(X) means X i j Þ X j i‬‬
‫‪ ‬در این تابع‪ ،‬آرایه دو بعدی (ماتریس) است ولی لزومی‬
‫ندارد که ماتریس مربع باشد‪.‬‬
‫‪43‬‬
‫دانشگاه صنعت آب و برق‬
‫‪Dot_Product‬‬
‫‪ ‬در این دستور ضرب داخلی دو بردار انجام میشود‪.‬‬
‫‪Dot_Product(X, Y) means å X i ×Y i Þ Z‬‬
‫‪i‬‬
‫‪ ‬این دستور فقط در بردارها (آرایه یک بعدی با طول و‬
‫نوع یکسان) عمل میکند‪ .‬به مثال زیر نگاه کنید‪.‬‬
‫]‪Integer :: A1(1:6)=[1,3,5,2,4,6‬‬
‫]‪Integer :: B1(1:6)=[0,3,5,7,4,8‬‬
‫)‪C=Dot_Product(A1, B1‬‬
‫‪Print*, C‬‬
‫‪44‬‬
‫دانشگاه صنعت آب و برق‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪MatMul‬‬
‫‪ ‬در اینجا دستور ضرب ماتریسها به همان روش که در ریاضیات‬
‫مرسوم است‪ ،‬انجام میشود‪ .‬به عبارت دیگر اگر یک ماتریس‬
‫(‪ )i,k‬در یک ماتریس (‪ )k,j‬ضرب شود‪ ،‬ماتریس حاصل (‪)i,j‬‬
‫خواهد‪å X i k ×Y k j Þ Z i j .‬‬
‫‪ MatMul(X, Y) means k‬‬
‫‪ ‬اکنون به مثال زیر توجه کنید‪.‬‬
‫‪45‬‬
‫‪Integer, Dimension(2,3) :: A‬‬
‫‪Integer, Dimension(3,2) :: B‬‬
‫‪Integer, Dimension(2,2) :: C‬‬
‫) )‪A=Reshape( (/1,2,3,4,5,6/), (/2,3/‬‬
‫) )‪B=Reshape( (/0,7,3,4,5,8/), (/3,2/‬‬
‫)‪C = MatMul(A, B‬‬
‫‪Print*, C‬‬
‫دانشگاه صنعت آب و برق‬
Where construct
.‫ فرض کنید میخواهید لگاریتم پارهای از عناصر یک ماتریس را بگیرید‬
Do and if construct
Do i = 1, m
Do j = 1, n
If(value(i, j) > 0.) Then
Logval(i, j) = log(value(i, j))
Else
Logval(i, j) = -99999
End if
End do
End do
WHERE construct
Where(value > 0.)
Logval = log(value)
Elsewhere
logval = -99999
End where
‫دانشگاه صنعت آب و برق‬
46
Forall construct
Do and if construct
Do i = 1, m
Do j = 1, n
If(work(i, j) /= 0.) Then
work(i, j) = 1./ work(i, j)
End if
End do
End do
Forall construct
Forall(i = 1:m, j = 1:n, work(i, j) /=
0.)
work(i, j) = 1./ work(i, j)
End Forall
‫دانشگاه صنعت آب و برق‬
47
‫متغیرهای اندیسدار شناور‬
‫‪ ‬تخصیص ایستای حافظه ‪(static memory‬‬
‫)‪allocation‬‬
‫• تاکنون اندازه متغیرهای اندیسدار برای هر متغیر در ابتدای‬
‫برنامه معین میشد‪ .‬به این نحوه تخصیص‪ ،‬که از ابتدا تا‬
‫انتهای برنامه میزان اندازه ارایه ثابت است‪ ،‬تخصیص ایستا‬
‫گویند‪.‬‬
‫‪ ‬تخصیص پویای حافظه )‪(dynamic memory allocation‬‬
‫•‬
‫‪48‬‬
‫در این رویکرد حسب نیاز‪ ،‬حافظه به متغیر اختصاص داده‬
‫میشود‪ ،‬بنابراین حافظه تخصیص یافته به هر متغیر اندیسدار‬
‫میتواند در طول برنامه تغییر کند‪ ،‬که به آن تخصیص پویا‬
‫گویند‪.‬‬
‫دانشگاه صنعت آب و برق‬
‫نحوه اعالن تخصیص شناور یا پویا‬

Real, Allocatable, Dimension(:) :: arr1
.‫در اینجا یک آرایه یک بعدی اعالن شده است که اندازه بعد آن معین نشده است‬
 Real, Allocatable, Dimension(:,:) :: arr2
.‫در اینجا یک آرایه دو بعدی اعالن شده است که اندازه ابعاد آن معین نشده است‬
:‫مثال‬
Integer, Allocatable, Dimension(:) :: nums
Integer :: temp, i, k, n_to_sort
Print'(A\)', 'How many numbers to sort:'
Read*, n_to_sort
allocate( nums(1:n_to_sort) )
DO i = 1, n_to_sort
Read*, nums(i)
End DO



IF(Allocated(nums)) Deallocate(nums)
 
‫دانشگاه صنعت آب و برق‬
49


