ایران سرفراز- نرم افزار وپروژهای دانشجویی


نرم افزار وپروژهای دانشجویی

فصل سوم برنامه سازی پیشرفته « انتخاب »++C

<!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

 

C++ فصل سومبرنامه سازی پیشرفته « انتخاب »

 

mohsen_mahyar@yahoo.com

 

همۀ برنامه هایی که در دو فصل اول بیان شد، به شکل ترتیبی اجرا می شوند،

یعنی دستورات برنامه به ترتیب از بالا به پایین و هر کدام دقیقا یک بار اجرا م یشوند.

در این فصل نشان داده می شود چگونه از دستورالعمل های انتخاب 1 جهت

انعطاف پذیری بیشتر برنامه استفاده کنیم. همچنین در این فصل انواع صحیح که در

وجود دارد بیشتر بررسی می گردد. C++

if 3 دستور ‐1

موجب می شود برنامه به شکل شرطی اجرا شود. نحو آن به گونۀ زیر if دستور

است :

If (condition) statement;

که شرط نامیده می شود یک عبارت صحیح است (عبارتی که با یک Condition

می تواند هر فرمان قابل اجرا باشد. statement مقدار صحیح برآورد می شود) و

مقدار غیر صفر داشته باشد. condition وقتی اجرا خواهد شد که Statement

1 – Selection

 

64 برنامه سازی پیشرفته

دقت کنید که شرط باید درون پرانتز قرار داده شود.

3 آزمون بخش پذیری ‐ * مثال 1

این برنامه بررسی می کند که یک عدد صحیح مثبت بر عدد دیگر قابل تقسیم

نباشد:

int main()

{ int n, d;

cout << "Enter two positive integers: ";

cin >> n >> d;

if (n%d) cout << n << " is not divisible by "

<< d << endl;

}

در اولین اجرا، اعداد 66 و 7 را وارد می کنیم:

Enter two positive integers: 66 7

66 is not divisible by 7

66 برابر با 3 برآورد می گردد. چون این مقدار، یک عدد صحیح غیرصفر % مقدار 7

اجرا شده و cout است، پس شرط به عنوان درست تفسیر می شود و در نتیجه دستور

پیغام عدم قابلیت تقسیم چاپ می شود.

برنامۀ بالا را دوباره اجرا می نماییم و این دفعه اعداد 56 و 7 را وارد می کنیم:

Enter two positive integers: 56 7

56 برابر با 0 برآورد می شود که این به معنی نادرست تفسیر م یگردد، پس % مقدار 7

نادیده گرفته شده و هیچ پیغامی روی صفحه چاپ نمی شود. cout دستور

هر وقت یک عبارت صحیح به عنوان یک شرط استفاده شود، مقدار 0 C++ در

است. « درست » و همۀ مقادیر دیگر به معنی « نادرست » به معنی

قابل تقسیم باشد، برنامه d بر n 3 ناقص به نظر می آید زیرا اگر ‐ برنامۀ مثال 1

رفع می شود. if..else هیچ عکس العملی نشان نمی دهد. این نقص به کمک دستور

فصل سوم / انتخاب 65

if..else 3 دستور ‐2

موجب م یشود بسته به این که شرط درست باشد یا خیر، if..else دستور

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

if (condition) statement1;

else statement2;

همان شرط مساله است که یک عبارت صحیح می باشد و condition

فرمان های قابل اجرا هستند. اگر مقدار شرط، غیر statement و 2 statement1

اجرا می شود. statement اجرا خواهد شد وگرنه 2 statement صفر باشد، 1

3 یک آزمون دیگر قابلیت تقسیم ‐ * مثال 2

با دستور if 3 است بجز این که دستور ‐ این برنامه مانند برنامۀ مثال 1

جایگزین شده است: if..else

int main()

{ int n, d;

cout << " Enter two positive integers: ";

cin >> n >> d;

if (n%d) cout << n << " is not divisible by "

<< d << endl;

else cout << n << " is divisible by " << d << endl;

}

حالا وقتی در این برنامه اعداد 56 و 7 را وارد کنیم، برنامه پاسخ می دهد که 56

بر 7 قابل تقسیم است:

Enter two positive integers: 56 7

56 is divisible by 7

56 برابر با صفر است، پس این عبارت به عنوان نادرست تفسیر % چون حاصل 7

اجرا else نادیده گرفته شده و دستور بعد از if می گردد. در نتیجه دستور بعد از

به تنهایی یک دستور است، گر چه به دو if..else می شود. توجه کنید که

سمیکولن نیاز دارد.

 

66 برنامه سازی پیشرفته

3 عملگرهای مقایسه ای ‐4

شش عملگر مقایسه ای وجود دارد: > و < و => و =< و == C++ در

و =! . هر یک از این شش عملگر به شکل زیر به کار می روند:

x < y // است y کوچک تر از x

x > y // است y بزرگ تر از x

x <= y // است y کوچک تر یا مساوی x

x >= y // است y بزرگ تر یا مساوی x

x == y // است y مساوی با x

x != y // نیست y مساوی با x

این ها می توانند برای مقایسۀ مقدار عبارات با هر نوع ترتیبی استفاده شوند. عبارت

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

نادرست باشد و غیر صفر است اگر شرط درست باشد. برای نمونه، عبارت

7 برابر با صفر ارزیابی می شود، به این معنی که این شرط نادرست است. ×8<6×9

3 کمینۀ دو عدد صحیح ‐ * مثال 3

این برنامه مشخص می کند که از دو عدد صحیح ورودی، کدام یک کوچ کتر

است:

int main()

{ int m, n;

cout << "Enter two integers: ";

cin >> m >> n;

if ( m < n ) cout << m << " is the minimum." << endl;

else cout << n << " is the minimum." << endl;

}

Enter two integers: 77 55

55 is the minimum.

عملگر جایگزینی با عملگر برابری فرق دارد. عملگر جایگزینی C++ دقت کنید که در

یک مساوی تکی " = " است ولی عملگر برابری، دو مساوی " = = " است. مثلا

 

فصل سوم / انتخاب 67

بررسی x == قرار می دهد ولی دستور ; 33 x مقدار 33 را در x = دستور ; 33

با 33 برابر است یا خیر. درک این تفاوت اهمیت زیادی دارد. x می کند که آیا مقدار

x = تخصی ص می دهد // ; 33 X مقدار 33 را ب ه

x == برابر با 33 باشد // ; 33 x صفر ارزیاب ی می شود (به معنی نادرست ) مگر این که مقدار

3 یک خطای برنامه نویسی متداول ‐ * مثال 4

این برنامه خطادار است:

int main()

{ int n;

cout << "Enter an integer: ";

cin >> n;

if (n = 22) cout << "n = 22" << endl; // LOGICAL ERROR!

else cout << "n != 22" << endl;

}

Enter an integer: 77

n = 22

ظاهرا منطق برنامۀ فوق به این گونه است که عددی از ورودی دریافت می شود و اگر

این عدد با 22 برابر بود، پیغام برابری چاپ می شود و در غیر این صورت پیغام عدم

