اموزش c++ عبارت انتخاب if (قسمت هفدهم)

Loading...
عبارت انتخاب if
عبارت انتخاب if

عبارت انتخاب if

۵-۴  عبارت انتخاب if

عبارت انتخاب if ، در یک عبارت انتخاب، هدف برگزیدن یکی از گزینه‌های موجود برای انجام آن است. برای مثال، فرض کنید که شرط قبولی در یک امتحان نمره ۶۰ است از (۱۰۰). عبارت شبه‌کد آن بصورت زیر می باشد:

If student’s grade is greater than or equal to 60

Print “Passed”

عبارت انتخاب if

شرط “student’s grade is greater than or equal to 60” می تواند برقرار باشد یا نباشد. اگر شرط برقرار باشد عبارت “Passed” به معنی قبول شدن به نمایش در می آید و عبارت پس از شبه‌کد به ترتیب اجرا می شود (بیاد داشته باشید که شبه‌کد یک زبان برنامه‌نویسی واقعی نیست). اگر شرط برقرار نباشد عبارت چاپ نادیده گرفته می شود و عبارت شبه‌کد بعدی به ترتیب اجرا خواهد شد. عبارت موجود در بدنه عبارت if رشته Passed را به چاپ می رساند. همچنین به دندانه‌دار بودن این عبارت در این عبارت انتخاب دقت کنید. دندانه‌ گذاری امری اختیاری است، اما بکارگیری آن بسیار توصیه می شود چرا که ارتباط عبارتهای مختلف برنامه را بخوبی نشان می دهند. کامپایلرC++ کاراکترهای whitespace یعنی کاراکترهای فاصله، tab و خطوط جدید بکار رفته در ایجاد دندانه‌ها و فاصله‌گذاری عمودی را بجز کاراکترهای whitespace بکار رفته در رشته‌ها، در نظر نمی گیرد.

 

می توان این عبارت شبه‌کد if را در زبان C++ بصورت زیر نوشت

if (grade >= 60 )

cout << “Passed”;

اگر به کد C++ دقت کنید متوجه شباهت نزدیک آن با شبه‌کد خواهید شد و نقش شبه‌کد به عنوان یک ابزار توسعه برنامه بخوبی آشکار می شود.

در شکل ۴-۴ دیاگرام فعالیت عبارت تک‌انتخابی if نشان‌داده شده است. این دیاگرام حاوی یکی از مهمترین نمادها در یک دیاگرام فعالیت است. نماد لوزی یا نماد تصمیم نشان می دهد که باید در آن نقطه تصمیمی اتخاذ گردد. نماد تصمیم‌گیری بر این نکته دلالت دارد که روند کار در امتداد مسیری به کار ادامه خواهد داد که توسط نماد وابسته نگهبان شرط تعیین می شود (آیا شرط برقرار است یا خیر). هر فلش یا بردار انتقال خارج شده از یک نماد تصمیم دارای یک نگهبان شرط است (در درون براکت‌های مربعی در بالا یا کنار فلش انتقال جای می گیرد). اگر شرط یک نگهبان شرط برقرار باشد، روند کار وارد وضعیت عملی می شود که فلش انتقال به آن اشاره می کند. در شکل ۴-۴ اگر grade بزرگتر یا برابر ۶۰ باشد، برنامه کلمه “Passed” را بر روی صفحه نمایش چاپ کرده و سپس انتقال به وضعیت پایانی در این فعالیت می رسد. اگر grade کوچکتر از ۶۰ باشد، بلافاصله برنامه به وضعیت پایانی منتقل می شود، بدون اینکه پیغامی چاپ کند.

cpp-ch4-4

شکل ۴-۴ | دیاگرام فعالیت عبارت if.

در فصل اول آموختیم، تصمیم‌گیری می تواند براساس شرط‌هایی صورت گیرد که حاوی عملگرهای رابطه‌ای یا برابری هستند. در واقع، در C++ یک شرط می تواند بر پایه هر عبارتی ارزیابی گردد، اگر عبارت با صفر ارزیابی شود، با آن همانند false (عدم برقراری شرط) رفتار خواهد شد و اگر عبارت با مقداری غیر از صفر ارزیابی گردد، با آن همانند true (برقراری شرط) رفتار می شود. زبان C++ دارای نوع داده بولی(bool) برای متغیرهایی است که فقط قادر به نگهداری مقادیر true و false هستند، که هر دو جزء کلمات کلیدی در C++ می باشند.

قابلیت حمل

برای حفظ سازگاری با نسخه‌های قبلی C که از اعداد صحیح برای مقادیر بولی استفاده می کردند، می توان برای عرضه یک مقدار بولی true از هر مقدار غیرصفری استفاده کرد (معمولاً کامپایلرها از ۱ استفاده می کنند). برای عرضه یک مقدار بولی false نیز می توان از مقدار صفر استفاده کرد.

