آخرین مطالب
LINK TABLES
خانه | برنامه‌نویسی | زبان C – ساختارهای شرطی (جلسه ۹)

زبان C – ساختارهای شرطی (جلسه ۹)

تو فکر این بودم که این جلسه رو چه جوری شروع کنم که متفاوت باشه. به ذهنم رسید که یادی کنم از دوران کودکی، اون وقتا که پدر مادرا به بچه‌ها میگفتن اگر نمره‌هات خوب بشه برات جایزه میخریم. 🙂 یه نکته ظریفی که تو این حرف دیده میشه وجود شرط هست. اون چیزی که امروز می‌خوایم در موردش حرف بزنیم.

 

یادآوری

پیشنهاد می شود قبل از مطالعه این بحث مباحث زیر را در صورت نیاز مطالعه کنید:

انواع داده در زبان C               اشاره گرهای زبان C               آرایه ها در زبان C

رشته ها در زبان C                ساختارها در زبان C                عملگرهای زبان C

دستورات شرطی

اگر زندگی یک خط مستقیم بود، بسیار خسته‌کننده و ملال آور می شد. اما این طور نیست و ما هر روز با اتفاقات مختلف و گاهی پیش بینی نشده روبه رو می شویم که یکنواختی زندگی را از بین می برد. همین موضوع در مورد برنامه نویسی نیز صدق می کند. در صورتی که دستورات برنامه شما فقط طبق ترتیبی که ظاهرشده‌اند به اجرا درآیند، بسیار یکنواخت و کسالت‌آور می‌گردد. این گونه برنامه هیچ هیجانی ندارد. 🙁

درواقع، وظیفه مهم یک برنامه، هدایت کامپیوتر جهت انشعاب دادن (که پرش نام دارد) به بخش‌های گوناگون کد هست و وظیفه‌ی دیگر یک برنامه انجام کارهای مختلف در زمان مواجه‌شدن با شرط‌های خاص است. به‌هرحال در اغلب حالات، نمی‌دانید که چه چیزی پیش خواهد آمد. آنچه می‌دانید این است که اگر با برخی شرایط مواجه شوید، قطعاً اتفاقی می‌افتد؛ بنابراین می‌توانید وظایف و شرایطی را در برنامه ثبت کنید. این طور هیجان در برنامه دیده می شود. 😀

اگر بخواهیم تحت شرایطی تعدادی از دستور ها اجرا شوند و یا تعدادی دیگر اجرا نشوند، باید از ساختار های شرطی استفاده کنیم. دستورات شرطی در تمام زبان های برنامه نویسی از اجزای اصلی هستند. یک دستور شرطی، شرطی که کاربر مشخص می کند را بررسی کرده و در صورت صحیح بودن یک دسته از کدهای کاربر و در صورت غلط بودن دسته‌ی دیگری از کدهای کاربر را اجرا می‌کند.

در زبان C دو ساختار شرطی مهم به نام های if و switch وجود دارد که در ادامه با آن ها آشنا می شویم:

ساختار شرطی if

در زبان C، حکم if پرطرفدارترین دستور انشعاب شرطی است. به‌وسیله این دستور شرطی می‌توان روی متغیرها، آرایه‌ها، رشته‌ها و… شرط قرارداد. در تصویر زیر فلوچارت ساختار انشعاب شرطی if را مشاهده می‌کنید:

 

قالب دستور شرطی if نیز به شکل زیر است:

همان‌طور که در بالا مشاهده می‌شود، اگر شرط موردنظر برقرار باشد، کدهای درون {  } در زیر if اجرا خواهند شد. اگر شرط موردنظر برقرار نباشد، کدهای درون { } در زیر else اجرا خواهند شد به مثال زیر توجه کنید:

  • در این مثال می خواهیم تحت شرایطی، مقداری را روی پورت D یک میکروکنترلر (مثلا AVR) قرار دهیم.
  •  اگر متغیر a برابر با عدد ۷ باشد، مقدار باینری ۱۱۱۱۰۰۰۰ به رجیستر PORTD نسبت داده می‌شود.
  •  اگرمتغیر a برابر با ۷ نباشد، مقدار باینری ۰۰۰۰۱۱۱۱ به رجیستر PORTD نسبت داده می‌شود.
  • در سطرهای بالا دو علامت { } وجود ندارد. چون در زیر دستور if و else تنها یک دستور وجود دارد.
  • اگر تعداد دستورات بیشتر از یک دستور باشد حتماً باید از { } استفاده شود.
  • وجود دستور else در if ضروری نیست و بسته به نیاز کاربر قرار داده می‌شود.