برابری چاپ می گردد. ولی اجرای بالا نشان می دهد که برنامه درست کار نمی کند. عدد

در خروجی چاپ شده است! ایراد در خط پنجم n = 77 وارد شده ولی پیغام 22

قرار داده و مقدار قبلی آن که 77 n مقدار 22 را در n = برنامه است. عبارت 22

استفاده شده پس if به عنوان شرط دستور n = است را تغییر می دهد. اما عبارت 22

به (n = به عنوان یک عبارت صحیح با مقدار 22 برآورد می شود. لذا شرط ( 22

است. به همین « نادرست » تفسیر می شود زیرا فقط مقدار 0 به معنای « درست » عنوان

اجرا می شود. خط پنجم باید ای نطور نوشته می شد: else دلیل دستور قبل از

if (n = = 22) cout << "n = 22" << endl; // CORRECT

خطای نشان داده شده در این مثال، خطای منطقی 1 نام دارد. این نوع خطا،

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

1 – Logical Error

68 برنامه سازی پیشرفته

وسیلۀ کامپایلر گرفته م یشود. خطاهای زمان اجرا (مانند تقسیم بر صفر) نیز به وسیلۀ

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

3 کمینۀ سه عدد صحیح ‐ * مثال 5

3 است با این تفاوت که از سه عدد صحیح استفاده ‐ این مثال شبیه مثال 3

می کند:

int main()

{ int n1, n2, n3;

cout << "Enter three integers: ";

cin >> n1 >> n2 >> n3;

int min=n1; // now min <= n1

if (n2 < min) min = n2; // now min <= n1 and n2

if (n3 < min) min = n3; // now min <= n1 ,n2 ,and n3

cout << "Their minimum is " << min << endl;

}

Enter three integers: 77 33 55

Their minimum is 33

n برابر 1 min سه توضیح ذکر شده در برنامه، نحوۀ پیشرفت کار را نشان می دهد: ابتدا

مقدار ،if می شود. پس از اجرای اولین {n کمینۀ مجموعۀ { 1 min فرض می شود، لذا

برابر min کوچک تر باشد. پس min از مقدار فعلی n می شود اگر 2 n برابر با 2 min

n را برابر با 3 min مقدار ،if می شود. آخرین دستور {n1,n کمینۀ مجموعۀ { 2

کوچک تر باشد. بنابراین در نهایت مقدار min از مقدار فعلی n قرار می دهد اگر 3

خواهد شد. {n1, n2, n برابر با کمینۀ مجموعۀ { 3 min

3 بلوک های دستورالعمل ‐5

یک بلوک دستورالعمل زنجیره ای از دستورالعمل هاست که درون براکت {}

محصور شده، مانند این:

{ int temp=x;

x = y;

y = temp;

}

 

 

فصل سوم / انتخاب 69

یک بلوک دستورالعمل مانند یک دستورالعمل تکی است. C++ در برنامه های

یعنی هر جا که یک دستورالعمل تنها بتواند استفاده شود، یک بلوک دستورالعمل نیز

می تواند استفاده شود. به مثال بعدی توجه کنید.

if 3 یک بلوک دستورالعمل درون یک دستور ‐ * مثال 6

این برنامه دو عدد صحیح را گرفته و به ترتیب بزر گتری، آن ها را چاپ می کند:

int main()

{ int x, y;

cout << "Enter two integers: ";

cin >> x >> y;

if (x > y) { int temp = x;

x = y;

y = temp;

} //swap x and y

cout << x << " <= " << y << endl;

}

Enter two integers: 66 44

44 <= 66

را به ترتیب بزرگ تری مرتب م یکنند بدین شکل y و x سه دستور درون بلوک، مقادیر

که اگر آ نها خارج از ترتیب باشند، جای آن دو را عو ض می کنند. برای این جابجایی

temp به سه گام متوالی و یک محل ذخیره سازی موقتی احتیاج داریم که در ای نجا

نامیده شده. برنامه یا باید هر سه دستورالعمل را اجرا کند و یا هیچ یک را نباید اجرا

کند. وقتی این سه دستور را درون بلوک دستورالعمل قرار دهیم، منظور فوق برآورده

درون بلوک تعریف شده است. این سبب می شود temp می شود. توجه کنید که متغیر

که متغیر مذکور درون بلوک، یک متغیر محلی 1 باشد. یعنی این متغیر فقط وقتی ایجاد

temp باشد) متغیر x<=y می شود که بلوک اجرا شود. اگر شرط نادرست باشد (یعنی

هرگز موجود نخواهد شد. این مثال، روش مناسبی برای محلی کردن اشیا را نشان

می دهد، طوری که اشیا وقتی ایجاد می شوند که به آن ها نیاز است. همچنین توجه کنید

خودش یک بلوک دستورالعمل است که توسط تابع C++ که یک برنامۀ

1 – Local Variable

70 برنامه سازی پیشرفته

ساخته شده است. یادآوری می کنیم که حوزۀ متغیر، قسمتی از یک main() اصلی

1). این حوزه، از نقطه ای ‐ برنامه است که متغیر می تواند در آن استفاده شود(بخش 5

که متغیر اعلان م یشود شروع شده و تا پایان همان بلوک ادامه می یابد. پس یک بلوک

می تواند به عنوان محدودۀ حوزۀ متغیر استفاده شود. یکی از نتایج مهم این کار آن است

که می توانیم از متغیرهای متفاوتی با یک نام در قسمت های مختلف برنامه استفاده کنیم.

3 استفاده از بلوک ها به عنوان محدودۀ حوزه ‐ * مثال 7

استفاده شده است: n در این برنامه سه متغیر مختلف با نام

int main()

{ int n=44;

cout << "n = " << n << endl;

{ int n; // scope extends over 4 lines

cout << "Enter an integer: ";

cin >> n;

cout << "n = " << n << endl;

}

{ cout << " n = " << n << endl; // n that was declared first

}

{ int n; // scope extends over 2 lines

cout << "n = " << n << endl;

}

cout << "n = " << n << endl; // n that was declared first

}

n = 44

Enter an integer: 77

n = 77

n = 44

n = 4251897

n = 44

جدید اعلان می کند که فقط درون n برنامۀ بالا سه بلوک داخلی دارد. اولین بلوک یک

اصلی را پنهان می کند. بنابراین وقتی n متغیر n همان بلوک، معتبر و موجود است. این

محلی قرار n مقدار 77 در این بلوک از ورودی دریافت می شود، این مقدار درون

جدیدی تعریف n اصلی بدون تغییر می ماند. در دومین بلوک n می گیرد و مقدار

فصل سوم / انتخاب 71

p q p||q

T T T

T F T

F T T

F F F

p q P&&q

T T T

T F F

F T F

F F F

p !p

T F

F T

اصلی این بلوک را نیز شامل م یشود. پس در سومین دستور n نمی شود، لذا حوزۀ

اصلی یعنی 44 چاپ می شود. بلوک سوم برنامه نیز مانند بلوک اول n خروجی، مقدار

جدید مقداردهی n اصلی را پنهان می نماید، اما این n جدید تعریف می کند که n یک

نمی شود. بنابراین در چهارمین خروجی، یک مقدار زباله چاپ می شود. در خط انتهایی

برنامه، تمام بلوک های محلی به پایان می رسند. به همین خاطر وقتی در این خط دستور

اصلی یعنی 44 چاپ می شود. n صادر می شود، مقدار n چاپ برای

3 شرط های مرکب ‐6

می توانند به صورت یک شرط مرکب با هم x>=y و n%d شرط هایی مانند

و ! (or) || و (and) && ترکیب شوند. این کار با استفاده ازعملگرهای منطقی

صورت می پذیرد. این عملگرها به شکل زیر تعریف می شوند: (not)

هر دو درست باشند q و هم p درست است اگر و تنها اگر هم p && q

هر دو نادرست باشند q و هم p نادرست است اگر و تنها اگر هم p || q

نادرست باشد p درست است اگر و تنها اگر !p

x برابر صفر و n%d نادرست است اگر و تنها اگر (n%d || x>=y) برای مثال

باشد. y کوچک تر از

سه عملگر منطقی بالا معمولا با استفاده از جداول درستی به گونۀ زیر بیان

می شوند:

نادرست و p&&q نادرست باشد، عبارت q درست و p طبق جدول های فوق اگر

درست است. p||q عبارت

 

 

72 برنامه سازی پیشرفته

3 را حل می کند ولی این کار را با استفاده از ‐ مثال بعدی همان مسألۀ مثال 5

شرط های مرکب انجام می دهد.

3 استفاده از شرط های مرکب ‐ * مثال 8

3 است. این نسخه برای یافتن کمینۀ سه عدد از ‐ برنامۀ زیر مانند برنامۀ مثال 5

شرط های مرکب استفاده کرده است:

int main()

{ int n1, n2, n3;

cout << "Enter three integers: ";

cin >> n1 >> n2 >> n3;

if (n1<=n2 && n1<=n3) cout << "Their minimum is "

<< n1 <<endl;

if (n2<=n1 && n2<=n3) cout << "Their minimum is "

<< n2 <<endl;

if (n3<=n1 && n3<=n2) cout << "Their minimum is "

<< n3 <<endl;

}

Enter three integers: 77 33 55

Their minimum is 33

3 ندارد و فقط نحوۀ استفاده ‐ برنامه ای که در این مثال آمد هیچ مزیتی بر مثال 5

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

3 ورودی کاربر پسند ‐ * مثال 9

را وارد کند: "Y" یا "y" این برنامه به کاربر امکان می دهد که برای پاسخ مثبت

int main()

{ char ans;

cout << "Are you enrolled (y/n): ";

cin >> ans;

if (ans= ='Y' || ans= ='y') cout << "You are enrolled.\n";

else cout << "You are not enrolled.\n";

}

Are you enrolled (y/n): N

 

فصل سوم / انتخاب 73

You are not enrolled.

را به عنوان جواب های ممکن پیشنهاد n و y برنامۀ بالا از کاربر پاسخی می خواهد و

نباشد، 'Y' یا 'y' می دهد. اما هر کاراکتر دیگری را هم می پذیرد و اگر آن کاراکتر

است. "no" فرض می کند که پاسخ کاربر

3 ارزیابی میانبری ‐7

عملگرهای && و || به دو عملوند نیاز دارند. یعنی به دو مقدار نیاز دارند تا

مقایسه را روی آن دو انجام دهند. شرط های مرکب که از && و || استفاده می کنند

عملوند دوم را بررسی نمی کنند مگر این که لازم باشد. جداول درستی نشان می دهد که

q نادرست باشد. در این حالت دیگر نیازی نیست که p نادرست است اگر p&&q

درست باشد و در این حالت هم p درست است اگر p||q بررسی شود. همچنین

بررسی شود. در هر دو حالت گفته شده، با ارزیابی عملوند اول به q نیازی نیست که

سرعت نتیجه معلوم می شود. این کار ارزیابی میانبری نامیده می شود.

3 ارزیابی میانبری ‐ * مثال 10

برنامۀ زیر بخش پذیری اعداد صحیح را بررسی می کند:

int main()

{ int n, d;

cout << "Enter two positive integers: ";

cin >> n >> d;

if (d != 0 && n%d == 0) cout << d << " divides " << n

<< endl;

else cout << d << " does not divide " << n << endl;

}

صفر است. بنابراین شرط مرکب درست است: n%d مثبت و d ، در اجرای زیر

Enter two integers: 300 5

5 divides 300

صفر نیست. بنابراین شرط مرکب n%d مثبت است اما d ، در اجرای بعدی

نادرست است:

74 برنامه سازی پیشرفته

Enter two integers: 300 7

7 does not divide 300

صفر است. پس به سرعت برآورد می شود که شرط مرکب d ، در آخرین اجرا

ارزیابی شود: n%d == نادرست است بدون این که عبارت دوم یعنی 0

Enter two integers: 300 0

0 does not divide 300

صفر d ارزیابی میانبری در مثال بالا از خرابی برنامه جلوگیری م یکند زیرا وقتی

را محاسبه کند. n%d است، رایانه نمی تواند عبارت

3 عبارات منطقی ‐8

یک عبارت منطقی شرطی است که یا درست است یا نادرست. در مثال قبلی

عبارات منطقی هستند. قبلا (d>0 && n%d== و ( 0 n%d == و 0 d> عبارات 0

دیدیم که عبارات منطقی با مقادیر صحیح ارزیابی می شوند. مقدار صفر به معنای

« عبارات بولی » نادرست و هر مقدار غیر صفر به معنای درست است. به عبارات منطقی

هم می گویند.

چون همۀ مقادیر صحیح ناصفر به معنای درست تفسیر می شوند، عبارات منطقی

اغلب تغییر قیافه می دهند. برای مثال دستور

if (n) cout << "n is not zero";

را چاپ می کند زیرا عبارت n is not zero غیر صفر است عبارت n وقتی

غیر صفر است به عنوان درست تفسیر م یگردد. کد زیر را n وقتی مقدار (n) منطقی

نگاه کنید:

if (n%d) cout << "n is not a multiple of d";

وقتی ناصفر n%d ناصفر است اجرا م یگردد و n%d دستور خروجی فقط وقتی که

بخش پذیر نباشد. گاهی ممکن است فراموش کنیم که عبارات منطقی d بر n است که

مقادیر صحیح دارند و این فراموشی باعث ایجاد نتایج غیر منتظره و نامتعارف شود.

فصل سوم / انتخاب 75

3 یک خطای منطقی دیگر ‐ * مثال 11

این برنامه خطادار است:

int main()

{ int n1, n2, n3;

cout << "Enter three integers: ";

cin >> n1 >> n2 >> n3;

if (n1 >= n2 >= n3) cout << "max = " << n1; // LOGICAL ERROR!

}

Enter three integers: 0 0 1

max = 0

منشأ خطا در برنامۀ بالا این اصل است که عبارات منطقی مقدارهای عددی دارند. چون

از چپ به راست ارزیابی می شود، به ازای ورودی های فوق (n1>=n2>=n عبارت ( 3

به شکل « درست » 0 اما >= درست است چون 0 n1>=n اولین بخش ارزیابی یعنی 2

که 1 می باشد مقایسه n عدد 1 در حافظه نگهداری می شود. سپس این مقدار با مقدار 3

1 ارزیابی می شود که این هم درست است. نتیجه این است >= می شود. یعنی عبارت 1

که کل عبارت به عنوان درست تفسیر می شود گرچه در حقیقت این طور نیست! ( 0

بیشینۀ 0 و 1 نیست)

ایراد کار این جاست که خط اشتباه به طور نحوی صحیح است. بنابراین نه

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

3 مطرح شد قابل مقایسه است. نتیجۀ این مثال آن است که: ‐ که با آن چه در مثال 4

همیشه به خاطر داشته باشید عبارات منطقی مقدار عددی دارند، بنابراین شرط های »

مرکب می توانند گول زننده باشند

3 دستور های انتخاب تودرتو ‐9

دستورهای انتخاب می توانند مانند دستورالعمل های مرکب به کار روند. به این

صورت که یک دستور انتخاب می تواند درون دستور انتخاب دیگر استفاده شود. به این

روش، جملات تودرتو می گویند.

 

76 برنامه سازی پیشرفته

3 دستور های انتخاب تودرتو ‐ * مثال 12

3 را دارد: ‐ این برنامه همان اثر مثال 10

int main()

{ int n, d;

cout << "Enter two positive integers: ";

cin >> n >> d;

if (d != 0)

if (n%d = = 0) cout << d << " divides " << n << endl;

else cout << d << " does not divide " << n << endl;

else cout << d << " does not divide " << n << endl;

}

اول قرار گرفته if..else دوم درون دستور if..else در برنامۀ بالا، دستور

صفر نباشد. توجه کنید که در d دوم وقتی اجرا می شود که if..else است . پس

استفاده کنیم. اولی در اولین does not divide این جا مجبوریم دو بار از عبارت

صفر n%d صفر نباشد و d قرار گرفته و زمانی اجرا می شود که if..else دستور

صفر باشد. d گردد. دومی هم وقتی اجرا می شود که

به شکل تو در تو به کار می رود، کامپایلر از قانون زیر if..else وقتی دستور

جهت تجزیه این دستورالعمل مرکب استفاده می کند:

«. تنها جفت می شود if با آخرین else هر »

با به کارگیری این قانون، کامپایلر به راحتی می تواند کد پیچیدۀ زیر را رمز گشایی کند:

if (a > 0) if (b > 0) ++a; else if (c > 0) //BAD CODING STYLE

if (a > 4) ++b; else if (b < 4) ++c; else –a; //BAD CODING STYLE

else if (c < 4) --b; else --c; else a = 0; //BAD CODING STYLE

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

if (a > 0)

if (b > 0) ++a;

else

if (c > 0)

if (a < 4) ++b;

فصل سوم / انتخاب 77

else

if (b < 4) ++c;

else –a;

else

if (c < 4) –b;

else –c;

else a = 0;

یا به این شکل :

if (a > 0)

if (b > 0) ++a;

else if (c > 0)

if (a < 4) ++b;

else if (b < 4) ++c;

else –a;

else if (c < 4) –b;

else –c;

else a = 0;

زیرِ هم و در یک راستا نوشته می شوند. else if در شیوۀ دوم عبارات

3 استفاده از دستورهای انتخاب تودرتو ‐ * مثال 13

3 را دارد. در این نسخه برای یافتن ‐ 3 و 8 ‐ این برنامه همان اثر مثال های 5

تودرتو استفاده می شود: if..else کمینۀ سه عدد صحیح از دستور های

int main()

{ int n1, n2, n3;

cout << "Enter three integers: ";

cin >> n1 >> n2 >> n3;

if (n1 < n2)

if (n1 < n3) cout << "Their minimum is " << n1 << endl;

else cout << "Their minimum is " << n3 << endl;

else // n1 >= n2

if (n2 < n3) cout << "Their minimum is " << n2 << endl;

else cout << "Their minimum is " << n3 << endl;

}

 

78 برنامه سازی پیشرفته

Enter two integers: 77 33 55

Their minimum is 33

درست (n2<n نادرست است و سومین شرط ( 3 (n1<n در اجرای بالا، اولین شرط ( 2

کمینه است. n است. بنابراین گزارش می شود که 2

3 موثرتر است زیرا در هر اجرای آن فقط دو شرط ‐ این برنامه از برنامۀ مثال 8

سادۀ تودرتو به جای سه شرط مرکب ارزیابی م یشود ولی به نظر م یرسد این برنامه

3 داشته باشد زیر ا منطق این برنامه پیچیده تر ‐ ارزش کم تری نسبت به برنامۀ مثال 8

است. در مقایسه بین کارایی و سادگی، معمولا بهتر است سادگی انتخاب گردد.

3 کمی پیچیده تر: یک بازی حدسی ‐ * مثال 14

برنامۀ زیر عددی را که کاربر بین 1 تا 8 در ذهن دارد، پیدا می کند:

int main()

{ cout << "Pick a number from 1 to 8." << endl;

char answer;

cout << "Is it less than 5? (y|n): "; cin >> answer;

if (answer = = 'y') // 1 <=n <= 4

{ cout << "Is it less than 3? (y|n): "; cin >> answer;

if (answer = = 'y') // 1 <= n <= 2

{ cout << "Is it less than 2? (y|n): "; cin >> answer;

if (answer = = 'y') cout << "Your number is 1."

<< endl;

else cout << "Your number is 2." << endl;

}

else // 3 <= n <= 4

{ cout << "Is it less than 4? (y|n): "; cin >> answer;

if (answer = = 'y') cout << "Your number is 3."

<< endl;

else cout << "Your number is 4." << endl;

}

}

else // 5 <= n <= 8

{ cout << "Is it less than 7? (y|n): "; cin >> answer;

if (answer = = 'y') // 5 <= n <= 6

 

فصل سوم / انتخاب 79

{ cout >> "Is it less than 6? (y|n): "; cin >> answer;

if (answer = = 'y') cout << "Your number is 5."

<< endl;

else cout << "Your number is 6." << endl;

}

else // 7 <= n <= 8

{ cout << "Is it less than 8? (y n): "; cin >> answer;

if (answer = = 'y') cout << "your number is 7."

<< endl;

else cout << "Your number is 8." << endl;

}

}

}

برنامۀ بالا با تجزیۀ مسأله قادر است تنها با سه پرسش، هر یک از هشت عدد را

پیدا کند. در اجرای زیر، کاربر عدد 6 را در نظر داشته است:

Pick a number from 1 to 8.

Is it less than 5? (y|n) : n

Is it less than 7? (y|n) : y

Is it less than 6? (y|n) : n

Your number is 6.

3 ‐ سعی کنید منطق برنامۀ بالا را کشف کنید. به الگوریتم استفاده شده در مثال 14

الگوریتم جستجوی دودوی ی 1 می گویند. این الگوریتم روی مجموعه های مرتب به کار

می رود و به سرعت مشخص می کند آیا یک دادۀ مفروض در این مجموعه هست یا

خیر. در فص لهای بعدی روش های دیگری از جستجو را خواهیم دید.

else if 3 ساختار ‐10

تودرتو، اغلب برای بررسی مجموعه ای از حالت های if..else دستور

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

می سازند. else if بعدی خواهد بود. این قبیل کدها را معمولا با ساختار

1 – Binary search

 

 

 

80 برنامه سازی پیشرفته

برای بررسی حالت های موازی else if 3 استفاده از ساختار ‐ * مثال 15

برنامۀ زیر زبان کاربر را سوال می کند و سپس یک پیغام به همان زبان در

خروجی چاپ می نماید:

int main()

{ char language;

cout << "Engl., Fren., Ger., Ital., or Rus.? (e|f|g|i|r): ";

cin >> language;

if (language = = 'e') cout << "Welcome to ProjectC++.";

else if (language = = 'f') cout << "Bon jour, ProjectC++.";

else if (language = = 'g') cout << "Guten tag, ProjectC++.";

else if (language = = 'i') cout << "Bon giorno, ProjectC++.";

else if (language = = 'r') cout << "Dobre utre, ProjectC++.";

else cout << "Sorry; we don't speak your language.";

}

Engl., Fren., Ger., Ital., or Rus.? (e|f|g|i|r): i

Bon giorno, ProjectC++.

تودرتو استفاده کرده. کد بالا را if..else این برنامه در حقیقت از دستور

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

if (language = = 'e') cout << "Welcome to ProjectC++.";

else

if (language = = 'f') cout << "Bon jour, ProjectC++.";

else

if (language = = 'g') cout << "Guten tag, ProjectC++.";

else

if (language = = 'i') cout << "Bon giorno, ProjectC++.";

else

if (language = = 'r') cout << "Dobre utre, ProjectC++.";

else cout << "Sorry; we don't speak your language.";

اما قالب قبلی به علت این که درک منطق برنامه را آسا نتر می کند، بیشتر استفاده

می شود. همچنین به تورفتگی کمتری احتیاج دارد.

 

 

فصل سوم / انتخاب 81

برای مشخص کردن محدودۀ نمره else if 3 استفاده از ساختار ‐ * مثال 16

برنامۀ زیر یک نمرۀ امتحان را به درجۀ حرفی معادل تبدیل م یکند:

int main()

{ int score;

cout << "Enter your test score: "; cin >> score;

if (score > 100) cout << "Error: that score is out of range.";

else if (score >= 90) cout << "Your grade is an A." << endl;

else if (score >= 80) cout << "Your grade is a B." << endl;

else if (score >= 70) cout << "Your grade is a C." << endl;

else if (score >= 60) cout << "Your grade is a D." << endl;

else if (score >= 0) cout << "Your grade is an F." << endl;

else cout << "Error: that score is out of range.";

}

Enter your test score: 83

Your grade is a B.

به شکل آبشاری با دستورهای انتخاب به طور متوالی بررسی score مقدار متغیر

برسیم. else می شود تا این که یکی از شرط ها درست شود و یا به آخرین

switch 3 دستورالعمل ‐11

برای بررسی مجموعه ای else if می تواند به جای ساختار switch دستور

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

switch (expression)

{ case constant1: statementlist1;

case constant2: statementlist2;

case constant3: statementlist3;

:

:

case constantN: statementlistN;

default: statementlist0;

}

 

82 برنامه سازی پیشرفته

به case را برآورد می کند و سپس میان ثابت های expression این دستور ابتدا

دنبال مقدار آن م یگردد. اگر مقدار مربوطه از میان ثاب تهای فهرست شده یافت شد،

اجرا م یشود. اگر مقدار مورد نظر میان case مقابل آن statementlist دستور

statementlist وجود داشت، دستور default ها یافت نشد و عبارت case

یک عبارت اختیاری است. یعنی می توانیم default مقابل آن اجرا می شود. عبارت

باید به شکل یک نوع صحیح expression . آن را قید نکنیم switch در دستور

ها باید ثاب تهای صحیح باشند. constant ارزیابی شود و

3‐ 3 نسخۀ تغییریافته ای از مثال 16 ‐ * مثال 17

3 را دارد. در این نسخه از دستور ‐ این برنامه همان اثر برنامۀ مثال 16

استفاده شده: switch

int main()

{ int score;

cout << "Enter your test score: "; cin >> score;

switch (score/10)

{ case 10:

case 9: cout << "Your grade is an A." << endl; break;

case 8: cout << "Your grade is a B." << endl; break;

case 7: cout << "Your grade is a C." << endl; break;

case 6: cout << "Your grade is a D." << endl; break;

case 5:

case 4:

case 3:

case 2:

case 1:

case 0: cout << "Your grade is an F." << endl; break;

default: cout << "Error: score is out of range.\n";

}

cout << "Goodbye." << endl;

}

Enter your test score: 83

Your grade is a B.

 

فصل سوم / انتخاب 83

Goodbye.

بر 10 تقسیم می شود تا محدودۀ اعداد بین صفر تا 10 score در برنامۀ بالا ابتدا

محدود شود. بنابراین در اجرای آزمایشی، نمرۀ 83 به 8 تبدیل می شود، اجرای برنامه

break انشعاب می کند و خروجی مربوطه چاپ م یگردد. سپس دستور case به 8

خارج شده و به اولین دستور بعد switch موجب می شود که اجرای برنامه از دستور

چاپ می شود. "Goodbye." انشعاب کند. در آن جا عبارت switch از بلوک

قرار بگیرد. بدون این دستور، break دستور case لازم است در انتهای هر

خارج switch مربوطه را اجرا کرد از دستور case اجرای برنامه پس از این که

های زیرین را هم خط به خط می پیماید و دستورات مقابل case نمی شود، بلکه همۀ

آن ها را اجرا می کند. به این اتفاق، تلۀ سقوط 1 می گویند.

switch 3 تلۀ سقوط در دستور ‐ * مثال 18

3 رفتار کند ولی بدون ‐ قصد بر این است که این برنامه مثل برنامۀ 17

این برنامه دچار تلۀ سقوط می شود: break دستورهای

int main()

{ int score;

cout << "Enter your test score: "; cin >> score;

switch (score/10)

{ case 10:

case 9: cout << "Your grade is an A." << endl; // LOGICAL ERROR

case 8: cout << "Your grade is a B." << endl; // LOGICAL ERROR

case 7: cout << "Your grade is a C." << endl; // LOGICAL ERROR

case 6: cout << "Your grade is a D." << endl; // LOGICAL ERROR

case 5:

case 4:

case 3:

case 2:

case 1:

case 0: cout << "Your grade is an F." << endl; // LOGICAL ERROR

default: cout << "Error: score is out of range.\n";

}

1 – Fall-throw error

 

 

84 برنامه سازی پیشرفته

cout << "Goodbye." << endl;

}

Enter your test score: 83

Your grade is a B.

Your grade is a C.

Your grade is a D.

Your grade is an F.

Error: score is out of range.

Goodbye.

انشعاب شد و عبارت مقابل آن چاپ شد، case در اجرای فوق پس از این که به 8

می رود case وجود ندارد، اجرای برنامه به خط بعدی یعنی 7 break چون دستور

را نیز چاپ می کند و به همین ترتیب یکی یکی "Your grade is a C." و عبارت

را هم اجرا default را اجرا می نماید و سرانجام عبارت case همۀ عبارت های

خارج می شود. switch نموده و آنگاه از دستور

3 عملگر عبارت شرطی ‐12

اختصار در کدنویسی است. عملگر عبارت شرطی یکی C++ یکی از مزیت های

از امکاناتی است که جهت اختصار در کدنویسی تدارک دیده شده است. این عملگر را

به کار ببریم. این عملگر از نشانه های ? و : به if..else می توانیم به جای دستور

شکل زیر استفاده می کند:

condition ? expression1 : expression2;

بررسی می شود. اگر این شرط درست بود، condition در این عملگر ابتدا شرط

می شود و اگر شرط نادرست بود، حاصل expression حاصل کل عبارت برابر با 1

می شود. مثلا در دستور انتساب زیر: expression کل عبارت برابر با 2

min = ( x<y ? x : y );

را درون y نباشد مقدار x<y قرار می دهد و اگر min را درون x باشد مقدار x<y اگر

درون متغیر y و x قرار می دهد. یعنی به همین سادگی و اختصار، مقدار کمینۀ min

قرار می گیرد. عملگر عبارت شرطی یک عملگر س هگانه است. یعنی سه عملوند را min

 

 

84 برنامه سازی پیشرفته

cout << "Goodbye." << endl;

}

Enter your test score: 83

Your grade is a B.

Your grade is a C.

Your grade is a D.

Your grade is an F.

Error: score is out of range.

Goodbye.

انشعاب شد و عبارت مقابل آن چاپ شد، case در اجرای فوق پس از این که به 8

می رود case وجود ندارد، اجرای برنامه به خط بعدی یعنی 7 break چون دستور

را نیز چاپ می کند و به همین ترتیب یکی یکی "Your grade is a C." و عبارت

را هم اجرا default را اجرا می نماید و سرانجام عبارت case همۀ عبارت های

خارج می شود. switch نموده و آنگاه از دستور

3 عملگر عبارت شرطی ‐12

اختصار در کدنویسی است. عملگر عبارت شرطی یکی C++ یکی از مزیت های

از امکاناتی است که جهت اختصار در کدنویسی تدارک دیده شده است. این عملگر را

به کار ببریم. این عملگر از نشانه های ? و : به if..else می توانیم به جای دستور

شکل زیر استفاده می کند:

condition ? expression1 : expression2;

بررسی می شود. اگر این شرط درست بود، condition در این عملگر ابتدا شرط

می شود و اگر شرط نادرست بود، حاصل expression حاصل کل عبارت برابر با 1

می شود. مثلا در دستور انتساب زیر: expression کل عبارت برابر با 2

min = ( x<y ? x : y );

را درون y نباشد مقدار x<y قرار می دهد و اگر min را درون x باشد مقدار x<y اگر

درون متغیر y و x قرار می دهد. یعنی به همین سادگی و اختصار، مقدار کمینۀ min

قرار می گیرد. عملگر عبارت شرطی یک عملگر س هگانه است. یعنی سه عملوند را min

 

فصل سوم / انتخاب 85

برای تهیۀ یک مقدار به کار می گیرد. بهتر است عملگر عبارت شرطی فقط در مواقع

ضروری استفاده شود؛ وقتی که شرط و هر دو دستور خیلی ساده هستند.

3 نسخۀ جدیدی از برنامۀ یافتن مقدار کمینه ‐ * مثال 19

3 دارد: ‐ این برنامه اثری شبیه برنامۀ مثال 3

int main()

{ int m, n;

cout << "Enter two integers: ";

cin >> m >> n;

cout << ( m<n ? m : n ) << " is the minimum." << endl;

}

باشد و در غیر این m<n می شود اگر m برابر با ( m<n ? m : n ) عبارت شرطی

می شود. n صورت برابر با

3 کلمات کلیدی 1 ‐13

آشنا شدیم. دانستیم که این کلمات float و case و if اکنون با کلماتی مثل

معانی خاصی دارند. از این کلمات نمی توان به عنوان نام یک متغیر یا هر C++ برای

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

فقط باید برای معرفی یک نوع اعشاری به کار رود. یک کلمۀ کلیدی در float کلمۀ

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

استاندارد اکنون شامل 74 کلمۀ کلیدی است: C++ . منظور شده است

and and_eq asm

auto bitand Bitor

bool break case

catch char class

compl const const_cast

continue default delete

dodouble dynamic_cast else

enum explicit export

extern dfalse float

for friend goto 86 برنامه سازی پیشرفته

if inline int

long mutable namespace

new not not_eq

operator or or_eq

privat eprotected public

register reinterpret_cast return

short signed sizeof

static static_cast struct

swich template this

throw true try

typedef typoid typename

using union unsigned

virtual void volatile

wchar_t while xor

xor_eq

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

هستند. 74 کلمۀ C++ منحصر به dynamic_cast دیگر کلمات کلیدی همچون

را نیز شامل می شود. C هست که همۀ 32 کلمۀ کلیدی زبان C++ کلیدی در

دو نوع کلمۀ کلیدی وجود دارد: کلمه های رزرو شده و شناسه های استاندار.د

یک کلمۀ رزرو شده کلم های است که یک دستور خاص از آن زبان را نشان می دهد.

کلمات رزرو شده هستند. یک شناسۀ استاندارد کلمه ای else و if کلمۀ کلیدی

و bool است که یک نوع دادۀ استاندارد از زبان را مشخص می کند. کلمات کلیدی

شناسه های استاندارد هستند زیرا هر یک از آن ها یک نوع دادۀ خاص را در زبان int

به مراجع C++ مشخص می کنند. برای اطلاعات بیشتر در مورد کلمات کلیدی C++

این زبان یا راهنمای کامپایلرتان مراجعه کنید.

 

1 – Keywords

 

 

 

فصل سوم / انتخاب 87

پرسش های گزینه ای

کدام جمله صحیح است؟ if (k = 0) i=k; 1 – به ازای کد

کپی می شود. i در k مساوی با صفر باشد، آنگاه مقدار k الف) اگر

کپی می شود. i در k مساوی با غیر صفر باشد، آنگاه مقدار k ب) اگر

ج) کامپایلر خطا می گیرد زیرا عملگر برابری == است نه = .

کپی می شود. i در k مقدار k د) به ازای همۀ مقادیر

چه کاری انجام می دهد؟ if(b) !b; از نوع بولین باشد، کد b 2 – اگر متغیر

می کند. false را b باشد، آنگاه true برابر با b الف) اگر

می کند. true را b باشد، آنگاه false برابر با b ب) اگر

می کند. true را b می کند وگرنه false را b باشد، آنگاه true برابر با b ج) اگر

می کند. false را b می کند وگرنه true را b باشد، آنگاه false برابر با b د) اگر

معادل کدام یک از کدهای زیر است؟ if (i==0) if (j==0) k= 3 – کد ; 0

if ((i==0) || (j==0)) k= الف) ; 0

if ((i==0) && (j==0)) k= ب) ; 0

if (i==0) k= ج) ; 0

if (j==0) k= د) ; 0

4 – در ارزیابی عبارت های شرطی:

الف) صفر به معنای درست و هر مقدار غیر صفر به معنای نادرست است.

ب) صفر به معنای نادرست و هر مقدار غیر صفر به معنای درست است.

ج) یک به معنای درست و هر مقدار غیر یک به معنای نادرست است.

