در این مقاله نشان داده میشود چگونه از دستورات شرطی و انتخاب در ++C یعنی دستورات if else و switch همراه با مثال جهت انعطافپذیری بیشتر برنامه استفاده کنیم. همۀ برنامههایی که در دو جلسه اول بیان شد، به شکل ترتیبی اجرا میشوند، یعنی دستورات برنامه به ترتیب از بالا به پایین و هر کدام دقیقاً یک بار اجرا میشوند. همچنین در این جلسه انواع صحیح كه در ++C وجود دارد بیشتر بررسی میگردد.
مقدمه ای بر دستورات شرطی و انتخاب در ++C
در جلسه قبلی یعنی معرفی کامل انواع متغير در ++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 اجرا میشود.
مثال یک آزمون قابلیت تقسیم
#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 یک بلوک دستورالعمل مانند یک دستورالعمل تکی است.
#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; }
شرطهای مرکب
در دستورات شرطی و انتخاب در ++C شرطهایی مانند 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 درست است.
ارزیابی میانبری
در دستورات شرطی و انتخاب در ++C عملگرهای && و || به دو عملوند نیاز دارند تا مقایسه را روی آن دو انجام دهند. جداول درستی نشان میدهد که 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 بخشپذیر نباشد. گاهی ممکن است فراموش کنیم که عبارات منطقی مقادیر صحیح دارند و این فراموشی باعث ایجاد نتایج غیر منتظره و نامتعارف شود.
دستورهای انتخاب تودرتو
دستورهای انتخاب میتوانند مانند دستورالعملهای مرکب به کار روند. به این صورت که یک دستور انتخاب میتواند درون دستور انتخاب دیگر استفاده شود. به این روش، جملات تودرتو میگویند. مثال زیر دستورهای انتخاب تودرتو:
#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 برای مشخص کردن محدوده نمره برنامه زیر یک نمره امتحان را به درجه حرفی معادل تبدیل میکند:
#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 قرار میگیرد.
کلمات کلیدی در برنامه نویسی ++C
اکنون با کلماتی مثل if و case و float در دستورات شرطی و انتخاب در ++C آشنا شدیم؛ دانستیم که این کلمات برای C++ معانی خاصی دارند. از این کلمات نمیتوان به عنوان نام یک متغیر یا هر منظور دیگری استفاده کرد و فقط باید برای انجام همان کار خاص استفاده شوند. مثلا کلمه float فقط باید برای معرفی یک نوع اعشاری به کار رود. یک کلمه کلیدی در یک زبان برنامهنویسی کلمهای است که از قبل تعریف شده و برای هدف مشخصی منظور شده است. C++ استاندارد اکنون شامل 74 کلمه کلیدی است.
دو نوع کلمه کلیدی وجود دارد:
1- کلمههای رزرو شده
2- شناسههای استاندارد.
یک کلمه رزرو شده کلمهای است که یک دستور خاص از آن زبان را نشان میدهد. کلمه کلیدی if و else کلمات رزرو شده هستند. یک شناسه استاندارد کلمهای است که یک نوع داده استاندارد از زبان را مشخص میکند. کلمات کلیدی bool و int شناسههای استاندارد هستند.