زیربرنامههایابرنامههایفرعی
موسوی ندوشنی
ویراست بهار 1389
1
دانشگاه صنعت آب و برق
مقدمه
معموال برنامههای جدی و بزرگ را به برنامههای کوچکتر
تجزیه میکنند و پس از نوشتن هر یک از آنها ،توسط یک برنامه
اصلی کلیه برنامههای فرعی و یا زیربرنامهها با هم ترکیب
میشوند.
رویکرد فوق شامل فایدههای زیر است.
• گاهی در یک برنامه ،محاسبات مشابهی چند بار تکرار میشود ،برای
•
•
•
2
پرهیز از تکرار میتوان محاسبات مشابه را به یک برنامه فرعی سپرد.
هر برنامه فرعی را میتوان مستقل از برنامههای دیگر ترجمه و تست
کرد .با این روش کار برنامهنویسی سادهتر خواهد شد.
برنامه فرعی با برنامه اصلی تعامل خواهد داشت .در این تعامل اگر
برنامهنویس تصادفا اشتباهی مرتکب شود روی سایر برنامههای فرعی
میتواند تاثیر نگذارد.
یک زیربرنامه را میتوان در برنامههای اصلی متفاوت به اشتراک
گذاشت و از آن استفاده نمود.
دانشگاه صنعت آب و برق
مثال
عمل محاسبه فاکتوریل سه بار تکرار شده، همانطور که مالحظه میشود.به برنامه زیر توجه کنید
.است
Fact_n = 1; Fact_m = 1; Fact_nm = 1
Read*, n, m
! calculation of Factorials
Do i = 1,n
End do
Do i = 1,m
End do
Do i = 1,n-m
• Fact_n = Fact_n*i
• Fact_m = Fact_m*i
•
Fact_nm = Fact_nm*i
End do
! calculation of C(m,n)
Comb = Fact_n/(Fact_m*Fact_nm)
Write(*,*) Comb
End
دانشگاه صنعت آب و برق
3
انواعزیربرنامهها
به طور کلی برنامههای فرعی یا زیربرنامهها به دو
قسمت تقسیم میشوند.
• تابع )(function
• زیرروال )(subroutine
همانطور که قبال مالحظه شد ،توابع به دو قسمت تقسیم
میشود.
• توابع پیش ساخته و یا کتابخانهای ،مانند cos ،sin ،logو قدر
•
4
مطلق و ...
توابع مورد نظر کاربر
دانشگاه صنعت آب و برق
فرمکلییکزیربرنامهازنوعتابع
فرم کلی تابع به صورت زیر است.
)] [type] Function name([a1,a2, …,an
دستورات مربوط به اعالن
متن برنامه یا دستورات اجرایی
] End Function [name
به آرگومانهای ،a1,a2, …, anآرگومانهای مجازی و یا صوری
گویند.
همانطور که مالحظه میشود ،آرگومانهای a1,a2, …, an
اختیاری هستند.
مورد اختیاری ] [typeنوع نام تابع مشخص میکند و در صورت
عدم تعیین آن از پیشفرض استفاده میشود.
نوع نام تابع را میتوان در دستورات اعالن داخل بدنه تابع نیز
معرفی نمود.
5
دانشگاه صنعت آب و برق
)1(مثال
Function Fact(k)
Fact = 1.
Do i = 1, k
Function Fact(k)
Integer :: Fact = 1
Do i = 1, k
End do
End Function Fact
End do
End Function Fact
• Fact = Fact*i
Integer Function Fact(k)
Fact = 1
Do i = 1, k
• Fact = Fact*i
End do
End Function Fact
• Fact = Fact*i
Function Fact(k)
Implicit none
Integer :: Fact = 1
Integer :: k, i
Do i = 1, k
• Fact = Fact*i
End do
End Function Fact
دانشگاه صنعت آب و برق
6
)1(مثال
! Main program
Read*, n, m
Comb = Fact(n) / ( Fact(m) * Fact(n-m) )
Write(*,*) Comb
Contains
! Function subprogram
Integer Function Fact(k)
Fact = 1
Do i = 1, k
• Fact = Fact*i
End do
End Function Fact
End
دانشگاه صنعت آب و برق
7
)2(مثال
زیربرنامه اول
Integer Function Som (a, b, c)
• Implicit none
• Integer :: a, b, c
• Som = a+b+c
End Function Som
زیربرنامه دوم
Logical Function positive(a)
• Implicit none
• Real :: a
• If(a > 0.0) Then
• Else
Positive = .true.
Positive = .false.
• End if
End Function positive
دانشگاه صنعت آب و برق
8
تابعبدونآرگومان
همانطور که در مثال زیر مالحظه میکنید ،تابع بهکار رفته بدون
آرگومان است.
)( Real Function pi
) pi = 4.*atan(1.
End function pi
9
دانشگاه صنعت آب و برق
)2(مثال
program circle
implicit none
Real :: radius
print*, 'Enter radius'
Read*, radius
print*, area(radius)
print*, perimeter(radius)
contains
! First function
Real Function area(r)
Real :: r
area = pi()*r**2
End function area
! Second function
Real Function perimeter(r)
Real :: r
perimeter = 2.*pi()*r
End function perimeter
! Third function
Real Function pi()
pi = 4.*atan(1.)
End function pi
End program circle
دانشگاه صنعت آب و برق
10
آرگومانهایواقعیباساختگی
آرگومان صوری یا مجازی ) (formalو یا ساختگی )(dummy
متغیری است که در عنوان تابع اعالن میشود.
آرگومان واقعی ) (actualمتغیر یا عباراتی است که در فراخوانی
تابع ذکر میشود.
وقتی فراخوانی تابع اجرا میشود ،آرگومان واقعی در آرگومان
صوری به ترتیب موقعیت آنها از چپ به راست کپی میشوند.
آنگاه کنترل به اولین دستور قابل اجرا در بدنه تابع انتقال مییابد.
وقتی آخرین دستور در تابع اجرا شد ،کنترل به نقطهای که تابع از
آن فراخوانده شده است باز میگردد ،و اجرای برنامه از اولین
دستور اجرایی بعد از آن نقطه ادامه مییابد.
11
دانشگاه صنعت آب و برق
سازگاریآرگومانهایواقعیوصورییامجازی
شرایط زیر برای سازگاری باید برقرار باشد.
• یکسان بودن اسامی آرگومانهای واقعی و مجازی ضرورتی
•
•
•
12
ندارد.
رعایت ترتیب آرگومانهای واقعی و مجازی الزامی است.
نوع آرگومانهای واقعی و مجازی باید یکسان باشد.
بین آرگومانهای واقعی و مجازی باید رابطه یک به یک
برقرار باشد.
دانشگاه صنعت آب و برق
ارتباطآرگومانها(واقعیباصوری) درتابع
Integer :: a, b, c
a=10
b=5
c=3
Print*, Small(a,b,c)
Print*, Small(a+b,b+c,c)
Print*, Small(10,5,3)
print*, Small((a), (b), (c))
Contains
Integer Function &
Small(x,y,z)
Implicit none
Integer :: x, y, z
if(x <= y .AND. x <= z)
Then
• Small = x
Elseif(y <= x .AND. y <=
z) Then
• Small = y
Else
• Small = z
End if
End Function Small
End
دانشگاه صنعت آب و برق
13
دنبالهارتباطآرگومانها(واقعیباصوری)
در تابع ،مقادیر آرگومان واقعی به آرگومان صوری
منتقل میشود .این انتقال متضمن قواعد زیر است.
• اگر آرگومان واقعی عبارت باشد ،ابتدا محاسبه شده و در یک
محل موقت ذخیره میشود .آنگاه مقدار ذخیره شده منتقل
میگردد.
• اگر آرگومان واقعی مقدار ثابت باشد ،آنگاه به مثابه یک
عبارت محسوب شده و وفق بند فوق عمل میشود.
• اگر آرگومان واقعی متغیر باشد ،آنگاه مقدارش به آرگومان
صوری منتقل میشود.
• اگر آرگومان متغیری باشد که در داخل پرانتز ) (Aباشد،
آنگاه به منزله یک عبارت محسوب شده و وفق بند عبارت
دانشگاه صنعت آب و برق
14عمل میشود
دنبالهارتباطآرگومانها(واقعیباصوری)
c
b+c
a+b
c
b
a
z
y
x
z
y
x
)(c
)(b
)(a
3
5
10
z
y
x
z
y
x
15
دانشگاه صنعت آب و برق
یکبرنامهاصلیوچندبرنامهفرعی
Program Wrong
Implicit none
…………..
Contains
Integer Function F1(…)
یک برنامه اصلی میتواند شامل
( چند برنامه فرعیcontains)
اما یک برنامه فرعی،باشد
(contains) نمیتواند شامل
.برنامه فرعی دیگری باشد
Implicit none
…………..
Contains
Real Function F2(…)
Implicit none
…………..
End Function F2
End Function F1
End
دانشگاه صنعت آب و برق
16
زیربرنامهیابرنامهفرعی)(subroutine
همانطور که مالحظه شد ،زیربرنامه از نوع تابع یک مقدار را برمیگرداند،
بر عکس زیربرنامه از نوع سابروتین دارای خواص زیر است.
• مقداری باز نمیگرداند.
• در یک عبارت محاسباتی نیز ظاهر نمیشود.
• در هنگام فراخوانی به عنوان یک عبارت کامل و تنها ظاهر میشود ،و برای این کار
از واژه callاستفاده میگردد.
• سابروتین مقادیری را از آرگومانهای صوری دریافت میکند و پس از انجام محاسبات
نتایج را در یک سری از آرگومانهای ساختگی ذخیره میشود.
فرم کلی سابروتین به صورت زیر است.
])Subroutine name[(a1, a2, a3,…, an
]دستورات مربوط به اعالن[
]دستورات اجرایی[
]End Subroutine [name
17
دانشگاه صنعت آب و برق
مثال
program circle
implicit none
Real :: radius, area, perimeter
print '(A\)', 'Enter radius: ‘
Read*, radius
call area_peri(radius, area, perimeter)
print*, area
call star
print*, perimeter
call star
contains
! First subprogram (subroutine )
subroutine area_peri(r, A, P)
Real :: r, a, p
A = pi()*r**2
P = 2.*pi()*r
End subroutine area_peri
! Second subprogram (function)
Real Function pi()
pi=4.*atan(1.)
End function pi
! Thrid subprogram (subroutine )
subroutine star
print "(20('-'))"
End subroutine star
End program circle
دانشگاه صنعت آب و برق
18
خاصیتintent
در تابع از خاصیت intentبرای آرگومان ورودی
استفاده میشود و خروجی در نام تابع ذخیره میشود،
بنابراین از خاصیت intentفقط قسمت inاستفاده
میشود.
در مورد سابروتین ،چون انواع آرگومان وجود دارد،
خاصیت intentدارای انواع زیر است.
) Intent(in
) Intent(out
) Intent(inout
19
دانشگاه صنعت آب و برق
مثالها
1 مثال
Subroutine Means(a, b, c, Am, Gm, Hm)
• Implicit none
• Real, intent(in) :: a, b, c
• Real, intent(out) :: Am, Gm, Hm
• ………………………
End subroutine Means
2 مثال
Subroutine swap(a, b)
• Implicit none
• Integer, intent(inout) :: a, b
• ………………………
End subroutine swap
دانشگاه صنعت آب و برق
20
)1(مثالتعاملبرنامهاصلیوزیربرنامه
Program example1
• Implicit none
• Integer :: a, b, c
• ………………
• Call large(a, b, c)
• ………………
• contains
Subroutine large(u,v,w)
• Implicit none
• Integer, intent(in) :: u,v
• Integer, intent(out) :: w
• If(u > v) then
w=u
• Else
w=v
• End if
End subroutine large
دانشگاه صنعت آب و برق
21
)2(مثالتعاملبرنامهاصلیوزیربرنامه
Program test
• Implicit none
• Integer :: a, b, c=5
• a=1
• b=2
• Call sub(a, b, c)
• ………………
Contains
Subroutine sub(u, v, w)
• Implicit none
• Integer, intent(in) :: u
• Integer, intent(inout) ::
v
Integer, intent(out) :: w
w=u+v
v = v*v - u*u
•
•
•
End subroutine sub
End program test
دانشگاه صنعت آب و برق
22
نمایشاستفادهازخاصیتintent
آرگومان
صوری
آرگومان
واقعی
)Intent(in
u
a
)Intent(inout
v
b
)Intent(out
w
c
23
دانشگاه صنعت آب و برق
ارتباطآرگومانها(واقعیبا صوری) درسابروتین
تعامل بین آرگومانهای واقعی با آرگومانهای صوری در
زیربرنامه از نوع سابروتین شبیه زیربرنامه از نوع تابع
است ،با این تفاوت که در تابع تنها از خاصیت
) intent(inاستفاده میشود .اما در سابروتین از
) intent(out) ،intent(inو ) intent(inoutاستفاده
میگردد.
با توجه به نکته اخیر این مطلب را باید به حافظه سپرد
که:
• در تعامالتی که از ) intent(outو ) intent(inoutاستفاده
24
میشود ،آرگومان واقعی متناظر با هر آرگومان صوری باید
عدد ثابت.
متغیر باشد و نه عبارت و یا
دانشگاه صنعت آب و برق
مثال
Program Errors
• Implicit none
• Integer :: a, b, c
• ………………
• Call&
sub(1,a,a+b,(c),1+a)
………………
•
Contains
Subroutine&
sub(u,v,w,p,q)
• Implicit none
• Integer, intent(out) :: u
• Integer, intent(inout) ::v
• Integer, intent(in) :: w
• Integer, intent(out) :: p
• Integer, intent(in) :: q
• ………………
• End Subroutine sub
• End Program Errors
دانشگاه صنعت آب و برق
25
مثال
Program Errors
• Implicit none
• Integer :: a, b, c
• ………………
• Call&
sub(1,a,a+b,(c),1+a)
………………
•
Contains
Subroutine&
sub(u,v,w,p,q)
• Implicit none
• Integer, intent(out) :: u
• Integer, intent(inout) ::v
• Integer, intent(in) :: w
• Integer, intent(out) :: p
• Integer, intent(in) :: q
• ………………
• End Subroutine sub
• End Program Errors
دانشگاه صنعت آب و برق
26
مثال
Program Errors
• Implicit none
• Integer :: a, b, c
• ………………
• Call sub(1, a, a+b, &
(c) ,1+a)
• ………………
Contains
Subroutine&
sub(u,v,w,p,q)
• Implicit none
• Integer, intent(out) :: u
• Integer, intent(inout) ::v
• Integer, intent(in) :: w
• Integer, intent(out) :: p
• Integer, intent(in) :: q
• ………………
• End Subroutine sub
• End Program Errors
دانشگاه صنعت آب و برق
27
متغیرهایمحلیوسراسرییاجهانییاکلی
متغیر محلی )(local variable
• در زیربرنامهها دو نوع متغیر وجود دارد.
متغیر و یا متغیرهایی که از طریق آرگومانها (ساختگی) وارد زیربرنامه
میشوند.
متغیر و یا متغیرهایی که در زیربرنامه مورد استفاده قرار میگیرند که
ارتباطی با آرگومانها ندارند و به آنها متغیرهای محلی گویند.
• متغیرهای محلی تنها زمانی فضای حافظه را اشغال میکنند که
زیربرنامه در حال اجرا باشد .در لحظهای که زیربرنامه فراخوانی
میشود ،فضای حافظه برای متغیرهای محلی ایجاد میشوند .وقتی
که کنترل از زیربرنامه خارج شد ،متغیرهای محلی آن از حافظه
پاک و محو میشوند.
متغیر جهانی یا سراسری یا کلی )(global variable
• بر عکس متغیرهای محلی ،بعضی از متغیرها خارج از کلیه
28
اینبرقمتغیرها را سراسری گویند.
زیربرنامهها اعالن میشوند.
دانشگاه صنعت آب و
1مثال
Integer :: x, y
Read*, x, y
call swap(x,y)
print*, x, y
print*, temp
contains
subroutine swap(a,b)
Integer, intent(inout) :: a, b
integer :: temp
temp = a
a = b
b = temp
End subroutine
End
یک متغیرtemp از طریق آرگومان وارد زیربرنامه شدهاند ولی متغیرb وa متغیرهای،swap در زیربرنامه
.محلی است
دانشگاه صنعت آب و برق
29
2مثال
Real, parameter :: pi =
3.14159
Real :: redius
Read*, radius
Print*, area(radius)
Print*, peri(radius)
contains
Function area(r)
Real, intent(in) :: r
area = pi*r**2
End function area
Function peri(r)
Real, intent(in) :: r
peri = 2.*r*pi
End function
End
همانطور که مالحظه میگردد
در برنامه اصلی و یاpi ثابت
( اعالن شدهhost) میزبان
است و زیربرنامهها از آن
استفاده مینمایند و لزومی به
در زیربرنامههاpi اعالن
.نیست
یک متغیر سراسری یاpi به
.جهانی گویند
دانشگاه صنعت آب و برق
30
2دنبالهمثال
Real, parameter :: pi =
3.14159
Real :: redius
Read*, radius
Print*, area(radius)
Print*, peri(radius)
contains
Function area(r)
Real, intent(in) :: r
pi = 4. ! illegal
area = pi*r**2
End function area
Function peri(r)
Real, intent(in) :: r
peri = 2.*r*pi
End function
End
سراسری استpi چون متغیر
و ضمنا بهصورت ثابت نیز
برنامه،تعریف شده است
درpi اجازه تغییر مقدار
.زیربرنامه را نمیدهد
دانشگاه صنعت آب و برق
31
2دنبالهمثال
Real :: redius
Read*, radius
Print*, area(radius)
Print*, peri(radius)
contains
Function area(r)
Real, intent(in) :: r
Real, parameter :: pi = 3.14159
area = pi*r**2
End function area
Function peri(r)
Real, intent(in) :: r
peri = 2.*r*pi
End function
End
یک متغیر محلیpi در اینجا
است که فقط برای زیرنامه
عمل میکند وarea
چون مقدارperi زیربرنامه
مقدارش برابر، را نداردpi
.صفر است
دانشگاه صنعت آب و برق
32
2دنبالهمثال
Real :: pi = 3.14159
Real :: redius
Print '(A\)', "Enter
radius= "
Read*, radius
Print*, area(radius)
Print*, peri(radius)
contains
Function area(r)
Real, intent(in) :: r
real :: pi = 4.
area = pi*r**2
End function area
Function peri(r)
Real, intent(in) :: r
peri = 2.*r*pi
End function
End
بهصورتpi در اینجا مقدار
.یک متغیر تعریف شده است
pi مقدارarea در زیربرنامه
است و مساحت با4. برابر
اما.این مقدار محاسبه میشود
pi=3.14159 مقدار محیط با
.محاسبه میگردد
دانشگاه صنعت آب و برق
33
2دنبالهمثال
Real :: pi = 3.14159
Real :: redius
Print '(A\)', "Enter
radius= "
Read*, radius
Print*, area(radius)
Print*, peri(radius)
contains
Function area(r)
Real, intent(in) :: r
pi = 4.
area = pi*r**2
End function area
Function peri(r)
Real, intent(in) :: r
peri = 2.*r*pi
End function
End
درpi در اینجا چون متغیر
،زیربرنامه اعالن نشده است
بنابراین با برنامه اصلی تعامل
یعنی برنامه اصلی.ایجاد میکند
که میرودarea که به زیربرنامه
میگردد و زمانی کهpi=4. مقدار
برنامه اصلی به سراغ زیربرنامه
خواهدpi=4. میرود مقدارperi
.بود
دانشگاه صنعت آب و برق
34
3مثال
Program scope_2
Implicit none
integer :: a=1, b=2, c=3
print*, Add(a)
c=4
print*, Add(a)
print*, Mul(b,c)
Contains
Integer Function
Mul(x,y)
Integer, intent(in) ::
x, y
Mul = x*y
End Function Mul
End program scope_2
Integer Function Add(q)
Integer, intent(in) :: q
Add = q+c
End Function Add
دانشگاه صنعت آب و برق
35
(side effect)اثرجانبی
program scope_3
Integer :: i, Max=5
Do i=1, Max
print*, Sum1(i)
End do
Do i=1, n
s=s+i
End do
Sum1=s
End Function Sum1
End program scope_3
Contains
Integer Function Sum1(n)
Integer, intent(in) :: n
Integer :: s
s=0
دانشگاه صنعت آب و برق
36
(side effect)اثرجانبی
program scope_3
Integer :: i, Max = 5
Do i=1, n
s = s+i
End do
Sum1 = s
End Function Sum1
End program scope_3
Do i=1, Max
print*, Sum1(i)
End do
Contains
Integer Function Sum1(n)
Integer, intent(in) :: n
Integer :: s, i
s = 0
دانشگاه صنعت آب و برق
37
زیربرنامههاویارویههایداخلیوخارجی
ارتباط و تعامالت بین برنامه اصلی و زیربرنامهها و یا
رویهها و همچنین بین خود رویهها ،شامل نکات مهم و
قابل تأملی است .این نکات شامل متغیرها محلی و
عمومی(مقادیر ثابت ،به اشتراک گذاشتن متغیرها و
ثابتها و )...نیز میگردد .بهطور کلی در این
خصوص ،دو رویکرد را میتوان از یکدیگر تمیز داد.
رویکرد داخلی
• همانطور که تاکنون مشاهده شد ،زیربرنامهها بین دستورات
containsو Endپایان برنامه اصلی یا میزبان ()host
احاطه شده بودند و خاصیت تو در تویی نیز برای زیربرنامه
برقرار نبود .به این رویکرد ،ارتباط به نحو داخلی گویند.
38
دانشگاه صنعت آب و برق
(زیربرنامهداخلیsyntax) نحو
[program name]
• دستورات اعالن
• دستورات اجرایی
[contains
• internal subprograms]
End [program [name]]
دانشگاه صنعت آب و برق
39
ویژگیهایرویکردداخلی
برنامه اصلی و زیربرنامهها در یک فایل قرار دارند و
لذا یکجا به زبان ماشین ترجمه میشوند .واضح است که
در این رویکرد نمیتوان آنها را از مجزا نمود.
استفاده از این روش به سهولت انجام میشود.
اگر حجم برنامه زیاد باشد ویرایش و اصالح آن ،امر
نسبتا ً دشواری است.
برنامه جداگانه دیگری (غیر از برنامه میزبان) نمیتواند
از رویههای داخلی استفاده کند ،که البته این محدویت قابل
مالحظهای است.
40
دانشگاه صنعت آب و برق
دنبالهویژگیهایرویکردداخلی
رویهها و یا زیربرنامههای داخلی تمام خصوصیات
عناصر پارامترها و متغیرها ( برنامه اصلی) را به ارث
میبرند .یعنی در حالت کلی تمام متغیرها و پارامترها
برنامه اصلی برای زیربرنامهها قابل رؤیت و قابل
استفاده هستند .مثالً اگر در برنامه میزبان دستور
implicit noneرا اعالن کنید ،دیگر نیازی نیست که
آن را در زیربرنامهها اعالن نمود .اگر عدد ثابت پی
) (piدر برنامه میزبان اعالن شود ،میتوان از آن در
تمام رویهها (بدون اعالن مجدد) استفاده نمود ،مگر این
که متغیری به همین نام در رویهای اعالن گردد ،که در
شود.
این صورت ارتباط قطع می
41
دانشگاه صنعت آب و برق
رویکردخارجی
همانطور که مشاهده شد ،رویکرد داخلی علیرغم سهولت
به لحاظ محدویتهایی که داشت ،کاربرد وسیعی ندارد و
در مقابل آن رویکرد خارجی سامان یافته است.
در این رویکرد کلیه رویهها (اعم از برنامه اصلی و
زیربرنامهها) با دستور Endخاتمه مییابند و یکی در
داخل دیگری نیست و یا:
حتی میتوانند در فایلهای مجزا قرار گیرند.
در این صورت میتوانند به صورت مجزا نیز ترجمه
شوند.
42
دانشگاه صنعت آب و برق
( زیربرنامهخارجیsyntax)نحو
subroutine name[(arguments)]
• دستورات اعالن
• دستورات اجرایی
[contains
• internal subprograms]
End [subroutine [name]]
یا
function name([arguments])
• دستورات اعالن
• دستورات اجرایی
[contains
• internal subprograms]
End [function [name]]
دانشگاه صنعت آب و برق
43
دنبالهرویکردخارجی
رویکرد خارجی خود به دو بخش تقسیم میشود.
• برنامه اصلی و زیربرنامهها به صورت بخشهای مجزا از هم
•
44
در یک و یا چند فایل (حسب مورد) قرار میگیرند و دستور
containsبین آنها قرار نمیگیرد ،این روش در فرترن 77
مرسوم است.
همه و یا تعدادی از زیربرنامهها در ساختاری قرار میگیرند
که به آن ماژول ) (Moduleگویند .این امکان در نسخ
پایینتر زبان فرترن وجود نداشت
دانشگاه صنعت آب و برق
مثالبارویکردخارجی
program Area_Volume
Real :: radius
Print*, 'Enter a radius'
Read*, radius
Print*, 'Area:', Area(radius)
Print*, 'Volume:', Volume(radius)
End
Function Area(r)
Real, intent(in) :: r
Real, parameter :: pi = 3.14159
Area = pi*(r**2)
End
Function Volume(r)
Real, intent(in) :: r
Real, parameter :: pi = 3.14159
Volume = 4.0*pi*(r**3) / 3.0
End
دانشگاه صنعت آب و برق
45
دنبالهمثالبارویکردخارجی
program Area_Volume
Real :: radius
Real :: pi = 3.14159
common pi
Print*, 'Enter a radius'
Read*, radius
Print*, 'Area:', Area(radius)
Print*, 'Volume:', Volume(radius)
End
Function Area(r)
Real, intent(in) :: r
common pi
Area = pi*(r**2)
End
Function Volume(r)
Real, intent(in) :: r
common pi
Volume = 4.0*pi*(r**3)/3.0
End
دانشگاه صنعت آب و برق
46
قطعهیاماژول()Module
همانطور که مالحظه شد چندین زیربرنامه میتوانند بعد از برنامه
اصلی ظاهر شوند .از نسخه 90به بعد فرترن ،این امکان وجود
دارد که چند زیربرنامه را در یک جا تجمیع نمود و تشکیل یک
قطعه و یا ماژول داد.
مقایسه ماژول با برنامه اصلی
• ساختار ماژول بسیار شبیه برنامه اصلی است و هیچ کدام دارای
•
•
•
47
آرگومان نیستند.
ماژول با واژه moduleشروع و با end moduleختم میشود اما
برنامه اصلی با programشروع و با end programبه پایان میرسد.
ماژول به جز پارهای از دستورات خاص (نظیر اعالن ،محدوده عمل و
)...و زیربرنامهها نمیتواند شامل دستورات دیگری باشد.
عناصر داخل ماژول نمیتوانند به تنهایی اجرا شوند و حتما باید ارتباط
آن را با یک برنامه اصلی برقرار نمود.
دانشگاه صنعت آب و برق
( ماژولsyntax)نحو
Module name
• Implicit none
Specification part
• [Contains
internal subprograms]
End [module [name]]
یا
Module name
• [Implicit none
Specification part]
• Contains
internal subprograms
End [module [name]]
دانشگاه صنعت آب و برق
48
) سادهازماژول1(یکمثال
Module test
Implicit none
Real, parameter :: pi = 3.1415926
Real, parameter :: g = 9.80
Integer :: counter
End module test
دانشگاه صنعت آب و برق
49
) سادهازماژول1(یکمثال
Module test
Implicit none
Real, parameter :: pi = 3.1415926
Real, parameter :: g = 9.80
Integer :: counter
قسمت ویژه
End module test
دانشگاه صنعت آب و برق
50
)2(مثال
Module average
Contains
Real function som(a, b, c)
Implicit none
Real, intent(in) :: a, b, c
som = a+b+c
End function som
Real function mean(a, b, c)
Implicit none
Real, intent(in) :: a, b, c
mean = som(a, b, c)/3.0
End function
End module average
دانشگاه صنعت آب و برق
51
)2(مثال
Module average
Contains
Real function som(a, b, c)
Implicit none
Real, intent(in) :: a, b, c
som = a+b+c
End function som
Real function mean(a, b, c)
Implicit none
Real, intent(in) :: a, b, c
mean = som(a, b, c)/3.0
End function
End module average
دانشگاه صنعت آب و برق
52
)3(مثال
Module Degree_Radian
Implicit none
Real, parameter :: pi=3.1415926
Real, parameter :: degree180=180.0
contains
Real Function DegreeToRadian(degree)
Implicit none
Real, intent(in) :: degree
DegreeToRadian = degree*pi/degree180
End Function DegreeToRadian
Real Function RadianToDegree(radian)
Implicit none
Real, intent(in) :: radian
RadianToDegree = radian*degree180/pi
End Function RadianToDegree
End Module Degree_Radian
دانشگاه صنعت آب و برق
53
چگونگیاستفادهازماژول
وقتی یک ماژول ایجاد شد ،اجزا آن که به شرح زیر است،
جهانی یا سراسری هستند .یعنی آنها از برنامهها و
ماژولهای دیگر قابل دسترسی میباشند.
• مقادیر ثابت (در قسمت ویژه)
• متغیرها (در قسمت ویژه)
• زیربرنامهها
برای ارتباط با دادهها و زیربرنامههای ماژول ،در
برنامههای دیگر (برنامه اصلی ،زیربرنامهها و ماژول) به
صورت زیر عمل میشود.
• USE module-name
• این دستور فقط در اول برنامه میآید ،و اگر این ترتیب رعایت
نشود برنامه خطا میدهد.
54
دانشگاه صنعت آب و برق
برنامهاصلیوزیربرنامهوماژولساده
Module something
Real, parameter :: pi = 3.141592, g = 9.80665
Integer :: counter
End Module something
Program Main
Use something
read *, L
f = (1.0 / 2.0 * pi) sqrt (g / L)
T = 1.0 / f
End program Main
Function area(r)
Use something
Real :: r
area = pi*r**2
End function
دانشگاه صنعت آب و برق
55
متغیرهایعمومیوخصوصیدرماژول
Module TheTest
Implicit none
Integer :: sky,
moon
Real :: city
Logical :: is_true
Real, parameter ::
pi = 3.141592
Public :: sky, moon
Private :: sizestar
Private :: pi, city
Integer Function
sizestar()
……………………………
End Funtion
Real Function
power(e)
……………………………
End Function
……………………………
End Module TheTest
contains
دانشگاه صنعت آب و برق
56
مثالبهاشتراکگذاریآرایه
Module share_data
implicit none
Integer, parameter :: Num_vals=5
Real, Dimension(Num_vals) :: values
End Module
Program test_module
Use share_data
Real, parameter :: pi=3.141592
values = pi*(/1.,2., 3., 4., 5./)
call sub1
End Program test_module
Subroutine sub1
Use share_data
implicit none
Write(*,*) values
End Subroutine sub1
دانشگاه صنعت آب و برق
57
تعاملبینمتغیرهایاندیسداروزیربرنامهها
همانطور که قبال مالحظه شد ،برنامه اصلی آرگومانهای
واقعی را به آرگومانهای صوری برنامههای فرعی
منتقل میکند.
اما اکنون حالتی مد نظر است که آرگومانهای اصلی به
صورت آرایه هستند ،لذا در ادامه کار این انتقال مورد
کاوش بیشتری قرار میگیرد.
58
دانشگاه صنعت آب و برق
)1(کد
Integer, Parameter :: Lower_Bound=20
Integer, Parameter :: Upper_Bound=50
Integer, Dimension(Lower_Bound:Upper_Bound) :: Data
Real, Dimension(1:Lower_Bound) :: Values
Logical, Dimension(21:Upper_Bound) :: Answers
..................................................
Call First(Data, Values, Answers, Lower_Bound,
Upper_Bound, 21)
Contains
Subroutine First(x, y, z, Lower, Upper, LL)
Integer, intent(IN) :: Lower
Integer, intent(IN) :: Upper
Integer, intent(IN) :: LL
Integer, Dimension(Lower:Upper), intent(IN) :: x
Real, Dimension(1:Lower), intent(OUT) :: y
Logical, Dimension(LL:Upper), intent(INOUT) :: z
..................................................
End Subroutine
دانشگاه صنعت آب و برق
59
)1(کد
Integer, Parameter :: Lower_Bound=20
Integer, Parameter :: Upper_Bound=50
Integer, Dimension(Lower_Bound:Upper_Bound) :: Data
Real, Dimension(1:Lower_Bound) :: Values
Logical, Dimension(21:Upper_Bound) :: Answers
..................................................
Call First(Data, Values, Answers, Lower_Bound,
Upper_Bound, 21)
Contains
Subroutine First(x, y, z, Lower, Upper, LL)
Integer, intent(IN) :: Lower
Integer, intent(IN) :: Upper
Integer, intent(IN) :: LL
Integer, Dimension(Lower:Upper), intent(IN) :: x
Real, Dimension(1:Lower), intent(OUT) :: y
Logical, Dimension(LL:Upper), intent(INOUT) :: z
..................................................
End Subroutine
دانشگاه صنعت آب و برق
60
)1(کد
Integer, Parameter :: Lower_Bound=20
Integer, Parameter :: Upper_Bound=50
Integer, Dimension(Lower_Bound:Upper_Bound) :: Data
Real, Dimension(1:Lower_Bound) :: Values
Logical, Dimension(21:Upper_Bound) :: Answers
..................................................
Call First(Data, Values, Answers, Lower_Bound,
Upper_Bound, 21)
Contains
Subroutine First(x, y, z, Lower, Upper, LL)
Integer, intent(IN) :: Lower
Integer, intent(IN) :: Upper
Integer, intent(IN) :: LL
Integer, Dimension(Lower:Upper), intent(IN) :: x
Real, Dimension(1:Lower), intent(OUT) :: y
Logical, Dimension(LL:Upper), intent(INOUT) :: z
..................................................
End Subroutine
دانشگاه صنعت آب و برق
61
)1(کد
Integer, Parameter :: Lower_Bound=20
Integer, Parameter :: Upper_Bound=50
Integer, Dimension(Lower_Bound:Upper_Bound) :: Data
Real, Dimension(1:Lower_Bound) :: Values
Logical, Dimension(21:Upper_Bound) :: Answers
..................................................
Call First(Data, Values, Answers, Lower_Bound,
Upper_Bound, 21)
Contains
Subroutine First(x, y, z, Lower, Upper, LL)
Integer, intent(IN) :: Lower
Integer, intent(IN) :: Upper
Integer, intent(IN) :: LL
Integer, Dimension(Lower:Upper), intent(IN) :: x
Real, Dimension(1:Lower), intent(OUT) :: y
Logical, Dimension(LL:Upper), intent(INOUT) :: z
..................................................
End Subroutine
دانشگاه صنعت آب و برق
62
)1(کد
Integer, Parameter :: Lower_Bound=20
Integer, Parameter :: Upper_Bound=50
Integer, Dimension(Lower_Bound:Upper_Bound) :: Data
Real, Dimension(1:Lower_Bound) :: Values
Logical, Dimension(21:Upper_Bound) :: Answers
..................................................
Call First(Data, Values, Answers, Lower_Bound,
Upper_Bound, 21)
Contains
Subroutine First(x, y, z, Lower, Upper, LL)
Integer, intent(IN) :: Lower
Integer, intent(IN) :: Upper
Integer, intent(IN) :: LL
Integer, Dimension(Lower:Upper), intent(IN) :: x
Real, Dimension(1:Lower), intent(OUT) :: y
Logical, Dimension(LL:Upper), intent(INOUT) :: z
..................................................
End Subroutine
دانشگاه صنعت آب و برق
63
)1(کد
Integer, Parameter :: Lower_Bound=20
Integer, Parameter :: Upper_Bound=50
Integer, Dimension(Lower_Bound:Upper_Bound) :: Data
Real, Dimension(1:Lower_Bound) :: Values
Logical, Dimension(21:Upper_Bound) :: Answers
..................................................
Call First(Data, Values, Answers, Lower_Bound,
Upper_Bound, 21)
Contains
Subroutine First(x, y, z, Lower, Upper, LL)
Integer, intent(IN) :: Lower
Integer, intent(IN) :: Upper
Integer, intent(IN) :: LL
Integer, Dimension(Lower:Upper), intent(IN) :: x
Real, Dimension(1:Lower), intent(OUT) :: y
Logical, Dimension(LL:Upper), intent(INOUT) :: z
..................................................
End Subroutine
دانشگاه صنعت آب و برق
64
)1(کد
Integer, Parameter :: Lower_Bound=20
Integer, Parameter :: Upper_Bound=50
Integer, Dimension(Lower_Bound:Upper_Bound) :: Data
Real, Dimension(1:Lower_Bound) :: Values
Logical, Dimension(21:Upper_Bound) :: Answers
..................................................
Call First(Data, Values, Answers, Lower_Bound,
Upper_Bound, 21)
Contains
Subroutine First(x, y, z, Lower, Upper, LL)
Integer, intent(IN) :: Lower
Integer, intent(IN) :: Upper
Integer, intent(IN) :: LL
Integer, Dimension(Lower:Upper), intent(IN) :: x
Real, Dimension(1:Lower), intent(OUT) :: y
Logical, Dimension(LL:Upper), intent(INOUT) :: z
..................................................
End Subroutine
دانشگاه صنعت آب و برق
65
)1(کد
Integer, Parameter :: Lower_Bound=20
Integer, Parameter :: Upper_Bound=50
Integer, Dimension(Lower_Bound:Upper_Bound) :: Data
Real, Dimension(1:Lower_Bound) :: Values
Logical, Dimension(21:Upper_Bound) :: Answers
..................................................
Call First(Data, Values, Answers, Lower_Bound,
Upper_Bound, 21)
Contains
Subroutine First(x, y, z, Lower, Upper, LL)
Integer, intent(IN) :: Lower
Integer, intent(IN) :: Upper
Integer, intent(IN) :: LL
Integer, Dimension(Lower:Upper), intent(IN) :: x
Real, Dimension(1:Lower), intent(OUT) :: y
Logical, Dimension(LL:Upper), intent(INOUT) :: z
..................................................
End Subroutine
دانشگاه صنعت آب و برق
66
)1(کد
Integer, Parameter :: Lower_Bound=20
Integer, Parameter :: Upper_Bound=50
Integer, Dimension(Lower_Bound:Upper_Bound) :: Data
Real, Dimension(1:Lower_Bound) :: Values
Logical, Dimension(21:Upper_Bound) :: Answers
..................................................
Call First(Data, Values, Answers, Lower_Bound,
Upper_Bound, 21)
Contains
Subroutine First(x, y, z, Lower, Upper, LL)
Integer, intent(IN) :: Lower
Integer, intent(IN) :: Upper
Integer, intent(IN) :: LL
Integer, Dimension(Lower:Upper), intent(IN) :: x
Real, Dimension(1:Lower), intent(OUT) :: y
Logical, Dimension(LL:Upper), intent(INOUT) :: z
..................................................
End Subroutine
دانشگاه صنعت آب و برق
67
)1(کد
Integer, Parameter :: Lower_Bound=20
Integer, Parameter :: Upper_Bound=50
Integer, Dimension(Lower_Bound:Upper_Bound) :: Data
Real, Dimension(1:Lower_Bound) :: Values
Logical, Dimension(21:Upper_Bound) :: Answers
..................................................
Call First(Data, Values, Answers, Lower_Bound,
Upper_Bound, 21)
Contains
Subroutine First(x, y, z, Lower, Upper, LL)
Integer, intent(IN) :: Lower
Integer, intent(IN) :: Upper
Integer, intent(IN) :: LL
Integer, Dimension(Lower:Upper), intent(IN) :: x
Real, Dimension(1:Lower), intent(OUT) :: y
Logical, Dimension(LL:Upper), intent(INOUT) :: z
..................................................
End Subroutine
دانشگاه صنعت آب و برق
68
حداکثراندازهآرایهمنتقلمیشود:)2(کد
Integer, Parameter :: Max_size=1000
Real, Dimension(1:Max_size) :: Data
Integer :: Actualsize
Integer :: i
Read*, Actualsize
Read*, (Data(i), i=1,Actualsize)
Print*, 'sum=', Summ(Data, Actualsize, Max_size)
Contains
Real Function Summ(x,n,size)
Integer, intent(IN) :: size, n
Real, Dimension(1:size), intent(IN) :: x
Real :: Total
Integer :: i
Total=0.0
DO i=1,n
• Total=Total+x(i)
End DO
Summ=Total
End Function
End
دانشگاه صنعت آب و برق
69
حداکثراندازهآرایهمنتقلمیشود:)2(کد
Integer, Parameter :: Max_size=1000
Real, Dimension(1:Max_size) :: Data
Integer :: Actualsize
Integer :: i
Read*, Actualsize
Read*, (Data(i), i=1,Actualsize)
Print*, 'sum=', Summ(Data, Actualsize, Max_size)
Contains
Real Function Summ(x,n,size)
Integer, intent(IN) :: size, n
Real, Dimension(1:size), intent(IN) :: x
Real :: Total
Integer :: i
Total=0.0
DO i=1,n
• Total=Total+x(i)
End DO
Summ=Total
End Function
End
دانشگاه صنعت آب و برق
70
حداکثراندازهآرایهمنتقلمیشود:)2(کد
Integer, Parameter :: Max_size=1000
Real, Dimension(1:Max_size) :: Data
Integer :: Actualsize
Integer :: i
Read*, Actualsize
Read*, (Data(i), i=1,Actualsize)
Print*, 'sum=', Summ(Data, Actualsize, Max_size)
Contains
Real Function Summ(x,n,size)
Integer, intent(IN) :: size, n
Real, Dimension(1:size), intent(IN) :: x
Real :: Total
Integer :: i
Total=0.0
DO i=1,n
Total=Total+x(i)
End DO
Summ=Total
End Function
End
دانشگاه صنعت آب و برق
71
حداکثراندازهآرایهمنتقلمیشود:)2(کد
Integer, Parameter :: Max_size=1000
Real, Dimension(1:Max_size) :: Data
Integer :: Actualsize
Integer :: i
Read*, Actualsize
Read*, (Data(i), i=1,Actualsize)
Print*, 'sum=', Summ(Data, Actualsize, Max_size)
Contains
Real Function Summ(x,n,size)
Integer, intent(IN) :: size, n
Real, Dimension(1:size), intent(IN) :: x
Real :: Total
Integer :: i
Total=0.0
DO i=1,n
• Total=Total+x(i)
End DO
Summ=Total
End Function
End
دانشگاه صنعت آب و برق
72
انتقالاندازهبهمقدارالزم:)3(کد
Integer, Parameter :: Max_size=1000
Real, Dimension(1:Max_size) :: Data
Integer :: Actualsize
Integer :: i
Read*, Actualsize
Read*, (Data(i), i=1,Actualsize)
Print*, 'sum=', Summ(Data, Actualsize)
Contains
Real Function Summ(x,n)
Integer, intent(IN) :: n
Real, Dimension(:), intent(IN) :: x
Real :: Total
Integer :: i
Total=0.0
DO i=1,n
• Total=Total+x(i)
End DO
Summ=Total
End Function
End
دانشگاه صنعت آب و برق
73
انتقالاندازهبهمقدارالزم:)3(کد
Integer, Parameter :: Max_ize=1000
Real, Dimension(1:Max_size) :: Data
Integer :: Actualsize
Integer :: i
Read*, Actualsize
Read*, (Data(i), i=1,Actualsize)
Print*, 'sum=', Summ(Data, Actualsize)
Contains
Real Function Summ(x,n)
Integer, intent(IN) :: n
Real, Dimension(:), intent(IN) :: x
Real :: Total
Integer :: i
Total=0.0
DO i=1,n
• Total=Total+x(i)
End DO
Summ=Total
End Function
End
دانشگاه صنعت آب و برق
74
انتقالاندازهبهمقدارالزم:)3(کد
Integer, Parameter :: Max_size=1000
Real, Dimension(1:Max_size) :: Data
Integer :: Actualsize
Integer :: i
Read*, Actualsize
Read*, (Data(i), i=1,Actualsize)
Print*, 'sum=', Summ(Data, Actualsize)
Contains
Real Function Summ(x,n)
Integer, intent(IN) :: n
Real, Dimension(:), intent(IN) :: x
Real :: Total
Integer :: i
Total=0.0
DO i=1,n
• Total=Total+x(i)
End DO
Summ=Total
End Function
End
دانشگاه صنعت آب و برق
75
انتقالاندازهبهمقدارالزم:)3(کد
Integer, Parameter :: Max_size=1000
Real, Dimension(1:Max_size) :: Data
Integer :: Actualsize
Integer :: i
Read*, Actualsize
Read*, (Data(i), i=1,Actualsize)
Print*, 'sum=', Summ(Data, Actualsize)
Contains
Real Function Summ(x,n)
Integer, intent(IN) :: n
Real, Dimension(:), intent(IN) :: x
Real :: Total
Integer :: i
Total=0.0
DO i=1,n
• Total=Total+x(i)
End DO
Summ=Total
End Function
End
دانشگاه صنعت آب و برق
76
ترتیبقرارگرفتندستوراتفرترن
PROGRAM, FUNCTION, SUBROUTINE or MODULE statement
USE statements
IMPLICIT NONE statement
Format
statements
PARAMETER and DATA
statements
Type declaration
Executable statements
CONTAINS
Internal subprograms
END statement
دانشگاه صنعت آب و برق
77
زیربرنامههایبازگشتی
همانطور که قبال مالحظه شد میتوان زیربرنامهها را در
یکدیگر فراخواند .اما پارهای از مسایل هستند که خصلت
بازگشتی دارند.
به عنوان مثال میتوان از محاسبه فاکتوریل نام برد.
!) N! = 1×2×3×…×N N! = N×(N-1
البته مسئله فوق را میتوان توسط یک تابع و یا سابروتین
معمولی برنامهنویسی نمود .اما تکنیک سادهتری وجود
دارد که این گونه مسایل را به صورت بازگشتی حل
میکند.
در روش بازگشتی ،یک زیربرنامه (تابع و یا سابروتین)
میتواند خودش را داخل خودش فراخواند.
78
دانشگاه صنعت آب و برق
محاسبهتابعباناممتفاوت
Real :: radius
Read*, radius
Print*, circle_area(radius)
Contains
!
Function circle_area(r) result(area)
Implicit none
Real :: area
Real :: r
Real :: pi
pi = 4.0*atan(1.0)
area = pi*r**2
End function circle_area
End
دانشگاه صنعت آب و برق
79
محاسبهفاکتوریلتوسطیکتابعبازگشتی
Integer :: n
Read*, n
Print*, fact(n)
CONTAINS
Recursive Function fact(n) Result(n_Fact)
INTEGER, intent(IN) :: n
INTEGER :: n_Fact
IF(n>0) Then
n_Fact = n*fact(n-1)
ELSE
n_Fact = 1
End IF
End function fact
End
دانشگاه صنعت آب و برق
80
نمایشکارکردزیربرنامهبازگشتی
N=1, fact=1
N=2, fact=? N=2, fact=? N=2, fact=2
N=3, fact=? N=3, fact=? N=3, fact=? N=3, fact=?
T=1
T=2
T=3
T=4
دانشگاه صنعت آب و برق
N=3, fact=6
T=5
81
محاسبهفاکتوریلتوسطیکسابروتینبازگشتی
Integer :: n, Res
Read*, n
call Fact(n, Res)
Print*, Res
Contains
Recursive Subroutine Fact(n, Res)
Integer, intent(IN) :: n
Integer, intent(INOUT) :: Res
IF(n>0) Then
call Fact(n-1, Res)
Res = Res*n
Else
Res=1
End IF
End Subroutine
End
دانشگاه صنعت آب و برق
82
© Copyright 2026 Paperzz