د) یک به معنای نادرست و هر مقدار غیر یک به معنای درست است.

چه روی می دهد؟ if(m) i++ else i--; یک متغیر بولین باشد، در کد m 5 – اگر

یک واحد i یک واحد افزوده می شود وگرنه از i باشد، به true برابر با m الف) اگر

کاسته می شود

یک واحد i یک واحد افزوده می شود وگرنه از i باشد، به false برابر با m ب) اگر

کاسته می شود

88 برنامه سازی پیشرفته

دو واحد i دو واحد افزوده می شود وگرنه از i باشد، به true برابر با m ج) اگر

کاسته می شود

دو واحد i دو واحد افزوده می شود وگرنه از i باشد، به False برابر با m د) اگر

کاسته می شود

چه رخ می دهد؟ if (i<0) i++; j++; 6 – در کد

یک واحد افزوده می شود j از صفر کوچک تر باشد، به i الف) اگر

یک واحد افزوده می شود j بزرگ تر یا مساوی صفر باشد، به i ب) اگر

هم یک واحد افزوده می شود. j یک واحد افزوده شود، به i ج) اگر به

یک واحد افزوده می شود. j ندارد و در هر حال به j ربطی به i د) مقدار

چه اتفاقی می افتد؟ if (i<j) {i++; j--;} 7 – در کد

