Download presentation
Presentation is loading. Please wait.
Published byNorman Lang Modified over 8 years ago
1
دانشگاه صنعت آب و برق 1 زیربرنامه ها یا برنامه های فرعی موسوی ندوشنی ویراست بهار 1389
2
دانشگاه صنعت آب و برق 2 مقدمه معمولا برنامه های جدی و بزرگ را به برنامه های کوچکتر تجزیه می کنند و پس از نوشتن هر یک از آنها، توسط یک برنامه اصلی کلیه برنامه های فرعی و یا زیربرنامه ها با هم ترکیب می شوند. رویکرد فوق شامل فایده های زیر است. گاهی در یک برنامه، محاسبات مشابهی چند بار تکرار می شود، برای پرهیز از تکرار می توان محاسبات مشابه را به یک برنامه فرعی سپرد. هر برنامه فرعی را می توان مستقل از برنامه های دیگر ترجمه و تست کرد. با این روش کار برنامه نویسی ساده تر خواهد شد. برنامه فرعی با برنامه اصلی تعامل خواهد داشت. در این تعامل اگر برنامه نویس تصادفا اشتباهی مرتکب شود روی سایر برنامه های فرعی می تواند تاثیر نگذارد. یک زیربرنامه را می توان در برنامه های اصلی متفاوت به اشتراک گذاشت و از آن استفاده نمود.
3
دانشگاه صنعت آب و برق 3 مثال به برنامه زیر توجه کنید. همانطور که ملاحظه می شود، عمل محاسبه فاکتوریل سه بار تکرار شده است. F act_n = 1; Fact_m = 1; Fact_nm = 1 R ead*, n, m ! c alculation of Factorials D o i = 1,n Fact_n = Fact_n*i E nd do D o i = 1,m Fact_m = Fact_m*i E nd do D o i = 1,n-m Fact_nm = Fact_nm*i E nd do ! c alculation of C(m,n) C omb = Fact_n/(Fact_m*Fact_nm) W rite(*,*) Comb E nd
4
دانشگاه صنعت آب و برق 4 انواع زیربرنامه ها به طور کلی برنامه های فرعی یا زیربرنامه ها به دو قسمت تقسیم می شوند. تابع (function) زیرروال (subroutine) همانطور که قبلا ملاحظه شد، توابع به دو قسمت تقسیم می شود. توابع پیش ساخته و یا کتابخانه ای، مانند log ، sin ، cos و قدر مطلق و... توابع مورد نظر کاربر
5
دانشگاه صنعت آب و برق 5 فرم کلی یک زیربرنامه از نوع تابع فرم کلی تابع به صورت زیر است. [t ype] Function name([a1,a2, …,an]) دستورات مربوط به اعلان متن برنامه یا دستورات اجرایی E nd Function [name] به آرگومان های a1,a2, …, an ، آرگومان های مجازی و یا صوری گویند. همانطور که ملاحظه می شود، آرگومان های a1,a2, …, an اختیاری هستند. مورد اختیاری [type] نوع نام تابع مشخص می کند و در صورت عدم تعیین آن از پیش فرض استفاده می شود. نوع نام تابع را می توان در دستورات اعلان داخل بدنه تابع نیز معرفی نمود.
6
مثال ( 1) F unction Fact(k) F act = 1. D o i = 1, k Fact = Fact*i E nd do E nd Function Fact Integer F unction Fact(k) F act = 1 D o i = 1, k Fact = Fact*i E nd do E nd Function Fact Function Fact(k) Integer :: Fact = 1 Do i = 1, k Fact = Fact*i End do End Function Fact Function Fact(k) Implicit none Integer :: Fact = 1 Integer :: k, i Do i = 1, k Fact = Fact*i End do End Function Fact دانشگاه صنعت آب و برق 6
7
7 مثال ( 1) ! M ain program R ead*, n, m C omb = Fact(n) / ( Fact(m) * Fact(n-m) ) W rite(*,*) Comb C ontains ! F unction subprogram Integer F unction Fact(k) F act = 1 D o i = 1, k Fact = Fact*i E nd do E nd Function Fact E nd
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
9
دانشگاه صنعت آب و برق 9 تابع بدون آرگومان همانطور که در مثال زیر ملاحظه می کنید، تابع به کار رفته بدون آرگومان است. Real Function pi() pi = 4.*atan(1.) End function pi
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
11
دانشگاه صنعت آب و برق 11 آرگومان های واقعی با ساختگی آرگومان صوری یا مجازی (formal) و یا ساختگی (dummy) متغیری است که در عنوان تابع اعلان می شود. آرگومان واقعی (actual) متغیر یا عباراتی است که در فراخوانی تابع ذکر می شود. وقتی فراخوانی تابع اجرا می شود، آرگومان واقعی در آرگومان صوری به ترتیب موقعیت آنها از چپ به راست کپی می شوند. آنگاه کنترل به اولین دستور قابل اجرا در بدنه تابع انتقال می یابد. وقتی آخرین دستور در تابع اجرا شد، کنترل به نقطه ای که تابع از آن فراخوانده شده است باز می گردد، و اجرای برنامه از اولین دستور اجرایی بعد از آن نقطه ادامه می یابد.
12
دانشگاه صنعت آب و برق 12 سازگاری آرگومان های واقعی و صوری یا مجازی شرایط زیر برای سازگاری باید برقرار باشد. یکسان بودن اسامی آرگومان های واقعی و مجازی ضرورتی ندارد. رعایت ترتیب آرگومان های واقعی و مجازی الزامی است. نوع آرگومان های واقعی و مجازی باید یکسان باشد. بین آرگومان های واقعی و مجازی باید رابطه یک به یک برقرار باشد.
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
14
دانشگاه صنعت آب و برق 14 دنباله ارتباط آرگومان ها ( واقعی با صوری ) در تابع، مقادیر آرگومان واقعی به آرگومان صوری منتقل می شود. این انتقال متضمن قواعد زیر است. اگر آرگومان واقعی عبارت باشد، ابتدا محاسبه شده و در یک محل موقت ذخیره می شود. آنگاه مقدار ذخیره شده منتقل می گردد. اگر آرگومان واقعی مقدار ثابت باشد، آنگاه به مثابه یک عبارت محسوب شده و وفق بند فوق عمل می شود. اگر آرگومان واقعی متغیر باشد، آنگاه مقدارش به آرگومان صوری منتقل می شود. اگر آرگومان متغیری باشد که در داخل پرانتز (A) باشد، آنگاه به منزله یک عبارت محسوب شده و وفق بند عبارت عمل می شود
15
دانشگاه صنعت آب و برق 15 دنباله ارتباط آرگومان ها ( واقعی با صوری )
16
دانشگاه صنعت آب و برق 16 یک برنامه اصلی و چند برنامه فرعی Program Wrong Implicit none ………….. Contains Integer Function F1(…) Implicit none ………….. Contains Real Function F2(…) Implicit none ………….. End Function F2 End Function F1 End یک برنامه اصلی میتواند شامل (contains) چند برنامه فرعی باشد، اما یک برنامه فرعی نمیتواند شامل (contains) برنامه فرعی دیگری باشد.
17
دانشگاه صنعت آب و برق 17 زیربرنامه یا برنامه فرعی (subroutine) همانطور که ملاحظه شد، زیربرنامه از نوع تابع یک مقدار را برمی گرداند، بر عکس زیربرنامه از نوع سابروتین دارای خواص زیر است. مقداری باز نمی گرداند. در یک عبارت محاسباتی نیز ظاهر نمی شود. در هنگام فراخوانی به عنوان یک عبارت کامل و تنها ظاهر می شود، و برای این کار از واژه call استفاده می گردد. سابروتین مقادیری را از آرگومان های صوری دریافت می کند و پس از انجام محاسبات نتایج را در یک سری از آرگومان های ساختگی ذخیره می شود. فرم کلی سابروتین به صورت زیر است. S ubroutine name[(a1, a2, a3,…, an)] [ دستورات مربوط به اعلان ] [ دستورات اجرایی ] E nd Subroutine [name]
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
19
دانشگاه صنعت آب و برق 19 خاصیت intent در تابع از خاصیت intent برای آرگومان ورودی استفاده می شود و خروجی در نام تابع ذخیره می شود، بنابراین از خاصیت intent فقط قسمت in استفاده می شود. در مورد سابروتین، چون انواع آرگومان وجود دارد، خاصیت intent دارای انواع زیر است. Intent(in) Intent(out) Intent(inout)
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
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
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
23
دانشگاه صنعت آب و برق 23 نمایش استفاده از خاصیت intent آرگومان واقعی a b c آرگومان صوری u v w Intent(in) Intent(inout) Intent(out)
24
دانشگاه صنعت آب و برق 24 ارتباط آرگومان ها ( واقعی با صوری ) در سابروتین تعامل بین آرگومان های واقعی با آرگومان های صوری در زیربرنامه از نوع سابروتین شبیه زیربرنامه از نوع تابع است، با این تفاوت که در تابع تنها از خاصیت intent(in) استفاده می شود. اما در سابروتین از intent(in) ، intent(out) و intent(inout) استفاده می گردد. با توجه به نکته اخیر این مطلب را باید به حافظه سپرد که : در تعاملاتی که از intent(out) و intent(inout) استفاده می شود، آرگومان واقعی متناظر با هر آرگومان صوری باید متغیر باشد و نه عبارت و یا عدد ثابت.
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
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
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
28
دانشگاه صنعت آب و برق 28 متغیرهای محلی و سراسری یا جهانی یا کلی متغیر محلی (local variable) در زیربرنامه ها دو نوع متغیر وجود دارد. متغیر و یا متغیرهایی که از طریق آرگومان ها ( ساختگی ) وارد زیربرنامه می شوند. متغیر و یا متغیرهایی که در زیربرنامه مورد استفاده قرار می گیرند که ارتباطی با آرگومان ها ندارند و به آنها متغیرهای محلی گویند. متغیرهای محلی تنها زمانی فضای حافظه را اشغال می کنند که زیربرنامه در حال اجرا باشد. در لحظه ای که زیربرنامه فراخوانی می شود، فضای حافظه برای متغیرهای محلی ایجاد می شوند. وقتی که کنترل از زیربرنامه خارج شد، متغیرهای محلی آن از حافظه پاک و محو می شوند. متغیر جهانی یا سراسری یا کلی (global variable) بر عکس متغیرهای محلی، بعضی از متغیرها خارج از کلیه زیربرنامه ها اعلان می شوند. این متغیرها را سراسری گویند.
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
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
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
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
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 بهصورت یک متغیر تعریف شده است. در زیربرنامه area مقدار pi برابر.4 است و مساحت با این مقدار محاسبه میشود. اما مقدار محیط با pi=3.14159 محاسبه میگردد. دانشگاه صنعت آب و برق 33
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
35
دانشگاه صنعت آب و برق 35 مثال 3 Program scope_2 Implicit none integer :: a=1, b=2, c=3 print*, Add(a) c=4 print*, Add(a) print*, Mul(b,c) Contains Integer Function Add(q) Integer, intent(in) :: q Add = q+c End Function Add Integer Function Mul(x,y) Integer, intent(in) :: x, y Mul = x*y End Function Mul End program scope_2
36
دانشگاه صنعت آب و برق 36 اثر جانبی (side effect) program scope_3 Integer :: i, Max=5 Do i=1, Max print*, Sum1(i) End do Contains Integer Function Sum1(n) Integer, intent(in) :: n Integer :: s s=0 Do i=1, n s=s+i End do Sum1=s End Function Sum1 End program scope_3
37
دانشگاه صنعت آب و برق 37 اثر جانبی (side effect) program scope_3 Integer :: i, Max = 5 Do i=1, Max print*, Sum1(i) End do Contains Integer Function Sum1(n) Integer, intent(in) :: n Integer :: s, i s = 0 Do i=1, n s = s+i End do Sum1 = s End Function Sum1 End program scope_3
38
زیربرنامه ها و یا رویه های داخلی و خارجی ارتباط و تعاملات بین برنامه اصلی و زیربرنامه ها و یا رویه ها و هم چنین بین خود رویه ها، شامل نکات مهم و قابل تأملی است. این نکات شامل متغیرها محلی و عمومی ( مقادیر ثابت، به اشتراک گذاشتن متغیرها و ثابت ها و...) نیز می گردد. به طور کلی در این خصوص، دو رویکرد را می توان از یکدیگر تمیز داد. رویکرد داخلی همانطور که تاکنون مشاهده شد، زیربرنامه ها بین دستورات contains و End پایان برنامه اصلی یا میزبان (host) احاطه شده بودند و خاصیت تو در تویی نیز برای زیربرنامه برقرار نبود. به این رویکرد، ارتباط به نحو داخلی گویند. دانشگاه صنعت آب و برق 38
39
نحو (syntax) زیربرنامه داخلی [program name] دستورات اعلان دستورات اجرایی [contains internal subprograms] End [program [name]] دانشگاه صنعت آب و برق 39
40
ویژگی های رویکرد داخلی برنامه اصلی و زیربرنامه ها در یک فایل قرار دارند و لذا یکجا به زبان ماشین ترجمه می شوند. واضح است که در این رویکرد نمی توان آنها را از مجزا نمود. استفاده از این روش به سهولت انجام می شود. اگر حجم برنامه زیاد باشد ویرایش و اصلاح آن، امر نسبتاً دشواری است. برنامه جداگانه دیگری ( غیر از برنامه میزبان ) نمی تواند از رویه های داخلی استفاده کند، که البته این محدویت قابل ملاحظه ای است. دانشگاه صنعت آب و برق 40
41
دنباله ویژگی های رویکرد داخلی رویه ها و یا زیربرنامه های داخلی تمام خصوصیات عناصر پارامترها و متغیرها ( برنامه اصلی ) را به ارث می برند. یعنی در حالت کلی تمام متغیرها و پارامترها برنامه اصلی برای زیربرنامه ها قابل رؤیت و قابل استفاده هستند. مثلاً اگر در برنامه میزبان دستور implicit none را اعلان کنید، دیگر نیازی نیست که آن را در زیربرنامه ها اعلان نمود. اگر عدد ثابت پی (pi) در برنامه میزبان اعلان شود، می توان از آن در تمام رویه ها ( بدون اعلان مجدد ) استفاده نمود، مگر این که متغیری به همین نام در رویه ای اعلان گردد، که در این صورت ارتباط قطع می شود. دانشگاه صنعت آب و برق 41
42
رویکرد خارجی همانطور که مشاهده شد، رویکرد داخلی علی رغم سهولت به لحاظ محدویت هایی که داشت، کاربرد وسیعی ندارد و در مقابل آن رویکرد خارجی سامان یافته است. در این رویکرد کلیه رویه ها ( اعم از برنامه اصلی و زیربرنامه ها ) با دستور End خاتمه می یابند و یکی در داخل دیگری نیست و یا : حتی می توانند در فایل های مجزا قرار گیرند. در این صورت می توانند به صورت مجزا نیز ترجمه شوند. دانشگاه صنعت آب و برق 42
43
نحو (syntax) زیربرنامه خارجی subroutine name[(arguments)] دستورات اعلان دستورات اجرایی [contains internal subprograms] End [subroutine [name]] یا function name([arguments]) دستورات اعلان دستورات اجرایی [contains internal subprograms] End [function [name]] دانشگاه صنعت آب و برق 43
44
دنباله رویکرد خارجی رویکرد خارجی خود به دو بخش تقسیم می شود. برنامه اصلی و زیربرنامه ها به صورت بخش های مجزا از هم در یک و یا چند فایل ( حسب مورد ) قرار می گیرند و دستور contains بین آنها قرار نمی گیرد، این روش در فرترن 77 مرسوم است. همه و یا تعدادی از زیربرنامه ها در ساختاری قرار می گیرند که به آن ماژول (Module) گویند. این امکان در نسخ پایین تر زبان فرترن وجود نداشت دانشگاه صنعت آب و برق 44
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
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
47
دانشگاه صنعت آب و برق 47 قطعه یا ماژول (Module) همانطور که ملاحظه شد چندین زیربرنامه می توانند بعد از برنامه اصلی ظاهر شوند. از نسخه 90 به بعد فرترن، این امکان وجود دارد که چند زیربرنامه را در یک جا تجمیع نمود و تشکیل یک قطعه و یا ماژول داد. مقایسه ماژول با برنامه اصلی ساختار ماژول بسیار شبیه برنامه اصلی است و هیچ کدام دارای آرگومان نیستند. ماژول با واژه module شروع و با end module ختم می شود اما برنامه اصلی با program شروع و با end program به پایان می رسد. ماژول به جز پاره ای از دستورات خاص ( نظیر اعلان، محدوده عمل و...) و زیربرنامه ها نمی تواند شامل دستورات دیگری باشد. عناصر داخل ماژول نمی توانند به تنهایی اجرا شوند و حتما باید ارتباط آن را با یک برنامه اصلی برقرار نمود.
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]]
49
دانشگاه صنعت آب و برق 49 یک مثال ( 1 ) ساده از ماژول Module test Implicit none Real, parameter :: pi = 3.1415926 Real, parameter :: g = 9.80 Integer :: counter End module test
50
دانشگاه صنعت آب و برق 50 یک مثال ( 1 ) ساده از ماژول Module test Implicit none Real, parameter :: pi = 3.1415926 Real, parameter :: g = 9.80 Integer :: counter End module test قسمت ویژه
51
دانشگاه صنعت آب و برق 51 مثال ( 2) Module average Contains Real function som(a, b, c) Implicit none Real, intent(in) :: a, b, c som = a+b+c End function som Real function mean(a, b, c) Implicit none Real, intent(in) :: a, b, c mean = som(a, b, c)/3.0 End function End module average
52
دانشگاه صنعت آب و برق 52 مثال ( 2) Module average Contains Real function som(a, b, c) Implicit none Real, intent(in) :: a, b, c som = a+b+c End function som Real function mean(a, b, c) Implicit none Real, intent(in) :: a, b, c mean = som(a, b, c)/3.0 End function End module average
53
مثال ( 3) Module Degree_Radian Implicit none Real, parameter :: pi=3.1415926 Real, parameter :: degree180=180.0 contains Real Function DegreeToRadian(degree) Implicit none Real, intent(in) :: degree DegreeToRadian = degree*pi/degree180 End Function DegreeToRadian Real Function RadianToDegree(radian) Implicit none Real, intent(in) :: radian RadianToDegree = radian*degree180/pi End Function RadianToDegree End Module Degree_Radian دانشگاه صنعت آب و برق 53
54
چگونگی استفاده از ماژول وقتی یک ماژول ایجاد شد، اجزا آن که به شرح زیر است، جهانی یا سراسری هستند. یعنی آن ها از برنامه ها و ماژول های دیگر قابل دسترسی می باشند. مقادیر ثابت ( در قسمت ویژه ) متغیرها ( در قسمت ویژه ) زیربرنامه ها برای ارتباط با داده ها و زیربرنامه های ماژول، در برنامه های دیگر ( برنامه اصلی، زیربرنامه ها و ماژول ) به صورت زیر عمل می شود. USE module-name این دستور فقط در اول برنامه می آید، و اگر این ترتیب رعایت نشود برنامه خطا می دهد. دانشگاه صنعت آب و برق 54
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
56
متغیرهای عمومی و خصوصی در ماژول Module TheTest Implicit none Integer :: sky, moon Real :: city Logical :: is_true Real, parameter :: pi = 3.141592 Public :: sky, moon Private :: sizestar Private :: pi, city contains Integer Function sizestar() …………………………… End Funtion Real Function power(e) …………………………… End Function …………………………… End Mo dule TheTest دانشگاه صنعت آب و برق 56
57
مثال به اشتراک گذاری آرایه M odule share_data i mplicit none I nteger, parameter :: Num_vals=5 R eal, Dimension(Num_vals) :: values E nd Module P rogram test_module U se share_data R eal, parameter :: pi=3.141592 v alues = pi*(/1.,2., 3., 4., 5./) c all sub1 E nd Program test_module S ubroutine sub1 U se share_data i mplicit none W rite(*,*) values E nd Subroutine sub1 دانشگاه صنعت آب و برق 57
58
تعامل بین متغیرهای اندیس دار و زیربرنامه ها همانطور که قبلا ملاحظه شد، برنامه اصلی آرگومان های واقعی را به آرگومان های صوری برنامه های فرعی منتقل می کند. اما اکنون حالتی مد نظر است که آرگومان های اصلی به صورت آرایه هستند، لذا در ادامه کار این انتقال مورد کاوش بیشتری قرار می گیرد. دانشگاه صنعت آب و برق 58
59
کد ( 1) Integer, Parameter :: Lower_Bound=20 Integer, Parameter :: Upper_Bound=50 Integer, Dimension(Lower_Bound:Upper_Bound) :: Data Real, Dimension(1:Lower_Bound) :: Values Logical, Dimension(21:Upper_Bound) :: Answers.................................................. Call First(Data, Values, Answers, Lower_Bound, Upper_Bound, 21) Contains Subroutine First(x, y, z, Lower, Upper, LL) Integer, intent(IN) :: Lower Integer, intent(IN) :: Upper Integer, intent(IN) :: LL Integer, Dimension(Lower:Upper), intent(IN) :: x Real, Dimension(1:Lower), intent(OUT) :: y Logical, Dimension(LL:Upper), intent(INOUT) :: z.................................................. End Subroutine دانشگاه صنعت آب و برق 59
60
کد ( 1) Integer, Parameter :: Lower_Bound=20 Integer, Parameter :: Upper_Bound=50 Integer, Dimension(Lower_Bound:Upper_Bound) :: Data Real, Dimension(1:Lower_Bound) :: Values Logical, Dimension(21:Upper_Bound) :: Answers.................................................. Call First(Data, Values, Answers, Lower_Bound, Upper_Bound, 21) Contains Subroutine First(x, y, z, Lower, Upper, LL) Integer, intent(IN) :: Lower Integer, intent(IN) :: Upper Integer, intent(IN) :: LL Integer, Dimension(Lower:Upper), intent(IN) :: x Real, Dimension(1:Lower), intent(OUT) :: y Logical, Dimension(LL:Upper), intent(INOUT) :: z.................................................. End Subroutine دانشگاه صنعت آب و برق 60
61
کد ( 1) Integer, Parameter :: Lower_Bound=20 Integer, Parameter :: Upper_Bound=50 Integer, Dimension(Lower_Bound:Upper_Bound) :: Data Real, Dimension(1:Lower_Bound) :: Values Logical, Dimension(21:Upper_Bound) :: Answers.................................................. Call First(Data, Values, Answers, Lower_Bound, Upper_Bound, 21) Contains Subroutine First(x, y, z, Lower, Upper, LL) Integer, intent(IN) :: Lower Integer, intent(IN) :: Upper Integer, intent(IN) :: LL Integer, Dimension(Lower:Upper), intent(IN) :: x Real, Dimension(1:Lower), intent(OUT) :: y Logical, Dimension(LL:Upper), intent(INOUT) :: z.................................................. End Subroutine دانشگاه صنعت آب و برق 61
62
کد ( 1) Integer, Parameter :: Lower_Bound=20 Integer, Parameter :: Upper_Bound=50 Integer, Dimension(Lower_Bound:Upper_Bound) :: Data Real, Dimension(1:Lower_Bound) :: Values Logical, Dimension(21:Upper_Bound) :: Answers.................................................. Call First(Data, Values, Answers, Lower_Bound, Upper_Bound, 21) Contains Subroutine First(x, y, z, Lower, Upper, LL) Integer, intent(IN) :: Lower Integer, intent(IN) :: Upper Integer, intent(IN) :: LL Integer, Dimension(Lower:Upper), intent(IN) :: x Real, Dimension(1:Lower), intent(OUT) :: y Logical, Dimension(LL:Upper), intent(INOUT) :: z.................................................. End Subroutine دانشگاه صنعت آب و برق 62
63
کد ( 1) Integer, Parameter :: Lower_Bound=20 Integer, Parameter :: Upper_Bound=50 Integer, Dimension(Lower_Bound:Upper_Bound) :: Data Real, Dimension(1:Lower_Bound) :: Values Logical, Dimension(21:Upper_Bound) :: Answers.................................................. Call First(Data, Values, Answers, Lower_Bound, Upper_Bound, 21) Contains Subroutine First(x, y, z, Lower, Upper, LL) Integer, intent(IN) :: Lower Integer, intent(IN) :: Upper Integer, intent(IN) :: LL Integer, Dimension(Lower:Upper), intent(IN) :: x Real, Dimension(1:Lower), intent(OUT) :: y Logical, Dimension(LL:Upper), intent(INOUT) :: z.................................................. End Subroutine دانشگاه صنعت آب و برق 63
64
کد ( 1) Integer, Parameter :: Lower_Bound=20 Integer, Parameter :: Upper_Bound=50 Integer, Dimension(Lower_Bound:Upper_Bound) :: Data Real, Dimension(1:Lower_Bound) :: Values Logical, Dimension(21:Upper_Bound) :: Answers.................................................. Call First(Data, Values, Answers, Lower_Bound, Upper_Bound, 21) Contains Subroutine First(x, y, z, Lower, Upper, LL) Integer, intent(IN) :: Lower Integer, intent(IN) :: Upper Integer, intent(IN) :: LL Integer, Dimension(Lower:Upper), intent(IN) :: x Real, Dimension(1:Lower), intent(OUT) :: y Logical, Dimension(LL:Upper), intent(INOUT) :: z.................................................. End Subroutine دانشگاه صنعت آب و برق 64
65
کد ( 1) Integer, Parameter :: Lower_Bound=20 Integer, Parameter :: Upper_Bound=50 Integer, Dimension(Lower_Bound:Upper_Bound) :: Data Real, Dimension(1:Lower_Bound) :: Values Logical, Dimension(21:Upper_Bound) :: Answers.................................................. Call First(Data, Values, Answers, Lower_Bound, Upper_Bound, 21) Contains Subroutine First(x, y, z, Lower, Upper, LL) Integer, intent(IN) :: Lower Integer, intent(IN) :: Upper Integer, intent(IN) :: LL Integer, Dimension(Lower:Upper), intent(IN) :: x Real, Dimension(1:Lower), intent(OUT) :: y Logical, Dimension(LL:Upper), intent(INOUT) :: z.................................................. End Subroutine دانشگاه صنعت آب و برق 65
66
کد ( 1) Integer, Parameter :: Lower_Bound=20 Integer, Parameter :: Upper_Bound=50 Integer, Dimension(Lower_Bound:Upper_Bound) :: Data Real, Dimension(1:Lower_Bound) :: Values Logical, Dimension(21:Upper_Bound) :: Answers.................................................. Call First(Data, Values, Answers, Lower_Bound, Upper_Bound, 21) Contains Subroutine First(x, y, z, Lower, Upper, LL) Integer, intent(IN) :: Lower Integer, intent(IN) :: Upper Integer, intent(IN) :: LL Integer, Dimension(Lower:Upper), intent(IN) :: x Real, Dimension(1:Lower), intent(OUT) :: y Logical, Dimension(LL:Upper), intent(INOUT) :: z.................................................. End Subroutine دانشگاه صنعت آب و برق 66
67
کد ( 1) Integer, Parameter :: Lower_Bound=20 Integer, Parameter :: Upper_Bound=50 Integer, Dimension(Lower_Bound:Upper_Bound) :: Data Real, Dimension(1:Lower_Bound) :: Values Logical, Dimension(21:Upper_Bound) :: Answers.................................................. Call First(Data, Values, Answers, Lower_Bound, Upper_Bound, 21) Contains Subroutine First(x, y, z, Lower, Upper, LL) Integer, intent(IN) :: Lower Integer, intent(IN) :: Upper Integer, intent(IN) :: LL Integer, Dimension(Lower:Upper), intent(IN) :: x Real, Dimension(1:Lower), intent(OUT) :: y Logical, Dimension(LL:Upper), intent(INOUT) :: z.................................................. End Subroutine دانشگاه صنعت آب و برق 67
68
کد ( 1) Integer, Parameter :: Lower_Bound=20 Integer, Parameter :: Upper_Bound=50 Integer, Dimension(Lower_Bound:Upper_Bound) :: Data Real, Dimension(1:Lower_Bound) :: Values Logical, Dimension(21:Upper_Bound) :: Answers.................................................. Call First(Data, Values, Answers, Lower_Bound, Upper_Bound, 21) Contains Subroutine First(x, y, z, Lower, Upper, LL) Integer, intent(IN) :: Lower Integer, intent(IN) :: Upper Integer, intent(IN) :: LL Integer, Dimension(Lower:Upper), intent(IN) :: x Real, Dimension(1:Lower), intent(OUT) :: y Logical, Dimension(LL:Upper), intent(INOUT) :: z.................................................. End Subroutine دانشگاه صنعت آب و برق 68
69
کد ( 2 ): حداکثر اندازه آرایه منتقل می شود Integer, Parameter :: Max_size=1000 Real, Dimension(1:Max_size) :: Data Integer :: Actualsize Integer :: i Read*, Actualsize Read*, (Data(i), i=1,Actualsize) Print*, 'sum=', Summ(Data, Actualsize, Max_size) Contains Real Function Summ(x,n,size) Integer, intent(IN) :: size, n Real, Dimension(1:size), intent(IN) :: x Real :: Total Integer :: i Total=0.0 DO i=1,n Total=Total+x(i) End DO Summ=Total End Function End دانشگاه صنعت آب و برق 69
70
کد ( 2 ): حداکثر اندازه آرایه منتقل می شود Integer, Parameter :: Max_size=1000 Real, Dimension(1:Max_size) :: Data Integer :: Actualsize Integer :: i Read*, Actualsize Read*, (Data(i), i=1,Actualsize) Print*, 'sum=', Summ(Data, Actualsize, Max_size) Contains Real Function Summ(x,n,size) Integer, intent(IN) :: size, n Real, Dimension(1:size), intent(IN) :: x Real :: Total Integer :: i Total=0.0 DO i=1,n Total=Total+x(i) End DO Summ=Total End Function End دانشگاه صنعت آب و برق 70
71
کد ( 2 ): حداکثر اندازه آرایه منتقل می شود Integer, Parameter :: Max_size=1000 Real, Dimension(1:Max_size) :: Data Integer :: Actualsize Integer :: i Read*, Actualsize Read*, (Data(i), i=1,Actualsize) Print*, 'sum=', Summ(Data, Actualsize, Max_size) Contains Real Function Summ(x,n,size) Integer, intent(IN) :: size, n Real, Dimension(1:size), intent(IN) :: x Real :: Total Integer :: i Total=0.0 DO i=1,n Total=Total+x(i) End DO Summ=Total End Function End دانشگاه صنعت آب و برق 71
72
کد ( 2 ): حداکثر اندازه آرایه منتقل می شود Integer, Parameter :: Max_size=1000 Real, Dimension(1:Max_size) :: Data Integer :: Actualsize Integer :: i Read*, Actualsize Read*, (Data(i), i=1,Actualsize) Print*, 'sum=', Summ(Data, Actualsize, Max_size) Contains Real Function Summ(x,n,size) Integer, intent(IN) :: size, n Real, Dimension(1:size), intent(IN) :: x Real :: Total Integer :: i Total=0.0 DO i=1,n Total=Total+x(i) End DO Summ=Total End Function End دانشگاه صنعت آب و برق 72
73
کد ( 3 ): انتقال اندازه به مقدار لازم Integer, Parameter :: Max_size=1000 Real, Dimension(1:Max_size) :: Data Integer :: Actualsize Integer :: i Read*, Actualsize Read*, (Data(i), i=1,Actualsize) Print*, 'sum=', Summ(Data, Actualsize) Contains Real Function Summ(x,n) Integer, intent(IN) :: n Real, Dimension(:), intent(IN) :: x Real :: Total Integer :: i Total=0.0 DO i=1,n Total=Total+x(i) End DO Summ=Total End Function End دانشگاه صنعت آب و برق 73
74
کد ( 3 ): انتقال اندازه به مقدار لازم Integer, Parameter :: Max_ize=1000 Real, Dimension(1:Max_size) :: Data Integer :: Actualsize Integer :: i Read*, Actualsize Read*, (Data(i), i=1,Actualsize) Print*, 'sum=', Summ(Data, Actualsize) Contains Real Function Summ(x,n) Integer, intent(IN) :: n Real, Dimension(:), intent(IN) :: x Real :: Total Integer :: i Total=0.0 DO i=1,n Total=Total+x(i) End DO Summ=Total End Function End دانشگاه صنعت آب و برق 74
75
کد ( 3 ): انتقال اندازه به مقدار لازم Integer, Parameter :: Max_size=1000 Real, Dimension(1:Max_size) :: Data Integer :: Actualsize Integer :: i Read*, Actualsize Read*, (Data(i), i=1,Actualsize) Print*, 'sum=', Summ(Data, Actualsize) Contains Real Function Summ(x,n) Integer, intent(IN) :: n Real, Dimension(:), intent(IN) :: x Real :: Total Integer :: i Total=0.0 DO i=1,n Total=Total+x(i) End DO Summ=Total End Function End دانشگاه صنعت آب و برق 75
76
کد ( 3 ): انتقال اندازه به مقدار لازم Integer, Parameter :: Max_size=1000 Real, Dimension(1:Max_size) :: Data Integer :: Actualsize Integer :: i Read*, Actualsize Read*, (Data(i), i=1,Actualsize) Print*, 'sum=', Summ(Data, Actualsize) Contains Real Function Summ(x,n) Integer, intent(IN) :: n Real, Dimension(:), intent(IN) :: x Real :: Total Integer :: i Total=0.0 DO i=1,n Total=Total+x(i) End DO Summ=Total End Function End دانشگاه صنعت آب و برق 76
77
ترتیب قرار گرفتن دستورات فرترن دانشگاه صنعت آب و برق 77 PROGRAM, FUNCTION, SUBROUTINE or MODULE statement USE statements Format statements IMPLICIT NONE statement PARAMETER and DATA statements Type declaration Executable statements CONTAINS Internal subprograms END statement
78
زیربرنامه های بازگشتی همانطور که قبلا ملاحظه شد می توان زیربرنامه ها را در یکدیگر فراخواند. اما پاره ای از مسایل هستند که خصلت بازگشتی دارند. به عنوان مثال می توان از محاسبه فاکتوریل نام برد. N! = 1×2×3×…×N N! = N×(N-1)! البته مسئله فوق را می توان توسط یک تابع و یا سابروتین معمولی برنامه نویسی نمود. اما تکنیک ساده تری وجود دارد که این گونه مسایل را به صورت بازگشتی حل می کند. در روش بازگشتی، یک زیربرنامه ( تابع و یا سابروتین ) می تواند خودش را داخل خودش فراخواند. دانشگاه صنعت آب و برق 78
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
80
محاسبه فاکتوریل توسط یک تابع بازگشتی Integer :: n Read*, n Print*, fact(n) CONTAINS Recursive Function fact(n) Result(n_Fact) INTEGER, intent(IN) :: n INTEGER :: n_Fact IF(n>0) Then n_Fact = n*fact(n-1) ELSE n_Fact = 1 End IF End function fact End دانشگاه صنعت آب و برق 80
81
نمایش کارکرد زیربرنامه بازگشتی N=1, fact=1 N=2, fact=? N=2, fact=2 N=3, fact=? N=3, fact=6 T=1T=2T=3T=4T=5 دانشگاه صنعت آب و برق 81
82
محاسبه فاکتوریل توسط یک سابروتین بازگشتی Integer :: n, Res Read*, n call Fact(n, Res) Print*, Res Contains Recursive Subroutine Fact(n, Res) Integer, intent(IN) :: n Integer, intent(INOUT) :: Res IF(n>0) Then call Fact(n-1, Res) Res = Res*n Else Res=1 End IF End Subroutine End دانشگاه صنعت آب و برق 82
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.