دستورات شرطی و انتخاب در ++C

همۀ برنامههايي که در دو جلسه اول بيان شد، به شکل ترتيبي اجرا ميشوند، يعني دستورات برنامه به ترتيب از بالا به پايين و هر کدام دقيقا يک بار اجرا ميشوند. در اين جلسه نشان داده ميشود چگونه از دستورات شرطی و انتخاب یعنی دستورات if else و switch همراه با مثال در ++C جهت انعطافپذيری بيشتر برنامه استفاده کنيم. همچنين در اين جلسه انواع صحيح كه در ++C وجود دارد بيشتر بررسي میگردد.
رئوس مطالب این جلسه
- دستور if
- دستور if..else
- عملگرهاي مقايسهاي
- بلوكهاي دستورالعمل
- شرطهاي مركب
- ارزيابي ميانبري
- عبارات منطقي
- دستورهاي انتخاب تودرتو
- ساختار else if
- دستورالعمل switch
- عملگر عبارت شرطي
- كلمات كليدي
دستورات شرطی و انتخاب در ++C
در ادامه درس انتظار ميرود پس از پايان اين جلسه بتوانيد نحو دستور if را شناخته و آن را در برنامهها به کار ببريد. نحو دستور if..else را شناخته و آن را در برنامهها به کار ببريد. از ساختار else..if در تصميمگيريهاي پيچيده استفاده کنيد. نحو دستور switch را شناخته و خطاي «تلۀ سقوط» را تشخيص دهيد. بلوک دستورالعمل را تعريف کنيد. عملگرهاي مقايسهاي و عملگر عبارت شرطي را در دستورات شرطي به کار ببريد. از شرطهاي مرکب استفاده کرده و ارزيابي ميانبري را شرح دهيد. «کلمۀ کليدي» را تعريف کنيد.
دستور if
دستور if موجب ميشود برنامه به شکل شرطي اجرا شود. نحو یا Syntax آن به گونۀ زير است:
If (condition) statement;
Condition که شرط ناميده ميشود يك عبارت صحيح است (عبارتي که با يک مقدار صحيح برآورد ميشود) و statement ميتواند هر فرمان قابل اجرا باشد. Statement وقتي اجرا خواهد شد كه condition مقدار غير صفر داشته باشد. دقت كنيد كه شرط بايد درون پرانتز قرار داده شود.
دستور if..else
دستور if..else موجب ميشود بسته به اين که شرط درست باشد يا خير، يكي از دو دستورالعمل فرعي اجرا گردد. نحو اين دستور به شکل زير است:
if (condition) statement1;
else statement2;
condition همان شرط مساله است که يك عبارت صحيح ميباشد و statement1 و statement2 فرمانهاي قابل اجرا هستند. اگر مقدار شرط، غير صفر باشد، statement1 اجرا خواهد شد وگرنه statement2 اجرا ميشود.
مثال يک آزمون قابليت تقسيم
1 2 3 4 5 6 7 8 9 | #include <iostream> using namespace std; int main() { int n, d; cout << " Enter two positive integers: "; cin >> n >> d; if (n%d) cout << n << " is not divisible by " << d << endl; else cout << n << " is divisible by " << d << endl; } |
عملگرهاي مقايسهاي
در C++ شش عملگر مقايسهاي وجود دارد: < و > و <= و >= و == و != . هر يک از اين شش عملگر به شکل زير به کار ميروند:
x < y // است y کوچکتر از x
x > y // است y بزرگتر از x
x <= y // است y کوچکتر يا مساوي x
x >= y // است y بزرگتر يا مساوي x
x == y // است y مساوي با x
x != y // نيست y مساوي با x
اينها ميتوانند براي مقايسۀ مقدار عبارات با هر نوع ترتيبي استفاده شوند. عبارت حاصل به عنوان يك شرط تفسير ميشود. مقدار اين شرط صفر است اگر شرط نادرست باشد و غير صفر است اگر شرط درست باشد. براي نمونه، عبارت 7*8<6*5 برابر با صفر ارزيابي ميشود، به اين معني كه اين شرط نادرست است.
متغير عدد صحيح
++C شش نوع متغير عدد صحيح دارد تفاوت اين شش نوع مربوط به ميزان حافظۀ مورد استفاده و محدودۀ مقاديري است که هر کدام ميتوانند داشته باشند. اين ميزان حافظۀ مورد استفاده و محدودۀ مقادير، بستگي زيادي به سختافزار و همچنين سيستم عامل دارد. يعني ممکن است روي يک رايانه، نوع int دو بايت از حافظه را اشغال کند در حالي که روي رايانهاي از نوع ديگر نوع int به چهار بايت حافظه نياز داشته باشد.
دقت کنيد كه در ++C عملگر جايگزيني با عملگر برابري فرق دارد. عملگر جايگزيني يک مساوي تکي ” = ” است ولي عملگر برابري، دو مساوي ” = = ” است. مثلا دستور x = 33; مقدار 33 را در x قرار ميدهد ولي دستور x == 33; بررسي ميکند که آيا مقدار x با 33 برابر است يا خير. درک اين تفاوت اهميت زيادي دارد.
بلوكهاي دستورالعمل
يك بلوك دستورالعمل زنجيرهاي از دستورالعملهاست كه درون براكت {} محصور شده، مانند:
{
int temp=x;
x = y;
y = temp;
}
در برنامههاي ++C يک بلوک دستورالعمل مانند يک دستورالعمل تکي است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <iostream> using namespace std; int main() { int n=44; cout << "n = " << n << endl; { int n; cout << "Enter an integer: "; cin >> n; cout << "n = " << n << endl; } { cout << "n = " << n << endl; } { int n; cout << "n = " << n << endl; } cout << "n = " << n << endl; return 0; } |
شرطهاي مركب
شرطهايي مانند n%d و x>=y ميتوانند به صورت يك شرط مركب با هم تركيب شوند. اين كار با استفاده ازعملگرهاي منطقي && (and) و || (or) و ! (not) صورت ميپذيرد. اين عملگرها به شکل زير تعريف ميشوند:
p && q درست است اگر و تنها اگر هم p و هم q هر دو درست باشند
p || q نادرست است اگر و تنها اگر هم p و هم q هر دو نادرست باشند
!pدرست است اگر و تنها اگر p نادرست باشد.
براي مثال(n%d || x>=y) نادرست است اگر و تنها اگر n%d برابر صفر و x كوچكتر از y باشد. سه عملگر منطقي && (and) و || (or) و ! (not) معمولا با استفاده از جداول درستي به گونۀ زير بيان ميشوند:
طبق جدولهاي فوق اگر p درست و q نادرست باشد، عبارت p&&q نادرست و عبارت p||q درست است.
ارزيابي ميانبري
عملگرهاي && و || به دو عملوند نياز دارند تا مقايسه را روي آن دو انجام دهند. جداول درستي نشان ميدهد که p&&q نادرست است اگر p نادرست باشد. در اين حالت ديگر نيازي نيست که q بررسي شود. همچنين p||q درست است اگر p درست باشد و در اين حالت هم نيازي نيست که q بررسي شود. در هر دو حالت گفته شده، با ارزيابي عملوند اول به سرعت نتيجه معلوم ميشود. اين كار ارزيابي ميانبري ناميده ميشود. شرطهاي مركب كه از && و || استفاده ميكنند عملوند دوم را بررسي نميكنند مگر اين كه لازم باشد.
عبارات منطقي
يك عبارت منطقي شرطي است كه يا درست است يا نادرست. قبلا ديديم که عبارات منطقي با مقادير صحيح ارزيابي ميشوند. مقدار صفر به معناي نادرست و هر مقدار غير صفر به معناي درست است. به عبارات منطقي «عبارات بولي» هم ميگويند.
چون همۀ مقادير صحيح ناصفر به معناي درست تفسير ميشوند، عبارات منطقي اغلب تغيير قيافه ميدهند. براي مثال دستور:
if (n) cout << “n is not zero”;
وقتي n غير صفر است عبارت n is not zero را چاپ ميكند زيرا عبارت منطقي (n) وقتي مقدار n غير صفر است به عنوان درست تفسير ميگردد. کد زير را نگاه کنيد:
if (n%d) cout << “n is not a multiple of d”;
دستور خروجي فقط وقتي كه n%d ناصفر است اجرا ميگردد و n%d وقتي ناصفر است که n بر d بخشپذير نباشد. گاهي ممکن است فراموش کنيم که عبارات منطقي مقادير صحيح دارند و اين فراموشي باعث ايجاد نتايج غير منتظره و نامتعارف شود.
دستورهاي انتخاب تودرتو
دستورهاي انتخاب ميتوانند مانند دستورالعملهاي مركب به كار روند. به اين صورت که يك دستور انتخاب ميتواند درون دستور انتخاب ديگر استفاده شود. به اين روش، جملات تودرتو ميگويند. مثال زیر دستورهاي انتخاب تودرتو:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <iostream> using namespace std; int main() { int n, d; cout << "Enter two positive integers: "; cin >> n >> d; if (d != 0) if (n%d == 0) cout << d << " divides " << n << endl; else cout << d << " does not divide " << n << endl; else cout << d << " does not divide " << n << endl; return 0; } |
در برنامۀ بالا، دستور if..else دوم درون دستور if..else اول قرار گرفته است. وقتي دستور if..else به شکل تو در تو به کار ميرود، كامپايلر از قانون زير جهت تجزيه اين دستورالعمل مركب استفاده ميكند « هر else با آخرين if تنها جفت ميشود.»
ساختار else if
دستور if..else تودرتو، اغلب براي بررسي مجموعهاي از حالتهاي متناوب يا موازي به كار ميرود. در اين حالات فقط عبارت else شامل دستور if بعدي خواهد بود. اين قبيل کدها را معمولا با ساختار else ifميسازند. استفاده از ساختار else if براي مشخص کردن محدودۀ نمره برنامۀ زير يك نمرۀ امتحان را به درجۀ حرفي معادل تبديل ميكند:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <iostream> using namespace std; int main() { int score; cout << "Enter your test score: "; cin >> score; if (score > 100) cout << "Error: that score is out of range."; else if (score >= 90) cout << "Your grade is an A." << endl; else if (score >= 80) cout << "Your grade is a B." << endl; else if (score >= 70) cout << "Your grade is a C." << endl; else if (score >= 60) cout << "Your grade is a D." << endl; else if (score >= 0) cout << "Your grade is an F." << endl; else cout << "Error: that score is out of range."; return 0; } |
دستورالعمل switch
در ادامه مبحث دستورات شرطی و انتخاب در ++C به دستور switch می رسیم. دستور switch ميتواند به جاي ساختار else if براي بررسي مجموعهاي از حالتهاي متناوب و موازي به كار رود. نحو دستور switch به شکل زير است:
switch (expression)
{ case constant1: statementlist1;
case constant2: statementlist2;
case constant3: statementlist3;
:
:
case constantN: statementlistN;
default: statementlist0;
}
اين دستور ابتدا expression را برآورد ميكند و سپس ميان ثابتهاي case به دنبال مقدار آن ميگردد. اگر مقدار مربوطه از ميان ثابتهاي فهرستشده يافت شد، دستور statementlist مقابل آن case اجرا ميشود. اگر مقدار مورد نظر ميان caseها يافت نشد و عبارت default وجود داشت، دستور statementlist مقابل آن اجرا ميشود. عبارتdefault يک عبارت اختياري است. يعني ميتوانيم در دستور switch آن را قيد نکنيم. expression بايد به شکل يك نوع صحيح ارزيابي شود و constantها بايد ثابتهاي صحيح باشند.
لازم است در انتهاي هر case دستور break قرار بگيرد. بدون اين دستور، اجراي برنامه پس از اين كه case مربوطه را اجرا کرد از دستور switch خارج نميشود، بلکه همۀ caseهاي زيرين را هم خط به خط ميپيمايد و دستورات مقابل آنها را اجرا ميکند. به اين اتفاق، تلۀ سقوط ميگويند.
case constant1: statementlist1;break;
عملگر عبارت شرطي
عملگر عبارت شرطي يکي از امکاناتي است که جهت اختصار در کدنويسي تدارک ديده شده است. اين عملگر را ميتوانيم به جاي دستور if..else به کار ببريم. اين عملگر از نشانههاي ? و : به شکل زير استفاده ميكند:
condition ? expression1 : expression2;
در اين عملگر ابتدا شرط condition بررسي ميشود. اگر اين شرط درست بود، حاصل کل عبارت برابر با expression1 ميشود و اگر شرط نادرست بود، حاصل کل عبارت برابر با expression2 ميشود. مثلا در دستور انتساب زير:
min = ( x<y ? x : y );
اگر x<y باشد مقدار x را درون min قرار ميدهد و اگر x<y نباشد مقدار y را درون min قرار ميدهد. يعني به همين سادگي و اختصار، مقدار کمينۀ x و y درون متغير min قرار ميگيرد.
كلمات كليدي
اکنون با کلماتي مثل if و case و float آشنا شديم. دانستيم که اين کلمات براي C++ معاني خاصي دارند. از اين کلمات نميتوان به عنوان نام يک متغير يا هر منظور ديگري استفاده کرد و فقط بايد براي انجام همان کار خاص استفاده شوند. مثلا کلمۀ float فقط بايد براي معرفي يک نوع اعشاري به کار رود. يك كلمۀ كليدي در يك زبان برنامهنويسي كلمهاي است كه از قبل تعريف شده و براي هدف مشخصي منظور شده است. C++ استاندارد اكنون شامل 74 كلمۀ كليدي است.
دو نوع كلمۀ كليدي وجود دارد:
1- كلمههاي رزرو شده
2- شناسههاي استاندارد.
يك كلمۀ رزرو شده كلمهاي است که يک دستور خاص از آن زبان را نشان ميدهد. كلمۀ كليدي if و else كلمات رزرو شده هستند. يك شناسۀ استاندارد كلمهاي است كه يك نوع دادۀ استاندارد از زبان را مشخص ميكند. كلمات كليدي bool و int شناسههاي استاندارد هستند.
دیدگاه ها