یک واحد کاسته می شود j کوچک تر باشد، از j از i الف) اگر

یک واحد کاسته می شود j بزرگ تر باشد، از j از i ب) اگر

ندارد j یک واحد اضافه می شود و ربطی به i ج) در هر حال به

ندارد i یک واحد کاسته می شود و ربطی به j د) در هر حال از

8 – خروجی کد مقابل چیست؟

int n=55;

{ int n=77;

cout << n << endl;

}

cout << n;

الف) روی اولین سطر 55 چاپ می شود و روی دومین سطر 77 چاپ می شود

ب) روی اولین سطر 77 چاپ می شود و روی دومین سطر 55 چاپ می شود

ج) روی هر دو سطر مقدار 55 چاپ می شود

د) روی هر دو سطر مقدار 77 چاپ می شود

چیست؟ m= و 0 d= به ازای 2 if ((d>1) || (d/m)) d++; 9 – حاصل اجرای کد

الف) خطای تقسیم بر صفر رخ می دهد و برنامه متوقف می شود

نادیده گرفته می شود d++ نادرست است پس دستور if ب) شرط دستور

یک واحد اضافه می شود d ج) به

نادیده گرفته می شود d++ د) خطای تقسیم بر صفر رخ می دهد پس دستور

 

فصل سوم / انتخاب 89

