به طور کلی در حالت عادی دستورات برنامه از اولین دستور به آخرین دستور اجرا می شوند. اگر بخواهیم تحت شرایطی، تعدادی از دستورات اجرا شوند و یا تعداد دیگر از دستورات اجرا نشوند، باید از ساختارهای تصمیم استفاده کنیم. این ساختارها شرطی را تست کرده در صورت درست بودن شرط، مجموعه ای از دستورات را انجام می دهند. توانایی ساخت دستورات شرطی کلی از مهم ترین کارهایی است که بایستی بتوان با زبان های برنامه نویسی انجام داد. در C، ساختار شرطی if بسیار ساده و کاربردی است. در زبان برنامه نویسی c چندین جملات شرطی وجود دارد که در این جملات کنترلی غنی و متنوع C مورد بررسی قرار می گیرد. در زبان C دو ساختار شرطی مهم به نام های if و switch وجود دارد که در ادامه با آن ها آشنا می شویم.
۱- عبارت شرطی IF
ساختار if که نام دیگرش، دستور انتقال کنترل شرطی است، شرطی را تست میکند و در صورتیکه آن شرط دارای ارزش درستی باشد، مجموعه ای از دستورات را اجرا میکند. این دستور به صورت زیر به کار میرود:
if (1شرط) { if(2شرط) دستورات 1; else دستورات 2; } else دستورات 3;
۱-۱- شرطهای تو در تو :
if (1شرط) { if(2شرط) دستورات 1; else دستورات 2; } else دستورات 3;
در شرط های تو در تو هر else مربوط به نزدیکترین if است.
اگر شرط موردنظر برقرار باشد، کدهای درون { } در زیر if اجرا خواهند شد. اگر شرط موردنظر برقرار نباشد، کدهای درون { } در زیر else اجرا خواهند شد
*مثال زیر عددی را از ورودی دریافت می کند و زوج یا فرد بودن آنرا مشخص و درخروجی پیغام مناسب را چاپ کند.
#include <stdio.h> #include <conio.h> main( ) { int x; scanf ("%d", &x ); if(x % 2 ==0) printf("addad Zoj ast") ; else printf("addad fard ast") ; }
*در مثال زیر زوج یا فرد بودن عدد ورودی مورد بررسی قرار می گیرد.
#include <stdio.h> int main() { int number; printf("Enter an integer: "); scanf("%d", &number); // True if the number is perfectly divisible by 2 if(number % 2 == 0) printf("%d is even.", number); else printf("%d is odd.", number); return 0; }
خروجی کد بالا:
Enter an integer: -7 -7 is odd.
*در مثال زیر بررسی می کند که آیا عدد اول می باشد یا خیر.
#include <stdio.h> int main() { int n, i, flag = 0; printf("Enter a positive integer: "); scanf("%d", &n); for(i = 2; i <= n/2; ++i) { // condition for nonprime number if(n%i == 0) { flag = 1; break; } } if (n == 1) { printf("1 is neither a prime nor a composite number."); } else { if (flag == 0) printf("%d is a prime number.", n); else printf("%d is not a prime number.", n); } return 0; }
خروجی کد بالا:
Enter a positive integer: 29 29 is a prime number.
۱-۲- کاربرد else در دستور IF چیست
اگرشرط روبروی if (چیزی که داخل پرانتز نوشته شده) برقرار باشد مجموعه ی دستورات داخل if اجرا میشود و اگر شرط برقرار نباشد مجموعه دستورات داخل else اجرا میشود.
نکته: اگر مجموعه دستورات if شامل فقط یک دستور باشه نیازی به { } نداریم.
۱-۳- انتقال کنترل غیر شرطی:
- دستور کنترل شرطی if بعد از بررسی کردن شرط , با توجه به نتیجه شرط اقدام به اجرای دستورالعمل ها می کند.برخی دستورات دیگر بدون بررسی کردن هیچ شرطی قادر به انتقال کنترل برنامه از نقطه ای به نقطه دیگر هستند.(break ; continue ; goto).
- دستور break موجب خروج از حلقه تکرار می شود.نحوه استفاده از این دستور به این صورت است : ;break . اگر چندین حلقه تودرتو وجود داشته باشد , این دستور موجب خروج از حلقه ای که در آن است می شود.برای خاتمه دادن به ساختار switch نیز از این دستور استفاده می شود.
- دستور continue در حلقه تکرار موجب انتقال کنترل به ابتدای حلقه می شود.پس از انتقال کنترل به ابتدای حلقه , شرط حلقه مورد بررسی قرار می گیرد.چنانچه شرط درست باشد , اجرای دستورات حلقه ادامه می یابد وگرنه حلقه تکرار خاتمه می یابد.استفاده از این دستور به این صورت است: ;continue .
- دستور goto سبب انتقال کنترل از نقطه به نقطه دیگر برنامه می شود.این دستور معمولا به ندرت مورد استفاده قرار می گیرد.چون استفاده از آن خوانایی برنامه را بسیار کاهش می دهد.نحوه استفاده از آن به این صورت است: ;<برچسب>goto .برچسب دستور همانند متغیرها نامگذاری می شود و به ( ; ) ختم می شود.انتقال کنترل توسط goto فقط داخل یک تابع امکان پذیر است.
۲- ساختار تصمیم switch
ساختار switch یکی از ساختارهای مهم و جالب در برنامه نویسی است. از این ساختار برای تصمیمگیریهای چندگانه بر اساس مقادیر مختلف یک عبارت، استفاده می شود. اگر چه ساختار شرطی if-else-if می تواند تست های چندگانه انجام دهد، با این حال مشکل ساز نیز می باشد. حتی نویسنده این ساختار بعدا نمی تواند گردش برنامه را ردیابی کند. به همین دلیل، در تمام تصمیمگیریهایی که بیش از سه اتخاب وجود داشته باشد، بهتر است از ساختار switch استفاده شود به عنوان مثال، فرض کنید یک متغیر به نام X تعریف می شود، و مقادیر ۱، ۳، ۷، ۹، ۱۵ از ورودی می پذیرد. مقرر است بسته به هر مقدار دستور خاصی اجرا شود. و اگر X مقداری غیر از این مقادیر داشته باشد دستور دیگری اجرا شود. این ساختار با switch پیاده سازی می شود.
switch ( عبارت ) { case < عبارت ۱ > < دستورات ۱ > break; case < عبارت ۲ > < دستورات ۲ > break; . . . default : < n دستورات > }
این ساختار به صورت زیر مورد استفاده قرار می گیرد:
- ابتدا عبارت مقابل switch به مقدار صحیح ارزیابی می شود و مقدار آن تعیین می شود.
- اگر مقدار عبارت برابر با <مقدار ۱> باشد <دستورات ۱> اجرا می شوند و اجرای دستورات تا رسیدن به break ادامه خواهد یاقت.
- دستور break اجرای برنامه را از ساختار switch خارج می سازد.
- در صورتی که مقدار غبارت با <مقدار ۱> برابر نباشد با <مقدار ۲> مقایسه می شود و همین روند ادامه می یابد.
- تا زمانی که مقدار عبارت برابر با یکی از مقادیر نباشد عمل مقایسه ادامه می یابد.
- اگر مقدار عبارت با هیچ کدام از مقادیر برابر نباشد , دستورات بخش default به اجرا در می آید.
#include <stdio.h> int main () { /* local variable definition */ char grade = 'B'; switch(grade) { case 'A' : printf("Excellent!\n" ); break; case 'B' : case 'C' : printf("Well done\n" ); break; case 'D' : printf("You passed\n" ); break; case 'F' : printf("Better try again\n" ); break; default : printf("Invalid grade\n" ); } printf("Your grade is %c\n", grade ); return 0; }
When the above code is compiled and executed, it produces the following result Well done Your grade is B
در ساختار switch به چند مورد باید توجه کرد:
- ساختار switch میتواند بدون بخش default باشد، در این صورت اگر عبارت محاسبه شده با هیچ کدام از مقادیر مساوی نباشد، هیچ کدام از دستورات داخل switch اجرا نمی شود.
- مقادیر موجود در case های switch نمی توانند با هم مساوی باشند. یعنی دستورات ۱، ۲ ،۳ و …n نباید مساوی باشند.
- اگز ثوابت کاراکتری در ساختار switch مورد مقایسه قرار گیرند، به مقدار صحیح تبدیل می شوند.
- اگر در یک case از دستور break استفاده نشود، با مقدار case بعدی or می شود. برای این که دو یا چند شرط را ساختار switch با هم or کنید، آنها را بدون break پشت سر هم قرار دهید.
- یکی از تفاوت های if و switch در این است که در ساختار if می توان عبارت منطقی یا رابطه ای را مورد بررسی قرار داد ولی در ساختار switch فقط مساوی بودن مقادیر مورد بررسی قرار می گیرد.
- چند ساختار switch را می توان به صورت تودرتو مورد استفاده قرار داد.
*ساخت ماشین حساب ساده با دستورات switch…case
// Performs addition, subtraction, multiplication or division depending the input from user # include <stdio.h> int main() { char operator; double firstNumber,secondNumber; printf("Enter an operator (+, -, *,): "); scanf("%c", &operator); printf("Enter two operands: "); scanf("%lf %lf",&firstNumber, &secondNumber); switch(operator) { case '+': printf("%.1lf + %.1lf = %.1lf",firstNumber, secondNumber, firstNumber + secondNumber); break; case '-': printf("%.1lf - %.1lf = %.1lf",firstNumber, secondNumber, firstNumber - secondNumber); break; case '*': printf("%.1lf * %.1lf = %.1lf",firstNumber, secondNumber, firstNumber * secondNumber); break; case '/': printf("%.1lf / %.1lf = %.1lf",firstNumber, secondNumber, firstNumber / secondNumber); break; // operator doesn't match any case constant (+, -, *, /) default: printf("Error! operator is not correct"); } return 0; }
خروجی کد بالا:
Enter an operator (+, -, *,): * Enter two operands: 1.5 4.5 1.5 * 4.5 = 6.8