عبارت انتخاب if
 
آموزش ++C
آموزش و سورس های برنامه نویسی به زبان ++C
 
 
سه شنبه 29 فروردين 1391برچسب:, :: 21:45 ::  نويسنده : کیوان مجنونی

در يك عبارت انتخاب، هدف برگزيدن يكي از گزينه‌هاي موجود براي انجام آن است. براي مثال، فرض كنيد كه شرط قبولي در يك امتحان نمره 60 است از (100). عبارت شبه‌كد آن بصورت زير مي‌باشد:

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

Print “Passed”

شرط “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++ دقت كنيد متوجه شباهت نزديك آن با شبه‌كد خواهيد شد و نقش شبه‌كد به عنوان يك ابزار توسعه برنامه بخوبي آشكار مي‌شود.

در شكل 4-4 دياگرام فعاليت عبارت تك‌انتخابي if نشان‌داده شده است. اين دياگرام حاوي يكي از مهمترين نمادها در يك دياگرام فعاليت است. نماد لوزي يا نماد تصميم نشان مي‌دهد كه بايد در آن نقطه تصميمي اتخاذ گردد. نماد تصميم‌گيري بر اين نكته دلالت دارد كه روند كار در امتداد مسيري به كار ادامه خواهد داد كه توسط نماد وابستهنگهبان شرط تعيين مي‌شود (آيا شرط برقرار است يا خير). هر فلش يا بردار انتقال خارج شده از يك نماد تصميم داراي يك نگهبان شرط است (در درون براكت‌هاي مربعي در بالا يا كنار فلش انتقال جاي مي‌گيرد). اگر شرط يك نگهبان شرط برقرار باشد، روند كار وارد وضعيت عملي مي‌شود كه فلش انتقال به آن اشاره مي‌كند. در شكل 4-4 اگر grade بزرگتر يا برابر 60 باشد، برنامه كلمه "Passed" را بر روي صفحه نمايش چاپ كرده و سپس انتقال به وضعيت پاياني در اين فعاليت مي‌رسد. اگر grade كوچكتر از 60 باشد، بلافاصله برنامه به وضعيت پاياني منتقل مي‌شود، بدون اينكه پيغامي چاپ كند.

cpp-ch4-4

شكل 4-4 | دياگرام فعاليت عبارت if.

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

قابليت حمل

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

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

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


6-4 عبارت انتخاب if..else

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

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

Print “Passed”

Else

Print “Failed”

اگر نمره دانش‌آموز برابر 60 يا بالاتر باشد، عبارت “Passed” به نمايش در مي‌آيد و اگر كمتر از آن باشد عبارت "Failed". در هر دو حالت پس از انجام عمل چاپ، عبارت شبه‌كد بعدي به اجرا گذاشته خواهد شد.

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

if (grade >= 60 )

cout << “Passed”;

else

cout << “Failed”;

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

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

cpp-ch4-5

شكل 5-4 دياگرام فعاليت عبارت دو انتخابي 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 بزرگتر يا مساوي 60 باشد، پس cout<<"Passed"، در غير اينصورت ".cout<<"Faild" همچنين اين عبارت قابل مقايسه با عبارت if..else قبلي است. عبارات شرطي را مي‌توان در مكان‌هاي از برنامه‌ كه امكان استفاده از if..else وجود ندارد، بكار گرفت.

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

عبارت تودرتوي if..else براي تست چندين شرط با قرار دادن عبارتهاي if..else در درون عبارتهاي if..else ديگر است. براي مثال، عبارت شبه‌كد زير، حرف “A” را براي نمره‌هاي بزرگتر يا برابر 90، “B” را براي نمره‌هاي در محدودة 80-89، “C” را براي نمره‌هاي در محدودة 70-79، “D” را براي نمره‌هاي در محدودة 60-69 و “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 بزرگتر يا مساوي 90 باشد، اولين شرط از پنج شرط برقرار شده و فقط عبارت 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 بزرگتر از 5 باشد، عبارت if تودرتو تعيين مي‌كند كه آيا y نيز بزرگتر از 5 است يا خير. اگر چنين باشد، رشته "x and y are > 5" در خروجي چاپ مي‌شود. در غير اينصورت اگر x بزرگتر از 5 نباشد، بخش 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 از 5 مي‌كند. اگر چنين باشد، اجرا با تست y بزرگتر از 5 ادامه مي‌يابد. اگر شرط دوم برقرار باشد، رشته "x and y are >5" به نمايش در خواهد آمد. با اين همه اگر شرط دوم برقرار نباشد، رشته  "x  is <=5" به نمايش در مي‌آيد، حتي اگر بدانيم كه x بزرگتر از 5 است.

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

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 كمتر از 60 باشد، برنامه هر دو عبارت موجود در بدنه else را اجرا كرده و پيغام‌هاي زير را چاپ مي‌كند.

Failed

You must take this course agein.

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

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

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


نظرات شما عزیزان:

نام :
آدرس ایمیل:
وب سایت/بلاگ :
متن پیام:
:) :( ;) :D
;)) :X :? :P
:* =(( :O };-
:B /:) =DD :S
-) :-(( :-| :-))
نظر خصوصی

 کد را وارد نمایید:

 

 

 

عکس شما

آپلود عکس دلخواه:







درباره وبلاگ


به وبلاگ من خوش آمدید
آخرین مطالب
پيوندها

تبادل لینک هوشمند
برای تبادل لینک  ابتدا ما را با عنوان آموزش C++ و آدرس amoozesh-cpp.LXB.ir لینک نمایید سپس مشخصات لینک خود را در زیر نوشته . در صورت وجود لینک ما در سایت شما لینکتان به طور خودکار در سایت ما قرار میگیرد.





نويسندگان


ورود اعضا:


نام :
وب :
پیام :
2+2=:
(Refresh)

<-PollName->

<-PollItems->

خبرنامه وب سایت:





آمار وب سایت:
 

بازدید امروز : 27
بازدید دیروز : 0
بازدید هفته : 28
بازدید ماه : 271
بازدید کل : 75205
تعداد مطالب : 50
تعداد نظرات : 7
تعداد آنلاین : 1