پس از اجرای کد زیر، چیست؟ c باشد، مقدار c= و 2 b= و 1 a= 10 – اگر 0

if (a==1)

if (b==1) c++;

else c--;

c = د) 4 c = ج) 2 c = ب) 1 c = الف) 3

پس از اجرای کد زیر، چیست؟ i باشد، مقدار i = 11 – اگر 5

switch (i)

{ case 5: i++;

case 0: i--;

default: i--;

}

i = د) 3 i = ج) 4 i = ب) 5 i = الف) 6

12 – تله سقوط وقتی رخ می دهد که :

الف) به جای عملگر برابری (==) از عملگر جایگزینی (=) استفاده کنیم

پرانتزهای شرط را فراموش کنیم if ب) در دستور

ج) تلاش کنیم عددی را بر صفر تقسیم کنیم

را فراموش کنیم break دستورهای switch د) در دستور

معادل کدام یک از کدهای زیر است؟ if (x>y) p=x; else p=y; 13 – کد

p=( x>y ? y : x); ( ب p=( x>y ? x : y); ( الف

(x>y ? p=y : p=x); ( د (x>y ? p=x : p=y); ( ج

« عملگر عبارت شرطی یک عملگر سه گانه است » ؟ 14 – معنی جملۀ مقابل چیست

الف) یعنی عملگر عبارت شرطی سه شکل متفاوت دارد

ب) یعنی عملگر عبارت شرطی سه کاربرد متفاوت دارد

ج) یعنی عملگر عبارت شرطی ترکیبی از سه شرط است

د) یعنی عملگر عبارت شرطی سه عملوند را برای تهیۀ یک مقدار به کار می گیرد