در مثال بالا تنها یک شرط بررسی شد. اگر نیاز باشد شرط‌های بیشتری بعد از اولین دستور if موردبررسی قرار بگیرد، باید از else if برای شرط‌های بعدی استفاده شود.

به مثال زیر توجه کنید:

در مثال بالا، دو شرط موردبررسی قرار می‌گیرد. در شرط اول اگر متغیر برابر با ۷ باشد و در شرط دوم اگر متغیر بزرگ‌تر از ۴۴ باشد.

در شکل زیر می توانید فلوچارت else if را مشاهده کنید:

در این فلوچارت، شرط ها به ترتیب بررسی شده و اولین شرطی که درست باشد، دستورات مربوط به آن اجرا شده و سایر دستورات نادیده گرفته می شوند. اما اگر هیچ کدام از دستوران صحیح نباشند دستورات مربوط به else آخر اجرا خواهند شد. توجه کنید که else آخر اختیاری بوده و می تواند حذف شود.

حال در مثال زیر از شرط های بیشتری استفاده می کنیم:

  • دستور شرطی اول با if شروع‌شده است.
  • چون کدهایی که در زمان برقراری شرط باید اجرا کند، بیش از یک دستور است، کدهای مربوط در داخل { } قرارگرفته‌اند.
  • دستور شرط دوم و سوم با else if آغازشده است.
  • در داخل دستور شرطی سوم یک دستور شرط دیگر وجود دارد که به این حالت دستور شرطی if تودرتو می‌گویند.
  • در دستور شرط سوم حتماً باید شرط a==56 برقرار باشد تا کدهای مربوط به آن‌که یک دستور شرط دیگر است، اجرا شود. پس دستور شرط سوم به این شکل تفسیر می‌شود که اگر a==56 و در همین زمان متغیر x نامساوی با ۹ باشد، دستور PORTD=0b00000000 اجرا می‌شود.
  • برای آخرین حالت چون شرط دیگری باقی نمانده تنها از else استفاده کردیم.

تذکر: این برنامه به صورت قطعه کد نوشته شده و شما می توانید متغیرهای استفاده شده در آن را به دلخواه تعریف و مقدار دهی کنید.

ساختار شرطی switch

ساختار switch یکی از ساختار های مهم و جالب در زبان C است که به وسیله ی آن می توان متناسب با مقدار یک متغیر، یک یا چند عبارت را اجرا کرد. به طور کلی، در تمام تصمیم گیری هایی که بیش از سه انتخاب وجود داشته باشد بهتر است از ساختار switch استفاده شود. دستور شرطی switch نسبت به دستور شرطی if از توانمندی کمتری برخوردار است. این دستور فقط می تواند برابری را مورد شرط قرار دهد.

قالب دستور شرطی switch را در زیر مشاهده می کنید :

گزینه Default در ساختار دستور switch ضروری نیست و بسته به نیاز کاربر قرار داده می شود. هر دستور case یک شرط برابری را بررسی می کند و در صورت برابر بودن کد های زیر آن اجرا شده و توسط دستور Break از ساختار switch خارج می شود. البته قرار دادن break اختیاری است.

در شکل زیر فلوچارت مربوط به ساختار switch را مشاهده می‌کنید:

اگر در زیر هر case دستور Break قرار داده نشود، با پایان دستوراتش، دستورات case های بعدی اجرا می شود و این روند تا رسیدن به break و خروج از ساختار switch ادامه پیدا می کند. در این حالت می توان چند case را باهم OR کرد.

به مثال زیر توجه کنید:

  • متغیر a عبارتی است که باید بررسی شود.
  • در دستور  case اول مقدار متغیر a با عدد ۱۳۴ مقایسه می شود. در صورت برابری، کد های زیر آن اجرا شده و توسط دستور Break از ساختار switch خارج می شود.
  • در دستور case دوم و سوم، دو مقدار با هم or (یا) شده‌اند. یعنی در صورت برابر بودن متغیر a با مقادیر ۲۰۰ یا ۲۱۰ ، رجیستر PORTD برابر با مقدار باینری ۱۰۱۰۱۰۱۰ شده و به مقدار متغیر x یک واحد افزوده می شود.
  • اگر مقدار متغیر a با هیچ یک از مقادیر اشاره شده توسط case ها برابر نباشد، کد های زیر دستور Default اجرا می شوند.