دقت کنید که عبارت if یک عبارت تک‌ورودی/ تک‌خروجی است. همچنین دیاگرام‌های مابقی عبارات کنترلی نیز حاوی نمادهای وضعیت اولیه، فلش‌های انتقال، وضعیت اجرا، تصمیم‌گیری و وضعیت پایانی هستند. به این نحوه نمایش عبارات کنترلی روش مدل برنامه‌نویسی اجرائی/تصمیم‌گیری گفته می شود.

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


۶-۴ عبارت انتخاب if..else

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

If Student’s grade is greater than or equal to 60

Print “Passed”

Else

Print “Failed”

اگر نمره دانش‌آموز برابر ۶۰ یا بالاتر باشد، عبارت “Passed” به نمایش در می آید و اگر کمتر از آن باشد عبارت “Failed“. در هر دو حالت پس از انجام عمل چاپ، عبارت شبه‌کد بعدی به اجرا گذاشته خواهد شد.

عبارت شبه‌کد if..else مطرح شده را می توان در زبان C++ و به فرم زیر نوشت:

if (grade >= 60 )

cout << “Passed”;

else

cout << “Failed”;

به دندانه‌دار بودن بدنه شرط else دقت کنید که با خطوط بالای خود در شرط if یکسان قرار گرفته‌اند.

در شکل ۵-۴ روند کنترل جریان در یک عبارت (ساختار) if..else نشان داده شده است. مجدداً توجه کنید (در کنار وضعیت اولیه، فلش‌های انتقال و وضعیت پایانی) که نمادهای بکار رفته در این دیاگرام فعالیت عبارتند از نمادهای عمل و تصمیم‌گیری و تاکید ما بر مدل‌سازی عمل/ تصمیم‌گیری است. مجدداً به صندو‌ق‌های خالی از دیاگرام‌های فعالیت عبارات انتخاب دوگانه فکر کنید که برنامه‌نویس می تواند به روش پشته‌ای یا تودرتو با سایر دیاگرام‌های فعالیت ساختارهای کنترلی بکار گیرد تا مبادرت به پیاده‌سازی الگوریتم کند.

cpp-ch4-5

شکل ۵-۴ دیاگرام فعالیت عبارت دو انتخابی if..else

عملگر شرطی (?:)

زبان C++ حاوی عملگر شرطی (?:)، است که قرابت نزدیکی با عبارت if..else دارد. عملگر شرطی C++ تنها عملگر ternary است، به این معنی که سه عملوند دریافت می کند. عملوندها به همراه عملگر شرطی تشکیل عبارت شرطی را می دهند. عملوند اول نشاندهنده شرط می باشد، عملوند دوم مقداری است که در صورت true بودن شرط انتخاب می شود و عملوند سوم مقداری است که در صورت برقرار نبودن شرط یا false بودن آن انتخاب می شود. برای مثال عبارت زیر

cout << (grade >= 60 ? ”Passed” : ”Failed” );

حاوی یک عبارت شرطی، است که در صورت برقرار بودن شرط grade >= 60 رشته “Passed” ارزیابی می شود، اما اگر شرط برقرار نباشد، رشته “Failed” بکار گرفته خواهد شد. از اینرو عملکرد این عبارت شرطی دقیقا همانند عملکرد عبارت if..else قبلی است. عملگر شرطی از تقدم پایین‌تری برخوردار است و از اینرو معمولا کل عبارت شرطی را در درون پرانتزها قرار می دهند.

مقادیر موجود در یک عبارت شرطی قادر به اجرا شدن نیز هستند. برای مثال عبارت شرطی زیر مبادرت به چاپ “Passed” یا “Failed” می کند.

grade >= 60 ? cout << “Passed” : cout << “Failed”;

این عبارت به صورت زیر تفسیر می شود «اگر grade بزرگتر یا مساوی ۶۰ باشد، پس cout<<“Passed”، در غیر اینصورت “.cout<<“Faild” همچنین این عبارت قابل مقایسه با عبارت if..else قبلی است. عبارات شرطی را می توان در مکان‌هایی از برنامه‌ که امکان استفاده از if..else وجود ندارد، بکار گرفت.

عبارات تودرتوی if..else

عبارت تودرتوی if..else برای تست چندین شرط با قرار دادن عبارتهای if..else در درون عبارتهای if..else دیگر است. برای مثال، عبارت شبه‌کد زیر، حرف “A” را برای نمره‌های بزرگتر یا برابر ۹۰، “B” را برای نمره‌های در محدوده ۸۰-۸۹، “C” را برای نمره‌های در محدوده ۷۰-۷۹، “D” را برای نمره‌های در محدوده ۶۰-۶۹ و “F” را سایر نمرات به چاپ می رساند.

If student’s grade is greater then or equal to 90

Print “A”

Else

If student’s grade is greater than or equal to 80

Print “B”

Else

If student’s grade is greater than or equal to 70

Print “C”

Else

If student’s grade is greater than or equal to 60

Print “D”

Else

Print “F”

عبارت شبه‌کد بالا را می توان در زبان C++ و به فرم زیر نوشت:

if (studentGrade>=90) // 90 and above gets “A”

cout << “A”;

else

if (studentGrade>=80) // 80-89 gets “B”

cout << “B”;

else

if (strudentGrade>=70) // 70-79 gets “C”