15 – کدام دستور زیر، یک دستور انتخاب نیست؟

if ب) دستور break الف) دستور

switch د) دستور if..else ج) دستور

 

90 برنامه سازی پیشرفته

پرسش های تشریحی

از 100 تجاوز کرد cout بنویسید که اگر متغیر C++ 1‐ یک دستورالعمل منفرد در

را چاپ کند. "Too many" عبارت

2‐ چه اشتباهی در کدهای زیر است؟

a. cin << count;

b. if x < y min = x

else min = y;

3‐ چه اشتباهی در این کد برنامه وجود دارد؟

cout << "Enter n: ";

cin >> n;

if (n < 0)

cout << "That is negative. Try again." << endl;

cin >> n;

else

cout << "o.k. n = " << n << endl;

4‐ چه تفاوتی بین کلمۀ رزرو شده و شناسۀ استاندارد است؟

5‐ مشخص کنید هر یک از عبارات زیر درست است یا نادرست. اگر نادرست است

بگویید چرا؟

برابر است. !p || !q با عبارت !(p||q) الف ‐ عبارت

برابر است. !p با عبارت !!!p ب ‐ عبارت

برابر است. p && (q || r) با عبارت p && q || r ج ‐ عبارت

6‐ برای هر یک از عبار تهای بولی زیر یک جدول درستی بسازید که مقادیر درستی

