440 likes | 667 Views
دستور if. دستور if موجب ميشود برنامه به شکل شرطي اجرا شود. نحو آن به گونۀ زير است: If ( condition ) statement ; Condition که شرط نامیده میشود يك عبارت صحيح است (عبارتی که با یک مقدار صحیح برآورد میشود) statement هر فرمان قابل اجرا باشد. condition مقدار غير صفر داشته باشد.
E N D
دستور if دستور if موجب ميشود برنامه به شکل شرطي اجرا شود. نحو آن به گونۀ زير است: If (condition) statement; Conditionکهشرط نامیده میشود يك عبارت صحيح است (عبارتی که با یک مقدار صحیح برآورد میشود) statement هر فرمان قابل اجرا باشد. condition مقدار غير صفر داشته باشد. شرط درون پرانتز ( )
2- دستورif..else دستور if..else موجب ميشود بسته به این که شرط درست باشد یا خیر، يكي از دو دستورالعمل فرعي اجرا گردد. نحو اين دستور به شکل زير است: if (condition) statement1; elsestatement2; condition همان شرط مساله است که يك عبارت صحيح میباشد و statement1و statement2 فرمانهاي قابل اجرا هستند. اگر مقدار شرط، غير صفر باشد، statement1 اجرا خواهد شد وگرنه statement2 اجرا ميشود.
مثال یک آزمون قابليت تقسيم 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; }
دقت کنید كه در ++Cعملگر جایگزینی با عملگر برابری فرق دارد. عملگر جایگزینی یک مساوی تکی " =" است ولی عملگر برابری، دو مساوی " = =" است. مثلا دستور x = 33;مقدار 33 را در x قرار میدهد ولی دستور x == 33;بررسی میکند که آیا مقدار x با 33 برابر است یا خیر. درک این تفاوت اهمیت زیادی دارد.
4- بلوكهاي دستورالعمل يك بلوك دستورالعملزنجيرهای از دستورالعملهاست كه درون براكت {} محصور شده، مانند : { int temp=x; x = y; y = temp; } در برنامههاي ++C یک بلوک دستورالعمل مانند یک دستورالعمل تکی است.
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; } مثال :يك بلوك دستورالعمل درون يك دستور if اين برنامه دو عدد صحيح را گرفته و به ترتيب بزرگتري، آنها را چاپ ميكند:
int main() {int n=44; cout << "n = " << n << endl; {int n; cout << "Enter an integer: "; cin >> n; cout << "n = " << n << endl; } { cout << " n = " << n << endl; } {int n; cout << "n = " << n << endl; } cout << "n = " << n << endl; }
int main() { intn=44; cout << "n = " << n << endl; { int n; cout << "Enter an integer: "; cin >> n; cout << "n = " << n << endl; } { cout << " n = " << n << endl; } { intn; cout << "n = " << n << endl; } cout << "n = " << n << endl; }
5 – شرطهاي مركب شرطهايي مانند n%d و x>=y ميتوانند به صورت يك شرط مركب با هم تركيب شوند. اين كار با استفاده ازعملگرهاي منطقي &&(and)و ||(or) و !(not) صورت ميپذیرد. اين عملگرها به شکل زير تعريف ميشوند: p && qدرست است اگر و تنها اگر هم pو هم q هر دو درست باشند p || qنادرست است اگر و تنها اگر هم p و هم qهر دو نادرست باشند !pدرست است اگر و تنها اگر p نادرست باشد براي مثال(n%d || x>=y)نادرست است اگر و تنها اگر n%dبرابر صفر و x كوچكتر از y باشد.
سه عملگر منطقي && (and) و || (or) و ! (not) معمولا با استفاده از جداول درستي به گونۀ زير بيان ميشوند: طبق جدولهای فوق اگر p درست و q نادرست باشد، عبارت p&&q نادرست و عبارت p||q درست است.
ارزيابي ميانبري شرطهاي مركب كه از && و || استفاده ميكنند عملوند دوم را بررسی نميكنند مگر اين كه لازم باشد.
عبارات منطقی يك عبارت منطقي شرطي است كه يا درست است يا نادرست. قبلا ديديم که عبارات منطقي با مقادير صحيح ارزيابي ميشوند. مقدار صفر به معناي نادرست و هر مقدار غير صفر به معناي درست است. به عبارات منطقی «عبارات بولی» هم میگویند.
چون همۀ مقادير صحيح ناصفر به معنای درست تفسیر ميشوند، عبارات منطقي اغلب تغيير قيافه ميدهند. برای مثال دستور if (n) cout << "n is not zero"; وقتي n غير صفر است عبارت n is not zero را چاپ ميكند زيرا عبارت منطقي (n) وقتی مقدار n غیر صفر است به عنوان درست تفسير ميگردد.
کد زیر را نگاه کنید: if (n%d) cout << "n is not a multiple of d"; دستور خروجي فقط وقتي كه n%d ناصفر است اجرا ميگردد و n%d وقتی ناصفر است که nبر dبخشپذير نباشد. گاهی ممکن است فراموش کنیم که عبارات منطقی مقادیر صحیح دارند و این فراموشی باعث ایجاد نتایج غیر منتظره و نامتعارف شود.
دستورهاي انتخاب تودرتو دستورهاي انتخاب ميتوانند مانند دستورالعملهاي مركب به كار روند. به این صورت که يك دستور انتخاب ميتواند درون دستور انتخاب ديگر استفاده شود. به اين روش، جملات تودرتو ميگويند.
مثال 12-3 دستورهاي انتخاب تودرتو اين برنامه همان اثر مثال 10-3 را دارد: 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 اول قرار گرفته است.
مثال 12-3 دستورهاي انتخاب تودرتو اين برنامه همان اثر مثال 10-3 را دارد: 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 اول قرار گرفته است.
9- ساختار else if دستور if..elseتودرتو، اغلب براي بررسي مجموعهای از حالتهاي متناوب یا موازي به كار ميرود. در این حالات فقط عبارت else شامل دستور if بعدی خواهد بود. این قبیل کدها را معمولا با ساختار else ifميسازند.
استفاده از ساختار else if براي مشخص کردن محدودۀ نمره برنامۀ زیر يك نمرۀ امتحان را به درجۀ حرفي معادل تبديل ميكند: int main() { int score; cout << "Enter your test score: "; cin >> score; if (score > 100) cout << "Error: that score is out of range."; elseif (score >= 90) cout << "Your grade is an A." << endl; elseif (score >= 80) cout << "Your grade is a B." << endl; elseif (score >= 70) cout << "Your grade is a C." << endl; elseif (score >= 60) cout << "Your grade is a D." << endl; elseif (score >= 0) cout << "Your grade is an F." << endl; else cout << "Error: that score is out of range."; }
استفاده از ساختار else if براي مشخص کردن محدودۀ نمره برنامۀ زیر يك نمرۀ امتحان را به درجۀ حرفي معادل تبديل ميكند: int main() { int score; cout << "Enter your test score: "; cin >> score; if (score > 100) cout << "Error: that score is out of range."; elseif (score >= 90) cout << "Your grade is an A." << endl; elseif (score >= 80) cout << "Your grade is a B." << endl; elseif (score >= 70) cout << "Your grade is a C." << endl; elseif (score >= 60) cout << “grade is a D." << endl; elseif (score >= 0) cout << "grade an F." << endl; elsecout << "Error: that score is out of range."; }
10- دستورالعمل switch دستور switch ميتواند به جاي ساختار else if براي بررسي مجموعهاي از حالتهای متناوب و موازي به كار رود. نحو دستور switch به شکل زير است: switch (expression) { case constant1: statementlist1; case constant2: statementlist2; case constant3: statementlist3; : : case constantN: statementlistN; default: statementlist0; }
عبارتdefaultیک عبارت اختیاری است. یعنی میتوانیم در دستور switch آن را قید نکنیم. expressionبايد به شکل يك نوع صحيح ارزيابي شود و constantها بايد ثابتهاي صحيح باشند. اين دستور ابتدا expression را برآورد ميكند و سپس ميان ثابتهاي case به دنبال مقدار آن ميگردد. اگر مقدار مربوطه از ميان ثابتهاي فهرستشده یافت شد، دستور statementlist مقابل آن case اجرا ميشود. اگر مقدار مورد نظر میان caseها یافت نشد و عبارت default وجود داشت، دستور statementlist مقابل آن اجرا ميشود.
11- عملگر عبارت شرطي عملگر عبارت شرطی یکی از امکاناتی است که جهت اختصار در کدنویسی تدارک دیده شده است. این عملگر را میتوانیم به جای دستور if..elseبه کار ببریم. اين عملگر از نشانههای ? و : به شکل زير استفاده ميكند: condition ? expression1 : expression2; در این عملگر ابتدا شرط condition بررسی میشود. اگر این شرط درست بود، حاصل کل عبارت برابر با expression1 میشود و اگر شرط نادرست بود، حاصل کل عبارت برابر با expression2 میشود.
مثلا در دستور انتساب زير: min = ( x<y ? x : y ); اگر x<y باشد مقدار x را درون min قرار میدهد و اگر x<y نباشد مقدار y را درون min قرار میدهد. یعنی به همین سادگی و اختصار، مقدار کمینۀ x و y درون متغیر min قرار میگیرد.
1- دستور while نحو دستورwhileبه شکل زير است: while (condition) statement; به جايcondition، يك شرط قرار میگیرد و به جايstatementدستوری که باید تکرار شود قرار ميگيرد. اگر مقدار شرط، صفر(یعني نادرست) باشد، statementناديده گرفته ميشود و برنامه به اولین دستور بعد ازwhileپرش ميكند. اگر مقدار شرط ناصفر(یعني درست) باشد، statementاجرا شده و دوباره مقدار شرط بررسی میشود. این تکرار آن قدر ادامه مییابد تا این که مقدار شرط صفر شود.
مثال 1-4 محاسبۀ حاصل جمع اعداد صحيح متوالي با حلقۀ while اين برنامه مقدار 1 + 2 + 3 + … + n را برای عدد ورودي n محاسبه ميكند: int main() { int n, i=1; cout << "Enter a positive integer: "; cin >> n; long sum=0; while (i <= n) sum += i++; cout << "The sum of the first " << n << " integers is " << sum; }
2- خاتمه دادن به يك حلقه int main() { int n, i=1; cout << "Enter a positive integer: "; cin >> n; long sum=0; while (true) {if (i > n) break; sum += i++; } cout << "The sum of the first " << n << " integers is " << sum; } قبلا ديديم كه چگونه دستور break براي كنترل دستورالعمل switch استفاده ميشود (به مثال 17-4 نگاه كنيد). از دستور break براي پایان دادن به حلقهها نیز ميتوان استفاده کرد. يكی از مزيتهای دستور break اين است كه فورا حلقه را خاتمه میدهد بدون این که مابقی دستورهای درون حلقه اجرا شوند.
مثال5-4 استفاده از تابع exit(0) تابع exit(0) روش ديگري براي خاتمه دادن به يك حلقه است. هرچند که این تابع بلافاصله اجرای کل برنامه را پایان ميدهد: int main() { long bound; cout << "Enter a positive integer: "; cin >> bound; cout << "Fibonacci numbers < " << bound << ":\n0, 1"; long f0=0, f1=1; while (true) { long f2 = f0 + f1; if (f2 > bound) exit(0); cout << ", " << f2; f0 = f1; f1 = f2; } } برنامهنویسان ترجیح میدهند از break برای خاتمه دادن به حلقههای نامتناهی استفاده کنند زیرا قابلیت انعطاف بیشتری دارد.
متوقف کردن يك حلقۀ نامتناهي : با فشردن کلیدهای Ctrl+C سیستم عامل یک برنامه را به اجبار خاتمه میدهد. كليد Ctrl را پايين نگه داشته و كليد C روي صفحهكليد خود را فشار دهيد تا برنامۀ فعلی خاتمه پیدا کند.
3- دستور do..while ساختار do..while روش دیگری برای ساختن حلقه است. نحو آن به صورت زیر است: dostatementwhile (condition); به جاي condition يك شرط قرار میگیرد و به جاي statement دستور یا بلوکی قرار میگیرد که قرار است تکرار شود. این دستور ابتدا statement را اجرا ميكند و سپس شرط condition را بررسی ميكند. اگر شرط درست بود حلقه دوباره تکرار میشود وگرنه حلقه پایان مییابد.
دستور do..while مانند دستور while است. با اين فرق كه شرط کنترل حلقه به جای این که در ابتدای حلقه ارزيابي گردد، در انتهای حلقه ارزيابي ميشود. یعنی هر متغير كنترلي به جاي اين كه قبل از شروع حلقه تنظیم شود، ميتواند درون آن تنظیم گردد. نتیجۀ دیگر این است كه حلقۀ do..while هميشه بدون توجه به مقدار شرط كنترل، لااقل يك بار اجرا ميشود اما حلقۀ while میتواند اصلا اجرا نشود.
مثال 7-4 محاسبۀ حاصل جمع اعداد صحيح متوالي با حلقۀ do..while اين برنامه همان تأثير مثال 1-5 را دارد: int main() { int n, i=0; cout << "Enter a positive integer: "; cin >> n; long sum=0; do sum += i++; while (i <= n); cout << "The sum of the first " << n << " integers is " << sum; }
* مثال 8-4 اعداد فاكتوريال اعداد فاكتوريال 0! و 1! و 2! و 3! و …با استفاده از رابطههايبازگشتي زير تعريف ميشوند: 0! = 1 , n! = n(n-1)! براي مثال، به ازاي n = 1 در معادلۀ دوم داريم: 1! = 1((1-1)!) = 1(0!) = 1(1) = 1 همچنین براي n = 2 داريم: 2! = 2((2-1)!) = 2(1!) = 2(1) = 2 و به ازاي n = 3 داريم: 3! = 3((3-1)!) = 3(2!) = 3(2) = 6
برنامۀ زیر همۀ اعداد فاكتوريال را که از عدد داده شده کوچکترند، چاپ میکند: int main() { long bound; cout << "Enter a positive integer: "; cin >> bound; cout << "Factorial numbers < " << bound << ":\n1"; long f=1, i=1; do { cout << ", " << f; f *= ++i; } while (f < bound); }
4- دستور for نحو دستورالعمل for به صورت زير است: for(initialization;condition;update) statement; سه قسمت داخل پرانتز، حلقه را کنترل میکنند. عبارت initialization برای اعلان یا مقداردهی اولیه به متغیر کنترل حلقه استفاده میشود.این عبارت اولین عبارتی است که ارزیابی میشود پیش از این که نوبت به تکرارها برسد. عبارت updateبرای پیشبردن متغیر کنترل حلقه به کار میرود. این عبارت پس از اجرای statement ارزیابی میگردد. عبارت condition برای تعیین این که آیا حلقه باید تکرار شود یا خیر به کار میرود. یعنی این عبارت، شرط کنترل حلقه است. اگر این شرط درست باشد دستور statement اجرا میشود.
بنابراین زنجیرۀ وقایعی که تکرار را ایجاد میکنند عبارتند از: 1 – ارزیابی عبارت initialization 2 – بررسی شرط condition . اگر نادرست باشد، حلقه خاتمه مییابد. 3 – اجرایstatement 4 – ارزیابی عبارت update 5 – تکرار گامهای 2 تا 4 عبارتهای initializationو conditionو updateعبارتهای اختیاری هستند. یعنی میتوانیم آنها را در حلقه ذکر نکنیم.
مثال 9-4 استفاده از حلقۀ for براي محاسبۀ مجموع اعداد صحيح متوالی اين برنامه همان تأثير مثال 1-5 را دارد: int main() { int n; cout << "Enter a positive integer: "; cin >> n; long sum=0; for (int i=1; i <= n; i++) sum += I; cout << "The sum of the first " << n << " integers is " << sum; } در C++ استاندارد وقتي يك متغیر كنترل درون يك حلقۀ for اعلان ميشود (مانند i در مثال بالا) حوزۀ آن متغیر به همان حلقۀ for محدود ميگردد. يعني آن متغير نميتواند بيرون از آن حلقه استفاده شود. نتیجۀ دیگر این است که ميتوان از نام مشابهي در خارج از حلقۀ for براي يك متغير ديگر استفاده نمود.
مثال 12-4 يك حلقۀ for نزولي برنامۀ زیر ده عدد صحيح مثبت را به ترتيب نزولی چاپ ميكند: int main() { for (inti=10; i > 0; i--) cout << " " << i; }
مثال 15-4 بيشتر از يك متغير كنترل در حلقۀ for حلقۀ for در برنامۀ زیر دو متغير كنترل دارد: int main() { for (int m=95, n=11; m%n > 0; m -= 3, n++) cout << m << "%" << n << " = " << m%n << endl; }
مثال 16-4 حلقههاي for تودرتو برنامۀ زیر يك جدول ضرب چاپ ميكند: #include <iomanip> #include <iostream> int main() { for (int x=1; x <= 10; x++) {for (int y=1; y <= 10; y++) cout << setw(4) << x*y; cout << endl; } }
5- دستور break وقتي دستور break درون حلقههای تودرتو استفاده شود، فقط روی حلقهای که مستقیما درون آن قرار گرفته تاثیر میگذارد. حلقههای بیرونی بدون هیچ تغییری ادامه مییابند. دستور break یک دستور آشناست. قبلا از آن برای خاتمه دادن به دستور switch و همچنین حلقههای while و do..while استفاده کردهایم. از این دستور برای خاتمه دادن به حلقۀ for نیز میتوانیم استفاده کنیم. دستور break در هر جایی درون حلقه میتواند جا بگیرد و در همان جا حلقه را خاتمه دهد.
6- دستور continue دستور break بقيۀ دستورهاي درون بلوك حلقه را نادیده گرفته و به اولین دستور بيرون حلقه پرش ميكند. دستور continue نیز شبیه همين است اما به جاي این که حلقه را خاتمه دهد، اجرا را به تكرار بعدي حلقه منتقل ميكند. این دستور، ادامۀ چرخۀ فعلی را لغو کرده و اجرای دور بعدی حلقه را آغاز ميکند.
مثال 19-4 استفاده از دستورهاي break و continue اين برنامۀ كوچك، دستورهاي break و continue را شرح ميدهد: int main() { int n = 1; char c; for( ; ;n++ ) { cout << "\nLoop no: " << n << endl; cout << "Continue? <y|n> "; cin >> c; if (c = = 'y')continue; break; } cout << "\nTotal of loops: " << n; }
دستور goto استفاده ممنوع