cout << “C”;

else

if (studentGrade>=60) // 60-69 gets “D”

cout << “D”;

else // less than 60 gets “F”

cout << “F”;

 

اگر مقدار studentGrade بزرگتر یا مساوی ۹۰ باشد، اولین شرط از پنج شرط برقرار شده و فقط عبارت cout قرار گرفته در بدنه اولین شرط به اجرا در می آید. پس از اجرای این عبارت از بخش else خارجی عبارت if..else عبور خواهد شد.

اکثر برنامه‌نویسان C++ ترجیح می دهند که عبارت if..else را با استفاده از کلمه کلیدی else if و بصورت زیر در برنامه‌های خود بنویسند:

if (studentGrade>=90) // 90 and above gets “A”

cout << “A”;

else if (studentGrade>=80) // 80-89 gets “B”

cout << “B”;

else if (studentGrade>=70) // 70-79 gets “C”

cout << “C”;

else if (studentGrade>=60) // 60-69 gets “D”

cout << “D”;

else // less than 60 gets “F”

cout << “F”;

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

مشکل dangling-else

همیشه کامپایلر C++ یک else را با یک if در نظر می گیرد، مگر اینکه خلاف آنرا با استفاده از براکت‌ها مشخص کنید. به این مشکل dangling-else می گویند. برای مثال،

if ( x > 5 )

if ( y > 5 )

cout << “x and y are > 5”;

else

cout << “x is <=5”;

به نظر می رسد بر این نکته دلالت دارد که اگر x بزرگتر از ۵ باشد، عبارت if تودرتو تعیین می کند که آیا y نیز بزرگتر از ۵ است یا خیر. اگر چنین باشد، رشته “x and y are > 5” در خروجی چاپ می شود. در غیر اینصورت اگر x بزرگتر از ۵ نباشد، بخش else از عبارت if..else رشته “x is <=5” را چاپ خواهد کرد.

با این همه امکان دارد عبارت if تودرتوی فوق مطابق با انتظار کار نکند. تفسیر کامپایلر از عبارت بصورت زیر خواهد بود

if ( x > 5 )

if ( y > 5 )

cout << “x and y are > 5”;

else

cout << “x is <=5”;

که در آن بدنه اولین عبارت if یک عبارت if..else تودرتو است. این عبارت مبادرت به تست بزرگتر بودن x از ۵ می کند. اگر چنین باشد، اجرا با تست y بزرگتر از ۵ ادامه می یابد. اگر شرط دوم برقرار باشد، رشته “x and y are >5” به نمایش در خواهد آمد. با این همه اگر شرط دوم برقرار نباشد، رشته  “x  is <=5” به نمایش در می آید، حتی اگر بدانیم که x بزرگتر از ۵ است.

برای اینکه عبارت فوق بنحوی کار کند که از انتظار داریم، بایستی کل عبارت بصورت زیر نوشته شود:

if ( x > 5 )

{

if ( y > 5 )

cout << “x and y are > 5”;

}

else

cout << “x is <=5”;

براکت‌ها به کامپایلر نشان می دهند که دومین if در بدنه اولین if قرار دارد و else در ارتباط با اولین if می باشد.

بلوک‌ها

معمولا عبارت انتخاب if فقط منتظر یک عبارت در بدنه خود است. به همین ترتیب، هر یک از بخش‌های else و if در یک عبارت if..else انتظار مقابله با یک عبارت در بدنه خود را دارند. برای وارد کردن چندین عبارت در بدنه یک if یا در بخش‌های if..else ، عبارات را در درون براکت‌ها ( { } ) قرار دهید. به مجموعه‌ای از عبارات موجود در درون یک جفت براکت، بلوک می گویند.

مثال زیر شامل یک بلوک در بخشی از else یک عبارت if..else است.

if (studentGrade>=60)

cout << “Passed.\n”;

else

{

cout << “Failed.\n”;

cout << “You must take this course again.\n”

}

در این مورد، اگر studentGrade کمتر از ۶۰ باشد، برنامه هر دو عبارت موجود در بدنه else را اجرا کرده و پیغام‌های زیر را چاپ می کند.

Failed

You must take this course agein.

به براکت‌های احاطه‌کننده دو عبارت در ضابطه else دقت کنید. این براکت‌ها مهم هستند. بدون این براکت‌ها، عبارت

cout << “You must take this course again.\n”;

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



avatar مسعود شریفی پور

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

آخرین مطالب و تخفیفات در کانال تلگرام :) کانال تلگرام ام اس پی سافت
مطالب مرتبط
ديدگاه خود را ارسال کنيد


محبوب ترين ويدئو هاي انلاين
دوره برنامه نویسی فروشگاه اینترنتی
  • تعداد اعضا 80k
  • قيمت دوره۱۳۰,۰۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...
دوره آموزشی سیستم ثبت سفارش آنلاین
  • تعداد اعضا 80k
  • قيمت دوره--
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...
دوره طراحی سیستم مدیریت مشتریان
  • تعداد اعضا 80k
  • قيمت دوره۶۵,۵۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...