Presentation is loading. Please wait.

Presentation is loading. Please wait.

واحد های مختلف برنامه عباسپور

Similar presentations


Presentation on theme: "واحد های مختلف برنامه عباسپور"— Presentation transcript:

1 واحد های مختلف برنامه عباسپور
Program Units واحد های مختلف برنامه عباسپور

2 واحد های مختلف برنامه عباسپور
مقدمه در برنامه های بزرگ هر قسمت از برنامه با وظيفه مشخص را در واحد (بخش ) خاصی از برنامه قرار می دهند و هر موقع (حتی به صورت تکراری) نياز بود از آن استفاده می شود هر برنامه متشکل از برنامه اصلی و برنامه های فرعی: Subprogram Subroutine Internal External Module واحد های مختلف برنامه عباسپور

3 واحد های مختلف برنامه عباسپور
جزئيات داخلی هر يک از برنامه های فرعی از ديگر برنامه های فرعی و خود برنامه اصلی مجزا بوده و لذا به راحتی می توان آنها را در هر برنامه ديگر به راحتی مورد استفاده قرار داد برنامه اصلی و هريک از برنامه های فرعی می توانند ازطريق واسط (Interface) با يک برنامه فرعی ارتباط بر قرار کند ولی ارتباط بين برنامه اصلی و فرعی يک طرفه است بايد بين واسط ها سازگاری برقرار باشد (Consistency of Interfaces) واحد های مختلف برنامه عباسپور

4 واحد های مختلف برنامه عباسپور
انواع برنامه های فرعی توابع آماده (Supplied Functions): در کتابخانه فرترن موجود بوده و برنامه نويس بدون اجازه دخل و تصرف فقط می تواند آنها را در برنامه خود زير روالها (Procedure): اينها را برنامه نويس خود نوشته و می تواند در هر برنامه ای از آنها استفاده نموده و يا آنها را تغيير و يا اصلاح نمايد. شامل Functions (توابع) Subroutines واحد های مختلف برنامه عباسپور

5 مزايای استفاده از برنامه های فرعی
واحد های فرعی را می توان مستقلاً نوشت و تست نمود يک برنامه فرعی که برای يک کار خاص نوشته شده است قابل فهم تر است استفاده مکرر در هر برنامه ديگر وقتی برنامه به صورت مجموعه ای از زير برنامه ها نوشته می شود عملکرد کامپايلر بهتر می شود واحد های مختلف برنامه عباسپور

6 واحد های مختلف برنامه عباسپور
انواع تابع در فرترن تابع تک جمله ای: موقعی استفاده می شود که تابع را بتوان در يک عبارت يا دستور بيان نمود. اين تابع تنها يک خروجی دارد تابع تک جمله ای بايد قبل از اولين دستور محاسباتی (يا اجرايی) آورده شود فرم کلی: Name (x1,x2,……..xn)=e e: is a FORTRAN statement اگر تابع در يک سطر جا نگيرد می توان ادامه آن را در سطر بعد (با علامت&) نوشت نام تابع اگر اعلان نشود از قانون Implicit declaration پيروی خواهد شد اگر نام تابع تک جمله ای انتخابی مشابه نام تابعی از کتابخانه فرترن باشد اولويت با تابع تک جمله ای خواهد بود واحد های مختلف برنامه عباسپور

7 واحد های مختلف برنامه عباسپور
مثال تابع تک جمله ای PROGRAM func1 REAL ::root REAL:: a, b, c, x, z REAL:: array (3) Root (a, b, c)=(-b+ ( b**2- 4.0*a *c)**0.5)/(2.0*a) X=Root (1, 5, 3) Print*, x ……….. ……… Z=Root (v, w, q) X= Root (Array (1), Array(2), Array (3)) Print*, z, x END PROGRAM func1 واحد های مختلف برنامه عباسپور

8 واحد های مختلف برنامه عباسپور
توابع چند جمله ای اگر تابع دارای بيش از يک دستور باشد از اين نوع تابع استفاده می شود تمام برنامه های فرعی (internal Procedure) شامل توابع چند جمله ای و سابروتين ها در داخل برنامه اصلی قرار می گيرند. به عبارتی هر برنامه ای فقط و فقط می تواند يک برنامه اصلی داشته باشد. فرم کلی PROGRAM [name] [specification statements] [executable statements] ... [CONTAINS ] internal procedures] END [PROGRAM [name]] تمام برنامه های فرعی (بجز توابع تک جمله ای ) پس از برنامه اصلی و پس از کلمه CONTAINS می ايند تقدم و تاخر در آوردن برنامه های فرعی وجود ندارد واحد های مختلف برنامه عباسپور

