82
رق ب و ب آ ت ع ن صاه گ ش ن دآ1 ی ع ر فهای ه م ا رن ب ا# ها ن ه م ا رن ب ر# ب ز ی ن ش دو وی ن س و م هاز ب ت ش رآ# ب و1389

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

  • Upload
    taro

  • View
    78

  • Download
    0

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: زیربرنامهها یا برنامههای فرعی

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

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

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

Page 2: زیربرنامهها یا برنامههای فرعی

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

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

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

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

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

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

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

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

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

Page 3: زیربرنامهها یا برنامههای فرعی

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

Page 4: زیربرنامهها یا برنامههای فرعی

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

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

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

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

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

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

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

Page 5: زیربرنامهها یا برنامههای فرعی

دانشگاه صنعت آب و برق 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] نوع نام تابع مشخص می کند و در صورت عدم تعیین آن از پیش فرض استفاده

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

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

Page 6: زیربرنامهها یا برنامههای فرعی

(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

Page 7: زیربرنامهها یا برنامههای فرعی

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

Page 8: زیربرنامهها یا برنامههای فرعی

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

Page 9: زیربرنامهها یا برنامههای فرعی

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

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

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

Page 10: زیربرنامهها یا برنامههای فرعی

(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

Page 11: زیربرنامهها یا برنامههای فرعی

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

آرگومان های واقعی با ساختگی آرگومان صوری یا مجازی(formal) و یا ساختگی

(dummy) متغیری است که در عنوان تابع اعالن می شود.

آرگومان واقعی(actual) متغیر یا عباراتی است که در فراخوانی تابع ذکر می شود.

وقتی فراخوانی تابع اجرا می شود، آرگومان واقعی درآرگومان صوری به ترتیب موقعیت آنها از چپ به راست کپی می شوند. آنگاه کنترل به اولین دستور قابل اجرا در بدنه تابع انتقال می یابد. وقتی آخرین دستور در تابع اجرا

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

اجرایی بعد از آن نقطه ادامه می یابد.

Page 12: زیربرنامهها یا برنامههای فرعی

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

سازگاری آرگومان های واقعی و صوری یا مجازی

.شرایط زیر برای سازگاری باید برقرار باشدیکسان بودن اسامی آرگومان های واقعی و •

مجازی ضرورتی ندارد.

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

نوع آرگومان های واقعی و مجازی باید یکسان •باشد.

بین آرگومان های واقعی و مجازی باید رابطه یک •به یک برقرار باشد.

Page 13: زیربرنامهها یا برنامههای فرعی

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

Page 14: زیربرنامهها یا برنامههای فرعی

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

دنباله ارتباط آرگومان ها )واقعی با صوری(

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

اگر آرگومان واقعی عبارت باشد، ابتدا محاسبه شده و در •یک محل موقت ذخیره می شود. آنگاه مقدار ذخیره شده

منتقل می گردد.

اگر آرگومان واقعی مقدار ثابت باشد، آنگاه به مثابه یک •عبارت محسوب شده و وفق بند فوق عمل می شود.

اگر آرگومان واقعی متغیر باشد، آنگاه مقدارش به •آرگومان صوری منتقل می شود.

باشد، (A)اگر آرگومان متغیری باشد که در داخل پرانتز •آنگاه به منزله یک عبارت محسوب شده و وفق بند

عبارت عمل می شود

Page 15: زیربرنامهها یا برنامههای فرعی

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

Page 16: زیربرنامهها یا برنامههای فرعی

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

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

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

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

ContainsReal‌Function‌F2(…)

Implicit‌none…………..

End‌Function‌F2

End‌Function‌F1

End

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

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

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

Page 17: زیربرنامهها یا برنامههای فرعی

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

Page 18: زیربرنامهها یا برنامههای فرعی

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

Page 19: زیربرنامهها یا برنامههای فرعی

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

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

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

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

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

Page 20: زیربرنامهها یا برنامههای فرعی

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

Page 21: زیربرنامهها یا برنامههای فرعی

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

Page 22: زیربرنامهها یا برنامههای فرعی

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

Page 23: زیربرنامهها یا برنامههای فرعی

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

نمایش استفاده از خاصیت intent

آرگومان

واقعیa

b

c

آرگومان

صوریu

v

w

Intent(in)

Intent(inout)

Intent(out)

Page 24: زیربرنامهها یا برنامههای فرعی

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

صوری( در باارتباط آرگومان ها )واقعی سابروتین

تعامل بین آرگومان های واقعی با آرگومان هایصوری در زیربرنامه از نوع سابروتین شبیه

زیربرنامه از نوع تابع است، با این تفاوت که در استفاده می شود. intent(in)تابع تنها از خاصیت و intent(in)، intent(out)اما در سابروتین از

intent(inout).استفاده می گردد با توجه به نکته اخیر این مطلب را باید به حافظه

سپرد که: استفاده intent(inout) و intent(out)در تعامالتی که از •

می شود، آرگومان واقعی متناظر با هر آرگومان صوری باید متغیر باشد و نه عبارت و یا عدد ثابت.

Page 25: زیربرنامهها یا برنامههای فرعی

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

Page 26: زیربرنامهها یا برنامههای فرعی

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

Page 27: زیربرنامهها یا برنامههای فرعی

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

Page 28: زیربرنامهها یا برنامههای فرعی

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

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

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

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

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

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

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

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

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

Page 29: زیربرنامهها یا برنامههای فرعی

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

Page 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 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

Page 31: زیربرنامهها یا برنامههای فرعی

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

Page 32: زیربرنامهها یا برنامههای فرعی

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

Page 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 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

Page 34: زیربرنامهها یا برنامههای فرعی

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

Page 35: زیربرنامهها یا برنامههای فرعی

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

Page 36: زیربرنامهها یا برنامههای فرعی

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

Page 37: زیربرنامهها یا برنامههای فرعی

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

Page 38: زیربرنامهها یا برنامههای فرعی

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

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

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

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

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

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

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

Page 39: زیربرنامهها یا برنامههای فرعی

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

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

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

• internal‌subprograms]

End‌[program‌[name]]

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

Page 40: زیربرنامهها یا برنامههای فرعی

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

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

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

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

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

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

Page 41: زیربرنامهها یا برنامههای فرعی

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

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

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

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

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

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

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

Page 42: زیربرنامهها یا برنامههای فرعی

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

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

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

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

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

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

Page 43: زیربرنامهها یا برنامههای فرعی

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

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

[contains• internal‌subprograms]

End‌[subroutine‌[name]]یا

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

[contains• internal‌subprograms]

End‌[function‌[name]]

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

Page 44: زیربرنامهها یا برنامههای فرعی

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

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

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

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

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

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

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

Page 45: زیربرنامهها یا برنامههای فرعی

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

Page 46: زیربرنامهها یا برنامههای فرعی

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

Page 47: زیربرنامهها یا برنامههای فرعی

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

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

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

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

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

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

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

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

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

Page 48: زیربرنامهها یا برنامههای فرعی

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

Page 49: زیربرنامهها یا برنامههای فرعی

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

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

Implicit none

Real, parameter :: pi = 3.1415926

Real, parameter :: g = 9.80

Integer :: counter

End module test

Page 50: زیربرنامهها یا برنامههای فرعی

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

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

Implicit‌none

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

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

Integer‌::‌counter

End‌module‌test

قسمت ویژه

Page 51: زیربرنامهها یا برنامههای فرعی

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

Page 52: زیربرنامهها یا برنامههای فرعی

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

Page 53: زیربرنامهها یا برنامههای فرعی

(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

Page 54: زیربرنامهها یا برنامههای فرعی

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

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

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

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

به صورت زیر عمل می شود.• USE‌module-name

این دستور فقط در اول برنامه می آید، و اگر این ترتیب •رعایت نشود برنامه خطا می دهد.

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

Page 55: زیربرنامهها یا برنامههای فرعی

برنامه اصلی و زیربرنامه و ماژول ساده

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

Page 56: زیربرنامهها یا برنامههای فرعی

متغیرهای عمومی و خصوصی در ماژول

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

Page 57: زیربرنامهها یا برنامههای فرعی

مثال به اشتراک گذاری آرایه 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

Page 58: زیربرنامهها یا برنامههای فرعی

تعامل بین متغیرهای اندیس دار و زیربرنامه ها

همانطور که قبال مالحظه شد، برنامه اصلیآرگومان های واقعی را به آرگومان های صوری

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

آرگومان های اصلی به صورت آرایه هستند، لذا در ادامه کار این انتقال مورد کاوش

بیشتری قرار می گیرد.

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

Page 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

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

Page 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

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

Page 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

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

Page 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

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

Page 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

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

Page 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

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

Page 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

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

Page 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

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

Page 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

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

Page 68: زیربرنامهها یا برنامههای فرعی

(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

Page 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

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

Page 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=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

Page 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=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

Page 72: زیربرنامهها یا برنامههای فرعی

(: حداکثر اندازه آرایه 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

Page 73: زیربرنامهها یا برنامههای فرعی

(: انتقال اندازه به مقدار 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

Page 74: زیربرنامهها یا برنامههای فرعی

(: انتقال اندازه به مقدار 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

Page 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

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

Page 76: زیربرنامهها یا برنامههای فرعی

(: انتقال اندازه به مقدار 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

Page 77: زیربرنامهها یا برنامههای فرعی

ترتیب قرار گرفتن دستورات فرترن

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

Page 78: زیربرنامهها یا برنامههای فرعی

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

در یکدیگر فراخواند. اما پاره ای از مسایل هستند که خصلت بازگشتی دارند.

.به عنوان مثال می توان از محاسبه فاکتوریل نام برد N!‌=‌1×2×3×…×N‌‌N!‌=‌N×(N-1)!

البته مسئله فوق را می توان توسط یک تابع و یاسابروتین معمولی برنامه نویسی نمود. اما تکنیک

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

در روش بازگشتی، یک زیربرنامه )تابع و یاسابروتین( می تواند خودش را داخل خودش

فراخواند.

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

Page 79: زیربرنامهها یا برنامههای فرعی

محاسبه تابع با نام متفاوت 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

Page 80: زیربرنامهها یا برنامههای فرعی

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

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

Page 81: زیربرنامهها یا برنامههای فرعی

نمایش کارکرد زیربرنامه بازگشتی

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

Page 82: زیربرنامهها یا برنامههای فرعی

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

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