زیربرنامهها یا برنامههای فرعی

Post on 20-Jan-2016

76 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

زیربرنامه‌ها یا برنامه‌های فرعی. موسوی ندوشنی ویراست بهار 1389. مقدمه. معمولا برنامه‌های جدی و بزرگ را به برنامه‌های کوچکتر تجزیه می‌کنند و پس از نوشتن هر یک از آنها، توسط یک برنامه اصلی کلیه برنامه‌های فرعی و یا زیربرنامه‌ها با هم ترکیب می‌شوند. رویکرد فوق شامل فایده‌های زیر است. - PowerPoint PPT Presentation

TRANSCRIPT

دانشگاه صنعت آب و برق 1

زیربرنامه ها یا برنامه های فرعی

موسوی ندوشنی 1389ویراست بهار

دانشگاه صنعت آب و برق 2

مقدمه معموال برنامه های جدی و بزرگ را به برنامه های کوچکتر

تجزیه می کنند و پس از نوشتن هر یک از آنها، توسط یک با زیربرنامه ها و یا برنامه های فرعیبرنامه اصلی کلیه

هم ترکیب می شوند..رویکرد فوق شامل فایده های زیر است

گاهی در یک برنامه، محاسبات مشابهی چند بار تکرار می شود، •برای پرهیز از تکرار می توان محاسبات مشابه را به یک برنامه

فرعی سپرد.هر برنامه فرعی را می توان مستقل از برنامه های دیگر ترجمه •

و تست کرد. با این روش کار برنامه نویسی ساده تر خواهد شد.برنامه فرعی با برنامه اصلی تعامل خواهد داشت. در این تعامل •

اگر برنامه نویس تصادفا اشتباهی مرتکب شود روی سایر برنامه های فرعی می تواند تاثیر نگذارد.

یک زیربرنامه را می توان در برنامه های اصلی متفاوت به •اشتراک گذاشت و از آن استفاده نمود.

دانشگاه صنعت آب و برق 3

مثال ،عمل محاسبه فاکتوریل به برنامه زیر توجه کنید. همانطور که مالحظه می شود

سه بار تکرار شده است. F‌a‌c‌t_n‌=‌1;‌F‌a‌ct_‌m‌=‌1;‌F‌a‌ct_‌n‌m‌=‌1 R‌e‌a‌d*,‌n,‌m !‌c‌a‌l‌c‌u‌l‌a‌t‌i‌o‌n‌o‌f‌F‌a‌c‌t‌o‌r‌i‌a‌l‌s D‌o‌i‌=‌1,n

• F‌a‌c‌t_n‌=‌F‌a‌ct_‌n*i E‌n‌d‌d‌o D‌o‌i‌=‌1,m

• F‌a‌c‌t_m‌=‌F‌a‌ct_‌m*i E‌n‌d‌d‌o D‌o‌i‌=‌1,n-m

• ‌F‌a‌c‌t_n‌m‌=‌F‌a‌ct_‌n‌m*i E‌n‌d‌d‌o !‌c‌a‌l‌c‌u‌l‌a‌t‌i‌o‌n‌o‌f‌C(m,n) C‌o‌m‌b‌=‌F‌a‌c‌t_n/(F‌a‌ct_‌m*F‌a‌ct_‌n‌m) W‌r‌i‌t‌e(*,*)‌C‌o‌m‌b E‌n‌d

دانشگاه صنعت آب و برق 4

انواع زیربرنامه ها به طور کلی برنامه های فرعی یا زیربرنامه ها

به دو قسمت تقسیم می شوند.(function)تابع •

(subroutine)زیرروال • همانطور که قبال مالحظه شد، توابع به دو

قسمت تقسیم می شود. ،log، sinتوابع پیش ساخته و یا کتابخانه ای، مانند •

cos... و قدر مطلق و

توابع مورد نظر کاربر •

دانشگاه صنعت آب و برق 5

فرم کلی یک زیربرنامه از نوع تابع

.فرم کلی تابع به صورت زیر است [t‌y‌p‌e]‌F‌u‌n‌c‌t‌i‌o‌n‌n‌a‌m‌e([a1,a2,‌…,a‌n]) دستورات مربوط به اعالن متن برنامه یا دستورات اجرایی E‌n‌d‌F‌u‌n‌c‌t‌i‌o‌n‌[n‌a‌m‌e]

