Upload
tiara
View
77
Download
0
Embed Size (px)
DESCRIPTION
واحد های مختلف برنامه. Program Units. مقدمه. در برنامه های بزرگ هر قسمت از برنامه با وظيفه مشخص را در واحد (بخش ) خاصی از برنامه قرار می دهند و هر موقع (حتی به صورت تکراری) نياز بود از آن استفاده می شود هر برنامه متشکل از برنامه اصلی و برنامه های فرعی: Subprogram Subroutine Internal - PowerPoint PPT Presentation
Citation preview
برنامه مختلف های واحدعباسپور
1
واحد های مختلف برنامه
Program Units
برنامه مختلف های واحدعباسپور
2
مقدمه
در برنامه های بزرگ هر قسمت از برنامه •با وظيفه مشخص را در واحد )بخش (
خاصی از برنامه قرار می دهند و هر موقع )حتی به صورت تکراری( نياز بود از آن
استفاده می شودهر برنامه متشکل از برنامه اصلی و برنامه •
های فرعی:– Subprogram– Subroutine– Internal– External– Module
برنامه مختلف های واحدعباسپور
3
جزئيات داخلی هر يک از برنامه های فرعی •از ديگر برنامه های فرعی و خود برنامه
اصلی مجزا بوده و لذا به راحتی می توان آنها را در هر برنامه ديگر به راحتی مورد
استفاده قرار دادبرنامه اصلی و هريک از برنامه های فرعی •
با يک (Interface)واسط می توانند ازطريق برنامه فرعی ارتباط بر قرار کند
ولی ارتباط بين برنامه اصلی و فرعی يک •طرفه است
بايد بين واسط ها سازگاری برقرار باشد•(Consistency of Interfaces)
برنامه مختلف های واحدعباسپور
4
انواع برنامه های فرعی: در (Supplied Functions)توابع آماده •
کتابخانه فرترن موجود بوده و برنامه نويس بدون اجازه دخل و تصرف فقط
می تواند آنها را در برنامه خود : اينها را برنامه (Procedure)زير روالها •
نويس خود نوشته و می تواند در هر برنامه ای از آنها استفاده نموده و يا آنها را تغيير و يا اصالح نمايد. شامل
– Functions (توابع)– Subroutines
برنامه مختلف های واحدعباسپور
5
مزايای استفاده از برنامه های فرعی• Yواحد های فرعی را می توان مستقال
نوشت و تست نموديک برنامه فرعی که برای يک کار خاص •
نوشته شده است قابل فهم تر استاستفاده مکرر در هر برنامه ديگر•وقتی برنامه به صورت مجموعه ای از •
زير برنامه ها نوشته می شود عملکرد کامپايلر بهتر می شود
برنامه مختلف های واحدعباسپور
6
انواع تابع در فرترنتابع تک جمله ای: موقعی استفاده می شود که تابع را 1.
بتوان در يک عبارت يا دستور بيان نمود. اين تابع تنها يک خروجی دارد
تابع تک جمله ای بايد قبل از اولين دستور محاسباتی •)يا اجرايی( آورده شود
فرم کلی:•Name (x1,x2,……..xn)=ee: is a FORTRAN statement
اگر تابع در يک سطر جا نگيرد می توان ادامه آن را در •سطر بعد )با عالمت&( نوشت
Implicit declarationنام تابع اگر اعالن نشود از قانون •پيروی خواهد شد
اگر نام تابع تک جمله ای انتخابی مشابه نام تابعی از •کتابخانه فرترن باشد اولويت با تابع تک جمله ای خواهد
بود
برنامه مختلف های واحدعباسپور
7
مثال تابع تک جمله ایPROGRAM func1REAL ::rootREAL:: a, b, c, x, zREAL:: 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, xEND PROGRAM func1
برنامه مختلف های واحدعباسپور
8
توابع چند جمله ای2.اگر تابع دارای بيش از يک دستور باشد از اين نوع تابع •
استفاده می شود شامل توابع (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 statementRETURNEND FUNCTION name
YY بايد • يک بار در سمت چپ يک دستور Nameدر يک تابع حتماقرار گيرد
پس از محاسبه مقدار تابع در اختيار برنامه ای قرار می •گيرد که آن را فرا خوانده است
کنترل را به نقطه ای بر می گرداند که RETURNدستور •احضار شده است
ليست آرگومان ممکن است تهی و يا شامل تعدادی متغير از •هر نوع باشد
يک تابع برای اينکه در برنامه اصلی و يا در يک برنامه فرعی •ديگر احضار شود با يد از اسم آن در دستورات مختلف استفاده شود )مانند توابع موجود در کتابخانه فرترن(
برنامه مختلف های واحدعباسپور
11
مثال: برنامه فرعی زير ريشه دوم هر عددی مثل •a رافسون با خطای – را به روش عددی نيوتن
از فرمول00001/0نسبی • Ri+1=1/2(Ri + a/Ri) استفاده می شود. در اين روش
در a/2 برابر Rبا استفاده از تکرار عمليات ابتدا از روی aنظر گرفته شده و هربار مقدار جديد
مقدار قبلی آن محاسبه می گرددFUNCTION SQR (a)R=a/2.0Do
SQR=0.5* (R+ a/R)IF (ABS (SQR**2 –a)/a -0.00001)10, 5, 5 ( ، مثبت، صفر
(منفی5 R=SQREND DO10 RETURNEND
يک برنامه آورده شود آنگاه می توان CONTAINSچنانچه اين تابع در پايين به صورت زير مورد استفاده قرار گيرد
Variable name= SQR (variable or constant) دستور محاسباتی شامل
برنامه مختلف های واحدعباسپور
12
PROGRAM main مثالREAL:: w(3,4)OPEN (16, File="out put", STATUS = "unknown")w=5.0WRITE (16,1) totsum (w)1 FORMAT (" The sum of All elements of w is:",F10.1)CONTAINSFUNCTION totsum (xx) تابع و اصلی برنامه در آرايه اسم نيست نياز
باشد يکسانREAL:: xx (3,4 ( !Dummy argument تقلبی آرگومانtotsum=0.0loop1: Do I=1,3
loop2: DO J=1,4 totsum=totsum+ xx (I,J) END DO loop2 END DO loop1END FUNCTION totsumEND 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 Function2REAL::y,xOPEN (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,wEND DO10 FORMAT (F5.0, 5x, E14.5)CONTAINSFUNCTION BIG (a)REAL:: a, y1, y2y1=COS (a*a)- COS (a)y2= COS (a**3)-0.5* COS (a)
IF (y1-y2)7, 4, 44 BIG=y1RETURN7 BIG=y2RETURNEND FUNCTION BIGEND PROGRAM Function2
برنامه مختلف های واحدعباسپور
15
آرگومان های حقيقی و تقلبی Actual and Dummy arguments
برنامه های فرعی وظايف خود را بر اساس •اطالعاتی که در اختيار آنها قرار می گيرد انجام
می دهند.اين اطالعات از طريق ليست ارگومانها که در •
جلوی اسم آنها قرار می گيرد مشخص می گردندليست آرگومانها متشکل از تعدادی متغيير و يا •
عبارت )ويا حتی نام يک تابع ديگر( استمتناظر با اين ليست ، ليست ارگومانها در دستور •
احضار نيز وجود داردآرگومانهای موجود در ليست دستور احضار را •
آرگومانهای حقيقی و آرگومانهای موجود در ليست برنامه فرعی را آرگومانهای تقلبی می
نامند
برنامه مختلف های واحدعباسپور
16
آرگومانهای حقيقی و تقلبی بر اساس مکان •انها در ليست آرگومانها با همديگر متناظر می
باشنديعنی اولين آرگومان در ليست حقيقی با •
اولين آرگومان در ليست تقلبی و الی آخربه اين ترتيب هر بار برنامه فرعی توسط يک •
برنامه ديگر احضار می شود تابع براساس مقادير آرگومانهای احضار کننده اجرا خواهد
شد.بنابراين ليست آرگومانها در هر دو حالت بايد •
، مرتبه و ابعاد آرايه( Data از همه نظر )نوع با همديگر مطابقت داشته باشند
پس از اجرای برنامه فرعی اطالعات از ليست •تقلبی به ليست حقيقی منتقل می گردد
برنامه مختلف های واحدعباسپور
17
مثال: استفاده از يک رشته در ارگومان برنامه فرعی!Example of using array in argumentFUNCTION Amaximum (a, n)REAL:: a(100)Amaximum= a(1)
IF (n>0)THENDO I=2, n
IF (Amaximum – a (I))5, 10, 105 Amaximum= a (I)10 CYCLE
END DOEND IF
RETURNEND FUNCTION Amaximum
اين برنامه فرعی )تابع( بزرگترين عنصر يک رشته يک بعدی را
مشخص می کند
برنامه مختلف های واحدعباسپور
18
SUBROUTINEبرنامه فرعی
ها چه FUNCTIONهمانطور که اشاره شد •تک جمله ای و چه چند جمله ای باشند فقط قادر به محاسبه و انتقال يک کميت هستند
که اين کميت می تواند به جای يک متغير قرار گيرد:
Results= name [(argument list)]
با استفاده از سابروتين می توان کميت های متعددی را از برنامه احضار کننده به برنامه
فرعی )سابروتين( منتقل و کميت های متعدد ديگری را از برنامه فرعی به برنامه
اصلی منتقل نمود
برنامه مختلف های واحدعباسپور
19
سابروتينفرم کلی
SUBROUTINE name (list of arguments)
................
.............
RETURN
END
بايد نام تابع يکباردر FUNCTION در برنامه فرعیسمت چپ يک دستور گنجانيده شود در حاليکه در
سابروتين نام فقط در اواين دستور ظاهر می گردد
آرگومانهای سابروتين همگی ساختگی )تقلبی( هستند و لذا انتقال دو طرفه کميت ها از طريق
ليست آرگومانها صورت می گيرد
برنامه مختلف های واحدعباسپور
20
نحوه احضار يک سابروتيندستور • :CALL از شود می استفاده
PROGRAM call_testREAL, DIMENSION(10) :: a, c ... CALL swap ( a,c ) …………. CONTAINSSUBROUTINE swap ( a,b )
REAL, DIMENSION(10) :: a, b, temp
temp = a
a = b
b = temp
END SUBROUTINE swapEND PROGRAM call_test
برنامه مختلف های واحدعباسپور
21
Subroutineمثال کاربرد
در اين برنامه از يک سابروتين استفاده می شودکه در اين برنامه فرعی مشخص می شود آيا سه عدد وارد
شده اضالع مثلث هستند يا خير: اگر مثلث باشند محيط و مساحت مثلث را با پيام مناسب چاپ کند. اگر مثلث
- قرار می دهد1نباشند مساحت و محيط را برابر روش عددی بکار رفته به صورت زير است:
))()(( cpbpapps
نصف محيط است pدر اين رابطه
برنامه مختلف های واحدعباسپور
22
1 READ (10,2) a, b, c2 FORMAT (3f10.2)
CALL Triangle (a, b, ,c, s, p)IF (s) 5, 10,10
5 WRITE (3,6) a, b, c6 FORMAT (// 3f10.2/ 5x, “not a triangle”)
GO TO 110 WRITE (3,12) a, b, c, s, p12 FORMAT (// 3f10.2/ 2x, “Area=“, f10.2, 5x, &
“Circumference=“, f10.2)GO TO 1
15 STOPCONTAINS
برنامه مختلف های واحدعباسپور
23
SUBROUTINE Triangle (a, b, c, Area, per)
Area= -1
Per= -1
IF (a –(b + c)) 1, 1, 5
1 IF (b – (a + c)) 2, 2, 5
2 IF (c – (a + b))3, 3, 5
3 Per = a + b + c
p=0.5 *per
Area= SQRT (p* (p-a) * (p- b) * (p* -c))
5 RETURN
6 END
برنامه مختلف های واحدعباسپور
24
مثال: برنامه ای بنويسيد که خواندن ؛ جمع کردن و چاپ
به صورت (3,4)عناصر يک آرايه مجزا در يک سابروتين انجام
PROGRAM mainگيردREAL, DIMENSION:: w (3,4)CALL READER (w)CALL PRINTER (w)CALL ADDER (w, sum)WRITE (*, 1) sum1 FORMAT (// , “ The sum of all the elements &
is:”, F7.2/)CALL FINISHCONTAINS
برنامه مختلف های واحدعباسپور
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)
3 FORMAT (1x, 4f10.1)
END DO
RETURN
END SUBROUTINE PRINTER
برنامه مختلف های واحدعباسپور
27
SUBROUTINE ADDER (w, sum)REAL, DIMENSION:: w(3,4)Sum=0.0DO Irow = 1, 3
DO Icol= 1,4sum= sum + w (Irow, Icol)
END DOEND DORETURNEND SUBROUTINE ADDER
برنامه مختلف های واحدعباسپور
28
SUBROUTINE FINISH ! آرگومان بدونWRITE (*,1)1 FORMAT (1x, 60 “-”,/ 1x, 60 “-”)
RETURNEND SUBROUTINE FINISHEND PROGRAM main
خالصه:تعداد آرگومان در سابروتين ممکن است صفر، يک و
يا بيشتر باشدانتقال اطالعات بين برنامه احضار کننده و احضار
شونده از طريق آرگومانهای حقيقی و ساختگی سورت می گيرد
هر برنامه فرعی می تواند برنامه فرعی ديگری را احضار ولی نمی تواند خود و يا برنامه اصلی را
احضار کند
برنامه مختلف های واحدعباسپور
29