صفحه 1:
متغیرهای اندیسدار با زیرنویسدار
صفحه 2:
(Array) 4,7
| * آرايه كروهى از متغيرها يا ثابتها هستند كه نوع آنها يكى
gulls col ا دی ناه مشب
Array a
a(1)
a(2)
a(3)
a(4)
a(5)
حافظه رایانه
صفحه 3:
نمایش متغیر به صورت آرایه
Do i = 1, 100
a(i) = SQRT(a(i))
End do
:جزییات حلقه فوق به صورت زیر است
a(1) = SQRT(a(1))
a(2) = SQRT(a(2))
1
a(100) = SQRT(a(100) )
صفحه 4:
دسنور اعلام متغیر اندیسدار
Real, Dimension(10) :: X =
Character(len = 20), Dimension(50) :: & =
1256
آرایه ميتواند با یک یا چند بعد معرفی شود. تعداد ابعاد یک آرایه را
(TANK) 45, نامند. در مثال فوق رتبه متغیرهای 2۶ و
6 185 برابر یک است.
تعداد عناصر یک بعد را 626610 آن گویند. در متغیر 2 برابر ۱۰
در متغیر 118106 186 برابر ۵۰ است.
ترکیبی از ۲8016 و 621610 هر آرایه را شکل (606) آن
آرايه نامند. au دیراد دارای بت شکل منت اكر رنه مداد
ع اي كاد 2
به تعداد کل درایههای یک آرایه اندازه (5126) آن آرایه گویند.
4
صفحه 5:
| مثال اعلام متغیر اندیسدار» یک بعد و بیش از یک بعد
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
go 4 مثال اخیر توجه کنید. متغیر 6 دارای رتبه یک.و متغیرهای .۷,2
را رت وه
* اندازه متغیرهای YZ 9X با هم برابرند.
* متغیرهای ۶و را دارای شکل یکنان نیستند.
* 6261:6110 بعد دوم متغیرهای2 رل برلبر ۵ لست
5
صفحه 6:
انواع اندبسها
فرم کلی اندیسها به صورت زیر است.
Real, Dimension(Lower_bound:upper_bound) :: array
به شرط آن كه
lower_bound <= upper_bound
به مثالهاى زير توجه کنید.
21
= Real, Dimension(5)
= Real, Dimension(-2:2) 891
= Real, Dimension(5:9) :: cl
Syl, EXtent 4 ole! يكسان هستند. زيرا داراى Shape) هر سه آرلیه دارای شکل
دراحالت کلی تعداد درایه در هر بعد را. میتوان با استفاده از رابطه ساده زیر پدست آورد.
= Extent = upper_bound — lower_bound+1
= Real, Dimension(-2:2, 0:3)
همانطور که ملاحظه میشود هر بعد گستره مربوط به خود را دارد. گستره بعد اول ۵ و گستره بعد
دوم #است.
صفحه 7:
| استفاده از عناصر متغیرهای اندیسدار مانند متغیرهای عادی
| * هر درایه از آرایهای را میتوان به صورت یک متغیر معمولی به
کار برد. به مثال زیر توجه کنید.
Integer, Dimension(10) :: index
Real, Dimension(3) :: temp
۳ دستورات کاملا درست هستند.
Index(10) = 5
Temp(3) = Real(index(1)) / 4.
Write(*,*) ‘index(1) =', index(1)
صفحه 8:
مقداردهی اولیه درایههای یک آرایه یک بعد
همانطور که قبلا هم ذکر شد. خیلی از زمانها لازم است که متفیرها را مقداردهی شوند. به مثال
زیر توجه کنید.
= Real, Dimension(10) :: arrayl
* 00 1 ۶ 1, 0
* arrayl(i) = real(i)
= End do
دستورات زیر معادل کدهای فوق است.
= Real, Dimension(10) :: arrayl
=" arrayl = (/1.,2.,3.,4.,5.,6.,7.,8.,9.,10./)
و بالاخره میتوان عمل مقداردهی را به صورت زیر انجام داد.
Real, Dimension(10) :: arrayl "=
arrayl = 0. "
میتوان عمل مقداردهی را حتی در دستور اعلام نیز گنجاند.
Integer, Dimension(5) :: array2 = (/1,2,3,4,5/) =
صفحه 9:
| ادامه مقداردهی اولیه درایههای یک آرایه یک بعد
" می توان بهصورت عبارت هم مقداردهی نمود. به مثال زیر
توجه کنید.
Integer, parameter :: N = 3, M = 6, P = 12 =
Integer :: arr(1:3) = (/ N, M/N, P/N /) "
* توجه کنید که در مثال بالاء گذاشتن 0810111616۳ اجباری است.
صمنا نمیتوان در مقداردهى Geni) از توابع استفاده نمود: اکنون مثال
بالا را کمی تغییر می دهیم.
Integer, Dimension(3) :: arr =
Integer :: N= 3, M=6, P = 12 =
arr = (/ N, M/N, P/N /) "
صفحه 10:
خطاى مازاد اندي سهاى آرايه
هر درایه یک آرایه به یک اندیس که عدد صحیح است نسبت
داده ميشود. محدوده را دستور اعلام مشخص میکند.
" Real, Dimension(5) :: a
در seek ۵ در اين مثال انديس ها اعداد از | نا
Out Of محاسبات درايه (3)6 رخ دهد. شما خطای
را دريافت مىكنيد. 0
اين خطاى را مىتوان جزء خظاهاى رايج كار با آرايهها
محسوب نمود. يافتن اين خطا در يارهاى از موارد كار سادهاى
نيست.
10
صفحه 11:
استفاده از مقدار ثابت در اعلام آرایه
* همانطور که ملاحظه شد در ابعاد آرایه میتوان اعداد صحیح محتلف را
Sp ya
همچنین میتوان از یک پارامتر و یا عبارت ثابت نیز استفاده نمود. *
متا
Integer, Parameter :: max_size = 100
Real, Dimension(max_size) :: arrayl
Real, Dimension(max_size) :: array2
Real, Dimension(max_size) :: array3
Anges!
Integer, Parameter :: max_size = 100
Integer, Dimension(max_size/4) :: arrayl
Real, Dimension(int(log(Real(max_size)))) :: &
array2
11
صفحه 12:
12
کر
مثال | برای تخصیص حداکثر
Program REVERSE =
"Integer :: i, n
Real, Dimension(1000) "=
"Read*, n, (X(i), i=1, n)
1- ر1 2 1 ۰0۵
۰۳۲10] *, ۱)1(
"End do
" End program REVERSE
صفحه 13:
منال ۲ برای تخصیص حداکنر
3 PSS .
اعلانهای زیر مفروض است.
Integer, parameter :: L_BOUND = 3, U_BOUND = 10 =
Integer, Dinemsion(L_BOUND:U_BOUND) :: x =
ol eouNe, Do i = L BOUND, U_BOUND
U_BOUND : ‘i
دنه if (MODG,2) == 0) Then
۳ :)( < 0
array x() has 3,4,5, Else
we 10 x(@) =1
End if
End do
277۲۵۲ ۲0 1 0 1 0 1 0
13
صفحه 14:
عملیات آرایهای (۱)
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
Doi=1, 4
c(i) = a(i) + b(i)
End do
14
صفحه 15:
عملیات آرایهای (۲)
! Whole array addition
d=a+b
! Write out results
Write(*,100) 'c', c
Write(*,100) ۰۵0۳, 0
100 format(' ', A, '=', 4(F6.1,1X))
End
در این مثال آرایهها حتما باید دارای شکل (5118060) یکسان باشند.
15
صفحه 16:
| عملیات آرابهای (۳)
؟ به مثال زیر توجه کنیب که یک ضرت عدد در آرانه است.
Real, Dimension(4) :: a= & "=
G23 Fela Che
Real :: b = 10 *
= a*b
۰
a
1
=" Real,Dimension(4) :: a=(/-1.,2.,-3.,4./)
= write(*,*) ABS(a)
16
صفحه 17:
ورودی و خروجی در آرایهها (۳)
Write(*,1000) (i, 2*i, 3*i, i = 1, 3)
format(1X, 916) 1000
پاسخ در یک سطر به صورت زیر چاپ میشود.
9 6 3 6 4 2 3 2 1
حلقه 00 ضمنى مىتواند تودرتو باشد. به مثال زير توجه كنيد.
(1:<2- 2 1 ,(3 ,1 < ژ ر,ژ ,ذ6) (۱۷۳1۲6)*,160
format(1X, I5, 1X, 15) 100
ياضخ بفرهورت رآ
مو مو يو رم زم زم
سو رم ين تررم بن
17
صفحه 18:
| قفاوت بين حلقه 00 عادی و حلقه 00 ضمنی
* همانطور که ملاحظه gb ce دو نوع حلقه 00 وجود دارد که اکنون
با مثال زیر میتوان تفاوت On آنها را مشاهده نمود.
Integer, Dimension(5) :: arr = (/1,2,3,4,5/) =
Do i=1,5 "
Write(*,1000) arr(i), 2*arr(i), 3*arr(i) °
format(1X, 616) 1000 ۰
End do =
* اکنون به همین مثال به شکل دیگر توجه کنید.
Write(*,1000) (arr(i), 2*arr(i), 3*arr(i), i = *
)1,5
format(1X,616) 1000 =
18
صفحه 19:
19
10 5
5
12
* پاسخ 00 ضمنی
15
10
* پاسخ 00 عادی
| قفاوت بين حلقه 10 عادی و حلقه 00
N
جح هت فق اص
N tT فى ©
> 6 بم س
8 وه ۱
oo
صفحه 20:
| نحوه تخصیص حافظه در آرایه دو بعدی
به ماتریس زير توجه کنید.
A(1,1)
A(2,1)
A(3,1)
A(1,2)
A(2,2)
A(3,2)
=p
نحوه قرار گرفتن در حافظه
20
A(1,2
A(2,2
A(3,2
A(L,1
A(2,1
A(3,1
oe دو al)
صفحه 21:
| _ نحوه تخصیص حافظه در آرایه سه بعدی
* آرایه سه بعدی 2< 22
21
Roy beh
Sond
S121
5
Soll
۳ یرت
wat 2,2
ae
910 3
0111
1,252
2,2,2
2
1,1,2
۲,۱,۱
صفحه 22:
* به مثال زیر توجه کنید.
Integer, Dimension(4,3) :: =
مقداردهی آرایههای دو بعدی (۱)
مقداردهی با استفاده از نسبت دادن
22
istat
3
=>
*"Doi=1, 4
°Do j =1,
Jistat(i, j) =j
° End do
= End do
صفحه 23:
مقداردهی آرایههای دو بعدی (۲)
* مقداردهی با استفاده از دستور ۲680 به مثال زیر توجه
کنید.
* فرض کنید که دادهها از روی فایلی به نام initial.dat
خوانده شود که دارای ساختار زیر است.
3 3 3 ۵
(4
* کدهای برنامه به صورت زیر است.
:: 153+
23
‘initial.dat')
Integer, Dimension(4,3)
Open(7, file =
Read(7,*) istat
صفحه 24:
| مقداردهی آرایههای دو بعدی (۴)
* اما اگر ساختار فایل ورودی به شکل زیر بود.
۳۱1 2 9:12 و 12 3-4123
کدهای برنامه به صورت زیر است. *
"Integer :: i, j
" Integer, Dimension(4,3) :: istat
" Open(7, file = ‘initial.dat')
" Read(7,*) ((istat(i,j), j = 1, 3),
1 2 1 4(
24
صفحه 25:
زیر آرایهها
© تاکنون عهلیات روی کل ذرايدها یک آرابه انجام شد. اما
میتوان عملیات را روی زیرمجموعهای از درایههای یک آرایه
متمرکز نمود. فرم کلی آن به صورت زیر است.
subscript _1 : subscript 2 [: stride] "
* 1 51105011۳0 ن_شانهنده اولینندیسلست
٩110501101 2 * ن_شاهندم آخریرلندیسلست
* 511106 ن شانهندم گامهایلفزلیشلست
* در واقع این رویه مانند یک حلقه 00 عمل میکند.
25
صفحه 26:
مثال زير آرایه در یک بعد
Integer ::i=3,j=7
Real, Dimension(10) :: a = (/1.,-2.,3.,-4.,5.,-
6.,7.,-8.,9.,-10./)
اکنون به پاسخ زیر ارایههای زیر توجه کنید.
2-0 ,111-49-0 200
a(ijj:j) 03.
a(i:) 0 3.,-4.,5.,-6.,7.,-8.,9.,-10
a(:j). 0 1.,-2.,3.,-4.,5.,-6.,7.
a(::i) 0 1.,-4.,7.,-10.
26
صفحه 27:
مثال زير آرایه در یک بعد
Integer ::i=3,j=7
Real, Dimension(10) :: a = (/1.,-2.,3.,-4.,5.,-
6.,7.,-8.,9.,-10./)
اکنون به پاسخ زیر ارایههای زیر توجه کنید.
2-0 ,111-49-0 200
a(ijj:j) 03.
a(i:) 0 3.,-4.,5.,-6.,7.,-8.,9.,-10
a(:j). 0 1.,-2.,3.,-4.,5.,-6.,7.
a(::i) 0 1.,-4.,7.,-10.
27
صفحه 28:
28
ساق گنک نگاو
ll
a
~—
x
222
oS AA
ه 58 8 8
2۵ ۲ 8
2 3 4 5
* به مثال زیر توجه کنید.
مثال زیر آرایه در دو بعد
صفحه 29:
29
Saree
oS AA
ه 5 8 8
2 ۲ 8
سل سه ارقا
1
لا
Ath) = 2 234 ot
2
دنباله مثال قبل
صفحه 30:
۸۸)1 : 31: 5 : 2(
i ها
8 2 3 ه >
8 28 5 ه م
8 5 ع حسام
dovedosudly
|
۳
دنباله مثال ة
صفحه 31:
| تناظر در آیه به د رآیه دو ماتربس در تساوی کلی
Real, Dimension(1:3,1:2) :: matrice1
Real, Dimension(-1:1,0:1) :: matrice2
matricel = 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:
| ساز کاری زير آرایهها
2۱ مفال ۳
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)
يمنال
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
arrl = arr1(100:1:-1) ! Reverses the order of
arrl
32
صفحه 33:
توایع کتابخانهای آرابهها
3 ا تب و سس ی تا ۱
ها بك شيك زدر
SHAPE(x) ! The shape of x
RESHAPE(x, shapel, pad][, order])
SIZE(x [, Dim ]) ! The size of x
LBOUND(« [, 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
صفحه 34:
shape تابع
0 اين تابع شکل آرایه (بعد و گستره) را نشان میدهد. شکل
عمومى به صورت زير است.
shape(source) =
Jue"
* Integer, Dimension(-2:27,0:49) :: t
" print*, shape(t)
* خروجی عبارتست از:
50 #00
34
صفحه 35:
| تابع Reshape
0 این تابع شکل یک آرایه را عوض میکند. شکل عمومی به
صورت زیر است.
Reshape(source, shapel[, pad][, "
order])
: تال
* Integer, Dimension(2,2) :: A
" A= Reshape((/1,2,3,4/), (/2,2/))
١| .انه Sp
۳ ۴
35
صفحه 36:
| دنباله تابع 65۳۵06
:۲ مثال *
= Integer, Dimension(2,2) :: A
" A= Reshape((/ 1,2,3,4/), (/2,2/),
order=(/2,1/) ١ 5
١ GOS Se
۳ ۴
۲ هنال "
" B = Reshape((/ 1,2,3,4,5,6/), (/2,4/), (/0/),
[ء]07:70[7]0
36
صفحه 37:
Size wt
در این تابع میتوان تعداد کل عناصر یک آرایه و یا یکی از *
ابعاد آن را به دست آورد. نحوه آن عبارتست از:
* Size(source[, Dim])
Jue"
* Real A(2, 3, 5)
° Size(A, 1) 12
* Size(A) 0 30
37
صفحه 38:
تابع 111 در یک بعد
* در این تابع میتوان مجموع عناصر یک آرایه و یا یکی از ابعاد
آن زابه دست اورد. تجوه آن عبار تست از:
Sum(source[, dim] [, mask]) =
Integer :: w(1:11) = (/7,9,- ¢
)/2,4,8,10,2,7,10,2,1
° Print*, sum(w) Oe)
eEnd ۱9 و | | ه| | 4۵۱ 6 | ۱۵۱6
9
38
صفحه 39:
تابع 911170 در دو بعد
= Integer w(2,11)
" w = reshape((/7, 9, -2, 4, 8, 10, 2,
7 10,2, 10; ood &
* 10,-2, -2, 7, 2, 9, -2/), (/2,11/), order
= (/2,1/))
5 print*_sum(w,dim=]) _,)
* End i |ه- |9 ام © | 8 ۱ ©| 0
3 1o| @| ela ۵۵۵۱۱۵] "مه
6 4649 9 8 9 © 06 08 00 4
39
صفحه 40:
Product wt
* در این تابع میتوان حاصلضرب عناصر یک آرایه و یا یکی از
ابعاد آن را به دست آورد. نحوه آن عبارتست از:
eae
* Product(source[, dim][, mask])
= Print*, Product(A, dim=1) 2 12 30
= Print*, Product(A, dim=2) 15 48
1 و |
A=
Bs
40
صفحه 41:
All |
So
13 5 8 3 |
2 4 6 ۳۱ 4+ 8
* تابع کتابخانهای ۸11 به صورت زیر است.
All(mask[, dim]) =
۰
* مقایسه روی ستون
* Print*, All(A/=B,dim=1) IT F F
© مقایسه روی سطر
Print*, All(A/=B,dim=2) 0 F F "
41
صفحه 42:
Any
دو ماتریس ۸و 3 به صورت زیر هستند.
1
سي (025
8 4 7 6 4 2
* تابع کتابخانهای ۸۸1137 به صورت زیر است.
Any(mask[, dim]) =
" مقایسه روی ستون
Print*, Any(A/=B, dim=1) 1 T F T "
" مقایسه روی سطر
Print*, Any(A/=B, dim=2) 1 T T =
42
صفحه 43:
| ترانهاده یک ماتریس
* تابع ذاتی ۳01050096 یک ماتریس را ترانهاده مینماید.
TRANSPOSE(X) mead P X, *
* در این تابع. آرایه دو بعدی (ماتریس) است ولی لزومی ندارد
که ماتریس مربع باشد.
43
صفحه 44:
۲ 10[
pete eRe a ae .
Dot _Product(X, Y) meg@nxX, Y,P Z "
* این دستور فقط در بردارها (آرایه یک بعدی با طول و نوع
یکسان) عمل میکند. به مثال زیر نگاه کنید.
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’; © *
44
صفحه 45:
MatMul
* در اینجا دستور ضرب ماتریسها به همان روش که در ریاضیات مرسوم
است. انجام میشود. به عبارت دیگر اگر یک ماتریس (ر) در یک
ماتریس ([,16) ضرب شود. ماتریسي wales (J) Sole
" MatMul(X, Y) mear@ X,, رح م۲
* اکنون به مثال زیر توجه کنید. *
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
45
صفحه 46:
Where construct |
*_فرض کنید میخواهید لگاریتم پارهای از عناصر یک ماتریس را بگیرید.
Do and if construct
090 1 2 1, «
Doj=i1,n
If(value(i, j) > @.) 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
صفحه 47:
Forall construct
Do and if construct
Doi=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
صفحه 48:
* تخصیص ایستای static MEMOTY) as
allocation
ای انذاره هی هام تشن دار دای هر سیر دشر استاق نامه
معین میشد. به این نحوه تخصیص, که از ابتدا تا انتهای برنامه
مدا ار ی ی ی ها با
* تخصيص يوياى dynamic memory) abil>
allocation
را رس با حافطة بد متثير اختطاض دنه مر
بنابراین حافظه تخصیص یافته به هر متغیر اندیسدار میتواند در
طول برنامه تغییر کند. که به آن تخصیص پویا گویند.
48
صفحه 49:
نحوه اعلان تخصیص شناور يا بويا
"Real, Allocatable, Dimension(:) :: arr1
در اینجا یک آرایه یک بعدی اعلان شده است که اندازه بعد آن معین نشده است.
"Real, Allocatable, Dimension(:,:) :: arr2
در اینجا یک آرایه دو بعدی اعلان شده است که اندازهابعاد آن معین نشده است.
Jeet
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