به آرگومان هایa1,a2,‌…,‌an آرگومان های مجازی و ،یا صوری گویند.

همانطور که مالحظه می شود، آرگومان هایa1,a2,‌…,‌an.اختیاری هستند

مورد اختیاری[type] نوع نام تابع مشخص می کند و در صورت عدم تعیین آن از پیش فرض استفاده

می شود. نوع نام تابع را می توان در دستورات اعالن داخل بدنه

تابع نیز معرفی نمود.

(1مثال ) F‌u‌n‌c‌t‌i‌o‌n‌F‌a‌c‌t(k) F‌a‌c‌t‌=‌1. D‌o‌i‌=‌1,‌k

• F‌a‌c‌t‌=‌F‌a‌c‌t*i E‌n‌d‌d‌o E‌n‌d‌F‌u‌n‌c‌t‌i‌o‌n‌Fact

Integer‌F‌u‌n‌c‌t‌i‌o‌n‌F‌a‌c‌t(k) F‌a‌c‌t‌=‌1 D‌o‌i‌=‌1,‌k

• F‌a‌c‌t‌=‌F‌a‌c‌t*i E‌n‌d‌d‌o E‌n‌d‌F‌u‌n‌c‌t‌i‌o‌n‌Fact‌‌‌‌

F‌u‌n‌c‌t‌i‌o‌n‌F‌a‌c‌t(k) Integer‌::‌F‌a‌c‌t‌=‌1 D‌o‌i‌=‌1,‌k

• F‌a‌c‌t‌=‌F‌a‌c‌t*i E‌n‌d‌d‌o E‌n‌d‌F‌u‌n‌c‌t‌i‌o‌n‌Fact‌‌‌‌‌‌‌‌‌‌

F‌u‌n‌c‌t‌i‌o‌n‌F‌a‌c‌t(k) Implicit‌none Integer‌::‌F‌a‌c‌t‌=‌1 Integer‌::‌k,‌i D‌o‌i‌=‌1,‌k

• F‌a‌c‌t‌=‌F‌a‌c‌t*i E‌n‌d‌d‌o E‌n‌d‌F‌u‌n‌c‌t‌i‌o‌n‌Fact‌‌‌‌‌‌‌‌‌‌

دانشگاه صنعت آب و برق 6

دانشگاه صنعت آب و برق 7

(1مثال ) !‌M‌a‌i‌n‌p‌r‌o‌g‌r‌a‌m R‌e‌a‌d*,‌n,‌m C‌o‌m‌b‌=‌F‌a‌c‌t(n)‌/ (‌F‌a‌c‌t(m)‌*‌F‌a‌c‌t(n-m)‌) W‌r‌i‌t‌e(*,*)‌C‌o‌m‌b

C‌o‌n‌t‌a‌i‌n‌s !‌F‌u‌n‌c‌t‌i‌o‌n‌s‌u‌b‌p‌r‌o‌g‌r‌a‌m Integer‌F‌u‌n‌c‌t‌i‌o‌n‌F‌a‌c‌t(k) F‌a‌c‌t‌=‌1 D‌o‌i‌=‌1,‌k

• F‌a‌c‌t‌=‌F‌a‌c‌t*i E‌n‌d‌d‌o E‌n‌d‌F‌u‌n‌c‌t‌i‌o‌n‌Fact E‌n‌d‌‌‌‌‌‌‌‌‌‌

دانشگاه صنعت آب و برق 8