9 واحد های مختلف برنامه عباسپور
هر برنامه فرعی خود دارای نام و کلمه END در پايان آن است آوردن کلمه STOP در هر جای برنامه اصلی و برنامه های فرعی که اورده شود (به شرط رسيدن کنترل به آن) کل برنامه متوقف می گردد STOP [Character string] هنگامی که يک برنامه فرعی به صورت Function نوشته می شود خروجی آن فقط می تواند يک کميت (از هر نوع) باشد خود يک برنامه فرعی می تواند برنامه های فرعی ديگر را فراخوانی کند واحد های مختلف برنامه عباسپور

10 واحد های مختلف برنامه عباسپور
فرم کلی FUNCTION FUNCTION name [(argument list)] [specification statements] [executable statements] ... …… name= Fortran statement RETURN END FUNCTION name در يک تابع حتماًً بايد Name يک بار در سمت چپ يک دستور قرار گيرد پس از محاسبه مقدار تابع در اختيار برنامه ای قرار می گيرد که آن را فرا خوانده است دستور RETURN کنترل را به نقطه ای بر می گرداند که احضار شده است ليست آرگومان ممکن است تهی و يا شامل تعدادی متغير از هر نوع باشد يک تابع برای اينکه در برنامه اصلی و يا در يک برنامه فرعی ديگر احضار شود با يد از اسم آن در دستورات مختلف استفاده شود (مانند توابع موجود در کتابخانه فرترن) واحد های مختلف برنامه عباسپور

11 واحد های مختلف برنامه عباسپور
مثال: برنامه فرعی زير ريشه دوم هر عددی مثل a را به روش عددی نيوتن – رافسون با خطای نسبی 00001/0 از فرمول Ri+1=1/2(Ri + a/Ri) استفاده می شود. در اين روش با استفاده از تکرار عمليات ابتدا R برابر a/2 در نظر گرفته شده و هربار مقدار جديد a از روی مقدار قبلی آن محاسبه می گردد FUNCTION SQR (a) R=a/2.0 Do SQR=0.5* (R+ a/R) IF (ABS (SQR**2 –a)/a )10, 5, (مثبت، صفر ، منفی) R=SQR END DO RETURN END چنانچه اين تابع در پايين CONTAINS يک برنامه آورده شود آنگاه می توان به صورت زير مورد استفاده قرار گيرد Variable name= SQR (variable or constant) دستور محاسباتی شامل واحد های مختلف برنامه عباسپور

