740 likes | 927 Views
مبانی برنامهسازی با C++ جلسه دوم. علی شکیبا ali@shakiba.id.ir اسفند 1391. مباحث این جلسه. متغیرها، ورودی خروجی کاربر، عملگرهای محاسباتی در C++ ، عبارات شرطی. یادآوری. یادآوری. قبل از نوشتن هر برنامهای، صورت مساله را به درستی درک کنید، یک روش برای حل آن مساله ارائه کنید.
E N D
مبانی برنامهسازی باC++جلسه دوم علی شکیبا ali@shakiba.id.ir اسفند 1391
مباحث این جلسه • متغیرها، • ورودی خروجی کاربر، • عملگرهای محاسباتی در C++، • عبارات شرطی.
یادآوری • قبل از نوشتن هر برنامهای، • صورت مساله را به درستی درک کنید، • یک روش برای حل آن مساله ارائه کنید. • در هنگام نوشتن برنامه، • درک روشنی از ساختارهای برنامه نویسی داشته باشید، • مانند حلقهها، شرطها، توابع و مانند این، • از الگوهای برنامه نویسی صحیح استفاده کنید، • زبان برنامه نویسی متناسب با مساله خود را انتخاب کنید. •
الگوریتمها • یک برنامه، برای محاسبه پاسخ یک مساله، • دنبالهای از دستورات را اجرا میکند. • الگوریتم رویهای است برای تعیین • وظایفی که باید برای حل مساله انجام شوند، • ترتیب انجام آن وظایف، • مثال، دستور پخت یک کیک خامهای خوشمزه هجده طبقه! • کنترل جریان برنامه • تعیین ترتیبی که دستورات برنامه اجرا میشوند.
شبهکد • شبهکد • زبانی مصنوعی و غیر رسمی برای توصیف الگوریتمها است، • شبیه به زبانهای روزمره است، • نمیتوانند توسط یک کامپیوتر اجرا شوند، • مهمترین کاربرد آن، امکان فکر کردن درباره ساختار برنامه است، چرا که: • تبدیل آن به کد برنامه نویسی ساده است، • شبهکد میتواند تنها شامل دستورات اجرایی باشد.
متغیر • متغیر • مکانی از حافظه که میتوان داده(ها) را در آن ذخیره نمود، • تمام متغیرها در C++ باید دارای نام و نوع داده باشند، • نوع داده قبل از نام متغیر میآید، • انواع داده معمول • عدد صحیح (int)، • کاراکتر (char)، • ممیز شناور با دقت مضاعف (double)، • میتوان چندین متغیر از یک نوع را با یک دستور مشخص نمود. int test; double grade; char firstChar; int test1, test2, numberOfPCs;
متغیر (ادامه) • متغیر • نام متغیر باید یک نام معتبر باشد! • متشکل از دنبالهای از کاراکترها شامل حروف، ارقام و خط زیرین (_)، است، • نباید با رقم آغاز شود، • C++ به بزرگی و کوچکی حروف حساس است، • نباید از کلمات کلیدی باشد. int grade1, Grade1;
انتساب (Assignment) (عملگر =) • مقدار دهی اولیه در هنگام تعریف متغیرها، • اگر این کار را انجام ندهید، مقدار اولیه متغیر نامشخص است و میتواند هر مقداری باشد! • عادت خوب برنامه نویسی، مقداردهی اولیه همه متغیرها در هنگام تعریف است. intmyValue = 0; • انتساب در حین اجرا، • مقادیر سمت راست و سمت چپ • مقادیر سمت چپ در یک انتساب باید شناسه یک متغیر باشند، • مقادیر سمت راست در یک انتساب میتوانند هر عبارتی باشند، • مثال: distance = rate * time;مقدار سمت چپ: "distance"مقدار سمت راست: "rate * time"
قواعد انتساب داده • قواعد انتساب داده • همسان بودن نوع داده • قانون کلی: نمیتوان دادهای از یک نوع را در یک نوع دیگر قرار داد! intVar = 2.99; // 2 is assigned to intVar! • در صورت اجرای این دستور، تنها قسمت صحیح، 2، به متغیر نسبت داده میشود، • در این صورت، تبدیل نوع ضمنی یا خودکار فراخوانی شده است. • الفاظ (Literals) 2, 5.75, ‘Z’, "Hello World" • به عنوان ثابت در نظر گرفته میشوند، و نمیتوان آنها را در طول برنامه تغییر داد! • مثال 2 = 9;
الفاظ (Literals) • الفاظ • مثال • 2 یک لفظ int است، • 5.75 یک لفظ double است، • ‘Z’ یک لفظ char است، • “Hello!” یک لفظ string است. • مقادیر آنها را در حین اجرای برنامه نمیتوان تغییر داد.
ثوابت • قالب کلی تعریف ثوابت 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 است!
مثالی مهم و البته جالب! • به خاطر داشته باشید: محاسبات یک به یک انجام میشوند! • برای محاسبه 1 / 2 / 3.0 / 4، سه عمل تقسیم انجام میشوند: • 1 / 2 = 0 • 0 / 3.0 = 0.0 • 0.0 / 4 = 0.0 • بنابراین برای نیل به نتیجه مورد نظر، باید تک تک محاسبات و دقت محاسباتی آنها را مد نظر داشت!
تبدیل نوع داده • تبدیل متغیرها • برای اینکه محاسبات با دقت اعشار را الزام کنیم، میتوانیم به الفاظ عددی، .0 را اضافه کنیم! اما نمیتوان نوشت: myInt.0 • بنابراین برای متغیرها باید از تبدیل نوع داده صریح استفاده کرد! static_cast<double>(intVar) • مقدار متغیر صحیح intVar را به یک مقدار double تبدیل میکند، • نتیجه این محاسبه مورد استفاده قرار میگیرد، • این تبدیل تغییری در نوع یا محتویات intVar ایجاد نمیکند، • مثال doubleVar = static_cast<double>(intVar1) / intVar2;
تبدیل نوع داده (ادامه) • دو نوع! • ضمنی، یا خودکار • به صورت خودکار انجام میشود، 17 / 5.5 • منجر به تبدیل زیر میشود: 17 17.0 • صریح static_cast<double>(intVar) تبدیل صریح با دستور زیر نیز قابل انجام است، اما توصیه میکنم به استفاده از دستور فوق عادت کنید! (نوع داده مقصد) نام متغیر
عملگرهای اختصاری • عملگرهای افزایشی و کاهشی • عملگر ++، • z++ معادل با z = z + 1 است! • عملگر --، • z-- معادل با z = z – 1 است! Z++ و ++Z با یکدیگر متفاوت هستند! این دو مقدار را ارزیابی کرده و توجیه کنید! Z++ * 8 و ++Z * 8
Z++ یا ++Z؟ • پس افزایش (عملگر ++ در سمت راست متغیر باشد)intVar++ • ابتدا از مقدار فعلی استفاده کرده و سپس آن را یک واحد افزایش میدهد، • پیش افزایش++intVar • ابتدا مقدار فعلی را افزایش داده و سپس از مقدار جدید استفاده میکند.
ورودی و خروجی کنسول • اشیا مربوط بهI/O عبارتند از cin, cout, cerr • که در کتابخانه <iostream> در فضای نام std تعریف شده اند، • برای استفاده از آنها، میتوان از رویه ذیل استفاده نمود: #include <iostream>using namespace std; • این دستورات به C++ میگویند که تعاریف مربوط به cin، coutو cerr را از کجا به دست بیاورد!
خروجی کنسول • چه چیزهایی را میتوان به خروجی فرستاد؟ • هر دادهای مانند • متغیرها، • ثوابت، • الفاظ، • عبارات (که شامل سه مورد فوق نیز میباشد) cout << numberOfGames << " games played."; • منظور از Cascading، چاپ کردن چندین داده در خروجی با استفاده از یک دستور cout میباشد.
جدا کردن خطوط در خروجی • ایجاد خطوط جدید در خروجی • یادآوری:‘\n’ کاراکتر کنترلی خط جدید • سعی کنید به استفاده از endlعادت کنید! • مثال cout << "Hello World\n"; cout << "Hello World" << endl;
خروجی قالبدار • قالبدار کردن خروجی عددی • مثال cout << "The price is $" << price << endl; • اگر مقدار متغیر price (که به صورت double تعریف شده است)، برابر با 78.5 باشد، آنگاه مشخص نیست خروجی دقیقا به چه فرمی است! The price is $78.500000 The price is $78.5 • باید به صورت مشخص و صریح ذکر شود که C++ از چه قالب خروجی برای اعداد استفاده کند!
قالبدار کردن اعداد • دستورات زیر، نمایش معمول (با دو رقم اعشار) از اعداد ممیز شناور را موجب میشوند، 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; • در کنسول، منتظر دریافت یک ورودی میماند، • مقدار وارد شده در کنسول را به متغیر منسوب میکند.
اندکی درباره دریافت از ورودی در برنامههای ما! • همواره به کاربر پیامی مرتبط با نوع داده ورودی و ویژگیهای آن نشان دهید! • cout << "Enter number of dragons: ";cin >> numOfDragons; • به عدم وجود کاراکتر ‘\n’ در انتهای رشته cout و تفاوت حاصل از آن در خروجی دقت کنید! Enter number of dragons: ____ • سعی کنید قبل از هر cin، یک cout باشد تا کاربر بداند که باید چه دادهای را به عنوان ورودی وارد کند.
توضیحات • یکی از مهمترین اهداف توضیحات، خواناتر کردن برنامهها و سادهتر کردن فرآیند تغییر آنها است. • دو شیوه کلی: • //از محل قرار گیری دو اسلش تا پایان خط جاری به عنوان توضیح فرض میشود. • /* هر آنچه که بین این دو علامت قرار بگیرد، حتی کاراکتر خط جدید نیز به عنوان توضیح فرض می شود. */ • از هر دو روش به صورت معمول استفاده میشود.
کتابخانهها • برای استفاده از کتابخانهها در C++، از قالب دستوری زیر استفاده میکنیم: • #include <Library_Name> • به پیشپردازنده میگوید که کتابخانه مورد نظر را برای استفاده، به برنامه الحاق کند. • به صورت خیلی ساده میتوان گفت که قبل از کامپایل برنامه، کتابخانه مورد نظر را به برنامه الحاق میکند، • کتابخانههای زیادی برای C++ وجود دارند.
کتابخانه cmath • کافی است کتابخانه را به صورت زیر به برنامه الحاق کنیم: #include <cmath>
ارزیابی عبارات رابطهای • نوع داده bool • مقدار true یا false را باز میگرداند، • True و false، ثوابت از پیشتعریف شده برای نوع داده bool هستند.
== با = تفاوت دارد! • خطای معمول • معمولا منجر به خطای نحوی نمیشود! • چرا مشکل ایجاد میشود؟ • عباراتی که حاصل آنها یک مقدار باشد، میتوانند به عنوان شرط استفاده شوند! • صفر == نادرست، ناصفر == درست! #include <iostream> using namespace std; int main() { int a = 0; cout << (a = 10) << endl; return 0; } 10
== با = تفاوت دارد! (ادامه) • مثال if ( payCode == 4 ) cout << "You get a bonus!" << endl; • اگر payCode برابر با 4 باشد، شامل پاداش میشود. • حال اگر == را با = جایگزین کنیم: if ( payCode = 4 )cout << "You get a bonus!" << endl; • مقدار payCode را به 4 تنظیم میکند (مقدار قبلی آن اهمیتی ندارد)، • چون 4 ناصفر است، بنابراین شرط صحیح است! • بنابراین در هر صورت، پاداش نسبت داده میشود.
عملگرهای منطقی • && (عطف) if ( gender == 1 && age >= 65 ) ++seniorFemales; • || (فصل) if ( semesterAverage >= 90 || finalExam >= 90 )cout << "Student grade is A" << endl;
عملگرهای منطقی (ادامه) • ! (نقیض) if ( !( grade == sentinelValue ) )cout << "The next grade is " << grade << endl; یا به صورت معادل if ( grade != sentinelValue )cout << "The next grade is " << grade << endl;
اولویت عملگرها بیشترین اولویت کمترین اولویت
اولویت عملگرها (ادامه) بیشترین اولویت کمترین اولویت
اولویت عملگرها (ادامه) بیشترین اولویت کمترین اولویت