زبان C – ساختارهای شرطی (جلسه ۸)
زمان تقریبی مطالعه این مقاله: ۷ دقیقه
سلام به همراهان همیشگی میکرولرن 🙂 🙂 🙂
این مقاله در ۲۹ اردیبهشت ۱۴۰۰ به روزرسانی شده.
تو فکر این بودم که این جلسه رو چه جوری شروع کنم که متفاوت باشه. به ذهنم رسید که یادی کنم از دوران کودکی، اون وقتا که پدر مادرا به بچهها میگفتن اگر نمرههات خوب بشه برات جایزه میخریم. 🙂 یه نکته ظریفی که تو این حرف دیده میشه وجود شرط هست. اون چیزی که امروز میخوایم در موردش حرف بزنیم. در این جلسه میخوایم در مورد دستور if در زبان C و دستور switch در زبان C صحبت کنیم. پس با میکرولرن، مرجع برنامه نویسی C همراه باشید.
قبل از اینکه وارد بحث امروز بشیم ازتون میخوام که جلسات قبلی زبان C را هم بررسی کنید و اگه لازم داشتید تو یه فرصت مناسب مطالعه کنید:
- انواع داده در زبان C
- اشاره گرهای زبان C
- آرایه ها در زبان C
- رشته ها در زبان C
- ساختارها در زبان C
- عملگرهای زبان C
دستورات شرطی
اگر زندگی یک خط مستقیم بود، بسیار خستهکننده میشد. اما این طور نیست و ما هر روز با اتفاقات مختلف روبهرو میشویم که یکنواختی زندگی را از بین میبرد. چرا که باید در شرایط مختلف تصمیم به انجام یک کار مشخص بگیریم. همین موضوع در مورد برنامه نویسی نیز صدق میکند. ما اغلب در برنامهها باید تصمیم گیری کنیم که بر اساس رخ دادن یک شرایط خاص، عمل مشخصی را انجام دهیم.
در واقع، وظیفهی مهم یک برنامه نویس، هدایت کامپیوتر(میکروکنترلر، گوشی هوشمند، لپ تاپ یا …) در مواجه شدن با شرایط خاص به بخشهای خاصی از برنامه هست.
اگر بخواهیم تحت شرایطی تعدادی از دستورها اجرا شوند و یا تعدادی دیگر اجرا نشوند، باید از ساختارهای شرطی استفاده کنیم. دستورات شرطی در تمام زبان های برنامه نویسی از اجزای اصلی هستند. یک دستور شرطی، شرطی که کاربر مشخص میکند را بررسی کرده و در صورت صحیح بودن یک دسته از کدها و در صورت غلط بودن دستهی دیگری از کدها را اجرا میکند.
در زبان C دو دستور یا ساختار شرطی مهم به نام های if و switch وجود دارد که در ادامه با آن ها آشنا می شویم.
دستور if در زبان C
در این بخش دستور if در زبان C را بررسی میکنیم. در زبان C، دستور if پرطرفدارترین دستور شرطی است. بهوسیله این دستور شرطی میتوان روی متغیرها، آرایهها، رشتهها و… شرط قرارداد. در تصویر زیر فلوچارت ساختار شرطی if را مشاهده میکنید:
قالب دستور شرطی if نیز به شکل زیر است:
if(شرط مورد نظر)
{
//کد هایی که در زمان برقرار بودن شرط اجرا خواهند شد
}
else
{
//کد هایی که در زمان برقرار نبودن شرط اجرا خواهند شد
}
همانطور که در بالا مشاهده میشود، اگر شرط موردنظر برقرار باشد، کدهای درون { } در زیر if اجرا خواهند شد. اگر شرط موردنظر برقرار نباشد، کدهای درون { } در زیر else اجرا خواهند شد.
به مثال زیر که یک قطعه کد از میکروکنترلر AVR است، توجه کنید:
if(a == 7)
PORTD = 0b11110000;
else
PORTD = 0b00001111;
- در این مثال می خواهیم تحت شرایطی، مقداری را روی پورت D میکروکنترلر AVR قرار دهیم.
- اگر متغیر a برابر با عدد ۷ باشد، مقدار باینری ۱۱۱۱۰۰۰۰ به رجیستر PORTD نسبت داده میشود.
- اگرمتغیر a برابر با ۷ نباشد، مقدار باینری ۰۰۰۰۱۱۱۱ به رجیستر PORTD نسبت داده میشود.
- در سطرهای بالا دو علامت { } وجود ندارد. چون در زیر دستور if و else تنها یک دستور وجود دارد.
- اگر تعداد دستورات بیشتر از یک دستور باشد حتماً باید از { } استفاده شود.
- وجود دستور else در if ضروری نیست و بسته به نیاز کاربر قرار داده میشود.
در مثال بالا تنها یک شرط بررسی شد. اگر نیاز باشد شرطهای بیشتری بعد از اولین دستور if موردبررسی قرار بگیرد، باید از else if برای شرطهای بعدی استفاده شود. در شکل زیر می توانید فلوچارت else if را مشاهده کنید:
در این فلوچارت، شرط ها به ترتیب بررسی شده و اولین شرطی که درست باشد، دستورات مربوط به آن اجرا شده و سایر دستورات نادیده گرفته میشوند. اما اگر هیچ کدام از دستوران صحیح نباشند دستورات مربوط به else آخر اجرا خواهند شد. توجه کنید که else آخر اختیاری بوده و میتواند حذف شود.
ابتدا به یک مثال ساده توجه کنید:
if(a == 7)
PORTD = 0b11110000;
else if(a > 10)
PORTD = 0b00001111;
در مثال بالا، دو شرط موردبررسی قرار میگیرد. در شرط اول اگر متغیر برابر با ۷ باشد و در شرط دوم اگر متغیر بزرگتر از ۱۰ باشد.
حال در مثال زیر از شرطهای بیشتری استفاده می کنیم:
if(a == 7)
{
PORTD = 0b11110000;
j++;
}
else if(a == 44)
{
PORTD = 0b11110000;
j--;
}
else if(a == 56)
{
if(x != 9)
PORTD = 0b00000000;
}
else
PORTD = 0b11110000;
- دستور شرطی اول با if شروعشده است.
- چون کدهایی که در زمان برقراری شرط باید اجرا کند، بیش از یک دستور است، کدهای مربوط در داخل { } قرارگرفتهاند.
- دستور شرط دوم و سوم با else if آغازشده است.
- در داخل دستور شرطی سوم یک دستور شرط دیگر وجود دارد که به این حالت دستور شرطی if تودرتو میگویند.
- در دستور شرط سوم حتماً باید شرط a==56 برقرار باشد تا کدهای مربوط به آن که یک دستور شرط دیگر است، اجرا شود.
- دستور شرط سوم به این شکل تفسیر میشود که اگر a==56 و در همین زمان متغیر x نامساوی با ۹ باشد، دستور PORTD=0b00000000 اجرا میشود.
- برای آخرین حالت چون شرط دیگری باقی نمانده تنها از else استفاده کردیم.
تذکر: این برنامه به صورت قطعه کد نوشته شده و شما می توانید متغیرهای استفاده شده در آن را قبل از این کد به دلخواه تعریف و مقداردهی کنید.
دستور switch در زبان C
در این بخش دستور switch در زبان C را بررسی میکنیم. ساختار switch یکی از ساختار های مهم و جالب در زبان C است که به وسیلهی آن میتوان متناسب با مقدار یک متغیر، یک یا چند عبارت را اجرا کرد.
به طور کلی، در تمام تصمیم گیریهایی که بیش از سه انتخاب وجود داشته باشد بهتر است از ساختار switch استفاده شود.
توجه کنید که دستور شرطی switch نسبت به دستور شرطی if از توانمندی کمتری برخوردار است. این دستور فقط می تواند برابری را مورد شرط قرار دهد.
قالب دستور شرطی switch را در زیر مشاهده می کنید :
switch(عبارت)
{
case مقدار اول:
//کد هایی که در صورت برابر بودن عبارت با مقدار اول باید اجرا شوند
Break;
case مقدار دوم:
//کد هایی که در صورت برابر بودن عبارت با مقدار دوم باید اجرا شوند
Break;
.
.
.
case ام n مقدار:
//کد هایی که در صورت برابر بودن عبارت با مقدار n ام باید اجرا شوند
Break;
Default:
//کد هایی که در صورت برابر نبودن عبارت با هیچ یک از مقادیر قید شده بایداجرا شوند
}
گزینه Default در ساختار دستور switch ضروری نیست و بسته به نیاز کاربر قرار داده میشود.
هر دستور case یک شرط برابری را بررسی میکند و در صورت برابر بودن، کدهای زیر آن اجرا شده و توسط دستور Break از درون ساختار switch خارج میشود. البته قرار دادن break اختیاری است.
در شکل زیر فلوچارت مربوط به ساختار switch را مشاهده میکنید:
اگر در زیر هر case دستور Break قرار داده نشود، با پایان دستوراتش، دستورات case های بعدی اجرا میشود و این روند تا رسیدن به یک break و خروج از ساختار switch ادامه پیدا میکند. در این حالت می توان چند case را باهم OR کرد.
به مثال زیر توجه کنید:
switch(a) {
case 134:
PORTD = 0b11110000;
j++;
break;
case 200:
case 210:
PORTD = 0b10101010;
x++;
break;
case 250:
PORTD = 0b11111111;
y++;
braek;
default:
PORTD = 0b11111111;
}
- متغیر a عبارتی است که باید بررسی شود.
- در دستور case اول مقدار متغیر a با عدد ۱۳۴ مقایسه می شود. در صورت برابری، کد های زیر آن اجرا شده و توسط دستور break از ساختار switch خارج می شود.
- در دستور case دوم و سوم، دو مقدار با هم or (یا) شدهاند. یعنی در صورت برابر بودن متغیر a با مقادیر ۲۰۰ یا ۲۱۰ ، رجیستر PORTD برابر با مقدار باینری ۱۰۱۰۱۰۱۰ شده و به مقدار متغیر x یک واحد افزوده می شود.
- اگر مقدار متغیر a با هیچ یک از مقادیر اشاره شده توسط case ها برابر نباشد، کد های زیر دستور Default اجرا می شوند.
دو نکته کلیدی در مورد switch:
- چندین ساختار switch را می توان به صورت تو در تو استفاده کرد. یعنی کد زیر هر یک از caseها میتواند یک ساختار switch دیگر باشد.
- مقادیر موجود در caseهای switch نمیتوانند با هم مساوی باشند. یعنی هیچکدام از مقادیر <مقدار ۱ > ، <مقدار ۲ > و . . . نباید مساوی باشند.
به مثال زیر دقت کنید:
برای درک این مثال نیاز به مفاهیم تابع و دستورات پیش پردازنده دارید. توصیه می شود اگر به این مباحث مسلط نیستید ابتدا مقالههای زیر را مطالعه کنید:
مقاله تابع
مقاله دستورات پیش پردازنده
#include <stdio.h>
int main(){
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;
}
پس از کامپایل و اجرای برنامه نتایج زیر حاصل می شود:
Well done
Your grade is B
این برنامه درون تابع ()main نوشته شده و قرار است در صورت برابری کاراکتر ذخیره شده در متغیر grade با یکی از مقادیر ‘A’ تا ‘F’، عبارت مناسبی روی صفحه نمایش چاپ کند. ابتدا کد را به صورت دستی دنبال کرده و سپس صحت نتایج را در محیط کد بلاکس مشاهده کنید. در صورتی که سوالی داشتید از بخش نظرات مطرح کنید.
اگر روال جلسات قبلی آموزش زبان C را به یاد داشته باشید متوجه شدید که این مثال شباهت زیادی به آنها دارد. به همین دلیل توضیح خط به خط داده نمیشود. اگر برای بار اول از سایت بازدید می کنید حتما از قسمت یادآوری که در بالای همین پست دیدید، به پست های قبلی آموزش زبان سی مراجعه کنید.
سخن آخر
میکرولرنیهای عزیز خسته نباشید 🙂
این جلسه دو تا ساختار شرطی مهم یعنی دستور if و دستور switch را بررسی کردیم. حتما چند بار مقاله را بخونید و تمرین کافی انجام بدید تا به تسلط برسید. جلسه بعد حلقهها رو بررسی میکنیم.
در آخر، یه پیشنهاد ویژه دارم برای اون دسته از دوستانی که علاقه دارند خیلی عمیقتر زبان C را یاد بگیرن و برای میکروکنترلرها یا کارهای نرم افزاری ازش استفاده کنند. دوره جامع زبان C را براتون تهیه کردم که فوق العاده پروژه محور و کاربردیه. خوش حال میشم در اون دوره شما رو ببینم. برای دسترسی به دوره میتونید روی عکس زیر کلیک کنید.
درباره احسان عبداللهی
مدیر و موسس میکرولرن | برنامه نویسی پاسخی ظریف به یک نیاز در دنیای واقعی هست.
نوشته های بیشتر از احسان عبداللهیمطالب زیر را حتما مطالعه کنید
دوره های آموزشی مرتبط
آموزش جنگو
آموزش پایتون
آموزش الگوریتم و فلوچارت – تفکر برنامه نویسی
آموزش برنامه نویسی C برای میکروکنترلر
آموزش الکترونیک دیجیتال
10 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام. در زبان c++ یک دستور چند شرطی بود به این شکل : if ((a==1&&b==2)||c==3) {}
در کدویژن این دستور کار نمیکنه . آیا راهی برای استفاده از این دستور هست؟
سلام. این دستور در سی هم باید به درستی کار کنه. حتما متغیرها مقداردهی بشن خطاها را بررسی کنید تا مشکل حل بشه
چگونه در کدویژن این متغیر ها رو تعریف کنم؟ در کدویزارد پایه های میکرو به صورت ورودی و خروجی تعیین شده اند. همین کافی نیست؟ چون دستور ساده یک شرطی به خوبی کار می کند.
تعریف متغیر که خیلی ساده هست. از بخش آموزش زبان سی مطالعه کنید. بعد مقدار از پورت ها بخونید و در این متغیرها قرار بدید.
سلام
خیلی ممنون از توضیحات خوبتون.
زبان سی پلاس پلاس رو هم لطفا در آموزش هاتون قرار بدین.
خیلی سایت خوبیه من تازه آشنا شدم اگه آموزشاش به صورت ویدیویی بود یعنی یکی از بهترین سایت های آموزش c توی کشور یا توی دنیا خیلی روان و سااااااااادددددددددددددهههههههههه
ممنون اگر آموزش ویدیویی توابع رو به ایمیلم بفرستی
شما لطف دارید ولی کیفیت کار ما هنوز در حد و اندازه های مخاطبای خوب سایتمون نشده و راه زیادی در پیش داریم. اما اگه نیاز به آموزش ویدیویی خاصی دارید بفرمایید تا براتون آماده کنیم
امیدوارم همینطور خوب پیش برید بله اگه میشه از قسمت توابع و توابع بازگشتی یک فیلم آموزشی آماده کنید البته اگه زحمتی نباشه
ممنون
به قول فیروز قمپز در نمیکنم واقعا آموزش ها روان هست و خیلی خوب
منم امیدوارم همینطور باشه و بتونیم پیش مخاطبای سایت سربلند باشیم و در حد انتظار اونا کارکنیم.
برای فیلم آموزشی یکم نیاز به برنامه ریزی و هماهنگی های جانبی بین نویسنده ها وجود داره که در حال انجامش هستیم.
شاید کمی شروع این کار طول بکشه اما اگه تعداد افرادی خواهان این موضوع زیاد بشه، حتما برای مجموعه آموزش های زبان C که فعلا متنی قرار داده شده، فیلم هم تهیه می کنیم. شما اخبار سایت را پیگیری کنید و در سایت عضو بشید. به محض تهیه فیلم ها از طریق ایمیل اطلاع رسانی ها انجام میشه .
موفق باشید 🙂
ممنون منتظریم