نشان دهد: q و p آن ها را ( 0 یا 1) به ازای هر مقدار از عملوندهای

!p || q ‐ الف

p&&q || !p&&!q ‐ ب

(p || q) && !(p&&q) ‐ ج

7‐ با استفاده از جدول درستی تعیین کنید که آیا دو عبارت بولی در هر یک از

معادلات زیر برابرند یا خیر؟

فصل سوم / انتخاب 91

!(p && q) و !p && !q ‐ الف

!!p و p ‐ ب

!p || q و p || !q ‐ ج

p && (q && r) و (p && q) && r – د

p || (q && r) و (p || q) && r – ه

8‐ ارزیابی میانبری چیست و چه فاید های دارد؟

9‐ چه اشتباهی در کد زیر است؟

if (x = 0) cout << x << " = 0\n";

else cout << x << " != 0\n";

10 ‐ چه اشتباهی در کد زیر وجود دارد؟

if (x < y < z) cout << x << " < " << y << " < " <<

z << endl;

11 ‐ برای هر یک از شرط های زیر یک عبارت منطقی بسازید:

بزرگ تر یا مساوی 80 و کوچک تر از 90 باشد score ‐ الف

باشد 'N' یا 'n' برابر با answer ‐ ب

یک عدد زوج باشد ولی برابر با 8 نباشد n ‐ ج