(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

Positive‌=‌.true.• Else

Positive‌=‌.false.• End‌if

End‌Function‌positive

دانشگاه صنعت آب و برق 9

تابع بدون آرگومان همانطور که در مثال زیر مالحظه می کنید، تابع

به کار رفته بدون آرگومان است. Real‌Function‌pi() pi‌=‌4.*atan(1.) End‌function‌pi

(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

دانشگاه صنعت آب و برق 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

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‌

دانشگاه صنعت آب و برق 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

یک برنامه اصلی و چند برنامه فرعی

Program‌WrongImplicit‌none…………..Contains

Integer‌Function‌F1(…)Implicit‌none…………..

ContainsReal‌Function‌F2(…)

Implicit‌none…………..

End‌Function‌F2

End‌Function‌F1

End

یک برنامه اصلی می تواند چند (contains)شامل

برنامه فرعی باشد، اما یک برنامه فرعی نمی تواند

برنامه (contains)شامل فرعی دیگری باشد.

دانشگاه صنعت آب و برق 17

زیربرنامه یا برنامه فرعی (subroutine)

همانطور که مالحظه شد، زیربرنامه از نوع تابع یک مقدار رابرمی گرداند، بر عکس زیربرنامه از نوع سابروتین دارای

خواص زیر است.مقداری باز نمی گرداند.•در یک عبارت محاسباتی نیز ظاهر نمی شود.•در هنگام فراخوانی به عنوان یک عبارت کامل و تنها ظاهر می شود، و •

استفاده می گردد.callبرای این کار از واژه سابروتین مقادیری را از آرگومان های صوری دریافت می کند و پس از •

انجام محاسبات نتایج را در یک سری از آرگومان های ساختگی ذخیره می شود.

.فرم کلی سابروتین به صورت زیر است S‌ubr‌o‌u‌t‌i‌n‌e‌n‌a‌m‌e[(a1,‌a2,‌a3,…,‌a‌n)] [دستورات مربوط به اعالن] [دستورات اجرایی] E‌n‌d‌S‌u‌b‌r‌o‌u‌t‌i‌n‌e‌[n‌a‌m‌e]

مثال 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

دانشگاه صنعت آب و برق 19

intentخاصیت در تابع از خاصیتintent برای آرگومان

ورودی استفاده می شود و خروجی در نام تابع ذخیره می شود، بنابراین از خاصیت

intent فقط قسمت in.استفاده می شود در مورد سابروتین، چون انواع آرگومان وجود

دارای انواع زیر است.intentدارد، خاصیت Intent(in) Intent(out) Intent(inout)

دانشگاه صنعت آب و برق 20

مثال ها 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

دانشگاه صنعت آب و برق 21

مثال تعامل برنامه اصلی و (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

دانشگاه صنعت آب و برق 22

مثال تعامل برنامه اصلی و (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

دانشگاه صنعت آب و برق 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

مثال 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

مثال 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

دانشگاه صنعت آب و برق 28

متغیرهای محلی و سراسری یا جهانی یا کلی

متغیر محلی(local‌variable) دو نوع متغیر وجود دارد.زیربرنامه هادر •

متغیر و یا متغیرهایی که از طریق آرگومان ها )ساختگی( واردزیربرنامه می شوند.

متغیر و یا متغیرهایی که در زیربرنامه مورد استفاده قرار می گیرندگویند.متغیرهای محلی که ارتباطی با آرگومان ها ندارند و به آنها

متغیرهای محلی تنها زمانی فضای حافظه را اشغال می کنند •که زیربرنامه در حال اجرا باشد. در لحظه ای که زیربرنامه

فراخوانی می شود، فضای حافظه برای متغیرهای محلی ایجاد می شوند. وقتی که کنترل از زیربرنامه خارج شد،

متغیرهای محلی آن از حافظه پاک و محو می شوند. متغیر جهانی یا سراسری یا کلی(global‌variable)

بر عکس متغیرهای محلی، بعضی از متغیرها خارج از کلیه •زیربرنامه ها اعالن می شوند. این متغیرها را سراسری گویند.

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 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مقدار زمانی که برنامه اصلی به

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

زیربرنامه ها و یا رویه های داخلی و خارجی

ارتباط و تعامالت بین برنامه اصلی و زیربرنامه ها ویا رویه ها و هم چنین بین خود رویه ها، شامل نکات مهم و قابل تأملی است. این نکات شامل متغیرها محلی و عمومی)مقادیر ثابت، به اشتراک گذاشتن متغیرها و ثابت ها و ...( نیز می گردد. به طور کلی در این خصوص، دو رویکرد را می توان از یکدیگر

تمیز داد. رویکرد داخلی

همانطور که تاکنون مشاهده شد، زیربرنامه ها بین •برنامه اصلی یا پایان E‌n‌d و c‌o‌n‌t‌a‌i‌n‌s دستورات

احاطه شده بودند و خاصیت تو در تویی ( hostمیزبان )ارتباط نیز برای زیربرنامه برقرار نبود. به این رویکرد،

گویند. به نحو داخلی

دانشگاه صنعت آب و برق 38

زیربرنامه داخلی ( syntax)نحو [program‌name]

• دستورات اعالن

• دستورات اجرایی [contains

• internal‌subprograms]

End‌[program‌[name]]

دانشگاه صنعت آب و برق 39

ویژگی های رویکرد داخلی برنامه اصلی و زیربرنامه ها در یک فایل قرار دارند

و لذا یکجا به زبان ماشین ترجمه می شوند. واضح است که در این رویکرد نمی توان آنها را از مجزا

نمود. .استفاده از این روش به سهولت انجام می شود ،اگر حجم برنامه زیاد باشد ویرایش و اصالح آن

u دشواری است. امر نسبتا )برنامه جداگانه دیگری )غیر از برنامه میزبان

نمی تواند از رویه های داخلی استفاده کند، که البته این محدویت قابل مالحظه ای است.

دانشگاه صنعت آب و برق 40

دنباله ویژگی های رویکرد داخلی رویه ها و یا زیربرنامه های داخلی تمام خصوصیات

عناصر پارامترها و متغیرها ) برنامه اصلی( را به ارث می برند. یعنی در حالت کلی تمام متغیرها و پارامترها

برنامه اصلی برای زیربرنامه ها قابل رؤیت و قابل u اگر در برنامه میزبان دستور استفاده هستند. مثال

i‌m‌p‌l‌i‌c‌i‌t‌n‌o‌n‌e را اعالن کنید، دیگر نیازی نیست که آن را در زیربرنامه ها اعالن نمود. اگر عدد ثابت پی

(pi) در برنامه میزبان اعالن شود، می توان از آن در تمام رویه ها )بدون اعالن مجدد( استفاده نمود، مگر این که متغیری به همین نام در رویه ای اعالن گردد،

که در این صورت ارتباط قطع می شود.

دانشگاه صنعت آب و برق 41

رویکرد خارجی همانطور که مشاهده شد، رویکرد داخلی

علی رغم سهولت به لحاظ محدویت هایی که داشت، کاربرد وسیعی ندارد و در مقابل آن

رویکرد خارجی سامان یافته است. در این رویکرد کلیه رویه ها )اعم از برنامه

خاتمه E‌n‌dاصلی و زیربرنامه ها( با دستور می یابند و یکی در داخل دیگری نیست و یا:

.حتی می توانند در فایل های مجزا قرار گیرند در این صورت می توانند به صورت مجزا نیز

ترجمه شوند. دانشگاه صنعت آب و برق 42

زیربرنامه خارجی (syntax)نحو subroutine‌name[(arguments)]

• دستورات اعالن• دستورات اجرایی

[contains• internal‌subprograms]

End‌[subroutine‌[name]]یا

function‌name([arguments])• دستورات اعالن• دستورات اجرایی

[contains• internal‌subprograms]

End‌[function‌[name]]

دانشگاه صنعت آب و برق 43

دنباله رویکرد خارجی رویکرد خارجی خود به دو بخش تقسیم

می شود. برنامه اصلی و زیربرنامه ها به صورت بخش های •

مجزا از هم در یک و یا چند فایل )حسب مورد( بین آنها قرار c‌o‌n‌t‌a‌i‌n‌sقرار می گیرند و دستور

مرسوم است. 77نمی گیرد، این روش در فرترن

همه و یا تعدادی از زیربرنامه ها در ساختاری قرار • گویند. این ( M‌o‌d‌u‌l‌e )می گیرند که به آن ماژول

امکان در نسخ پایین تر زبان فرترن وجود نداشت

دانشگاه صنعت آب و برق 44

مثال با رویکرد خارجی 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

دانشگاه صنعت آب و برق 47

(Moduleقطعه یا ماژول ) همانطور که مالحظه شد چندین زیربرنامه می توانند

به بعد 90بعد از برنامه اصلی ظاهر شوند. از نسخه فرترن، این امکان وجود دارد که چند زیربرنامه را در یک جا تجمیع نمود و تشکیل یک قطعه و یا ماژول داد.

مقایسه ماژول با برنامه اصلیساختار ماژول بسیار شبیه برنامه اصلی است و هیچ کدام •

دارای آرگومان نیستند. ختم می شود end‌module شروع و با moduleماژول با واژه •

به end‌program شروع و با programاما برنامه اصلی با پایان می رسد.

ماژول به جز پاره ای از دستورات خاص )نظیر اعالن، •محدوده عمل و ...( و زیربرنامه ها نمی تواند شامل

دستورات دیگری باشد.عناصر داخل ماژول نمی توانند به تنهایی اجرا شوند و حتما •

باید ارتباط آن را با یک برنامه اصلی برقرار نمود.

دانشگاه صنعت آب و برق 48

ماژول(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]] ‌

دانشگاه صنعت آب و برق 49

( ساده از ماژول1یک مثال )Module test

Implicit none

Real, parameter :: pi = 3.1415926

Real, parameter :: g = 9.80

Integer :: counter

End module test

دانشگاه صنعت آب و برق 50

( ساده از ماژول1یک مثال )Module‌test

Implicit‌none

Real,‌parameter‌::‌pi‌=‌3.1415926

Real,‌parameter‌::‌g‌=‌9.80

Integer‌::‌counter

End‌module‌test

قسمت ویژه

دانشگاه صنعت آب و برق 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

چگونگی استفاده از ماژول وقتی یک ماژول ایجاد شد، اجزا آن که به شرح زیر

است، جهانی یا سراسری هستند. یعنی آن ها از برنامه ها و ماژول های دیگر قابل دسترسی می باشند.

مقادیر ثابت )در قسمت ویژه(•متغیرها )در قسمت ویژه(•زیربرنامه ها•

ماژول، در زیربرنامه های و داده هابرای ارتباط با برنامه های دیگر )برنامه اصلی، زیربرنامه ها و ماژول(

به صورت زیر عمل می شود.• 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 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 Module‌TheTest

برق آب و صنعت دانشگاه 56

مثال به اشتراک گذاری آرایه M‌o‌d‌u‌l‌e‌s‌h‌a‌r‌e_d‌a‌t‌a i‌m‌p‌l‌i‌c‌i‌t‌n‌o‌n‌e I‌n‌t‌e‌g‌e‌r,‌p‌a‌r‌a‌m‌e‌t‌e‌r‌::‌N‌u‌m_v‌a‌l‌s=5 R‌e‌a‌l,‌D‌i‌m‌e‌n‌s‌i‌o‌n(N‌u‌m_v‌a‌l‌s)‌::‌v‌a‌l‌u‌e‌s E‌n‌d‌M‌o‌d‌u‌l‌e P‌r‌o‌g‌r‌a‌m‌t‌e‌s‌t_m‌o‌d‌u‌l‌e U‌s‌e‌s‌h‌a‌r‌e_d‌a‌t‌a R‌e‌a‌l,‌p‌a‌r‌a‌m‌e‌t‌e‌r‌::‌p‌i=3.141592 v‌a‌l‌u‌e‌s‌=‌p‌i*(/1.,2.,‌3.,‌4.,‌5./) c‌a‌l‌l‌s‌u‌b1 E‌n‌d‌P‌r‌o‌g‌r‌a‌m‌t‌e‌s‌t_m‌o‌d‌u‌l‌e S‌u‌b‌r‌o‌u‌t‌i‌n‌e‌s‌u‌b1 U‌s‌e‌s‌h‌a‌r‌e_d‌a‌t‌a i‌m‌p‌l‌i‌c‌i‌t‌n‌o‌n‌e W‌r‌i‌t‌e(*,*)‌v‌a‌l‌u‌e‌s E‌n‌d‌S‌u‌b‌r‌o‌u‌t‌i‌n‌e‌s‌u‌b1

دانشگاه صنعت آب و برق 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×…×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

محاسبه فاکتوریل توسط یک تابع بازگشتی

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

top related