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