12 واحد های مختلف برنامه عباسپور
PROGRAM main مثال REAL:: w(3,4) OPEN (16, File="out put", STATUS = "unknown") w=5.0 WRITE (16,1) totsum (w) 1 FORMAT (" The sum of All elements of w is:",F10.1) CONTAINS FUNCTION totsum (xx) نياز نيست اسم آرايه در برنامه اصلی و تابع يکسان باشد REAL:: xx (3,4 ( !Dummy argument آرگومان تقلبی totsum=0.0 loop1: Do I=1,3 loop2: DO J=1,4 totsum=totsum+ xx (I,J) END DO loop2 END DO loop1 END FUNCTION totsum END PROGRAM main اين برنامه فرعی جمع مقادير المان های يک آرايه دو بعدی را مشخص می کند واحد های مختلف برنامه عباسپور

13 واحد های مختلف برنامه عباسپور
مثال2 اگر Y بزرگترين مقداری باشد که برای هر مقدار x از روابط زير بدست می آيد Y=cos x2 – cos x Y=cos x3 – 0.5 cos x برنامه ای بنويسيد که w را از رابطه w=(y+siny)0.5 برای مقادير x از 1 تا 100 حساب کند واحد های مختلف برنامه عباسپور

14 واحد های مختلف برنامه عباسپور
PROGRAM Function2 REAL::y,x OPEN (16, File="out put", STATUS = "unknown") DO I=1,100 x=REAL (I) y=BIG (x) w=SQRT (ABS(y+SIN (y))) WRITE (16,10) x,w END DO 10 FORMAT (F5.0, 5x, E14.5) CONTAINS FUNCTION BIG (a) REAL:: a, y1, y2 y1=COS (a*a)- COS (a) y2= COS (a**3)-0.5* COS (a) IF (y1-y2)7, 4, 4 4 BIG=y1 RETURN 7 BIG=y2 END FUNCTION BIG END PROGRAM Function2 واحد های مختلف برنامه عباسپور

15 آرگومان های حقيقی و تقلبی Actual and Dummy arguments
برنامه های فرعی وظايف خود را بر اساس اطلاعاتی که در اختيار آنها قرار می گيرد انجام می دهند. اين اطلاعات از طريق ليست ارگومانها که در جلوی اسم آنها قرار می گيرد مشخص می گردند ليست آرگومانها متشکل از تعدادی متغيير و يا عبارت (ويا حتی نام يک تابع ديگر) است متناظر با اين ليست ، ليست ارگومانها در دستور احضار نيز وجود دارد آرگومانهای موجود در ليست دستور احضار را آرگومانهای حقيقی و آرگومانهای موجود در ليست برنامه فرعی را آرگومانهای تقلبی می نامند واحد های مختلف برنامه عباسپور

16 واحد های مختلف برنامه عباسپور
آرگومانهای حقيقی و تقلبی بر اساس مکان انها در ليست آرگومانها با همديگر متناظر می باشند يعنی اولين آرگومان در ليست حقيقی با اولين آرگومان در ليست تقلبی و الی آخر به اين ترتيب هر بار برنامه فرعی توسط يک برنامه ديگر احضار می شود تابع براساس مقادير آرگومانهای احضار کننده اجرا خواهد شد. بنابراين ليست آرگومانها در هر دو حالت بايد از همه نظر (نوع Data ، مرتبه و ابعاد آرايه) با همديگر مطابقت داشته باشند پس از اجرای برنامه فرعی اطلاعات از ليست تقلبی به ليست حقيقی منتقل می گردد واحد های مختلف برنامه عباسپور

17 مثال: استفاده از يک رشته در ارگومان برنامه فرعی
!Example of using array in argument FUNCTION Amaximum (a, n) REAL:: a(100) Amaximum= a(1) IF (n>0)THEN DO I=2, n IF (Amaximum – a (I))5, 10, 10 Amaximum= a (I) CYCLE END DO END IF RETURN END FUNCTION Amaximum اين برنامه فرعی (تابع) بزرگترين عنصر يک رشته يک بعدی را مشخص می کند واحد های مختلف برنامه عباسپور

18 برنامه فرعی SUBROUTINE
همانطور که اشاره شد FUNCTION ها چه تک جمله ای و چه چند جمله ای باشند فقط قادر به محاسبه و انتقال يک کميت هستند که اين کميت می تواند به جای يک متغير قرار گيرد: Results= name [(argument list)] با استفاده از سابروتين می توان کميت های متعددی را از برنامه احضار کننده به برنامه فرعی (سابروتين) منتقل و کميت های متعدد ديگری را از برنامه فرعی به برنامه اصلی منتقل نمود واحد های مختلف برنامه عباسپور

19 واحد های مختلف برنامه عباسپور
فرم کلی سابروتين SUBROUTINE name (list of arguments) RETURN END در برنامه فرعی FUNCTION بايد نام تابع يکباردر سمت چپ يک دستور گنجانيده شود در حاليکه در سابروتين نام فقط در اواين دستور ظاهر می گردد آرگومانهای سابروتين همگی ساختگی (تقلبی) هستند و لذا انتقال دو طرفه کميت ها از طريق ليست آرگومانها صورت می گيرد واحد های مختلف برنامه عباسپور

20 واحد های مختلف برنامه عباسپور
نحوه احضار يک سابروتين از دستور CALL استفاده می شود: PROGRAM call_test REAL, DIMENSION(10) :: a, c ... CALL swap ( a,c )   …………. CONTAINS SUBROUTINE swap ( a,b ) REAL, DIMENSION(10) :: a, b, temp temp = a a = b b = temp END SUBROUTINE swap END PROGRAM call_test واحد های مختلف برنامه عباسپور

21 مثال کاربرد Subroutine
در اين برنامه از يک سابروتين استفاده می شودکه در اين برنامه فرعی مشخص می شود آيا سه عدد وارد شده اضلاع مثلث هستند يا خير: اگر مثلث باشند محيط و مساحت مثلث را با پيام مناسب چاپ کند. اگر مثلث نباشند مساحت و محيط را برابر 1- قرار می دهد روش عددی بکار رفته به صورت زير است: در اين رابطه p نصف محيط است واحد های مختلف برنامه عباسپور

22 واحد های مختلف برنامه عباسپور
READ (10,2) a, b, c FORMAT (3f10.2) CALL Triangle (a, b, ,c, s, p) IF (s) 5, 10,10 WRITE (3,6) a, b, c FORMAT (// 3f10.2/ 5x, “not a triangle”) GO TO 1 WRITE (3,12) a, b, c, s, p FORMAT (// 3f10.2/ 2x, “Area=“, f10.2, 5x, & “Circumference=“, f10.2) STOP CONTAINS واحد های مختلف برنامه عباسپور

23 واحد های مختلف برنامه عباسپور
SUBROUTINE Triangle (a, b, c, Area, per) Area= -1 Per= -1 IF (a –(b + c)) 1, 1, 5 IF (b – (a + c)) 2, 2, 5 IF (c – (a + b))3, 3, 5 Per = a + b + c p=0.5 *per Area= SQRT (p* (p-a) * (p- b) * (p* -c)) RETURN END واحد های مختلف برنامه عباسپور

24 واحد های مختلف برنامه عباسپور
مثال: برنامه ای بنويسيد که خواندن ؛ جمع کردن و چاپ عناصر يک آرايه (3,4) به صورت مجزا در يک سابروتين انجام گيرد PROGRAM main REAL, DIMENSION:: w (3,4) CALL READER (w) CALL PRINTER (w) CALL ADDER (w, sum) WRITE (*, 1) sum 1 FORMAT (// , “ The sum of all the elements & is:”, F7.2/) CALL FINISH CONTAINS واحد های مختلف برنامه عباسپور

25 واحد های مختلف برنامه عباسپور
SUBROUTINE READER (z) REAL, DIMENSION:: z (3,4) WRITE (*,1) 1 FORMAT (“Please enter the 12 elements of the matrix”) READ (*,*) z RETURN END SUBROUTINE READER واحد های مختلف برنامه عباسپور

26 واحد های مختلف برنامه عباسپور
SUBROUTINE PRINTER (x) REAL, DIMENSION:: x(3,4) WRITE ( *,10) 10 FORMAT (// “The following matrix was read:”) DO Irow=1,3 WRITE (*,3) (x ( Irow, Icol ) , Icol=1,4) FORMAT (1x, 4f10.1) END DO RETURN END SUBROUTINE PRINTER واحد های مختلف برنامه عباسپور

27 واحد های مختلف برنامه عباسپور
SUBROUTINE ADDER (w, sum) REAL, DIMENSION:: w(3,4) Sum=0.0 DO Irow = 1, 3 DO Icol= 1,4 sum= sum + w (Irow, Icol) END DO RETURN END SUBROUTINE ADDER واحد های مختلف برنامه عباسپور

28 واحد های مختلف برنامه عباسپور
SUBROUTINE FINISH ! بدون آرگومان WRITE (*,1) FORMAT (1x, 60 “-”,/ 1x, 60 “-”) RETURN END SUBROUTINE FINISH END PROGRAM main خلاصه: تعداد آرگومان در سابروتين ممکن است صفر، يک و يا بيشتر باشد انتقال اطلاعات بين برنامه احضار کننده و احضار شونده از طريق آرگومانهای حقيقی و ساختگی سورت می گيرد هر برنامه فرعی می تواند برنامه فرعی ديگری را احضار ولی نمی تواند خود و يا برنامه اصلی را احضار کند واحد های مختلف برنامه عباسپور

29 واحد های مختلف برنامه عباسپور
واحد های مختلف برنامه عباسپور


Download ppt "واحد های مختلف برنامه عباسپور"

Similar presentations


Ads by Google