متغیرهای اندیسدار یا زیرنویسدار
اسلاید 1: 1متغیرهای اندیسدار یا زیرنویسدار
اسلاید 2: 2آرایه (Array)آرایه گروهی از متغیرها یا ثابتها هستند که نوع آنها یکی است و با اسم واحدی نامیده میشوند.a(1)a(2)a(3)a(4)a(5)Array aحافظه رایانه
اسلاید 3: 3نمایش متغیر به صورت آرایه 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))
اسلاید 4: 4دستور اعلام متغیر اندیسدارReal, Dimension(10) :: XCharacter(len = 20), Dimension(50) :: & last_nameآرایه میتواند با یک یا چند بعد معرفی شود. تعداد ابعاد یک آرایه را رتبه (rank) نامند. در مثال فوق رتبه متغیرهای X و last_name برابر یک است.تعداد عناصر یک بعد را extent آن گویند. در متغیر X برابر 10 و در متغیر last_name برابر 50 است.ترکیبی از rank و extent هر آرایه را شکل (shape) آن آرایه نامند. بنابراین دو آرایه دارای یک شکل هستند، اگر رتبه و تعداد عناصر هر بعد آرایه با هم یکسان باشد. به تعداد کل درایههای یک آرایه اندازه (size) آن آرایه گویند.
اسلاید 5: 5مثال اعلام متغیر اندیسدار، یک بعد و بیش از یک بعدReal, Dimension(100) :: RReal, Dimension(10,10) :: SReal :: T(10,10)Integer, Dimension :: L(2,3)Integer, Dimension(5) :: A, B(2,3)Real, Dimension(15) :: XReal, Dimension(3,5) :: Y, Zبه دو مثال اخیر توجه کنید. متغیر X دارای رتبه یک و متغیرهای Y,Z دارای رتبه دو هستند.اندازه متغیرهای X و Y,Z با هم برابرند.متغیرهای X و Y,Z دارای شکل یکسان نیستند.extent بعد دوم متغیرهای Y,Z برابر 5 است.
اسلاید 6: 6انواع اندیسهافرم کلی اندیسها به صورت زیر است.Real,Dimension(lower_bound:upper_bound) :: arrayبه شرط آن که lower_bound <= upper_boundبه مثالهای زیر توجه کنید.Real, Dimension(5) :: a1Real, Dimension(-2:2) :: b1Real, Dimension(5:9) :: c1هر سه آرایه دارای شکل (shape) یکسان هستند. زیرا دارای ابعاد و extent برابرند.در حالت کلی تعداد درایه در هر بعد را، میتوان با استفاده از رابطه ساده زیر بدست آورد.Extent = upper_bound – lower_bound+1Real, Dimension(-2:2, 0:3)همانطور که ملاحظه میشود هر بعد گستره مربوط به خود را دارد. گستره بعد اول 5 و گستره بعد دوم 4 است.
اسلاید 7: 7استفاده از عناصر متغیرهای اندیسدار مانند متغیرهای عادیهر درایه از آرایهای را میتوان به صورت یک متغیر معمولی به کار برد. به مثال زیر توجه کنید.Integer, Dimension(10) :: indexReal, Dimension(3) :: tempدستورات کاملا درست هستند.Index(10) = 5Temp(3) = Real(index(1)) / 4.Write(*,*) index(1) =, index(1)
اسلاید 8: 8مقداردهی اولیه درایههای یک آرایه یک بعد همانطور که قبلا هم ذکر شد، خیلی از زمانها لازم است که متغیرها را مقداردهی شوند. به مثال زیر توجه کنید.Real, Dimension(10) :: array1Do i = 1, 10array1(i) = real(i)End doدستورات زیر معادل کدهای فوق است.Real, Dimension(10) :: array1array1 = (/1.,2.,3.,4.,5.,6.,7.,8.,9.,10./)و بالاخره میتوان عمل مقداردهی را به صورت زیر انجام داد.Real, Dimension(10) :: array1array1 = 0.میتوان عمل مقداردهی را حتی در دستور اعلام نیز گنجاند.Integer, Dimension(5) :: array2 = (/1,2,3,4,5/)
اسلاید 9: ادامه مقداردهی اولیه درایههای یک آرایه یک بعد می توان بهصورت عبارت هم مقداردهی نمود. به مثال زیر توجه کنید.Integer, parameter :: N = 3, M = 6, P = 12Integer :: arr(1:3) = (/ N, M/N, P/N /)توجه کنید که در مثال بالا، گذاشتن parameter اجباری است. ضمناً نمیتوان در مقداردهی (/…/) از توابع استفاده نمود. اکنون مثال بالا را کمی تغییر می دهیم.Integer, Dimension(3) :: arrInteger :: N = 3, M = 6, P = 12arr = (/ N, M/N, P/N /)9
اسلاید 10: 10خطای مازاد اندیسهای آرایههر درایه یک آرایه به یک اندیس که عدد صحیح است نسبت داده میشود. محدوده را دستور اعلام مشخص میکند.Real, Dimension(5) :: aدر این مثال اندیسها، اعداد از 1 تا 5 میباشند. اگر در محاسبات درایه a(6) رخ دهد. شما خطای out of bound را دریافت میکنید.این خطای را میتوان جزء خطاهای رایج کار با آرایهها محسوب نمود. یافتن این خطا در پارهای از موارد کار سادهای نیست.
اسلاید 11: استفاده از مقدار ثابت در اعلام آرایههمانطور که ملاحظه شد در ابعاد آرایه میتوان اعداد صحیح مختلف را بهکار برد.همچنین میتوان از یک پارامتر و یا عبارت ثابت نیز استفاده نمود. مثال 1:Integer, Parameter :: max_size = 100Real, Dimension(max_size) :: array1Real, Dimension(max_size) :: array2Real, Dimension(max_size) :: array3مثال 2:Integer, Parameter :: max_size = 100Integer, Dimension(max_size/4) :: array1Real, Dimension(int(log(Real(max_size)))) :: & array211
اسلاید 12: مثال 1 برای تخصیص حداکثرProgram REVERSEInteger :: i, nReal, Dimension(1000) :: XRead*, n, (X(i), i=1, n)Do i = n, 1, -1Print *, X(i)End doEnd program REVERSE12
اسلاید 13: مثال 2 برای تخصیص حداکثراعلانهای زیر مفروض است.Integer, parameter :: L_BOUND = 3, U_BOUND = 10Integer, Dinemsion(L_BOUND:U_BOUND) :: x13Do i = L_BOUND, U_BOUNDx(i) = iEnd doarray x() has 3,4,5,…, 10Do i = L_BOUND, U_BOUNDif (MOD(i,2) == 0) Then x(i) = 0Elsex(i) = 1End ifEnd doarray x() 1 0 1 0 1 0 1 0
اسلاید 14: 14عملیات آرایهای (1)Implicit noneInteger :: IReal, Dimension(4) :: a = (/1.,2.,3.,4./)Real, Dimension(4) :: b = (/5.,6.,7.,8./)Real, Dimension(4) :: c, d! Element by Element additionDo i = 1, 4 c(i) = a(i) + b(i)End do
اسلاید 15: 15عملیات آرایهای (2)! Whole array additiond = a + b! Write out resultsWrite(*,100) c, cWrite(*,100) d, d100 format( , A, =, 4(F6.1,1X))End در این مثال آرایهها حتما باید دارای شکل (shape) یکسان باشند.
اسلاید 16: 16عملیات آرایهای (3)به مثال زیر توجه کنید که یک ضرب عدد در آرایه است.Real, Dimension(4) :: a = & (/1.,2.,3.,4./), c, dReal :: b = 10c = a*bd = b*aحتی میتوان از توابع کتابخانهای نیز به صورت زیر استفاده نمود.Real,Dimension(4) :: a=(/-1.,2.,-3.,4./)write(*,*) ABS(a)یکسان
اسلاید 17: 17ورودی و خروجی در آرایهها (2)Write(*,1000) (i, 2*i, 3*i, i = 1, 3)1000 format(1X, 9I6)پاسخ در یک سطر به صورت زیر چاپ میشود.1 2 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 11 21 32 12 22 3
اسلاید 18: 18تفاوت بین حلقه do عادی و حلقه do ضمنیهمانطور که ملاحظه میشود، دو نوع حلقه do وجود دارد که اکنون با مثال زیر میتوان تفاوت بین آنها را مشاهده نمود.Integer, Dimension(5) :: arr = (/1,2,3,4,5/)Do i=1,5Write(*,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)
اسلاید 19: 19تفاوت بین حلقه do عادی و حلقه do ضمنیپاسخ do عادی1 2 32 4 63 6 94 8 125 10 15پاسخ do ضمنی1 2 3 2 4 63 6 9 4 8 125 10 15
اسلاید 20: 20نحوه تخصیص حافظه در آرایه دو بعدیبه ماتریس زیر توجه کنید.A(1,1)A(1,2)A(2,1)A(2,2)A(3,1)A(3,2)آرایه دو بعدینحوه قرار گرفتن در حافظه
اسلاید 21: 21نحوه تخصیص حافظه در آرایه سه بعدیآرایه سه بعدی 22 21,1,12,1,11,2,12,2,11,1,22,1,21,2,22,2,21,1,12,1,11,2,12,2,11,1,22,1,21,2,22,2,2Page onePage two123Do i=1,2Do j=1,2Do k=1,2………..…………End doEnd doEnd do
اسلاید 22: 22مقداردهی آرایههای دو بعدی (1)مقداردهی با استفاده از نسبت دادنبه مثال زیر توجه کنید.Integer, Dimension(4,3) :: istatDo i = 1, 4Do j = 1, 3istat(i, j) = jEnd doEnd do
اسلاید 23: 23مقداردهی آرایههای دو بعدی (2)مقداردهی با استفاده از دستور read، به مثال زیر توجه کنید.فرض کنید که دادهها از روی فایلی به نام initial.dat خوانده شود که دارای ساختار زیر است.1 1 1 1 2 2 2 2 3 3 3 3کدهای برنامه به صورت زیر است.Integer, Dimension(4,3) :: istatOpen(7, file = initial.dat)Read(7,*) istat
اسلاید 24: 24مقداردهی آرایههای دو بعدی (4)اما اگر ساختار فایل ورودی به شکل زیر بود.1 2 3 1 2 3 1 2 3 1 2 3کدهای برنامه به صورت زیر است.Integer :: i, jInteger, Dimension(4,3) :: istatOpen(7, file = initial.dat)Read(7,*) ((istat(i,j), j = 1, 3), i = 1, 4)
اسلاید 25: 25زیر آرایههاتاکنون عملیات روی کل درایهها یک آرایه انجام شد. اما میتوان عملیات را روی زیرمجموعهای از درایههای یک آرایه متمرکز نمود. فرم کلی آن به صورت زیر است.subscript_1 : subscript_2 [: stride]subscript_1 نشاندهنده اولین اندیس است.subscript_2 نشاندهنده آخرین اندیس است.stride نشاندهنده گامهای افزایش است.در واقع این رویه مانند یک حلقه do عمل میکند.
اسلاید 26: 26مثال زیر آرایه در یک بعدInteger :: i = 3, j = 7Real, 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: 27مثال زیر آرایه در یک بعدInteger :: i = 3, j = 7Real, 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.
اسلاید 28: مثال زیر آرایه در دو بعدبه مثال زیر توجه کنید.28
اسلاید 29: 29دنباله مثال قبل
اسلاید 30: 30دنباله مثال قبل
اسلاید 31: تناظر درآیه به درآیه دو ماتریس در تساوی کلیReal, Dimension(1:3,1:2) :: matrice1Real, Dimension(-1:1,0:1) :: matrice2matrice1 = 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
اسلاید 32: سازگاری زیرآرایههامثال 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
اسلاید 33: 33توابع کتابخانهای آرایههادر فرترن 90 توابع کتابخانهای قابل ملاحظهای مربوط به بردارها تعبیه شده است. که برخی از آنها به شرح زیر است.SHAPE(x) ! The shape of xRESHAPE(x, shape[, pad][, order])SIZE(x [, Dim ]) ! The size of xLBOUND(x [, Dim]) ! The nth lower bound of xUBOUND(x [, Dim]) ! The nth upper bound of xMINVAL(x) ! The minimum of all elements of xMINLOC(x) ! The index of the minimumMAXVAL(x) ! The maximum of all elements of xMAXLOC(x) ! The index of the maximumSUM(x [, Dim]) ! The sum of all elements of xPRODUCT(x [, Dim]) ! The product of all elements of xTRANSPOSE(x) ! The transposition of xDOT_PRODUCT(x, y) ! The dot product of x and yMATMUL(x, y) ! Matrix multiplication
اسلاید 34: تابع shapeاین تابع شکل آرایه (بعد و گستره) را نشان میدهد. شکل عمومی به صورت زیر است.shape(source)مثال:Integer, Dimension(-2:27,0:49) :: tprint*, shape(t)خروجی عبارتست از: 30 50 34
اسلاید 35: تابع Reshapeاین تابع شکل یک آرایه را عوض میکند. شکل عمومی به صورت زیر است.Reshape(source, shape[, pad][, order])مثال 1:Integer, Dimension(2,2) :: AA = Reshape((/1,2,3,4/), (/2,2/))3543213142
اسلاید 36: دنباله تابع Reshapeمثال 2:Integer, Dimension(2,2) :: AA = Reshape((/ 1,2,3,4/), (/2,2/), order=(/2,1/))مثال 3:B = Reshape((/ 1,2,3,4,5,6/), (/2,4/), (/0/),(/2,1/))364321214365432143210065
اسلاید 37: 37تابع Sizeدر این تابع میتوان تعداد کل عناصر یک آرایه و یا یکی از ابعاد آن را به دست آورد. نحوه آن عبارتست از:Size(source[, Dim])مثال: Real A(2, 3, 5) Size(A, 1) 2Size(A) 30
اسلاید 38: 38تابع Sum در یک بعددر این تابع میتوان مجموع عناصر یک آرایه و یا یکی از ابعاد آن را به دست آورد. نحوه آن عبارتست از:Sum(source[, dim] [, mask])Integer :: w(1:11) = (/7,9,-2,4,8,10,2,7,10,2,1/)Print*, sum(w)End 722174810109-2+++++++++++Sum(w)=58
اسلاید 39: 39تابع Sum در دو بعد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
اسلاید 40: 40تابع Productدر این تابع میتوان حاصلضرب عناصر یک آرایه و یا یکی از ابعاد آن را به دست آورد. نحوه آن عبارتست از:مثال:Product(source[, dim][, mask])Print*, Product(A, dim=1) 2 12 30Print*, Product(A, dim=2) 15 48
اسلاید 41: 41Allدو ماتریس A و B به صورت زیر هستند.تابع کتابخانهای All به صورت زیر است.All(mask[, dim])مقایسه روی ستونPrint*, All(A/=B,dim=1) T F Fمقایسه روی سطرPrint*, All(A/=B,dim=2) F F
اسلاید 42: 42Anyدو ماتریس A و B به صورت زیر هستند.تابع کتابخانهای Any به صورت زیر است.Any(mask[, dim])مقایسه روی ستونPrint*, Any(A/=B, dim=1) T F Tمقایسه روی سطرPrint*, Any(A/=B, dim=2) T T
اسلاید 43: ترانهاده یک ماتریستابع ذاتی transpose یک ماتریس را ترانهاده مینماید.TRANSPOSE(X) means در این تابع، آرایه دو بعدی (ماتریس) است ولی لزومی ندارد که ماتریس مربع باشد. 43
اسلاید 44: 44Dot_Productدر این دستور ضرب داخلی دو بردار انجام میشود.Dot_Product(X, Y) means این دستور فقط در بردارها (آرایه یک بعدی با طول و نوع یکسان) عمل میکند. به مثال زیر نگاه کنید.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
اسلاید 45: 45MatMulدر اینجا دستور ضرب ماتریسها به همان روش که در ریاضیات مرسوم است، انجام میشود. به عبارت دیگر اگر یک ماتریس (i,k) در یک ماتریس (k,j) ضرب شود، ماتریس حاصل (i,j) خواهد.MatMul(X, Y) means اکنون به مثال زیر توجه کنید.Integer, Dimension(2,3) :: AInteger, Dimension(3,2) :: BInteger, Dimension(2,2) :: CA=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
اسلاید 46: 46Where constructفرض کنید میخواهید لگاریتم پارهای از عناصر یک ماتریس را بگیرید.Do and if constructDo i = 1, mDo j = 1, nIf(value(i, j) > 0.) ThenLogval(i, j) = log(value(i, j))ElseLogval(i, j) = -99999End ifEnd doEnd doWHERE constructWhere(value > 0.)Logval = log(value)Elsewherelogval = -99999End where
اسلاید 47: 47Forall constructDo and if constructDo i = 1, mDo j = 1, nIf(work(i, j) /= 0.) Thenwork(i, j) = 1./ work(i, j)End ifEnd doEnd doForall constructForall(i = 1:m, j = 1:n, work(i, j) /= 0.)work(i, j) = 1./ work(i, j)End Forall
اسلاید 48: 48متغیرهای اندیسدار شناور تخصیص ایستای حافظه (static memory allocation)تاکنون اندازه متغیرهای اندیسدار برای هر متغیر در ابتدای برنامه معین میشد. به این نحوه تخصیص، که از ابتدا تا انتهای برنامه میزان اندازه ارایه ثابت است، تخصیص ایستا گویند.تخصیص پویای حافظه (dynamic memory allocation)در این رویکرد حسب نیاز، حافظه به متغیر اختصاص داده میشود، بنابراین حافظه تخصیص یافته به هر متغیر اندیسدار میتواند در طول برنامه تغییر کند، که به آن تخصیص پویا گویند.
اسلاید 49: 49نحوه اعلان تخصیص شناور یا پویاReal, Allocatable, Dimension(:) :: arr1در اینجا یک آرایه یک بعدی اعلان شده است که اندازه بعد آن معین نشده است.Real, Allocatable, Dimension(:,:) :: arr2در اینجا یک آرایه دو بعدی اعلان شده است که اندازه ابعاد آن معین نشده است.مثال:Integer, Allocatable, Dimension(:) :: numsInteger :: temp, i, k, n_to_sortPrint(A), How many numbers to sort:Read*, n_to_sortallocate( nums(1:n_to_sort) )DO i = 1, n_to_sortRead*, nums(i)End DOIF(Allocated(nums)) Deallocate(nums)
نقد و بررسی ها
هیچ نظری برای این پاورپوینت نوشته نشده است.