End Function …………………………… End Module

‫زیربرنامه‌ها‌یا‌برنامه‌های‌فرعی‬
‫موسوی ندوشنی‬
‫ویراست بهار ‪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