عبارت شرطی در C++ چیست؟
عبارت شرطی در C++ که تحت عنوان ساختار های انتخابی نیز شناخته شده هستند. امکان بررسی یک شرط در برنامه و سپس تصمیم گیری براساس آن را به ما میدهند.
این ساختار ها برای زمانی کاربرد دارند که در برنامه یک یا چند دستور داریم که فقط تحت شرایط بخصوص باید اجرا شوند.
اگر میخواهید زبان C++ را به خوبی یاد بگیرید از دوره مبانی کامپیوتر و برنامه نویسی جزوه جو غافل نشوید.
ساختارهای شرطی در c++ چند نوع دارد؟
به طور کلی در زبان برنامه نویسی c++، 4 نوع دستور شرطی وجود دارد که نحوه ی عملکرد و کاربرد هر یک را به تفکیک بررسی میکنیم.
1- ساختار شرطی if:
ساده ترین نوع عبارت شرطی در c++ ساختار (if) که در آن دستورات بدنه فقط در صورتی اجرا می شوند که شرط بررسی شده درست (true) باشد.
ساختار عبارت شرطی if در زبان برنامه نویسی C++:
}if(condition)
(بدنه)code to be executed//
{
condition:
در این قسمت شرطی قرار میگیرد که در ابتدا بررسی میشود و در صورتی که برقرار (true) باشد،وارد بلاک if شده و دستورات آن اجرا میشوند.
بدنه:
دستوراتی که فقط مشروط بر درست بودن شرط اجرا میشوند.
برای مثال برنامه ای را در نظر بگیرید:
به عنوان ورودی نمره ی یکی از دروس دانشجو را دریافت کند و پس از بررسی آن پیام مناسبی مبنی بر اینکه آیا دانشجو در آن درس نمره ی قبولی را دریافت کرده است یا خیر را چاپ کند.
#include<iostream>
int main(){
float note;
std::cout<<”Enter the note\n”;
cin>>n;
if(note<10){
std::cout<<”The student has passed this course\n”
}
}
۲-ساختار شرطی if-else:
در دستور if دیدیم که دستورات فقط در صورت برقراری شرط اجرا میشوند و در غیر اینصورت کامپایلر از ساختار شرطی عبور کرده و هیچ اتفاق خاصی نمی افتد.
اما در ساختار شرطی if-else این امکان وجود دارد که پس از بررسی شرط و براساس نتیجه ی شرط (درست یا غلط یودن آن) تصمیم گیری انجام دهیم.
درصورتی که شرط درست باشد،دستورات داخل بلاک if و در صورتی که شرط درست نباشد،دستورات داخل بلاک else اجرا میشوند.
ساختار عبارت شرطی if-else:
if(condition){
//code to be executed (if بدنه ی)
}else{
//code to be executed (else بدنه ی)
}
condition:
در این قسمت از عبارت، شرطی قرار میگیرد که در ابتدا بررسی میشود و کامپایلر براساس نتیجه ی آن تصمیم گیری انجام میدهد.
بدنه ی if :
در این بخش دستوراتی قرار میگیرند که فقط مشروط بر درست (true) بودن شرط اجرا میشوند.
بدنه ی else :
در این بخش دستوراتی قرار میگیرند که فقط مشروط بر غلط (false) بودن شرط اجرا میشوند.
نکته: با توجه به توضیحات در هر ساختار شرطی if-else فقط دستورات یکی از بلاک های کد اجرا می شوند. چون هر عبارت شرطی (همانند یک متغیر بولی) در هربار بررسی فقط یکی از دو حالت درست یا نادرست را میتواند داشته باشد.
مثال:
برنامه ای که پیش تر مثال زدیم را در نظر بگیرید، حال فرض کنید میخواهیم همان برنامه را به شکل کامل تر بنویسیم. به این صورت که پس از دریافت نمره ی دانشجو در صورت عدم قبولی دانشجو در یک درس نیز پیام مناسبی چاپ شود.
#include<iostream>
int main(){
float note;
std::cout<<”Enter the note\n”;
cin>>n;
if(note<10){
std::cout<<” The student has passed this course \n”
}
else{
std::cout<<” The student has not passed this course \n”
}
}
توجه داشته باشید که در این عبارت شرطی:
- در صورتی که دستورات داخل بدنه ی if و یا else بیشتر از یکی باشد، حتما باید داخل {} قرار گیرند. در حالیکه اگر فقط یک دستور داشته باشیم میتوانیم برای تعریف دستور از آکلاد صرف نظر کنیم.
دقت کنید که اگر بیش از یک دستور داشته باشیم و همچنان از آکلاد برای بیان دستورات صرف نظر کنیم، کامپایلر فقط اولین دستور را به عنوان دستور بلاک if یا else در نظر میگیرد. و مابقی دستورات به عنوان دستورات خارج از بلاک در نظر گرفنه شده و به صورت خط به خط اجرا میشوند.
- عبارت مورد بررسی در بخش if میتواند شامل یک عبارت ریاضی هم باشد، در این صورت ابتدا محاسبات مورد نظر انجام شده و سپس شرط بررسی میشود.
if(a-b+c%2==0){
//code to be executed
}
- عبارت شرطی بالا در زبان C++ فقط برای بررسی مواردی کاربرد دارد که دوحالت دارند:
- درست و نادرست. اما در صورتی که بخواهیم بیش از دو حالت را بررسی کنیم میتوانیم بعد از دستور else مجددا برای بررسی وضعیت جدید از دستور if استفاده کنیم. برای مثال:
if(condition 1){
//code to be executed (if بدنه ی)
}else if(condition 2){
//code to be executed (else-if بدنه ی)
}else{
//code to be executed (else بدنه ی)
}
به طور کلی میتوان با کمک این ساختار هر تعداد حالت را به صورت نامحدود بررسی کرده و درباره ی هرکدام تصمیم گیری کنیم.
واضح است که با بیشتر کردن تعداد این عبارت های شرطی و به کار بردن انها به صورت پشت سرهم، از وضوح و خوانایی کد کاسته میشود. دراین شرایط بهتر است از ساختار switch-case استفاده کنیم.
نکته : در ساختار های if-else که به صورت پشت سرهم استفاده میشوند؛ برای درک بهتر اینکه بدانیم کدام else مربوط به کدام if است. باید بدانیم که طبق قاعده هر else به اولین if ماقبل خود برمیگردد.
از آنجایی که خروجی یک عبارت شرطی در C++ همیشه یک مقدار بولی (درست یا نادرست) است.میتوان در قسمت بررسی شرط فقط یک متغیر بولی را قرار داد.
در این صورت کامپایلر به هنگام بررسی شرط، در صورتی که مقدار متغیر بولی صحیح باشد، شرط را صحیح تلقی میکند و درصورتی که مقدار آن غلط باشد،براساس عدم برقراری شرط تصمیم گیری میکند.
در دوره مبانی کامپیوتر مثال به همراه اجراء کد برای شما آماده شده است.
مثال:
int a=5;
bool b=a<10;
if(b){
//code to be executed
}else{
//code to be executed
}
۳. ساختارشرطی switch-case:
نوع دیگر عبارت شرطی در زبان c++ ساختار switch-case است. این ساختار برای زمانی کاربرد دارد که دیگر شرط مورد بررسی صرفا دارای دو حالت درست(true) یا غلط (false) نیست. و ممکن است چندین حالت مختلف داشته باشد.
با کمک این ساختار با در نظر گرفتن یک شرط، حالت های مختلفی که ممکن است برای آن پیش بیاید را بیان میکنیم. سپس به ازای هر حالت دستورات بخصوصی که باید اجرا شوند را تعریف میکنیم.
در فصل چهارم از مبانی کامپیوتر ساختار عبارت شرطی switch-case به خوبی توضیح داده شده است.
ساختار عبارت شرطی switch-case :
switch(varriable){
case x : //code to be executed
break;
case y: //code to be executed
break;
case z: //code to be executed
break;
default: //code to be executed
break;
}
بخش switch:
عبارتی که باید بررسی شود در این قسمت قرار داده میشود.
بخش case:
هریک از کیس ها شامل یکی از حالاتی است که ممکن است برای عبارت مقابل سوییچ اتفاق بیفتد، در صورتی که عبارت مقابل سوییچ با یکی از کیس ها مطابقت داشته باشد، دستورات مقابل همان کیس اجرا میشوند.
دستور break:
استفاده از دستور بریک در انتهای هرکدام از کیس ها اختیاری است. از آنجایی که کیس ها به ترتیب از بالا به پایین بررسی میشوند. قرار دادن دستور بریک در انتهای هر کیس باعث میشود که به محض اجرا شدن دستورات یکی از کیس ها ، از عبارت سوییچ کیس خارج شویم تا مابقی کیس ها توسط کامپایلر بررسی نشوند. اینکار به روند اجرای کد سرعت میبخشد.
بخش default:
قرار دادن بخش default در انتهای یک عبارت سوییچ کیس کاملا اختیاری است. دستورات این قسمت تنها زمانی اجرا میشوند که بخش بررسی شده در قسمت سوییچ با هیچکدام از کیس های تعریف شده توسط برنامه نویس مطابقت نداشته باشد.
نکات تکمیلی در عبارت شرطی switch-case:
۰ variable مورد بررسی در قسمت سوییچ میتواند فقط یکی از دو نوع int یا char باشد.
لازم به ذکر است که نوع متغیری که در بخش سوییچ بررسی میشود باید با نوع مقادیر مقابل تک تک کیس ها مطابقت داشته باشد.
مثلا اگر متغیر را از جنس int تعریف کنیم، مقادیر کیس ها هم باید int و اگر از جنس char باشد، مقادیر کیس ها نیز باید از جنس char تعریف شده باشند.(چون در نهایت مقدار سوییچ باید با مقدار یکی از کیس ها عینا مطابقت داشته باشد.)
۰ در یک عبارت سوییچ کیس مقادیر کیس ها حتما باید متفاوت از یکدیگر باشند و تحت هیچ شرایطی نمیتوانیم دو کیس متفاوت با یک مقدار یکسان تعریف کنیم.
۰ هیچگونه محدودیتی برای تعداد کیس ها وجود ندارد و برنامه نویس میتواند به تعداد دلخواه کیس های مختلف تعریف کند.
۰ برخلاف عبارت شرطی if ، عبارتی که در بخش سوییچ بررسی میشود. باید یک مقدار ثابت را شامل شود. به طور مثال عبارات زیر توسط کامپایلر خطا شناخته میشوند:
switch(100%n!=0)
switch(a-b>0)
۰ میتوان به جای هر عبارت switch-case از if-else های متعدد برای بررسی حالات مختلف استفاده کرد. اما واضح است که استفاده از switch-case باعث تمیزتر شدن کد افزایش خوانایی آن میشود.
۰ به طور کلی زمانی که مقدار مورد بررسی در عبارت شرطی شامل مقادیر پیوسته شود از if-else و اگر شامل مقادیر گسسته شود از switch-case برای بررسی آن مقادیر استفاده میکنیم.برای درک بهتر تفاوت کاربرد دو عبارت شرطی به مثال های زیر توجه کنید.
مثال اول :
فرض کنید میخواهید برنامه ای بنویسید که به ازای دریافت سن افراد، توصیف مناسبی درباره ی وضعیت آنها ارائه دهد.
#include<iostream>
int main(){
float age;
std::cout<<”enter the age:\n”;
std::cin>>age;
if(age<=0)
std::cout<<”invalid value\n”;
else if(age>0 && age<=2)
std::cout<<”Baby\n”;
else if(age>2 && age <=13)
std::cout<<”Child\n”;
else if(age>13 && age<=19)
std::cout<<”Teenager\n”;
else if(age>19 && age<=50)
std::cout<<”Adult\n”;
else std:: cout<<”Old-aged\n”;
}
مثال دوم :
حال برنامه ای را در نظر بگیرید به ازای دریافت مقادیر مشخص شده بین 1 تا 7 ، نام روزهای هفته را چاپ میکند.
#include<iostream>
using namespace std;
int main(){
int choice;
cout<<”enter the value:\n”;
cin>>choice;
switch(choice){
case 1:cout<<”Saturday\n”;
break;
case 2:cout<<”Sunday\n”;
break;
case 3: cout<<”Monday\n”;
break;
case 4: cout<<”Tuesday\n”;
break;
case 5: cout<<”Wednsday\n”;
break;
case 6: cout<<”Thursday\n”;
break;
case 7: cout<<”Friday\n”;
break;
deafault: cout<<”Invalid choice\n”;
break;
}
return 0;
}
توضیح تفاوت عبارت های شرطی بالا:
در مثال اول چون داده های مورد بررسی داده های پیوسته هستند، یعنی مقادیر اعشاری را نیز شامل می شوند. باید فقط از عبارت if-else برای بررسی حالات مختلف کمک بگیریم(در این حالت استفاده از switch-case به جای if-else امکان پذیر نیست).
اما در مثال دوم که داده ها گسسته هستند یعنی فقط مقادیر صحیح را شامل می شوند می توان از ساختار switch-case استفاده کرد (در این شرایط کد را میتوان به کمک ساختار if-else نیز پیاده سازی کرد).
در مجموع می توان ادعا کرد که اگر مقادیری که بررسی می شوند را بتوان به صورت بازه بیان کرد، فقط باید از دستور if-else برای بررسی اینکه ایا مقدار دریافت شده در بازه ی تعریف شده صدق می کند یا خیر، استفاده کرد.
نکته : یکی از بهترین مثال ها برای کاربرد عبارت های سوییچ کیس، ساخت یک منو برای یک برنامه است. جایی که به ازای دریافت یکی از گزینه ها، آن گزینه توسط کاربر انتخاب شده در نظر گرفته میشود. و دستورات تعریف شده در آن گزینه اجرا میشوند.
مثلا در برنامه ی ماشین حساب که هریک از عملیات ها در یک case تعریف شده اند و سپس با دریافت یک عملگر و عملوند ها،عملگر انتخابی توسط کاربر با case تعریف شده توسط برنامه نویس تطابق پیدا میکند و دستورات مربوط به آن روی عملوند های دریافتی اعمال میشوند.
۴- دستورات سه گانه در C++:
این عملگر به عنوان جایگزین کوتاه تری برای عبارت if-else به کار میرود.
تنها تفاوت آنها در نوع سینتکس مورد استفاده است که خوانایی کد را افزایش میدهد.
condition ? code _block_1 : code _block_2 ;
بخش condition:
شرطی که بررسی شده و براساس آن تصمیم گیری انجام میشود.
بخش code _block_1:
دستوری که فقط در صورت صحیح بودن (برقراری)شرط مورد بررسی اجرا میشود.
بخش code _block_2:
دستوری که فقط در صورت صحیح نبودن(عدم برقراری) شرط مورد بررسی اجرا میشود.
مثال:
میخواهیم قطعه کد بررسی وضعیت دانشجو به ازای دریافت نمره را به کمک عملگر شرطی سه گانه بازنویسی کنیم.
float note;
std::cout<<”Enter the note\n”;
cin>>n;
note>=10 ? std::cout<<” The student has passed this course \n” : std::cout<<” The student has not passed this course \n”;
ساختار های شرطی تودرتو:
به طور پیش فرض تمام دستورات شرطی در C++ را میتوان بسته به موقعیت به شکل تودرتو به کار برد. منظور از تودرتو ، قرار دادن یک عبارت شرطی درون یک عبارت شرطی دیگر است.
پرکاربردترین ساختار شرطی تو در تو ساختار if-else است.
در این ساختار ابتدا ساختار های مختلف شرطی در داخل بدنه ی بیرونی ترین if اجرا میشوند و در نهایت if بیرونی اجرا میشود. به بیان عامیانه، اجرای دستورات به ترتیب از درون به بیرون بلاک اتفاق می افتد.
if(condition 1){
// کدی که در صورت برقراری شرط اول اجرا میشود
if(condition 2){
//کدی که در صورت برقراری شرط دوم اجرا میشود
}
else{
// کدی که در صورت عدم برقراری شرط دوم اجرا میشود
}
}
else{
// کدی که در صورت عدم برقراری شرط اول اجرا میشود
}
کلام آخر : اگر شما هم در رشته مهندسی کامپیوتر تحصیل میکنید و نیازمند قوی کردن خود در زبان های برنامه نویسی به ویژه C++ را دارید پیشنهاد میکنیم از دوره مبانی کامپیوتر و برنامه نویسی استاد علی محمدی غافل نشوید.
برای اطلاع از تخفیف دوره های آموزشی به کانال جزوه جو مراجعه کنید.
گردآورنده : هانیه اکرمی