دستورهای انتقال کنترل
1
دستورهای انتقال کنترل Control Statements
دستورهای انتقال کنترل
2
انواع
IF
CASE
DO
توجه: در فرترن احکام غیر اجرایی (مثل اعلان) در این بلوک ها پذیرفته نمی شود
هر کدام ازاین بلک ها می تواند با نوعی دیگر به صورت متداخل ترکیب شوند
جهت سهولت در فهم برنامه می توان به دلخواه به هر بلوک یک نام اختصاص داد
دستورهای انتقال کنترل
3
دستور های شرطی Conditional Statements
هر تصمیمی احتیاج به برآورده شدن شرط یا شروطی دارد (حتی در زندگی روز مره)
با بر آورده شدن شرایط یک سری عملیات انجام می گیرد
اگر هوا آفتابی باشد
…………
………….
شرایط به صورت دستور های منطقی بیان می شوند که بر اساس نتیجه TRUE یا FALSE عملیاتی انجام می گیرد
دستورهای انتقال کنترل
4
جریان کنترل FLOW CONTROL
انتخاب و کنترل مسیر اجرای برنامه از ابزار مهم و قدرتمند در برنامه نویسی است
در فرترن 90 و C دو ساختار زیر جهت کنترل اجرا براساس خروجی یک عبارت منطقی مورد استفاده قرار می گیرد
ساختار و دستور IF
سازه و دستور CASE
دستورهای انتقال کنترل
5
ساختار و دستور 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
دستورهای انتقال کنترل
6
ساختار IF THEN
ساده ترین بلوک IF
چنانچه نتیجه دستوری منطقی TRUE باشد بلوکی شامل مجموعه ای از دستورات اجرا می شود
در غیر اینصورت اجرا به بعد از END IF منتقل می گردد
فرم کلی
[name:] IF (logical expression) THEN
block1
END IF name
دستورهای انتقال کنترل
7
اجازه می دهد بر اساس نتیجه منطقی دو مسیر مختلف انتخاب گردد. یک مسیر با true بودن و مسیر دیگر با false بودن اجرا می شود. در هر تکرار فقط یک بلوک می تواند اجرا شود
[name:] IF (logical expression) THEN
block1
ELSE
block2
END IF name
ساختار IF THEN ELSE
دستورهای انتقال کنترل
8
چندین گزینه پشت سر هم امکان پذیر است
تنها یک گزینه می تواند در هر بار اجرا شود
به مجرد اجرای یک گزینه کنترل به انتهای 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
ساختارچند گانه Cascaded IF THEN ELSE
دستورهای انتقال کنترل
9
مثال ساختار IF
برنامه ای بنویسید که بر اساس شکل سطح (دایره circle، مثلث triangle و مستطیل 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ادامه در صفحه بعد
دستورهای انتقال کنترل
10
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
دستورهای انتقال کنترل
11
ساختار IF را می توان به صورت متداخل نیز نوشت. بطوریکه تقریباً تداخل در هر جایی امکان پذیر است
مادامیکه تصویر صحیحی از نوع تصمیم داشته باشید ساختاری ساده است در غیر اینصورت ممکن است برنامه به درستی اجرا نشود
فرم کلی:
outer: IF( x>0.0 ) THEN
block1…
inner: IF( y<0.0 ) THEN
block2….
END IF inner
ELSE
…………
………….
END IF outer
ساختار متداخل Nested IF THEN ELSE
دستورهای انتقال کنترل
12
ساختاری قدیمی است که ساختار چندگانه جایگزین آن شده است
ممکن است بعضی از کامپایلر ها آن را قبول نکنند
فرم کلی
IF (FORTRAN arithmetic expression) a, b, c
a, b, c عدد برچسب دستور هستند
اگر داخل پرانتز:
منفی به دسنور a
صفر به دستور b
مثبت به دستور c می رود
مثال
IF (x-6.)100,200,300
ساختار محاسباتی Arithmetic IF
دستورهای انتقال کنترل
13
ساختار GO TO
با این دستور بدون هیچ شرطی و یا بر آورده شدن شروطی خاص کنترل به دستوری معین به سمت جلو و یا عقب می رود
با این وجود از فرترن 90 به بعد سعی می شود از دستورات برچسب دار استفاده نشود
فرم کلی
GO TO lable
مثال
IF (x>10.) GO TO 10
……
……
WRITE(*,*)……….
GO TO 25
……..
………
دستورهای انتقال کنترل
14
ساختار مناسب دیگر در تصمیم گیری
بر اساس مقدار یک INTEGER کنترل به دستوری خاص می رود
بهتر است کمتر از این دستور استفاده شود چون برنامه را مبهم می کند
این دستور و دستور IF محاسباتی از دستورات منسوخ شده فرترن 90 هستند ولی می توان آنها را استفاده کرد
فرم کلی
GO TO (n1,n2,n3,……..nr) integer expression
مثال
GO TO (100,200,300,400)I
اگر I
1 باشد به دستور 100 ، 2 باشد به دستور 200 و علی آخر
اگر کمتر از 1 و یا بزرگتر از 4 باشد دستور بعدی اجرا می شود
ساختار Computed GO TO
دستورهای انتقال کنترل
15
ساختار انتخاب if در C
فرم کلی
if (<expression>) <statement>;
<expression> عبارت منطقی (درست (1یا غیر صفر) یا غلط (0))
<statement> دستور اجرایی
پرانتز if اجباری است
فرم دیگر
if (<expression>) <statement1>;
else <statement2>;
فقط یکی از دو دستور اجرا می شود
نیاز به کلمه then در این دستور نیست
If (grade>=10) printf(“passed”);
else printf(“failed”);
دستورهای انتقال کنترل
16
ساختار بلوک if در C
اگر تعداد دستورات در if بیشتر از 1 باشد باید از بلوک {} استفاده نمود
فرم کلی
if (<expression>){
<statement1>
……
…….
<statement n>
}
else {
<statement1>
……
…….
<statement n>
}
دستورهای انتقال کنترل
17
مثال: محاسبه ضرائب معادله درجه2
# 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);
}
}
دستورهای انتقال کنترل
18
نکات برنامه
تابع exit در فایل stdlib.h قرار دارد
ارگومان آن یک عدد است که نشان دهنده نحوه خروج از برنامه است
عدد 0 خروج عادی
هر عدد غیر صفر خروج بدلیل بروز خطا
در c حاصل عبارت مقایسه ای (0 و یا غیر 0 است) بنابراین می توان در قسمت شرط if بجای عبارت مقایسه ای هر عبارتی که یک مقدار را باز می گرداند قرار داد
If (!a) …..
اگر a صفر باشد نقیض ان درست خواهد بود
دستورهای انتقال کنترل
19
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!”);
دستورهای انتقال کنترل
20
وضعیت 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;
else <statement2>;
If (a<b) {
if (c<d) <statment1>;
}
else <statement2>;
دستورهای انتقال کنترل
21
مثال
برنامه ای بنویسید که سه عدد را دریافت و حداکثر آنها را چاپ کند
# 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);
}
دستورهای انتقال کنترل
22
ساختار 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 اجرا شود
دستورهای انتقال کنترل
23
مثال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
دستورهای انتقال کنترل
24
مثال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
دستورهای انتقال کنترل
25
ساختار چند انتخابی switch/ case در C
Switch (<expression>) {
case <constant1> : <statement1>; فرم کلی
<statement2>;
……
<statementn>;
case <constant2> : <statement1>;
<statement2>;
……
<statementn>;
………..
case <constant m> : <statement1>;
<statement2>;
……
<statementn>;
Default : <statement1>;
<statement2>;
……
<statementn>;
}
دستورهای انتقال کنترل
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 در C
دستورهای انتقال کنترل
27
مثال : 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);
}
دستورهای انتقال کنترل
28
مثال کاربردی برای دستور IF
افت انرژی در لوله ها
تعیین نوع جریان بر اساس عدد رینولدز Re=VD/ ، v=Q/A ؛ A=d2/4
: Kinematic Viscosity (ft2/s)
Re>2000 جریان متلاتم.
معادله Darcy-Weisbach برای افت انرژی:
hL=f(L/D)(v2/2g)
افت بر حسب واحد وزن سیال
f: Friction Factor
f=64/Re for Rey2000 جریان آرام
دستورهای انتقال کنترل
29
برای جریان متلاتم:
معادله Chen :
معادله : Swamee and Jain
معادله Colebrook
دستورهای انتقال کنترل
30
استفاده از معادله 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 ادامه………
دستورهای انتقال کنترل
31
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
ادامه………………………..
دستورهای انتقال کنترل
32
!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)
دستورهای انتقال کنترل
33
!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
دستورهای انتقال کنترل
34
عملیات تکرار Repetition
از مهمترین ویژگیهای هر زبان برنامه نویسی است
ساختار DO (DO Construct)
جهت تکرار بلوک هایی از دستورات مختلف
فرم کلی
[name:] DO [Control Clause شرط کنترل ]
block
END DO [name]