دو نکته کلیدی در مورد switch:

  • چندین ساختار switch را می توان به صورت تو در تو استفاده کرد. یعنی کد زیر هر یک از case ها می تواند یک ساختار switch دیگر باشد.
  • مقادیر موجود در case های switch نمی توانند با هم مساوی باشند. یعنی هیچکدام از مقادیر <مقدار ۱ > ، <مقدار ۲ > و  . . . نباید مساوی باشند.

به مثال زیر دقت کنید:

برای درک این مثال نیاز به مفاهیم تابع و دستورات پیش پردازنده دارید. توصیه می شود اگر به این مباحث مسلط نیستید ابتدا مطالعه کنید:

پست تابع

پست دستورات پیش پردازنده

پس از کامپایل و اجرای برنامه نتایج زیر حاصل می شود:

اگر روال جلسات قبلی آموزش زبان C را به یاد داشته باشید متوجه شدید که این مثال شباهت زیادی به آن ها دارد. به همین دلیل توضیح خط به خط داده نمی شود. اگر برای بار اول از سایت بازدید می کنید حتما از قسمت یادآوری که در بالای همین پست دیدید، به پست های قبلی آموزش زبان سی مراجعه کنید.

این برنامه در یک تابع نوشته شده و قرار است در صورت برابری یک کاراکتر با کاراکتر ذخیره شده در متغیر grade، عبارت مناسبی روی صفحه نمایش چاپ کند. ابتدا کد را به صورت دستی دنبال کرده و سپس صحت نتایج را در کامپایلر مشاهده کنید. در صورتی که سوالی داشتید از بخش نظرات مطرح کنید.

یه جلسه سبک و ملایم با دو تا ساختار ساده. بعید میدونم کسی اذیت شده باشه برای یادگیریش. تمرین یادتون نره. جلسه بعد حلقه‌ها رو بررسی می‌کنیم.

درباره ی احسان عبداللهی

احسان عبداللهی هستم | کارشناسی الکترونیک خوندم و کارشناسی ارشد مخابرات |در سال 94 وب سایت میکرولرن را راه اندازی کردم | سعی کردم هر چیزی را به صورت کاربردی دنبال کنم، برای همین از کارشناسی کار با میکروکنترلرهای AVR و ARM، برنامه نویسی C و طراحی PCB را به صورت تخصصی کار کردم و از کارشناسی ارشد برنامه نویسی پایتون ، Computer vision و deep learning را به صورت تخصصی و کاربردی شروع کردم | الان هم سعی میکنم همیشه خودم را به روز نگه دارم و لذت کار کردن با دنیای برنامه نویسی و امبدد سیستم ها را به دیگران انتقال بدم

۵ دیدگاه

  1. خیلی سایت خوبیه من تازه آشنا شدم اگه آموزشاش به صورت ویدیویی بود یعنی یکی از بهترین سایت های آموزش c توی کشور یا توی دنیا خیلی روان و سااااااااادددددددددددددهههههههههه

    ممنون اگر آموزش ویدیویی توابع رو به ایمیلم بفرستی

    • شما لطف دارید ولی کیفیت کار ما هنوز در حد و اندازه های مخاطبای خوب سایتمون نشده و راه زیادی در پیش داریم. اما اگه نیاز به آموزش ویدیویی خاصی دارید بفرمایید تا براتون آماده کنیم

      • امیدوارم همینطور خوب پیش برید بله اگه میشه از قسمت توابع و توابع بازگشتی یک فیلم آموزشی آماده کنید البته اگه زحمتی نباشه
        ممنون

        به قول فیروز قمپز در نمیکنم واقعا آموزش ها روان هست و خیلی خوب

        • منم امیدوارم همینطور باشه و بتونیم پیش مخاطبای سایت سربلند باشیم و در حد انتظار اونا کارکنیم.
          برای فیلم آموزشی یکم نیاز به برنامه ریزی و هماهنگی های جانبی بین نویسنده ها وجود داره که در حال انجامش هستیم.
          شاید کمی شروع این کار طول بکشه اما اگه تعداد افرادی خواهان این موضوع زیاد بشه، حتما برای مجموعه آموزش های زبان C که فعلا متنی قرار داده شده، فیلم هم تهیه می کنیم. شما اخبار سایت را پیگیری کنید و در سایت عضو بشید. به محض تهیه فیلم ها از طریق ایمیل اطلاع رسانی ها انجام میشه .
          موفق باشید 🙂

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *