1.51k likes | 1.77k Views
مبانی برنامهسازی با C++ جلسه سوم. علی شکیبا ali@shakiba.id.ir فروردین 1392. مباحث این جلسه. حلقهها، توابع. یادآوری. یادآوری. قبل از نوشتن هر برنامهای، صورت مساله را به درستی درک کنید، یک روش برای حل آن مساله ارائه کنید. در هنگام نوشتن برنامه،
E N D
مبانی برنامهسازی باC++جلسه سوم علی شکیبا ali@shakiba.id.ir فروردین 1392
مباحث این جلسه • حلقهها، • توابع.
یادآوری • قبل از نوشتن هر برنامهای، • صورت مساله را به درستی درک کنید، • یک روش برای حل آن مساله ارائه کنید. • در هنگام نوشتن برنامه، • درک روشنی از ساختارهای برنامه نویسی داشته باشید، • مانند حلقهها، شرطها، توابع و مانند این، • از الگوهای برنامه نویسی صحیح استفاده کنید، • زبان برنامه نویسی متناسب با مساله خود را انتخاب کنید. •
الگوریتمها • یک برنامه، برای محاسبه پاسخ یک مساله، • دنبالهای از دستورات را اجرا میکند. • الگوریتم رویهای است برای تعیین • وظایفی که باید برای حل مساله انجام شوند، • ترتیب انجام آن وظایف، • مثال، دستور پخت یک کیک خامهای خوشمزه هجده طبقه! • کنترل جریان برنامه • تعیین ترتیبی که دستورات برنامه اجرا میشوند.
شبهکد • شبهکد • زبانی مصنوعی و غیر رسمی برای توصیف الگوریتمها است، • شبیه به زبانهای روزمره است، • نمیتوانند توسط یک کامپیوتر اجرا شوند، • مهمترین کاربرد آن، امکان فکر کردن درباره ساختار برنامه است، چرا که: • تبدیل آن به کد برنامه نویسی ساده است، • شبهکد میتواند تنها شامل دستورات اجرایی باشد.
متغیر • متغیر • مکانی از حافظه که میتوان داده(ها) را در آن ذخیره نمود، • تمام متغیرها در C++ باید دارای نام و نوع داده باشند، • نوع داده قبل از نام متغیر میآید، • انواع داده معمول • عدد صحیح (int)، • کاراکتر (char)، • ممیز شناور با دقت مضاعف (double)، • میتوان چندین متغیر از یک نوع را با یک دستور مشخص نمود. int test; double grade; char firstChar; int test1, test2, numberOfPCs;
انتساب (Assignment) (عملگر =) • مقدار دهی اولیه در هنگام تعریف متغیرها، • اگر این کار را انجام ندهید، مقدار اولیه متغیر نامشخص است و میتواند هر مقداری باشد! • عادت خوب برنامه نویسی، مقداردهی اولیه همه متغیرها در هنگام تعریف است. intmyValue = 0; • انتساب در حین اجرا، • مقادیر سمت راست و سمت چپ • مقادیر سمت چپ در یک انتساب باید شناسه یک متغیر باشند، • مقادیر سمت راست در یک انتساب میتوانند هر عبارتی باشند، • مثال: distance = rate * time;مقدار سمت چپ: "distance"مقدار سمت راست: "rate * time"
ثوابت • قالب کلی تعریف ثوابت constنوع داده NAME_OF_VAR = مقدار ; • مثال: const int NUMBER_OF_STUDENTS = 24; • در هر کجای برنامه، میتوان از این ثابت با نوشتن نامش استفاده کرد، • مقدار ثابت در طول برنامه، پس از تعریف؛ غیر قابل تغییر است!
دقت محاسبات ریاضی • دقت محاسبات ریاضی • یک اصل مهم در برنامه نویسی است که باید همواره در نظر گرفته شود، • ممکن است محاسبه عبارات آنگونه که شما انتظار دارید، پیش نروند! • دقت محاسبات توسط عملگر محاسباتی با بیشترین اولویت مشخص میشود! • عدم دقت به این مورد، متاسفانه یکی از معمولترین خطاها در بین برنامه نویسان C++ است!
مثالهایی از محاسبات ریاضی در C++ • مثال • 17 / 5 • هر دو عملوند صحیح هستند! • در نتیجه تقسیم صحیح انجام شده است! • 17.0 / 5 • یکی از عملوندها، ممیز شناور دارد، بنابراین • عملگر تقسیم با ممیز شناور اعمال شده است. • int intVar1 =1, intVar2=2;intVar1 / intVar2; • اعمال تقسیم صحیح، • جواب: 0 است!
تبدیل نوع داده • دو نوع! • ضمنی، یا خودکار • به صورت خودکار انجام میشود، 17 / 5.5 • منجر به تبدیل زیر میشود: 17 17.0 • صریح static_cast<double>(intVar) تبدیل صریح با دستور زیر نیز قابل انجام است، اما توصیه میکنم به استفاده از دستور فوق عادت کنید! (نوع داده مقصد) نام متغیر
عملگرهای اختصاری • عملگرهای افزایشی و کاهشی • عملگر ++، • z++ معادل با z = z + 1 است! • عملگر --، • z-- معادل با z = z – 1 است! Z++ و ++Z با یکدیگر متفاوت هستند! این دو مقدار را ارزیابی کرده و توجیه کنید! Z++ * 8 و ++Z * 8
ورودی و خروجی کنسول • اشیا مربوط بهI/O عبارتند از cin, cout, cerr • که در کتابخانه <iostream> در فضای نام std تعریف شده اند، • برای استفاده از آنها، میتوان از رویه ذیل استفاده نمود: #include <iostream>using namespace std; • این دستورات به C++ میگویند که تعاریف مربوط به cin، coutو cerr را از کجا به دست بیاورد!
قالبدار کردن اعداد • دستورات زیر، نمایش معمول (با دو رقم اعشار) از اعداد ممیز شناور را موجب میشوند، cout.setf(ios::fixed);cout.setf(ios::showpoint);cout.precision(2); • این دستورات، همه cout های پس از خود را تحت تاثیر قرار میدهند. • دقیقا دو رقم اعشار پس از ممیز داریم! • مثال: cout << "The price is $" << price << endl; • نتیجه به صورت ذیل است: The price is $78.50 • دقت نمایش را میتوان در هنگام اجرا نیز تغییر داد.
خروجی خطا • کافی است که خروجی را به cerr ارسال کنیم، • cerrدقیقا مانند cout کار میکند، • مکانیزمی برای تفاوت قائل شدن بین خروجی استاندارد و خروجی خطا فراهم میکند، (سعی کنیم به استفاده صحیح از این اشیا عادت کنیم )
ورودی با استفاده از cin • از شی cin برای ورودی و از شی cout برای خروجی استفاده میشود، • تفاوتها • ">>" عملگر استخراج از جریان • جهت آن از جریان به سمت متغیر(ها) است. • از شی "cin به جای شی "cout” استفاده میشود، • برای cin، از هیچ لفظی نمیتوان استفاده کرد. • باید ورودیای برای یک متغیر فراهم کند! cin >> num; • در کنسول، منتظر دریافت یک ورودی میماند، • مقدار وارد شده در کنسول را به متغیر منسوب میکند.
توضیحات • یکی از مهمترین اهداف توضیحات، خواناتر کردن برنامهها و سادهتر کردن فرآیند تغییر آنها است. • دو شیوه کلی: • //از محل قرار گیری دو اسلش تا پایان خط جاری به عنوان توضیح فرض میشود. • /* هر آنچه که بین این دو علامت قرار بگیرد، حتی کاراکتر خط جدید نیز به عنوان توضیح فرض می شود. */ • از هر دو روش به صورت معمول استفاده میشود.
کتابخانهها • برای استفاده از کتابخانهها در C++، از قالب دستوری زیر استفاده میکنیم: • #include <Library_Name> • به پیشپردازنده میگوید که کتابخانه مورد نظر را برای استفاده، به برنامه الحاق کند. • به صورت خیلی ساده میتوان گفت که قبل از کامپایل برنامه، کتابخانه مورد نظر را به برنامه الحاق میکند، • کتابخانههای زیادی برای C++ وجود دارند.
ارزیابی عبارات رابطهای • نوع داده bool • مقدار true یا false را باز میگرداند، • True و false، ثوابت از پیشتعریف شده برای نوع داده bool هستند.
اولویت عملگرها بیشترین اولویت کمترین اولویت
اولویت عملگرها (ادامه) بیشترین اولویت کمترین اولویت
اولویت عملگرها (ادامه) بیشترین اولویت کمترین اولویت
اولویت عملگرها (ادامه) بیشترین اولویت کمترین اولویت
ساختارهای کنترل جریان برنامه • اجرای دنبالهای • دستورات به ترتیبی که در برنامه آمده اند اجرا میشوند، • انتقال کنترل • دستور بعدی که اجرا میشود، الزاما دستور بعدی نیست! • سه ساختار کنترل جریان وجود دارد: • ساختار دنبالهای • به صورت پیش فرض، دستورات برنامه به ترتیبی که در برنامه آمده اند اجرا میشوند، • ساختارهای انتخاب • if, if/else, switch • ساختارهای تکرار • while, do/while, for
ساختار انتخابی if • ترجمه شبه کد به کد C++ ذیل، If student’s grade is greater than or equal to 60 Print “Passed” if ( grade >= 60 ) cout << "Passed"; A decision can be made on any expression. zero - false nonzero - true Example: 3 - 4 istrue
Condition Value if true Value if false عملگر شرطی سهتایی • عملگر شرطی سهتایی(?:) cout << ( grade >= 60 ? “Passed” : “Failed” );
ساختار تکرار while • ساختار تکرار • اجرای فرآیند مادامی که شرط صحیح باشد، تکرار میشود. • شبهکد while there are more items on my shopping list Purchase next item and cross it off my list • اجرای بدنه حلقه while تا زمانی ادامه مییابد که شرط حلقه نادرست شود! • مثال int product = 2; while ( product <= 1000 ) product = 2 * product;
کنترل تکرار با شمارنده • کنترل تکرار با شمارنده • اجرای بدنه حلقه تا زمانی ادامه پیدا میکند که شمارنده به مقدار مشخصی برسد، • تکرار معین • تعداد تکرارها از پیش مشخص است، • مثال A class of ten students took a quiz. The grades (integers in the range 0 to 100) for this quiz are available to you. Determine the class average on the quiz.
کنترل تکرار با شمارنده (ادامه) • شبه کد نمونه: Set total to zero Set grade counter to one While grade counter is less than or equal to ten Input the next grade Add the grade into the total Add one to the grade counter Set the class average to the total divided by tenPrint the class average • تمرین کلاسی: این شبهکد را به یک برنامه معتبر C++ تبدیل کنید.
کنترل تکرار با شمارنده (ادامه) 1 // Fig. 2.7: fig02_07.cpp 2 // Class average program with counter-controlled repetition. 3 #include <iostream> 4 5 using std::cout; 6 using std::cin; 7 using std::endl; 8 9 // function main begins program execution 10 int main() 11 { 12 int total; // sum of grades input by user 13 int gradeCounter; // number of grade to be entered next 14 int grade; // grade value 15 int average; // average of grades 16 17 // initialization phase 18 total = 0; // initialize total 19 gradeCounter = 1; // initialize loop counter 20
The counter gets incremented each time the loop executes. Eventually, the counter causes the loop to end. کنترل تکرار با شمارنده (ادامه) 21 // processing phase 22 while ( gradeCounter <= 10 ) { // loop 10 times 23 cout << "Enter grade: "; // prompt for input 24 cin >> grade; // read grade from user 25 total = total + grade; // add grade to total 26 gradeCounter = gradeCounter + 1; // increment counter 27 } 28 29 // termination phase 30 average = total / 10; // integer division 31 32 // display result 33 cout << "Class average is " << average << endl; 34 35 return0; // indicate program ended successfully 36 37 } // end function main
کنترل تکرار با شمارنده (ادامه) Enter grade: 98 Enter grade: 76 Enter grade: 71 Enter grade: 87 Enter grade: 83 Enter grade: 90 Enter grade: 57 Enter grade: 79 Enter grade: 82 Enter grade: 94 Class average is 81
کنترل تکرار با نگهبان • حال فرض کنید مساله قبلی را به صورت زیر تغییر دهیم: Develop a class-averaging program that will process an arbitrary number of grades each time the program is run • تعداد دانش آموزان نامشخص است! • برنامه چگونه متوجه شود که لیست پایان یافته است؟ • مقدار نگهبان در این مساله، • مشخص کننده پایان ورود دادهها، • هنگامیکه مقدار نگهبان به ورودی داده شد، حلقه خاتمه پیدا میکند. • باید مقدار نگهبان را به گونهای انتخاب نمود که یک ورودی معتبر نباشد، • مثلا نمره منفی نداریم، پس مقدار نگهبان -1، انتخابی مناسب است.
کنترل تکرار با نگهبان (ادامه) • یادآوری (حل گام به گام مساله) • شبه کد سطح بالا، Determine the class average for the quiz • اصلاح و پالایش شبه کد Initialize variables Input, sum and count the quiz grades Calculate and print the class average
کنترل تکرار با نگهبان (ادامه) • بسیاری از برنامهها از سه فاز تشکیل شدهاند: • مقداردهی اولیه • مقداردهی اولیه متغیرهای برنامه، • پردازش • دریافت داده از ورودی، تغییر دادن متغیرهای برنامه، • خاتمه • محاسبه و چاپ نتایج
کنترل تکرار با نگهبان (ادامه) • مقداردهی اولیه: Initialize variables به دستورات زیر تبدیل میشود: Initialize total to zero Initialize counter to zero • پردازش: Input, sum and count the quiz grades به دستورات زیر تبدیل میشود: Input the first grade (possibly the sentinel) While the user has not as yet entered the sentinel Add this grade into the running total Add one to the grade counter Input the next grade (possibly the sentinel)
کنترل تکرار با نگهبان (ادامه) • خاتمه Calculate and print the class average به دستورات زیر تبدیل میشود: If the counter is not equal to zero Set the average to the total divided by the counter Print the average Else Print “No grades were entered” • تمرین کلاسی: این شبهکد را به یک برنامه معتبر C++ تبدیل کنید.
Data type double used to represent decimal numbers. کنترل تکرار با نگهبان (ادامه) 1 // Fig. 2.9: fig02_09.cpp 2 // Class average program with sentinel-controlled repetition. 3 #include <iostream> 4 5 using std::cout; 6 using std::cin; 7 using std::endl; 8 using std::fixed; 9 10 #include <iomanip> // parameterized stream manipulators 11 12 using std::setprecision; // sets numeric output precision 13 14 // function main begins program execution 15 int main() 16 { 17 int total; // sum of grades 18 intgradeCounter; // number of grades entered 19 int grade; // grade value 20 21 double average; // number with decimal point for average 22 23 // initialization phase 24 total = 0; // initialize total 25 gradeCounter = 0; // initialize loop counter
static_cast<double>() treats total as a double temporarily (casting). Required because dividing two integers truncates the remainder. gradeCounter is an int, but it gets promoted to double. کنترل تکرار با نگهبان (ادامه) 26 27 // processing phase 28 // get first grade from user 29 cout << "Enter grade, -1 to end: "; // prompt for input 30 cin >> grade; // read grade from user 31 32 // loop until sentinel value read from user 33 while ( grade != -1 ) { 34 total = total + grade; // add grade to total 35 gradeCounter = gradeCounter + 1; // increment counter 36 37 cout << "Enter grade, -1 to end: "; // prompt for input 38 cin >> grade; // read next grade 39 40 } // end while 41 42 // termination phase 43 // if user entered at least one grade ... 44 if ( gradeCounter != 0 ) { 45 46 // calculate average of all grades entered 47 average = static_cast< double >( total ) / gradeCounter; 48
fixed forces output to print in fixed point format (not scientific notation). Also, forces trailing zeros and decimal point to print. Include <iostream> setprecision(2)prints two digits past decimal point (rounded to fit precision). Programs that use this must include <iomanip> کنترل تکرار با نگهبان (ادامه) 49 // display average with two digits of precision 50 cout << "Class average is " << setprecision( 2 ) 51 << fixed<< average << endl; 52 53 } // end if part of if/else 54 55 else// if no grades were entered, output appropriate message 56 cout << "No grades were entered" << endl; 57 58 return0; // indicate program ended successfully 59 60 } // end function main Enter grade, -1 to end: 75 Enter grade, -1 to end: 94 Enter grade, -1 to end: 97 Enter grade, -1 to end: 88 Enter grade, -1 to end: 70 Enter grade, -1 to end: 64 Enter grade, -1 to end: 83 Enter grade, -1 to end: 89 Enter grade, -1 to end: -1 Class average is 82.50
ساختار تکرار do/while • با ساختار تکرار while مشابه است، اما دارای تفاوتهای ذیل است: • شرط ادامه حلقه را در انتهای حلقه کنترل میکند، • بدنه حلقه حداقل برای یک بار اجرا میشود، • به فرم ذیل است: do { statement } while ( condition );