Programming7 (Control statements)
Download
Report
Transcript Programming7 (Control statements)
دستورهای انتقال کنترل
Control Statements
1
دستورهای انتقال کنترل
عباسپور
انواع
IF
CASE
DO
توجه :در فرترن احکام غير اجرايي (مثل اعالن) در اين بلوک ها
پذيرفته نمی شود
هر کدام ازاين بلک ها می تواند با نوعی ديگر به صورت متداخل
ترکيب شوند
جهت سهولت در فهم برنامه می توان به دلخواه به هر بلوک يک
نام اختصاص داد
2
دستورهای انتقال کنترل
عباسپور
دستور های شرطی
Conditional Statements
• هر تصميمی احتياج به برآورده شدن شرط يا شروطی دارد (حتی
در زندگی روز مره)
• با بر آورده شدن شرايط يک سری عمليات انجام می گيرد
– اگر هوا آفتابی باشد
• ............
• .............
• شرايط به صورت دستور های منطقی بيان می شوند که بر
اساس نتيجه TRUEيا FALSEعملياتی انجام می گيرد
3
دستورهای انتقال کنترل
عباسپور
جريان کنترل FLOW CONTROL
• انتخاب و کنترل مسير اجرای برنامه از ابزار مهم و قدرتمند در
برنامه نويس ی است
• در فرترن 90و Cدو ساختار زير جهت کنترل اجرا براساس
خروجی يک عبارت منطقی مورد استفاده قرار می گيرد
– ساختار و دستور IF
– سازه و دستور CASE
4
دستورهای انتقال کنترل
عباسپور
ساختار و دستور IFدر فرترن
IF statement and construct
• ساده ترين فرم IF
IF (Logical Expression) Executable Statement
: Statementهر دستور اجرايي ( نه غير اجرايي و بجز ENDو خود
دستور ديگری از )IF
اگر Logical Expressionمقداری TRUEباشد انگاه دستور
statementاجرا می شود
در اين ساختار هميشه دستور بعد از آن اجرا می شود
Statementفقط بايد يک دستور واحد باشد
مثال
IF (x<0.0) x=0.0
5
دستورهای انتقال کنترل
عباسپور
ساختار
IF THEN
•
•
•
•
ساده ترين بلوک IF
چنانچه نتيجه دستوری منطقی TRUEباشد بلوکی شامل
مجموعه ای از دستورات اجرا می شود
در غير اينصورت اجرا به بعد از END IFمنتقل می گردد
فرم کلی
TRUE
BLOCK1
6
Logical
expression
[name:] IF (logical expression) THEN
block1
FALSE
END IF name
دستورهای انتقال کنترل
عباسپور
ساختار
IF THEN ELSE
اجازه می دهد بر اساس نتيجه منطقی دو مسير مختلف انتخاب
گردد .يک مسير با trueبودن و مسير ديگر با falseبودن اجرا
می شود .در هر تکرار فقط يک بلوک می تواند اجرا شود
[name:] IF (logical expression) THEN
FALSE
BLOCK2
7
Logical
expression
TRUE
block1
ELSE
block2
END IF name
BLOCK1
دستورهای انتقال کنترل
عباسپور
ساختارچند گانه
Cascaded IF THEN ELSE
•
•
•
•
چندين گزينه پشت سر هم امکان پذير است
تنها يک گزينه می تواند در هر بار اجرا شود
به مجرد اجرای يک گزينه کنترل به انتهای END IFمی رود
در فرترن 90با ساختار CASEجايگزين شده است
[name:] IF (logical expression) THEN
block1
ELSE IF (logical expression) THEN
block2
ELSE IF (logical expression) THEN
bolock3
ELSE
block4
END IF name
8
دستورهای انتقال کنترل
عباسپور
IF مثال ساختار
و مستطيلtriangle مثلث،circle برنامه ای بنويسيد که بر اساس شکل سطح (دايره
) در هر مورد مساحت آنها را محاسبه نمايدRectangle
PROGRAM shap
! Finding area of a surface based on shape identification
! shap= shape ID CHARACTER variable
!radius= radius of circle
!base= base of rectangle or Triangle
!Height= height of rectangle or Triangle
REAL:: area, radius, base, height, pi
CHARACTER (10):: shap
Pi=3.14
!input shape ID to choose a branch
PRINT*, “input shape ID as “”circle””, “”triangle””,&
&“”rectangle””.”
READ(*,*) shap ادامه در صفحه بعد
دستورهای انتقال کنترل
عباسپور
9
IF (shap(1:1) == “c” . OR. shap(1:1) == “C” )THEN
PRINT*, “input radius of circle”
READ (*,*) radius
Area=pi*radius**2.
PRINT*, “radius and area for circle”, radius, area
ELSE IF (shap(1:1) == “t” . OR. shap(1:1) == “T” )THEN
PRINT*, “input base and height of triangle”
READ(*,*) base, height
Area=0.5*base*height
PRINT*, “base, height and area for triangle are”, base, height, area
ELSE IF (shap(1:1) == “r” . OR. shap(1:1) == “R” )THEN
PRINT*, “input base and height of rectangle”
READ (*,*) base, height
Area=base*height
PRINT*, “base, height and area for rectangle are:”, base, height, area
ELSE
PRINT*, “the requested shape is not a circle, triangle or rectangle”
END IF
END PROGRAM shap
دستورهای انتقال کنترل
عباسپور
10
ساختار متداخل
Nested IF THEN ELSE
•
•
•
11
ً
ساختار IFرا می توان به صورت متداخل نيز نوشت .بطوريکه تقريبا تداخل در هر جايي امکان پذير
است
ماداميکه تصوير صحيحی از نوع تصميم داشته باشيد ساختاری ساده است در غير اينصورت ممکن
است برنامه به درستی اجرا نشود
فرم کلی:
outer: IF( x>0.0 ) THEN
block1...
inner: IF( y<0.0 ) THEN
block2….
END IF inner
ELSE
…………
………….
END IF outer
دستورهای انتقال کنترل
عباسپور
ساختار محاسباتی
Arithmetic IF
• ساختاری قديمی است که ساختار چندگانه جايگزين آن شده است
• ممکن است بعض ی از کامپايلر ها آن را قبول نکنند
• فرم کلی
IF (FORTRAN arithmetic expression) a, b, c
a, b, cعدد برچسب دستور هستند
اگر داخل پرانتز:
منفی به دسنور a
صفر به دستور b
مثبت به دستور cمی رود
مثال
IF (x-6.)100,200,300
12
دستورهای انتقال کنترل
عباسپور
ساختار GO TO
•
•
•
مثال
با اين دستور بدون هيچ شرطی و يا بر آورده شدن شروطی خاص کنترل به دستوری
معين به سمت جلو و يا عقب می رود
با اين وجود از فرترن 90به بعد سعی می شود از دستورات برچسب دار استفاده
نشود
فرم کلی
GO TO lable
IF (x>10.) GO TO 10
……
……
WRITE(*,*)……….
GO TO 25
……..
………
13
دستورهای انتقال کنترل
عباسپور
10
ساختار
Computed GO TO
• ساختار مناسب ديگر در تصميم گيری
• بر اساس مقدار يک INTEGERکنترل به دستوری خاص می رود
• بهتر است کمتر از اين دستور استفاده شود چون برنامه را مبهم می کند
• اين دستور و دستور IFمحاسباتی از دستورات منسوخ شده فرترن 90هستند ولی می
توان آنها را استفاده کرد
• فرم کلی
GO TO (n1,n2,n3,……..nr) integer expression
مثال
GO TO (100,200,300,400)I
اگر I
1باشد به دستور 2 ، 100باشد به دستور 200و علی آخر
اگر کمتر از 1و يا بزرگتر از 4باشد دستور بعدی اجرا می شود
14
دستورهای انتقال کنترل
عباسپور
ساختار انتخاب ifدر C
• فرم کلی
;>if (<expression>) <statement
> <expressionعبارت منطقی (درست (1یا غير صفر) یا غلط ())0
> <statementدستور اجرایی
پرانتز ifاجباری است
• فرم دیگر
;>if (<expression>) <statement1
;>else <statement2
فقط یکی از دو دستور اجرا می شود
نیاز به کلمه thenدر این دستور نیست
;)”If (grade>=10) printf(“passed
;)”else printf(“failed
15
دستورهای انتقال کنترل
عباسپور
ساختار بلوک ifدر C
• اگر تعداد دستورات در ifبیشتر از 1باشد باید از بلوک {} استفاده نمود
•
فرم کلی
{)>if (<expression
><statement1
……
…….
><statement n
}
{ else
><statement1
……
…….
><statement n
}
16
دستورهای انتقال کنترل
عباسپور
•
•
•
•
•
•
•
•
•
•
•
•
•
•
# include <stdio.h>
# include <stdlib.h>
# include <math.h>
void main(){
int a,b,c;
float x1,x2 ;
float delta;
printf("please enter a,b,c:");
scanf("%d%d%d",&a,&b,&c);
if (a==0){
printf("wrong equation");
exit(0);
}
delta= b*b -4*a*c;
•
•
•
•
•
•
•
•
•
•
•
•
•
if (delta<0)
printf("no answer");
else if (delta==0){
x1=-b/(2*a);
printf("ther is one answer, x= %f",x1);
}
else {
delta = sqrt(delta);
x1=(-b+delta)/(2*a);
x2=(-b-delta)/(2*a);
printf(" there are two answers, x1=%4.2f and x2= %4.2f", x1, x2);
دستورهای انتقال کنترل
}
عباسپور
}
2 محاسبه ضرائب معادله درجه:مثال
17
نکات برنامه
• تابع exitدر فایل stdlib.hقرار دارد
– ارگومان آن یک عدد است که نشان دهنده نحوه خروج از برنامه است
• عدد 0خروج عادی
• هر عدد غیر صفر خروج بدلیل بروز خطا
• در cحاصل عبارت مقایسه ای ( 0و یا غیر 0است) بنابراین می
توان در قسمت شرط ifبجای عبارت مقایسه ای هر عبارتی که یک
مقدار را باز می گرداند قرار داد
If )!a( …..
اگر aصفر باشد نقیض ان درست خواهد بود
18
دستورهای انتقال کنترل
عباسپور
If-else –ifمتداخل در c
• شرط ها از باال به پایین بررسی و بمحض درستی یک
شرط از دیگر شرط ها عبور می شود
• شرط های نادر تر در انتها آورده شود
;(”If (grade>=18( printf)“good
;(”else if (grade>=15( printf)“medium
;(”else if (grade>=12( printf)“rather weak
;(”else if (grade>=10( printf)“weak
;(”!else printf)“failed
19
دستورهای انتقال کنترل
عباسپور
وضعیت elseدر ifهای متداخل
•
مثال
)If (a<b
;>if (c<d) <statment1
;>else <statement2
وضعیت tabنشان می دهد که elseمربوط به ifدوم است ( statement2در صورتی اجرا
می شود که a<bدرست و شرط c<dغلط باشد)
• در Cهر elseبه نزدیکترین ifبدون elseتعلق دارد
• تغییر مالکیت if
– اضافه کردن else
– استفاده از بلوک {}
{ )If (a<b
;>if (c<d) <statment1
}
;>else <statement2
20
دستورهای انتقال کنترل
عباسپور
)If (a<b
;>if (c<d) <statment1
;else
;>else <statement2
•
•
•
•
•
•
•
•
•
•
•
•
•
• برنامه ای بنویسید که سه عدد را دریافت و حداکثر آنها را چاپ کند
# include <stdio.h>
void main(){
int a,b,c;
int max;
printf("please enter 3 numbers:");
scanf("%d%d%d",&a,&b,&c);
مثال
if (a>b)
if(a>c) max=a;
else max=c;
else if (b>c)max=b;
else max=c;
printf("maximum is %d", max);
}
دستورهای انتقال کنترل
21
عباسپور
ساختار
•
•
•
SELECT CASEدر فرترن
روش ی ساده که جايگزين ساختار IF…THENمی شود وقتی ELSEخيلی تکرار شود
در فرترن 90به بعد وجود دارد
فرم کلی
) [name:] SELECT CASE( expression
]CASE( value ) [name
block
...
[CASE DEFAULT
]block
]END SELECT [name
نتيجه expressionممکن است character, logical , integerباشد
Valueبايد هم نوع با نتيجه expressionباشد
CASE DEFAULTانتخابی است ولی اگر باشد شامل تمام مقاديری است که توسط
) CASE (VALUEدر نظر گرفته نشده است
Valueمی تواند يک محدوده باشد ولی در هر صورت نبايد بر هم منطبق باشند
) CASE (number:يعنی با هر مقداری بزرگتر از numberاجرا شود
) CASE (:numberيعنی با هر مقداری کوچکتر از numberاجرا شود
22
دستورهای انتقال کنترل
عباسپور
1مثال
INTEGER :: month
season: SELECT CASE( month )
CASE(4,5)
WRITE(*,*) `Spring'
CASE(6,7)
WRITE(*,*) `Summer'
CASE(8:10)
WRITE(*,*) `Autumn'
CASE(11,1:3,12)
WRITE(*,*) `Winter'
CASE DEFAULT
WRITE(*,*) `not a month'
END SELCET season
دستورهای انتقال کنترل
عباسپور
23
2مثال
Wars: SELECTE CASE (nyears)
CASE(1853:1856)
WAR=“Crimean War”
CASE(1899:1902)
WAR=“Boer War”
CASE(1914:1918)
WAR=“World War1”
CASE(1939:1945)
WAR=“World War2”
CASE DEFAULT
WAR=“Peace”
END SELECT Wars
دستورهای انتقال کنترل
عباسپور
24
C درswitch/ case ساختار چند انتخابی
Switch (<expression>) {
case <constant1> :
case <constant2> :
………..
case <constant m> :
}
<statement1>;
<statement2>;
……
<statementn>;
فرم کلی
<statement1>;
<statement2>;
……
<statementn>;
<statement1>;
<statement2>;
……
<statementn>;
Default : <statement1>;
<statement2>;
……
<statementn>; دستورهای انتقال کنترل
عباسپور
25
ساختار چند انتخابی switch/ caseدر C
•
•
•
•
•
•
•
•
•
•
•
•
•
26
)> (<expressionیک عبارت عدد صحیح یا کاراکتری
> <constantیک ثابت عدد صحیح یا کاراکتری
)> (<expressionبا هر یک از constantها مقایسه و اگر برابر باشد اجرا می شود
اگر با هیچکدام برابر نباشد Defaultاجرا می شود
قرار دادن قسمت Defaultاختیاری است
این ساختار فقط برای عبارات کاراکتری و صحیح قابل انجام است و برای اعشاری نمی توان
استفاده نمود!
اولین constantکه صادق باشد تمام caseهای پس از ان نیز اجرا می شود
حالت ORمنطقی دارد ،یعنی اگر چند حالت مختلف دارید که وقوع یکی از آنها باعث اجراء
مجموعه ای از دستورات می شود
برای لغو این حالت می توان از دستور breakدر انتهای هر caseاستفاده نمود
دستور breakدر ساختار هاي do/while, for, whileهم قابل استفاده هستند
این دستور سب مي شود كنترل از بلوك مربوط خارج و به اولین دستور پس از ان ساختار
برسد
دستور continueهم در ساختار هاي do/while, for, whileقابل استفاده هستند.
با این دستور از اجراي باقیمانده بلوك صرف نظر شده و كنترل به ابتداي ساختار یا حلقه بر
مي گردد
;If (number<0) break
دستورهای انتقال کنترل
عباسپور
;If (number<0) continue
switch/ case : مثال
برنامه اي بنويسيد كه دو عدد و عملگري را دريافت و نتيجه را
چاپ نمايد
#include <stdio.h>
void main(){
int number1,
number2, result;
char op;
printf("please enter first number, operator and second number:");
scanf("%d%c%d", &number1, &op, &number2);
result=0;
switch (op){
case '+': result= number1+ number2; break;
case '-': result= number1- number2; break;
case '*': result= number1* number2;
break;
case '/': if (number2!=0)result= number1/ number2;
else printf("error! there is no answer.\n");
break;
case '%': if (number2!=0)result= number1% number2;
else printf("error! there is no answer.\n");
break;
default: printf("invalid operator!\n");
}
printf("result=%d", result);
}
دستورهای انتقال کنترل
عباسپور
27
مثال کاربردی برای دستور IF
• افت انرژی در لوله ها
– تعيين نوع جريان بر اساس عدد رينولدز v=Q/A ، Re=VD/؛
A=d2/4
Kinematic Viscosity (ft2/s) :
Re>2000جريان متالتم.
معادله Darcy-Weisbachبرای افت انرژی:
)hL=f(L/D)(v2/2g
افت بر حسب واحد وزن سيال
Friction Factor :f
جریان آرام f=64/Re for Rey2000
28
دستورهای انتقال کنترل
عباسپور
ε
5.0452
f 2.01log(
log A
3
.
7065
D
R
e
1
ε
5.8506
A
( )1.1098 0.8981
2.8257 D
Re
f
2
:• برای جريان متالتم
: Chen • معادله
0.25
0.27ε 5.74
log( D R 0.9 )
e
2
1
ε
2.5226
2.0 log
f
3.7065D Re f
دستورهای انتقال کنترل
عباسپور
Swamee and Jain: معادله
Colebrook معادله
29
برای محاسبه افتChen استفاده از معادله
PROGRAM headloss
!Calculating energy loss in a circular pipe !using Chen Eq.
! D=diameter of pipe, ft
! E= average size of roughness, ft
!AREA= Area of pipe, sq. ft
!VEL=velocity of flow
! NU= Kinematic Viscosity, ft**2/s
!Q= Volumetric flow rate, ft**3/s
!L=Length of pipe, ft
!F=friction factor
!HL=energy loss, ft .........ادامه
دستورهای انتقال کنترل
عباسپور
30
REAL::D,AREA,VEL,NU,Q,L,E,RE,F,HL,G,PI
CHARACTER(LEN=9)::LABLE
PRINT*, “input flow rate, cfs”
READ(*,*)Q
PRINT*, “input diameter, ft”
READ (*,*)D
PRINT*, “input length of pipe, ft”
READ (*,*)L
PRINT*, “input size of roughness, ft”
READ (*,*)E
PRINT*, “input kinematic viscosity, ft**2/s”
READ (*,*)NU
!Initial calculations and specifications
G=32.17
PI=3.1416
AREA=PI*D**2/4.
VEL=Q/AREA
RE=VEL*D/NU
.............................ادامه
دستورهای انتقال کنترل
عباسپور
31
!calculating f based on Re
IF (RE<=2000.)THEN
F=64./RE
LABLE="laminar"
ELSE
A1=5.8506/RE**0.8981
A2=1./2.8257*(E/D)**1.1098
A=A2+A1
F1=E/(3.7065*D)-5.0452/RE*LOG10(A)
F=(-2.01*LOG10(F1))**(-2)
LABLE="Turbulant"
END IF
HL=F*L/D*VEL**2/(2.*G)
دستورهای انتقال کنترل
عباسپور
32
!Out put approperiate data
WRITE(*,*)
WRITE(*,*)"Flow rate=",Q,"cfs"
WRITE(*,*)"Pipe Diameter=",D,"ft"
WRITE(*,*)"Lenght of pipe=",L,"ft"
WRITE(*,*)"Size of ruoghness=",E,"ft"
WRITE(*,*)"Kinematic Viscosity=",NU,"ft**2/s"
WRITE(*,*)
WRITE(*,*)"Flow is",LABLE,"the friction factor is",F
WRITE(*,*)"The energy loss is",HL,"ft"
END PROGRAM headloss
دستورهای انتقال کنترل
عباسپور
33
عمليات تکرار Repetition
• از مهمترين ويژگيهای هر زبان برنامه نويس ی است
• ساختار (DO Construct) DO
– جهت تکرار بلوک هايي از دستورات مختلف
– فرم کلی
] شرط کنترل [Control Clause
[name:] DO
block
]END DO [name
34
دستورهای انتقال کنترل
عباسپور