باشد (capital) یک حرف بزرگ ch ‐ د

12 ‐ برای هر یک از شرط های زیر یک عبارت منطقی بسازید:

بین 0 و 7 باشد ولی برابر با 3 نباشد n ‐ الف

بین 0 و 7 باشد ولی زوج نباشد n ‐ ب

بر 3 بخش پذیر باشد ولی بر 30 بخش پذیر نباشد n ‐ ج

یک حرف بزرگ یا کوچک باشد ch ‐ د

13 ‐ چه اشتباهی در این کد است؟

if (x = = 0)

if (y = = 0) cout << "x and y are both zero."

<< endl;

else cout << "x is not zero." << endl;

14 ‐ چه تفاوتی بین دو دستورالعمل زیر است؟

a. if (n > 2) { if (n < 6) cout << "OK"; }

else cout << "NG"; 92 برنامه سازی پیشرفته

b. if (n > 2) { if (n < 6) cout << "OK" ;

else cout << "NG"; }

15 ‐ تلۀ سقوط چیست؟

16 ‐ عبارت زیر چگونه ارزیابی م یشود؟

(x < y ? -1 : (x == y ? 0 : 1) );

بنویسید که با استفاده از عملگر عبارت شرطی، C++ 17 ‐ یک دستورالعمل منفرد در

قرار دهد. absx را در متغیر x قدرمطلق

از 100 تجاوز count بنویسید که اگر متغیر C++ 18 ‐ یک دستورالعمل منفرد در

را چاپ کند با استفاده از: "Too many" کرد عبارت

if الف ‐ یک دستورالعمل

ب ‐ یک عملگر عبارت شرطی

 

 

 

فصل سوم / انتخاب 93

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

قابل تقسیم باشد پاسخی d بر n 3 را طوری تغییر دهید که تنها اگر ‐ 1‐ برنامۀ مثال 1

را چاپ کند.

3 را طوری تغییر دهید که کمینۀ چهار عدد صحیح را چاپ کند. ‐ 2‐ برنامۀ مثال 5

3 را طوری تغییر دهید که حد وسط سه عدد صحیح وارد شده را ‐ 3‐ برنامۀ مثال 5

چاپ کند.

3 را طوری تغییر دهید که همان اثر را داشته باشد اما بدون استفاده ‐ 4‐ برنامۀ مثال 6

از بلوک دستورالعمل.

3 چیست اگر اعلان خط پنجم برنامه را ‐ 5‐ پیش بینی کنید خروجی برنامۀ مثال 17

پاک کنیم. برنامۀ تغییریافته را برای بررسی پی شبینی خود اجرا کنید.

6‐ برنامه ای نوشته و اجرا کنید که سن کاربر را بخواند و اگر سن کوچ کتر از 18

را چاپ کند و اگر سن بین 18 و 65 بود "You are a child" بود عبارت

را چاپ کند و اگر سن بزرگ تر یا مساوی 65 بود "You are an adult" عبارت

را چاپ کند. "you are a cenior citizen" عبارت

7‐ برنامه ای نوشته و اجرا کنید که دو عدد صحیح را م یخواند و با استفاده از یک

عملگر عبارت شرطی، با توجه به این که آیا یکی از این دو مضرب دیگری است یا

را چاپ کند. "not" یا "multiple" خیر، عبارت

8‐ برنامه ای نوشته و اجرا کنید که یک ماشین حساب ساده را شبی هسازی م یکند که دو

عدد صحیح و یک کاراکتر را می خواند و سپس اگر کاراکتر (+) باشد مجموع را چاپ

کند و اگر کاراکتر (‐ ) باشد تفاضل را چاپ کند و اگر کاراکتر(*) باشد حاصل ضرب را

چاپ کند و اگر کاراکتر (/) باشد حاصل تقسیم را چاپ کند و اگر کاراکتر (%) باشد

استفاده کنید. switch باقیمانده تقسیم را چاپ کند. از یک دستورالعمل

9‐ برنامه ای نوشته و اجرا کنید که بازی "سنگ – کاغذ – قیچی" را انجام دهد. در این

بازی دو نفر به طور ه مزمان یکی از عبارات "سنگ" یا "کاغذ" یا "قیچی" را می گویند

(و یا یکی از علامت های از قبل مشخص را با دست نشان می دهند). برنده کسی است

که شیء غلبه کننده بر دیگری را انتخاب کرده باشد. حالات ممکن، چنین است که کاغذ

 

 

94 برنامه سازی پیشرفته

بر سنگ غلبه می کند (می پوشاند)، سنگ بر قیچی غلبه می کند (می شکند) و قیچی بر

کاغذ غلبه می کند (می برد). برای اشیاء از یک نوع شمارشی استفاده کنید.

حل کنید. switch 10 ‐ مسألۀ 9 را با استفاده از دستور

11 ‐ مسألۀ 9 را با استفاده از عبارات شرطی حل کنید.

12 ‐ برنامه ای را نوشته و اجرا کنید که یک معادلۀ درجه دوم را حل می کند. معادلۀ

ضرایب c و b و a . باشد ax2+bx+c= درجه دوم معادله ای است که به شکل 0

مجهول است. ضرایب، اعداد حقیقی هستند که توسط کاربر وارد می شوند. x هستند و

اعلان گردند. از آ نجا که معادلۀ درجه دوم double یا float بنابراین باید از نوع

استفاده کنید. جواب ها باید از نوع x و 2 x معمولا دو ریشه دارد، برای جواب ها از 1

اعلان گردند تا از خطای گرد کردن جلوگیری شود. double

13 ‐ برنامه ای را نوشته و اجرا کنید که یک عدد شش رقمی را می خواند و مجموع

شش رقم آن عدد را چاپ می کند. از عملگر تقسیم (/) و عملگر باقیمانده (%) برای

برابر با n بیرون کشیدن رقم ها از عدد ورودی استفاده کنید. برای مثال اگر عدد ورودی

برابر با رقم یکان هزار یعنی 6 است. n/1000% 876,543 باشد، آنگاه 10

mohsen_mahyar@yahoo.com

   + MOHSEN GHASEMI - ۱۱:۳۳ ‎ب.ظ ; ۱۳۸٩/٥/۱٧