Upload
taro
View
78
Download
0
Embed Size (px)
DESCRIPTION
زیربرنامهها یا برنامههای فرعی. موسوی ندوشنی ویراست بهار 1389. مقدمه. معمولا برنامههای جدی و بزرگ را به برنامههای کوچکتر تجزیه میکنند و پس از نوشتن هر یک از آنها، توسط یک برنامه اصلی کلیه برنامههای فرعی و یا زیربرنامهها با هم ترکیب میشوند. رویکرد فوق شامل فایدههای زیر است. - PowerPoint PPT Presentation
Citation preview
دانشگاه صنعت آب و برق 1
زیربرنامه ها یا برنامه های فرعی
موسوی ندوشنی 1389ویراست بهار
دانشگاه صنعت آب و برق 2
مقدمه معموال برنامه های جدی و بزرگ را به برنامه های کوچکتر
تجزیه می کنند و پس از نوشتن هر یک از آنها، توسط یک با زیربرنامه ها و یا برنامه های فرعیبرنامه اصلی کلیه
هم ترکیب می شوند..رویکرد فوق شامل فایده های زیر است
گاهی در یک برنامه، محاسبات مشابهی چند بار تکرار می شود، •برای پرهیز از تکرار می توان محاسبات مشابه را به یک برنامه
فرعی سپرد.هر برنامه فرعی را می توان مستقل از برنامه های دیگر ترجمه •
و تست کرد. با این روش کار برنامه نویسی ساده تر خواهد شد.برنامه فرعی با برنامه اصلی تعامل خواهد داشت. در این تعامل •
اگر برنامه نویس تصادفا اشتباهی مرتکب شود روی سایر برنامه های فرعی می تواند تاثیر نگذارد.
یک زیربرنامه را می توان در برنامه های اصلی متفاوت به •اشتراک گذاشت و از آن استفاده نمود.
دانشگاه صنعت آب و برق 3
مثال ،عمل محاسبه فاکتوریل به برنامه زیر توجه کنید. همانطور که مالحظه می شود
سه بار تکرار شده است. Fact_n=1;Fact_m=1;Fact_nm=1 Read*,n,m !calculationofFactorials Doi=1,n
• Fact_n=Fact_n*i Enddo Doi=1,m
• Fact_m=Fact_m*i Enddo Doi=1,n-m
• Fact_nm=Fact_nm*i Enddo !calculationofC(m,n) Comb=Fact_n/(Fact_m*Fact_nm) Write(*,*)Comb End
دانشگاه صنعت آب و برق 4
انواع زیربرنامه ها به طور کلی برنامه های فرعی یا زیربرنامه ها
به دو قسمت تقسیم می شوند.(function)تابع •
(subroutine)زیرروال • همانطور که قبال مالحظه شد، توابع به دو
قسمت تقسیم می شود. ،log، sinتوابع پیش ساخته و یا کتابخانه ای، مانند •
cos... و قدر مطلق و
توابع مورد نظر کاربر •
دانشگاه صنعت آب و برق 5
فرم کلی یک زیربرنامه از نوع تابع
.فرم کلی تابع به صورت زیر است [type]Functionname([a1,a2,…,an]) دستورات مربوط به اعالن متن برنامه یا دستورات اجرایی EndFunction[name]
به آرگومان هایa1,a2,…,an آرگومان های مجازی و ،یا صوری گویند.
همانطور که مالحظه می شود، آرگومان هایa1,a2,…,an.اختیاری هستند
مورد اختیاری[type] نوع نام تابع مشخص می کند و در صورت عدم تعیین آن از پیش فرض استفاده
می شود. نوع نام تابع را می توان در دستورات اعالن داخل بدنه
تابع نیز معرفی نمود.
(1مثال ) FunctionFact(k) Fact=1. Doi=1,k
• Fact=Fact*i Enddo EndFunctionFact
IntegerFunctionFact(k) Fact=1 Doi=1,k
• Fact=Fact*i Enddo EndFunctionFact
FunctionFact(k) Integer::Fact=1 Doi=1,k
• Fact=Fact*i Enddo EndFunctionFact
FunctionFact(k) Implicitnone Integer::Fact=1 Integer::k,i Doi=1,k
• Fact=Fact*i Enddo EndFunctionFact
دانشگاه صنعت آب و برق 6
دانشگاه صنعت آب و برق 7
(1مثال ) !Mainprogram Read*,n,m Comb=Fact(n)/ (Fact(m)*Fact(n-m)) Write(*,*)Comb
Contains !Functionsubprogram IntegerFunctionFact(k) Fact=1 Doi=1,k
• Fact=Fact*i Enddo EndFunctionFact End
دانشگاه صنعت آب و برق 8
(2مثال )زیربرنامه اول
IntegerFunctionSom(a,b,c)• Implicitnone• Integer::a,b,c• Som=a+b+c
EndFunctionSomزیربرنامه دوم
LogicalFunctionpositive(a)• Implicitnone• Real::a• If(a>0.0)Then
Positive=.true.• Else
Positive=.false.• Endif
EndFunctionpositive
دانشگاه صنعت آب و برق 9
تابع بدون آرگومان همانطور که در مثال زیر مالحظه می کنید، تابع
به کار رفته بدون آرگومان است. RealFunctionpi() pi=4.*atan(1.) Endfunctionpi
(2مثال ) programcircle implicitnone Real::radius print*,'Enterradius' Read*,radius print*,area(radius) print*,perimeter(radius)
contains !Firstfunction RealFunctionarea(r) Real::r area=pi()*r**2 Endfunctionarea
!Secondfunction RealFunctionperimeter(r) Real::r perimeter=2.*pi()*r Endfunctionperimeter !Thirdfunction RealFunctionpi() pi=4.*atan(1.) Endfunctionpi Endprogramcircle
دانشگاه صنعت آب و برق 10
دانشگاه صنعت آب و برق 11
آرگومان های واقعی با ساختگی آرگومان صوری یا مجازی(formal) و یا ساختگی
(dummy) متغیری است که در عنوان تابع اعالن می شود.
آرگومان واقعی(actual) متغیر یا عباراتی است که در فراخوانی تابع ذکر می شود.
وقتی فراخوانی تابع اجرا می شود، آرگومان واقعی درآرگومان صوری به ترتیب موقعیت آنها از چپ به راست کپی می شوند. آنگاه کنترل به اولین دستور قابل اجرا در بدنه تابع انتقال می یابد. وقتی آخرین دستور در تابع اجرا
شد، کنترل به نقطه ای که تابع از آن فراخوانده شده است باز می گردد، و اجرای برنامه از اولین دستور
اجرایی بعد از آن نقطه ادامه می یابد.
دانشگاه صنعت آب و برق 12
سازگاری آرگومان های واقعی و صوری یا مجازی
.شرایط زیر برای سازگاری باید برقرار باشدیکسان بودن اسامی آرگومان های واقعی و •
مجازی ضرورتی ندارد.
رعایت ترتیب آرگومان های واقعی و مجازی •الزامی است.
نوع آرگومان های واقعی و مجازی باید یکسان •باشد.
بین آرگومان های واقعی و مجازی باید رابطه یک •به یک برقرار باشد.
دانشگاه صنعت آب و برق 13
ارتباط آرگومان ها )واقعی با صوری( در تابع
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
IntegerFunction&Small(x,y,z)
Implicitnone 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
Endif EndFunctionSmall End
دانشگاه صنعت آب و برق 14
دنباله ارتباط آرگومان ها )واقعی با صوری(
در تابع، مقادیر آرگومان واقعی به آرگومان صوریمنتقل می شود. این انتقال متضمن قواعد زیر است.
اگر آرگومان واقعی عبارت باشد، ابتدا محاسبه شده و در •یک محل موقت ذخیره می شود. آنگاه مقدار ذخیره شده
منتقل می گردد.
اگر آرگومان واقعی مقدار ثابت باشد، آنگاه به مثابه یک •عبارت محسوب شده و وفق بند فوق عمل می شود.
اگر آرگومان واقعی متغیر باشد، آنگاه مقدارش به •آرگومان صوری منتقل می شود.
باشد، (A)اگر آرگومان متغیری باشد که در داخل پرانتز •آنگاه به منزله یک عبارت محسوب شده و وفق بند
عبارت عمل می شود
دانشگاه صنعت آب و برق 15
دنباله ارتباط آرگومان ها )واقعی با صوری(
a b c
x y z
a+b b+c c
x y z
(a) (b) (c)
x y z
10 5 3
x y z
دانشگاه صنعت آب و برق 16
یک برنامه اصلی و چند برنامه فرعی
ProgramWrongImplicitnone…………..Contains
IntegerFunctionF1(…)Implicitnone…………..
ContainsRealFunctionF2(…)
Implicitnone…………..
EndFunctionF2
EndFunctionF1
End
یک برنامه اصلی می تواند چند (contains)شامل
برنامه فرعی باشد، اما یک برنامه فرعی نمی تواند
برنامه (contains)شامل فرعی دیگری باشد.
دانشگاه صنعت آب و برق 17
زیربرنامه یا برنامه فرعی (subroutine)
همانطور که مالحظه شد، زیربرنامه از نوع تابع یک مقدار رابرمی گرداند، بر عکس زیربرنامه از نوع سابروتین دارای
خواص زیر است.مقداری باز نمی گرداند.•در یک عبارت محاسباتی نیز ظاهر نمی شود.•در هنگام فراخوانی به عنوان یک عبارت کامل و تنها ظاهر می شود، و •
استفاده می گردد.callبرای این کار از واژه سابروتین مقادیری را از آرگومان های صوری دریافت می کند و پس از •
انجام محاسبات نتایج را در یک سری از آرگومان های ساختگی ذخیره می شود.
.فرم کلی سابروتین به صورت زیر است Subroutinename[(a1,a2,a3,…,an)] [دستورات مربوط به اعالن] [دستورات اجرایی] EndSubroutine[name]
مثال programcircle implicitnone Real::radius,area,perimeter print'(A\)','Enterradius:‘ Read*,radius callarea_peri(radius,area,perimeter) print*,area callstar print*,perimeter callstar contains
!Firstsubprogram(subroutine) subroutinearea_peri(r,A,P) Real::r,a,p A=pi()*r**2 P=2.*pi()*r Endsubroutinearea_peri !Secondsubprogram(function) RealFunctionpi() pi=4.*atan(1.) Endfunctionpi !Thridsubprogram(subroutine) subroutinestar print"(20('-'))" Endsubroutinestar Endprogramcircle
دانشگاه صنعت آب و برق 18
دانشگاه صنعت آب و برق 19
intentخاصیت در تابع از خاصیتintent برای آرگومان
ورودی استفاده می شود و خروجی در نام تابع ذخیره می شود، بنابراین از خاصیت
intent فقط قسمت in.استفاده می شود در مورد سابروتین، چون انواع آرگومان وجود
دارای انواع زیر است.intentدارد، خاصیت Intent(in) Intent(out) Intent(inout)
دانشگاه صنعت آب و برق 20
مثال ها 1مثال
SubroutineMeans(a,b,c,Am,Gm,Hm)• Implicitnone• Real,intent(in)::a,b,c• Real,intent(out)::Am,Gm,Hm• ………………………
EndsubroutineMeans 2مثال
Subroutineswap(a,b)• Implicitnone• Integer,intent(inout)::a,b• ………………………
Endsubroutineswap
دانشگاه صنعت آب و برق 21
مثال تعامل برنامه اصلی و (1زیربرنامه )
Programexample1• Implicitnone
• Integer::a,b,c
• ………………
• Calllarge(a,b,c)
• ………………
• contains
Subroutinelarge(u,v,w)• Implicitnone
• Integer,intent(in)::u,v
• Integer,intent(out)::w
• If(u>v)then w=u
• Else w=v
• Endif
Endsubroutinelarge
دانشگاه صنعت آب و برق 22
مثال تعامل برنامه اصلی و (2زیربرنامه )
Programtest• Implicitnone
• Integer::a,b,c=5
• a=1
• b=2
• Callsub(a,b,c)
• ………………
Contains
Subroutinesub(u,v,w)• Implicitnone
• Integer,intent(in)::u
• Integer,intent(inout)::v
• Integer,intent(out)::w
• w=u+v
• v=v*v-u*u
Endsubroutinesub Endprogramtest
دانشگاه صنعت آب و برق 23
نمایش استفاده از خاصیت intent
آرگومان
واقعیa
b
c
آرگومان
صوریu
v
w
Intent(in)
Intent(inout)
Intent(out)
دانشگاه صنعت آب و برق 24
صوری( در باارتباط آرگومان ها )واقعی سابروتین
تعامل بین آرگومان های واقعی با آرگومان هایصوری در زیربرنامه از نوع سابروتین شبیه
زیربرنامه از نوع تابع است، با این تفاوت که در استفاده می شود. intent(in)تابع تنها از خاصیت و intent(in)، intent(out)اما در سابروتین از
intent(inout).استفاده می گردد با توجه به نکته اخیر این مطلب را باید به حافظه
سپرد که: استفاده intent(inout) و intent(out)در تعامالتی که از •
می شود، آرگومان واقعی متناظر با هر آرگومان صوری باید متغیر باشد و نه عبارت و یا عدد ثابت.
آب و برق صنعت دانشگاه 25
مثال ProgramErrors
• Implicitnone
• Integer::a,b,c
• ………………
• Call& sub(1,a,a+b,(c),1+a)
• ………………
Contains
Subroutine& sub(u,v,w,p,q)• Implicitnone
• Integer,intent(out)::u
• Integer,intent(inout)::v
• Integer,intent(in)::w
• Integer,intent(out)::p
• Integer,intent(in)::q
• ………………
• EndSubroutinesub
• EndProgramErrors
دانشگاه صنعت آب و برق 26
مثال ProgramErrors
• Implicitnone
• Integer::a,b,c
• ………………
• Call& sub(1,a,a+b,(c),1+a)
• ………………
Contains
Subroutine& sub(u,v,w,p,q)• Implicitnone
• Integer,intent(out)::u
• Integer,intent(inout)::v
• Integer,intent(in)::w
• Integer,intent(out)::p
• Integer,intent(in)::q
• ………………
• EndSubroutinesub
• EndProgramErrors
دانشگاه صنعت آب و برق 27
مثال ProgramErrors
• Implicitnone
• Integer::a,b,c
• ………………
• Call sub(1,a,a+b,&(c),1+a)
• ………………
Contains
Subroutine& sub(u,v,w,p,q)• Implicitnone
• Integer,intent(out)::u
• Integer,intent(inout)::v
• Integer,intent(in)::w
• Integer,intent(out)::p
• Integer,intent(in)::q
• ………………
• EndSubroutinesub
• EndProgramErrors
دانشگاه صنعت آب و برق 28
متغیرهای محلی و سراسری یا جهانی یا کلی
متغیر محلی(localvariable) دو نوع متغیر وجود دارد.زیربرنامه هادر •
متغیر و یا متغیرهایی که از طریق آرگومان ها )ساختگی( واردزیربرنامه می شوند.
متغیر و یا متغیرهایی که در زیربرنامه مورد استفاده قرار می گیرندگویند.متغیرهای محلی که ارتباطی با آرگومان ها ندارند و به آنها
متغیرهای محلی تنها زمانی فضای حافظه را اشغال می کنند •که زیربرنامه در حال اجرا باشد. در لحظه ای که زیربرنامه
فراخوانی می شود، فضای حافظه برای متغیرهای محلی ایجاد می شوند. وقتی که کنترل از زیربرنامه خارج شد،
متغیرهای محلی آن از حافظه پاک و محو می شوند. متغیر جهانی یا سراسری یا کلی(globalvariable)
بر عکس متغیرهای محلی، بعضی از متغیرها خارج از کلیه •زیربرنامه ها اعالن می شوند. این متغیرها را سراسری گویند.
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
در زیربرنامهswap متغیرهای ،a و b از طریق آرگومان وارد زیربرنامه یک متغیر محلی است.tempشده اند ولی متغیر
دانشگاه صنعت آب و برق 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 Functionarea(r) Real,intent(in)::r Real,parameter::pi=3.14159 area=pi*r**2 Endfunctionarea Functionperi(r) Real,intent(in)::r peri=2.*r*pi Endfunction 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مقدار زمانی که برنامه اصلی به
periسراغ زیربرنامه خواهد .pi=4می رود مقدار
بود.
دانشگاه صنعت آب و برق 34
برق و آب صنعت دانشگاه 35
3مثال Program scope_2Implicit noneinteger :: a=1, b=2, c=3
print*, Add(a)c=4print*, Add(a)print*, Mul(b,c)Contains
Integer Function Add(q)Integer, intent(in) :: qAdd = q+cEnd Function Add
Integer Function Mul(x,y)
Integer, intent(in) :: x, y
Mul = x*yEnd Function MulEnd program scope_2
و برق آب صنعت دانشگاه 36
(side effect)اثر جانبی program scope_3Integer :: i, Max=5
Do i=1, Maxprint*, Sum1(i)
End do
ContainsInteger Function Sum1(n)Integer, intent(in) :: nInteger :: ss=0
Do i=1, ns=s+iEnd doSum1=sEnd Function Sum1End program scope_3
و برق آب صنعت دانشگاه 37
(side effect)اثر جانبی program scope_3Integer :: i, Max = 5
Do i=1, Maxprint*, Sum1(i)
End do
ContainsInteger Function Sum1(n)Integer, intent(in) :: nInteger :: s, is = 0
Do i=1, ns = s+iEnd doSum1 = sEnd Function Sum1End program scope_3
زیربرنامه ها و یا رویه های داخلی و خارجی
ارتباط و تعامالت بین برنامه اصلی و زیربرنامه ها ویا رویه ها و هم چنین بین خود رویه ها، شامل نکات مهم و قابل تأملی است. این نکات شامل متغیرها محلی و عمومی)مقادیر ثابت، به اشتراک گذاشتن متغیرها و ثابت ها و ...( نیز می گردد. به طور کلی در این خصوص، دو رویکرد را می توان از یکدیگر
تمیز داد. رویکرد داخلی
همانطور که تاکنون مشاهده شد، زیربرنامه ها بین •برنامه اصلی یا پایان End و contains دستورات
احاطه شده بودند و خاصیت تو در تویی ( hostمیزبان )ارتباط نیز برای زیربرنامه برقرار نبود. به این رویکرد،
گویند. به نحو داخلی
دانشگاه صنعت آب و برق 38
زیربرنامه داخلی ( syntax)نحو [programname]
• دستورات اعالن
• دستورات اجرایی [contains
• internalsubprograms]
End[program[name]]
دانشگاه صنعت آب و برق 39
ویژگی های رویکرد داخلی برنامه اصلی و زیربرنامه ها در یک فایل قرار دارند
و لذا یکجا به زبان ماشین ترجمه می شوند. واضح است که در این رویکرد نمی توان آنها را از مجزا
نمود. .استفاده از این روش به سهولت انجام می شود ،اگر حجم برنامه زیاد باشد ویرایش و اصالح آن
u دشواری است. امر نسبتا )برنامه جداگانه دیگری )غیر از برنامه میزبان
نمی تواند از رویه های داخلی استفاده کند، که البته این محدویت قابل مالحظه ای است.
دانشگاه صنعت آب و برق 40
دنباله ویژگی های رویکرد داخلی رویه ها و یا زیربرنامه های داخلی تمام خصوصیات
عناصر پارامترها و متغیرها ) برنامه اصلی( را به ارث می برند. یعنی در حالت کلی تمام متغیرها و پارامترها
برنامه اصلی برای زیربرنامه ها قابل رؤیت و قابل u اگر در برنامه میزبان دستور استفاده هستند. مثال
implicitnone را اعالن کنید، دیگر نیازی نیست که آن را در زیربرنامه ها اعالن نمود. اگر عدد ثابت پی
(pi) در برنامه میزبان اعالن شود، می توان از آن در تمام رویه ها )بدون اعالن مجدد( استفاده نمود، مگر این که متغیری به همین نام در رویه ای اعالن گردد،
که در این صورت ارتباط قطع می شود.
دانشگاه صنعت آب و برق 41
رویکرد خارجی همانطور که مشاهده شد، رویکرد داخلی
علی رغم سهولت به لحاظ محدویت هایی که داشت، کاربرد وسیعی ندارد و در مقابل آن
رویکرد خارجی سامان یافته است. در این رویکرد کلیه رویه ها )اعم از برنامه
خاتمه Endاصلی و زیربرنامه ها( با دستور می یابند و یکی در داخل دیگری نیست و یا:
.حتی می توانند در فایل های مجزا قرار گیرند در این صورت می توانند به صورت مجزا نیز
ترجمه شوند. دانشگاه صنعت آب و برق 42
زیربرنامه خارجی (syntax)نحو subroutinename[(arguments)]
• دستورات اعالن• دستورات اجرایی
[contains• internalsubprograms]
End[subroutine[name]]یا
functionname([arguments])• دستورات اعالن• دستورات اجرایی
[contains• internalsubprograms]
End[function[name]]
دانشگاه صنعت آب و برق 43
دنباله رویکرد خارجی رویکرد خارجی خود به دو بخش تقسیم
می شود. برنامه اصلی و زیربرنامه ها به صورت بخش های •
مجزا از هم در یک و یا چند فایل )حسب مورد( بین آنها قرار containsقرار می گیرند و دستور
مرسوم است. 77نمی گیرد، این روش در فرترن
همه و یا تعدادی از زیربرنامه ها در ساختاری قرار • گویند. این ( Module )می گیرند که به آن ماژول
امکان در نسخ پایین تر زبان فرترن وجود نداشت
دانشگاه صنعت آب و برق 44
مثال با رویکرد خارجی programArea_Volume Real::radius Print*,'Enteraradius' Read*,radius Print*,'Area:',Area(radius) Print*,'Volume:',Volume(radius) End
FunctionArea(r) Real,intent(in)::r Real,parameter::pi=3.14159 Area=pi*(r**2) End
FunctionVolume(r) Real,intent(in)::r Real,parameter::pi=3.14159 Volume=4.0*pi*(r**3)/3.0 End
دانشگاه صنعت آب و برق 45
دنباله مثال با رویکرد خارجی programArea_Volume Real::radius Real::pi=3.14159 commonpi Print*,'Enteraradius' Read*,radius Print*,'Area:',Area(radius) Print*,'Volume:',Volume(radius) End
FunctionArea(r) Real,intent(in)::r commonpi Area=pi*(r**2) End
FunctionVolume(r) Real,intent(in)::r commonpi Volume=4.0*pi*(r**3)/3.0 End
دانشگاه صنعت آب و برق 46
دانشگاه صنعت آب و برق 47
(Moduleقطعه یا ماژول ) همانطور که مالحظه شد چندین زیربرنامه می توانند
به بعد 90بعد از برنامه اصلی ظاهر شوند. از نسخه فرترن، این امکان وجود دارد که چند زیربرنامه را در یک جا تجمیع نمود و تشکیل یک قطعه و یا ماژول داد.
مقایسه ماژول با برنامه اصلیساختار ماژول بسیار شبیه برنامه اصلی است و هیچ کدام •
دارای آرگومان نیستند. ختم می شود endmodule شروع و با moduleماژول با واژه •
به endprogram شروع و با programاما برنامه اصلی با پایان می رسد.
ماژول به جز پاره ای از دستورات خاص )نظیر اعالن، •محدوده عمل و ...( و زیربرنامه ها نمی تواند شامل
دستورات دیگری باشد.عناصر داخل ماژول نمی توانند به تنهایی اجرا شوند و حتما •
باید ارتباط آن را با یک برنامه اصلی برقرار نمود.
دانشگاه صنعت آب و برق 48
ماژول(syntax)نحو Modulename
• Implicitnone Specificationpart
• [Contains internalsubprograms]
End[module[name]]یا
Modulename• [Implicitnone
Specificationpart]• Contains
internalsubprograms End[module[name]]
دانشگاه صنعت آب و برق 49
( ساده از ماژول1یک مثال )Module test
Implicit none
Real, parameter :: pi = 3.1415926
Real, parameter :: g = 9.80
Integer :: counter
End module test
دانشگاه صنعت آب و برق 50
( ساده از ماژول1یک مثال )Moduletest
Implicitnone
Real,parameter::pi=3.1415926
Real,parameter::g=9.80
Integer::counter
Endmoduletest
قسمت ویژه
دانشگاه صنعت آب و برق 51
(2مثال )Module average
ContainsReal function som(a, b, c)
Implicit noneReal, intent(in) :: a, b, csom = a+b+c
End function som
Real function mean(a, b, c)Implicit noneReal, intent(in) :: a, b, cmean = som(a, b, c)/3.0
End function
End module average
دانشگاه صنعت آب و برق 52
(2مثال )Module average
ContainsReal function som(a, b, c)
Implicit noneReal, intent(in) :: a, b, csom = a+b+c
End function som
Real function mean(a, b, c)Implicit noneReal, intent(in) :: a, b, cmean = som(a, b, c)/3.0
End function
End module average
(3مثال )Module Degree_Radian
Implicit noneReal, parameter :: pi=3.1415926Real, parameter :: degree180=180.0contains
Real Function DegreeToRadian(degree)Implicit noneReal, intent(in) :: degreeDegreeToRadian = degree*pi/degree180
End Function DegreeToRadian
Real Function RadianToDegree(radian)Implicit none Real, intent(in) :: radianRadianToDegree = radian*degree180/pi
End Function RadianToDegreeEnd Module Degree_Radian
دانشگاه صنعت آب و برق 53
چگونگی استفاده از ماژول وقتی یک ماژول ایجاد شد، اجزا آن که به شرح زیر
است، جهانی یا سراسری هستند. یعنی آن ها از برنامه ها و ماژول های دیگر قابل دسترسی می باشند.
مقادیر ثابت )در قسمت ویژه(•متغیرها )در قسمت ویژه(•زیربرنامه ها•
ماژول، در زیربرنامه های و داده هابرای ارتباط با برنامه های دیگر )برنامه اصلی، زیربرنامه ها و ماژول(
به صورت زیر عمل می شود.• USEmodule-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 TheTestImplicit none
Integer :: sky, moon
Real :: city
Logical :: is_true
Real, parameter :: pi = 3.141592
Public :: sky, moon
Private :: sizestar
Private :: pi, city
contains
Integer Function sizestar()
……………………………
End Funtion
Real Function power(e)
……………………………
End Function
……………………………
End ModuleTheTest
برق آب و صنعت دانشگاه 56
مثال به اشتراک گذاری آرایه Moduleshare_data implicitnone Integer,parameter::Num_vals=5 Real,Dimension(Num_vals)::values EndModule Programtest_module Useshare_data Real,parameter::pi=3.141592 values=pi*(/1.,2.,3.,4.,5./) callsub1 EndProgramtest_module Subroutinesub1 Useshare_data implicitnone Write(*,*)values EndSubroutinesub1
دانشگاه صنعت آب و برق 57
تعامل بین متغیرهای اندیس دار و زیربرنامه ها
همانطور که قبال مالحظه شد، برنامه اصلیآرگومان های واقعی را به آرگومان های صوری
برنامه های فرعی منتقل می کند. اما اکنون حالتی مد نظر است که
آرگومان های اصلی به صورت آرایه هستند، لذا در ادامه کار این انتقال مورد کاوش
بیشتری قرار می گیرد.
دانشگاه صنعت آب و برق 58
(1کد )I n t e g e r, P a r a m e t e r :: L o w e r_B o u n d=20I n t e g e r, P a r a m e t e r :: U p p e r_B o u n d=50I n t e g e r, D i m e n s i o n(L o w e r_B o u n d:U p p e r_B o u n d) :: D a t aR e a l, D i m e n s i o n(1:L o w e r_B o u n d) :: V a l u e sL o g i c a l, D i m e n s i o n(21:U p p e r_B o u n d) :: A n s w e r s..................................................C a l l F i r s t(D a t a, V a l u e s, A n s w e r s, L o w e r_B o u n d,
U p p e r_B o u n d, 21)C o n t a i n sS u b r o u t i n e F i r s t(x, y, z, L o w e r, U p p e r, L L)I n t e g e r, i n t e n t(I N) :: L o w e rI n t e g e r, i n t e n t(I N) :: U p p e rI n t e g e r, i n t e n t(I N) :: L LI n t e g e r, D i m e n s i o n(L o w e r:U p p e r), i n t e n t(I N) :: xR e a l, D i m e n s i o n(1:L o w e r), i n t e n t(O U T) :: yL o g i c a l, D i m e n s i o n(L L:U p p e r), i n t e n t(I N O U T) :: z ..................................................E n d S u b r o u t i ne
دانشگاه صنعت آب و برق 59
(1کد )I n t e g e r, P a r a m e t e r :: L o w e r_B o u n d=20I n t e g e r, P a r a m e t e r :: U p p e r_B o u n d=50I n t e g e r, D i m e n s i o n(L o w e r_B o u n d:U p p e r_B o u n d) :: D a t aR e a l, D i m e n s i o n(1:L o w e r_B o u n d) :: V a l u e sL o g i c a l, D i m e n s i o n(21:U p p e r_B o u n d) :: A n s w e r s..................................................C a l l F i r s t(D a t a, V a l u e s, A n s w e r s, L o w e r_B o u n d,
U p p e r_B o u n d, 21)C o n t a i n sS u b r o u t i n e F i r s t(x, y, z, L o w e r, U p p e r, L L)I n t e g e r, i n t e n t(I N) :: L o w e rI n t e g e r, i n t e n t(I N) :: U p p e rI n t e g e r, i n t e n t(I N) :: L LI n t e g e r, D i m e n s i o n(L o w e r:U p p e r), i n t e n t(I N) :: xR e a l, D i m e n s i o n(1:L o w e r), i n t e n t(O U T) :: yL o g i c a l, D i m e n s i o n(L L:U p p e r), i n t e n t(I N O U T) :: z ..................................................E n d S u b r o u t i ne
دانشگاه صنعت آب و برق 60
(1کد )I n t e g e r, P a r a m e t e r :: L o w e r_B o u n d=20I n t e g e r, P a r a m e t e r :: U p p e r_B o u n d=50I n t e g e r, D i m e n s i o n(L o w e r_B o u n d:U p p e r_B o u n d) :: D a t aR e a l, D i m e n s i o n(1:L o w e r_B o u n d) :: V a l u e sL o g i c a l, D i m e n s i o n(21:U p p e r_B o u n d) :: A n s w e r s..................................................C a l l F i r s t(D a t a, V a l u e s, A n s w e r s, L o w e r_B o u n d,
U p p e r_B o u n d, 21)C o n t a i n sS u b r o u t i n e F i r s t(x, y, z, L o w e r, U p p e r, L L)I n t e g e r, i n t e n t(I N) :: L o w e rI n t e g e r, i n t e n t(I N) :: U p p e rI n t e g e r, i n t e n t(I N) :: L LI n t e g e r, D i m e n s i o n(L o w e r:U p p e r), i n t e n t(I N) :: xR e a l, D i m e n s i o n(1:L o w e r), i n t e n t(O U T) :: yL o g i c a l, D i m e n s i o n(L L:U p p e r), i n t e n t(I N O U T) :: z ..................................................E n d S u b r o u t i ne
دانشگاه صنعت آب و برق 61
(1کد )I n t e g e r, P a r a m e t e r :: L o w e r_B o u n d=20I n t e g e r, P a r a m e t e r :: U p p e r_B o u n d=50I n t e g e r, D i m e n s i o n(L o w e r_B o u n d:U p p e r_B o u n d) :: D a t aR e a l, D i m e n s i o n(1:L o w e r_B o u n d) :: V a l u e sL o g i c a l, D i m e n s i o n(21:U p p e r_B o u n d) :: A n s w e r s..................................................C a l l F i r s t(D a t a, V a l u e s, A n s w e r s, L o w e r_B o u n d,
U p p e r_B o u n d, 21)C o n t a i n sS u b r o u t i n e F i r s t(x, y, z, L o w e r, U p p e r, L L)I n t e g e r, i n t e n t(I N) :: L o w e rI n t e g e r, i n t e n t(I N) :: U p p e rI n t e g e r, i n t e n t(I N) :: L LI n t e g e r, D i m e n s i o n(L o w e r:U p p e r), i n t e n t(I N) :: xR e a l, D i m e n s i o n(1:L o w e r), i n t e n t(O U T) :: yL o g i c a l, D i m e n s i o n(L L:U p p e r), i n t e n t(I N O U T) :: z ..................................................E n d S u b r o u t i ne
دانشگاه صنعت آب و برق 62
(1کد )I n t e g e r, P a r a m e t e r :: L o w e r_B o u n d=20I n t e g e r, P a r a m e t e r :: U p p e r_B o u n d=50I n t e g e r, D i m e n s i o n(L o w e r_B o u n d:U p p e r_B o u n d) :: D a t aR e a l, D i m e n s i o n(1:L o w e r_B o u n d) :: V a l u e sL o g i c a l, D i m e n s i o n(21:U p p e r_B o u n d) :: A n s w e r s..................................................C a l l F i r s t(D a t a, V a l u e s, A n s w e r s, L o w e r_B o u n d,
U p p e r_B o u n d, 21)C o n t a i n sS u b r o u t i n e F i r s t(x, y, z, L o w e r, U p p e r, L L)I n t e g e r, i n t e n t(I N) :: L o w e rI n t e g e r, i n t e n t(I N) :: U p p e rI n t e g e r, i n t e n t(I N) :: L LI n t e g e r, D i m e n s i o n(L o w e r:U p p e r), i n t e n t(I N) :: xR e a l, D i m e n s i o n(1:L o w e r), i n t e n t(O U T) :: yL o g i c a l, D i m e n s i o n(L L:U p p e r), i n t e n t(I N O U T) :: z ..................................................E n d S u b r o u t i ne
دانشگاه صنعت آب و برق 63
(1کد )I n t e g e r, P a r a m e t e r :: L o w e r_B o u n d=20I n t e g e r, P a r a m e t e r :: U p p e r_B o u n d=50I n t e g e r, D i m e n s i o n(L o w e r_B o u n d:U p p e r_B o u n d) :: D a t aR e a l, D i m e n s i o n(1:L o w e r_B o u n d) :: V a l u e sL o g i c a l, D i m e n s i o n(21:U p p e r_B o u n d) :: A n s w e r s..................................................C a l l F i r s t(D a t a, V a l u e s, A n s w e r s, L o w e r_B o u n d,
U p p e r_B o u n d, 21)C o n t a i n sS u b r o u t i n e F i r s t(x, y, z, L o w e r, U p p e r, L L)I n t e g e r, i n t e n t(I N) :: L o w e rI n t e g e r, i n t e n t(I N) :: U p p e rI n t e g e r, i n t e n t(I N) :: L LI n t e g e r, D i m e n s i o n(L o w e r:U p p e r), i n t e n t(I N) :: xR e a l, D i m e n s i o n(1:L o w e r), i n t e n t(O U T) :: yL o g i c a l, D i m e n s i o n(L L:U p p e r), i n t e n t(I N O U T) :: z ..................................................E n d S u b r o u t i ne
دانشگاه صنعت آب و برق 64
(1کد )I n t e g e r, P a r a m e t e r :: L o w e r_B o u n d=20I n t e g e r, P a r a m e t e r :: U p p e r_B o u n d=50I n t e g e r, D i m e n s i o n(L o w e r_B o u n d:U p p e r_B o u n d) :: D a t aR e a l, D i m e n s i o n(1:L o w e r_B o u n d) :: V a l u e sL o g i c a l, D i m e n s i o n(21:U p p e r_B o u n d) :: A n s w e r s..................................................C a l l F i r s t(D a t a, V a l u e s, A n s w e r s, L o w e r_B o u n d,
U p p e r_B o u n d, 21)C o n t a i n sS u b r o u t i n e F i r s t(x, y, z, L o w e r, U p p e r, L L)I n t e g e r, i n t e n t(I N) :: L o w e rI n t e g e r, i n t e n t(I N) :: U p p e rI n t e g e r, i n t e n t(I N) :: L LI n t e g e r, D i m e n s i o n(L o w e r:U p p e r), i n t e n t(I N) :: xR e a l, D i m e n s i o n(1:L o w e r), i n t e n t(O U T) :: yL o g i c a l, D i m e n s i o n(L L:U p p e r), i n t e n t(I N O U T) :: z ..................................................E n d S u b r o u t i ne
دانشگاه صنعت آب و برق 65
(1کد )I n t e g e r, P a r a m e t e r :: L o w e r_B o u n d=20I n t e g e r, P a r a m e t e r :: U p p e r_B o u n d=50I n t e g e r, D i m e n s i o n(L o w e r_B o u n d:U p p e r_B o u n d) :: D a t aR e a l, D i m e n s i o n(1:L o w e r_B o u n d) :: V a l u e sL o g i c a l, D i m e n s i o n(21:U p p e r_B o u n d) :: A n s w e r s..................................................C a l l F i r s t(D a t a, V a l u e s, A n s w e r s, L o w e r_B o u n d,
U p p e r_B o u n d, 21)C o n t a i n sS u b r o u t i n e F i r s t(x, y, z, L o w e r, U p p e r, L L)I n t e g e r, i n t e n t(I N) :: L o w e rI n t e g e r, i n t e n t(I N) :: U p p e rI n t e g e r, i n t e n t(I N) :: L LI n t e g e r, D i m e n s i o n(L o w e r:U p p e r), i n t e n t(I N) :: xR e a l, D i m e n s i o n(1:L o w e r), i n t e n t(O U T) :: yL o g i c a l, D i m e n s i o n(L L:U p p e r), i n t e n t(I N O U T) :: z ..................................................E n d S u b r o u t i ne
دانشگاه صنعت آب و برق 66
(1کد )I n t e g e r, P a r a m e t e r :: L o w e r_B o u n d=20I n t e g e r, P a r a m e t e r :: U p p e r_B o u n d=50I n t e g e r, D i m e n s i o n(L o w e r_B o u n d:U p p e r_B o u n d) :: D a t aR e a l, D i m e n s i o n(1:L o w e r_B o u n d) :: V a l u e sL o g i c a l, D i m e n s i o n(21:U p p e r_B o u n d) :: A n s w e r s..................................................C a l l F i r s t(D a t a, V a l u e s, A n s w e r s, L o w e r_B o u n d,
U p p e r_B o u n d, 21)C o n t a i n sS u b r o u t i n e F i r s t(x, y, z, L o w e r, U p p e r, L L)I n t e g e r, i n t e n t(I N) :: L o w e rI n t e g e r, i n t e n t(I N) :: U p p e rI n t e g e r, i n t e n t(I N) :: L LI n t e g e r, D i m e n s i o n(L o w e r:U p p e r), i n t e n t(I N) :: xR e a l, D i m e n s i o n(1:L o w e r), i n t e n t(O U T) :: yL o g i c a l, D i m e n s i o n(L L:U p p e r), i n t e n t(I N O U T) :: z ..................................................E n d S u b r o u t i ne
دانشگاه صنعت آب و برق 67
(1کد )I n t e g e r, P a r a m e t e r :: L o w e r_B o u n d=20I n t e g e r, P a r a m e t e r :: U p p e r_B o u n d=50I n t e g e r, D i m e n s i o n(L o w e r_B o u n d:U p p e r_B o u n d) :: D a t aR e a l, D i m e n s i o n(1:L o w e r_B o u n d) :: V a l u e sL o g i c a l, D i m e n s i o n(21:U p p e r_B o u n d) :: A n s w e r s..................................................C a l l F i r s t(D a t a, V a l u e s, A n s w e r s, L o w e r_B o u n d,
U p p e r_B o u n d, 21)C o n t a i n sS u b r o u t i n e F i r s t(x, y, z, L o w e r, U p p e r, L L)I n t e g e r, i n t e n t(I N) :: L o w e rI n t e g e r, i n t e n t(I N) :: U p p e rI n t e g e r, i n t e n t(I N) :: L LI n t e g e r, D i m e n s i o n(L o w e r:U p p e r), i n t e n t(I N) :: xR e a l, D i m e n s i o n(1:L o w e r), i n t e n t(O U T) :: yL o g i c a l, D i m e n s i o n(L L:U p p e r), i n t e n t(I N O U T) :: z ..................................................E n d S u b r o u t i ne
دانشگاه صنعت آب و برق 68
(: حداکثر اندازه آرایه 2کد )منتقل می شود
I n t e g e r, P a r a m e t e r :: M a x_s i z e=1000 R e a l, D i m e n s i o n(1:M a x_s i z e) :: D a t a I n t e g e r :: A c t u a l s i z e I n t e g e r :: i R e a d*, A c t u a l s i z e R e a d*, (D a t a(i), i=1,A c t u a l s i z e) P r i n t*, 's u m=', S u mm(D a t a, A c t u a l s i z e, M a x_s i z e) C o n t a i n s R e a l F u n c t i o n S u mm(x,n,s i z e) I n t e g e r, i n t e n t(I N) :: s i z e, n R e a l, D i m e n s i o n(1:s i z e), i n t e n t(I N) :: x R e a l :: T o t a l I n t e g e r :: i T o t a l=0.0 D O i=1,n
• T o t a l=T o t a l+x(i) E n d D O S u mm=T o t a l E n d F u n c t i o n E n d
دانشگاه صنعت آب و برق 69
(: حداکثر اندازه آرایه 2کد )منتقل می شود
I n t e g e r, P a r a m e t e r :: M a x_s i z e=1000 R e a l, D i m e n s i o n(1:M a x_s i z e) :: D a t a I n t e g e r :: A c t u a l s i z e I n t e g e r :: i R e a d*, A c t u a l s i z e R e a d*, (D a t a(i), i=1,A c t u a l s i z e) P r i n t*, 's u m=', S u mm(D a t a, A c t u a l s i z e, M a x_s i z e) C o n t a i n s R e a l F u n c t i o n S u mm(x,n,s i z e) I n t e g e r, i n t e n t(I N) :: s i z e, n R e a l, D i m e n s i o n(1:s i z e), i n t e n t(I N) :: x R e a l :: T o t a l I n t e g e r :: i T o t a l=0.0 D O i=1,n
• T o t a l=T o t a l+x(i) E n d D O S u mm=T o t a l E n d F u n c t i o n E n d
دانشگاه صنعت آب و برق 70
(: حداکثر اندازه آرایه 2کد )منتقل می شود
I n t e g e r, P a r a m e t e r :: M a x_s i z e=1000R e a l, D i m e n s i o n(1:M a x_s i z e) :: D a t aI n t e g e r :: A c t u a l s i z eI n t e g e r :: iR e a d*, A c t u a l s i z eR e a d*, (D a t a(i), i=1,A c t u a l s i z e)P r i n t*, 's u m=', S u mm(D a t a, A c t u a l s i z e, M a x_s i z e)C o n t a i n sR e a l F u n c t i o n S u mm(x,n,s i z e)I n t e g e r, i n t e n t(I N) :: s i z e, nR e a l, D i m e n s i o n(1:s i z e), i n t e n t(I N) :: xR e a l :: T o t a lI n t e g e r :: iT o t a l=0.0D O i=1,n
T o t a l=T o t a l+x(i)E n d D OS u mm=T o t a lE n d F u n c t i o nE n d
دانشگاه صنعت آب و برق 71
(: حداکثر اندازه آرایه 2کد )منتقل می شود
I n t e g e r, P a r a m e t e r :: M a x_s i z e=1000 R e a l, D i m e n s i o n(1:M a x_s i z e) :: D a t a I n t e g e r :: A c t u a l s i z e I n t e g e r :: i R e a d*, A c t u a l s i z e R e a d*, (D a t a(i), i=1,A c t u a l s i z e) P r i n t*, 's u m=', S u mm(D a t a, A c t u a l s i z e, M a x_s i z e) C o n t a i n s R e a l F u n c t i o n S u mm(x,n,s i z e) I n t e g e r, i n t e n t(I N) :: s i z e, n R e a l, D i m e n s i o n(1:s i z e), i n t e n t(I N) :: x R e a l :: T o t a l I n t e g e r :: i T o t a l=0.0 D O i=1,n
• T o t a l=T o t a l+x(i) E n d D O S u mm=T o t a l E n d F u n c t i o n E n d
دانشگاه صنعت آب و برق 72
(: انتقال اندازه به مقدار 3کد )الزم
I n t e g e r, P a r a m e t e r :: M a x_ si z e=1000 R e a l, D i m e n s i o n(1:M a x_s i z e) :: D a t a I n t e g e r :: A c t u a l s i z e I n t e g e r :: i R e a d*, A c t u a l s i z e R e a d*, (D a t a(i), i=1,A c t u a l s i z e) P r i n t*, 's u m=', S u mm(D a t a, A c t u a l s i z e) C o n t a i n s R e a l F u n c t i o n S u mm(x,n) I n t e g e r, i n t e n t(I N) :: n R e a l, D i m e n s i o n(:), i n t e n t(I N) :: x R e a l :: T o t a l I n t e g e r :: i T o t a l=0.0 D O i=1,n
• T o t a l=T o t a l+x(i) E n d D O S u mm=T o t a l E n d F u n c t i o n E n d
دانشگاه صنعت آب و برق 73
(: انتقال اندازه به مقدار 3کد )الزم
I n t e g e r, P a r a m e t e r :: M a x_ i z e=1000 R e a l, D i m e n s i o n(1:M a x_s i z e) :: D a t a I n t e g e r :: A c t u a l s i z e I n t e g e r :: i R e a d*, A c t u a l s i z e R e a d*, (D a t a(i), i=1,A c t u a l s i z e) P r i n t*, 's u m=', S u mm(D a t a, A c t u a l s i z e) C o n t a i n s R e a l F u n c t i o n S u mm(x,n) I n t e g e r, i n t e n t(I N) :: n R e a l, D i m e n s i o n(:), i n t e n t(I N) :: x R e a l :: T o t a l I n t e g e r :: i T o t a l=0.0 D O i=1,n
• T o t a l=T o t a l+x(i) E n d D O S u mm=T o t a l E n d F u n c t i o n E n d
دانشگاه صنعت آب و برق 74
(: انتقال اندازه به مقدار 3کد )الزم
I n t e g e r, P a r a m e t e r :: M a x_ si z e=1000 R e a l, D i m e n s i o n(1:M a x_s i z e) :: D a t a I n t e g e r :: A c t u a l s i z e I n t e g e r :: i R e a d*, A c t u a l s i z e R e a d*, (D a t a(i), i=1,A c t u a l s i z e) P r i n t*, 's u m=', S u mm(D a t a, A c t u a l s i z e) C o n t a i n s R e a l F u n c t i o n S u mm(x,n) I n t e g e r, i n t e n t(I N) :: n R e a l, D i m e n s i o n(:), i n t e n t(I N) :: x R e a l :: T o t a l I n t e g e r :: i T o t a l=0.0 D O i=1,n
• T o t a l=T o t a l+x(i) E n d D O S u mm=T o t a l E n d F u n c t i o n E n d
دانشگاه صنعت آب و برق 75
(: انتقال اندازه به مقدار 3کد )الزم
I n t e g e r, P a r a m e t e r :: M a x_ si z e=1000 R e a l, D i m e n s i o n(1:M a x_s i z e) :: D a t a I n t e g e r :: A c t u a l s i z e I n t e g e r :: i R e a d*, A c t u a l s i z e R e a d*, (D a t a(i), i=1,A c t u a l s i z e) P r i n t*, 's u m=', S u mm(D a t a, A c t u a l s i z e) C o n t a i n s R e a l F u n c t i o n S u mm(x,n) I n t e g e r, i n t e n t(I N) :: n R e a l, D i m e n s i o n(:), i n t e n t(I N) :: x R e a l :: T o t a l I n t e g e r :: i T o t a l=0.0 D O i=1,n
• T o t a l=T o t a l+x(i) E n d D O S u mm=T o t a l E n d F u n c t i o n E n d
دانشگاه صنعت آب و برق 76
ترتیب قرار گرفتن دستورات فرترن
برق و آب صنعت دانشگاه 77
PROGRAM, FUNCTION, SUBROUTINE or MODULE statement
USE statements
Format statements
IMPLICIT NONE statementPARAMETER and DATA
statements Type declaration
Executable statements
CONTAINS
Internal subprograms
END statement
زیربرنامه های بازگشتی همانطور که قبال مالحظه شد می توان زیربرنامه ها را
در یکدیگر فراخواند. اما پاره ای از مسایل هستند که خصلت بازگشتی دارند.
.به عنوان مثال می توان از محاسبه فاکتوریل نام برد N!=1×2×3×…×NN!=N×(N-1)!
البته مسئله فوق را می توان توسط یک تابع و یاسابروتین معمولی برنامه نویسی نمود. اما تکنیک
ساده تری وجود دارد که این گونه مسایل را به صورت بازگشتی حل می کند.
در روش بازگشتی، یک زیربرنامه )تابع و یاسابروتین( می تواند خودش را داخل خودش
فراخواند.
دانشگاه صنعت آب و برق 78
محاسبه تابع با نام متفاوت Real::radius Read*,radius Print*,circle_area(radius) Contains ! Functioncircle_area(r)result(area) Implicitnone Real::area Real::r Real::pi pi=4.0*atan(1.0) area=pi*r**2 Endfunctioncircle_area End
دانشگاه صنعت آب و برق 79
محاسبه فاکتوریل توسط یک تابع بازگشتی
I n t e g e r :: nR e a d*, nP r i n t*, f a c t(n)C O N T A I N SR e c u r s i v e F u n c t i o n f a c t(n) R e s u l t(n_F a c t)
I N T E G E R, i n t e n t(I N) :: nI N T E G E R :: n_F a c tI F(n>0) T h e n
n_F a c t = n*f a c t(n-1)E L S E
n_F a c t = 1E n d I F
E n d f u n c t i o n factE n d
دانشگاه صنعت آب و برق 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=? N=3,fact=6
T=1 T=2 T=3 T=4 T=5
دانشگاه صنعت آب و برق 81
محاسبه فاکتوریل توسط یک سابروتین بازگشتی
I n t e g e r :: n, R e sR e a d*, nc a l l F a c t(n, R e s)P r i n t*, R e sC o n t a i n sR e c u r s i v e S u b r o u t i n e F a c t(n, R e s)
I n t e g e r, i n t e n t(I N) :: nI n t e g e r, i n t e n t(I N O U T) :: R e sI F(n>0) T h e n
c a l l F a c t(n-1, R e s)R e s = R e s*n
E l s eR e s=1
E n d I FE n d S u b r o u t i n eE n d
دانشگاه صنعت آب و برق 82