You are on page 1of 68

‫بسمه تعالی‬

‫دانشگاه صنعتی نوشیروانی بابل‬

‫جزوه مبانی برنامه نویسی کامپیوتر‬

‫استاد‪:‬‬
‫دکتر باباگلی‬

‫تهیه و تنظیم‪:‬‬
‫بردیا سهامی‬

‫ویراست ‪1‬‬

‫بهمن ماه ‪1398‬‬

‫‪0‬‬
‫فهرست مطالب‪:‬‬

‫مقدمه‬

‫مفاهیم اولیه‬

‫ساختارهای کنترلی‬

‫حلقه‬

‫توابع‬

‫آرایه‬

‫‪1‬‬
‫مقدمه‬

‫جزوه در دست شما حاصل ساعت ها تالش جهت گردآوری مطالب میباشد‪ .‬پیشنهاد‬
‫میگردد این جزوه را در کنار کتاب برنامه نویسی به زبان ‪( C++‬دایتل و دایتل)‬
‫مطالعه کنید‪ .‬امیدواریم این جزوه به درک مطالب درس کمک کند‪.‬‬

‫مثال های متنوعی در این جزوه وجود دارد که سواالت ساده با یک ستاره‪ ،‬سواالت‬
‫متوسط با دو ستاره و سواالت سخت با سه ستاره مشخص شده اند‪.‬‬

‫در صورت مشاهده هرگونه مشکل‪ ،‬خواهشمندیم ایرادات را به ایمیل زیر ارسال‬
‫‪Bardia_Sahami@yahoo.com‬‬ ‫فرمایید‪:‬‬

‫با آرزو موفقیت‪.‬‬

‫دکتر مهدی باباگلی – دکترا تخصصی ‪IT‬‬


‫بردیا سهامی – دانشجو مهندسی برق‬
‫بهمن ‪1398‬‬

‫‪2‬‬
‫فصل ‪ - 1‬مفاهیم اولیه‬

‫در دنیای برنامهنویسی‪ ،‬زبانهای برنامهنویسی به سه دسته زبان سطح پایین‪ ،‬سطح‬
‫متوسط و سطح باال دسته بندی میشوند‪ .‬زبان های سطح پایین نزدیکتر به زبان‬
‫ماشین (‪ 0‬و ‪ )1‬میباشد و هرچه باالتر میرویم‪ ،‬زبان های برنامهنویسی بیشتر شبیه‬
‫به زبان گفتاریمان میشوند‪ .‬زبان سطح پایین مانند زبان اسمبلی‪ ،‬سطح متوسط‬
‫مانند سی و سی پالس پالس و زبان سطح باال مثل پایتون‪ .‬زبان سی پالس پالس‬
‫توسعه یافته زبان سی بوده و یکی از زبان های معروف میباشد‪.‬‬

‫از این حرفها که بگذریم‪ ،‬میخواهیم نگاهی به ساده ترین برنامه بیندازیم‪.‬‬
‫>‪#include <iostream‬‬

‫;‪using namespace std‬‬

‫{ )( ‪int main‬‬

‫;”!‪cout << “Hello world‬‬

‫;‪return 0‬‬

‫}‬

‫!‪Hello world‬‬

‫همانطور که می بینید‪ ،‬این برنامه‪ ،‬عبارت !‪ Hello world‬را چاپ میکند‪ .‬حال به‬
‫اجزا آن میپردازیم‪ .‬زبان سی پالس پالس کدها را خط به خط چک و اجرا میکند و‬
‫به خط بعدی میرود‪ .‬در خط اول عبارت >‪ #include <iostream‬را میبینیم‪.‬‬
‫در سی پالس پالس‪ ،‬کتابخانه های پیشفرض و استانداردی وجود دارد که در آنها‪،‬‬
‫توابع پرکاربرد نوشته شده و در اختیار برنامه نویس قرار گرفتهاند‪ .‬جهت اضافه کردن‬
‫کتابخانهها و استفاده از آنها باید از >‪ #include <Library Name‬استفاده‬
‫کنیم‪ iostream .‬یکی از کتابخانههای پرکاربرد و یکی از مهمترین مسئولیتهای‬
‫آن‪ ،‬چاپ و خواندن مقادیر می باشد‪.‬‬

‫‪3‬‬
‫در خط بعدی عبارت ;‪ using namespace std‬را میبینیم که میگوید از‬
‫دستورات استاندارد استفاده خواهیم کرد‪( .‬همیشه این عبارت را بنویسید‪).‬‬

‫در خط بعد‪ ،‬عبارت )( ‪ int main‬را می بینیم که یک سری کد در داخل کروشه }{‬
‫وجود دارد‪ int main () .‬تابع اصلی می باشد که کد های اصلی در آن قرار می‪-‬‬
‫گیرند و اول دستورات این تابع اجرا می شوند‪.‬‬

‫در خط بعد عبارت ;”‪ cout << “Hello world‬را مشاهده میکنید‪ .‬برای چاپ‬
‫هر متن دلخواه‪ ،‬از دستور ‪ cout‬استفاده میکنیم‪ cout .‬تمام کاراکترهای موجود در‬
‫داخل " " را عینا چاپ میکند (مگر در موارد خاص)‪ .‬عالئم << به معنی چسباندن‬
‫کاراکترها به کاراکترهای قبلی میباشد‪ .‬پس ساختار کلی دستور ‪ cout‬به شکل زیر‬
‫است‪:‬‬

‫;”‪cout << “String 1” << “String 2” << … << “String‬‬


‫برای فهم بیشتر‪ ،‬عبارت !‪ Hello world‬را میتوان به روش های زیر چاپ کرد‪:‬‬

‫;”!‪cout << “Hello world‬‬


‫یا‬

‫;”!‪cout << “Hello “ << “world‬‬


‫یا‬

‫;”‪cout << “Hello‬‬


‫;”!‪cout << “world‬‬
‫یا به هر روشی که دلتان میخواهد‪ ،‬اما واضح است که دو روش اول بهتر از روش‬
‫آخر می باشند‪ ،‬چون صرفا باعث زیاد شدن حجم کدتان می شود‪.‬‬

‫‪4‬‬
‫در آخر نیز عبارت ;‪ return 0‬را می بینیم‪ return 0 .‬بدین معناست که اگر‬
‫برنامه به درستی اجرا شود‪ ،‬تابع ‪ main‬مقدار صفر را برمیگرداند که به معنای‬
‫اجرای صحیح برنامه میباشد‪.‬‬

‫‪ ‬توجه‪ :‬سی پالس پالس به کوچک و بزرگ بودن حروف حساس است‪ .‬بطور‬
‫مثال‪ ،‬استفاده از ‪ Cout‬بجای ‪ cout‬موجب خطا می شود‪.‬‬
‫‪ ‬نکته‪ :‬فعال به یاد داشته باشید که در انتهای هر خط از کد باید ; قرار دهید‬
‫مگر آنکه کروشه باشد‪ ،‬یا کامنت باشد‪ ،‬یا آن خط با ‪ #‬شروع شده باشد‪.‬‬

‫تا اینجا با شِمای کلی یک برنامه سی پالس پالس آشنا شدید‪.‬‬

‫کامنت گذاری یکی ازکارهای مهم جهت قابل فهم تر کردن برنامه و ساختار‪ ،‬و قابل‬
‫درک کردن آن برای دیگر برنامه نویسان می باشد‪ .‬سی پالس پالس کامنت ها را در‬
‫نظر نگرفته و از آنها می گذرد‪ .‬برای نوشتن کامنت‪ ،‬دو راه وجود دارد‪ .‬یک استفاده‬
‫از ‪ .//‬دو استفاده از *‪ /‬و ‪ .*/‬از ‪ //‬برای کامنت کردن یک خط استفاده می شود‬
‫که نوشته های بعد ‪ //‬کامنت می شوند و نوشته های قبل از آن در آن خط اجرا می‬
‫شوند‪ .‬از *‪( /‬آغاز) و ‪( */‬پایان) برای کامنت گذاشتن یک بلوک یا یک خط استفاده‬
‫می شود‪.‬‬

‫>‪#include <iostream‬‬

‫‪// This is a comment.‬‬

‫;‪using namespace std‬‬

‫{ )( ‪int main‬‬

‫‪cout << “Hello world!”; // This is a comment.‬‬

‫‪/* Comment first line‬‬

‫‪Comment second line */‬‬

‫;‪return 0‬‬

‫}‬

‫‪5‬‬
‫شاید تا االن برایتان پیش آمده است که چگونه می توان در هنگام چاپ کردن یک‬
‫متن به خطوط بعدی رفت‪ .‬در اینجا به چند دنباله گریزها یا ‪Scape Sequences‬‬
‫میپردازیم‪ .‬دنباله گریزها در داخل خود "" استفاده میشوند و از جمله مواردی‬
‫هستند که سی پالس پالس آنها را عینا چاپ نکرده‪ ،‬بلکه نوعی دستور هستد‪.‬‬

‫‪ :\n‬جهت رفتن به خط بعد‪.‬‬


‫‪ :\t‬جهت ایجاد ‪.tab‬‬
‫‪ :\r‬جهت بردن مکان نما به ابتدا همان خط‪.‬‬
‫‪ :\a‬بوق سیستم به صدا در میاید‪.‬‬
‫\\‪ :‬جهت نمایش \‪.‬‬
‫”\‪ :‬جهت نمایش "‪.‬‬

‫همانطور که گفته شد‪ ،‬دنباله گریزها در داخل " " قرار داده می شوند‪.‬‬

‫>‪#include <iostream‬‬

‫;‪using namespace std‬‬

‫{ )( ‪int main‬‬

‫;”!‪cout << “Welcome\nto\n\nC++\t‬‬

‫;‪return 0‬‬

‫}‬

‫‪Welcome‬‬

‫‪to‬‬

‫! ‪C++‬‬

‫‪6‬‬
‫اما از آنجایی که دنباله گریز ‪ \n‬بسیار کاربردی میباشد‪ ،‬دستوری به نام ‪ endl‬با‬
‫همان کاربرد است اما خارج از گیومه استفاده میشوند‪ .‬مثال قبل را می توان به‬
‫روش زیر نوشت‪:‬‬

‫<< ‪cout << “Welcome” << endl << “to” << endl << endl‬‬
‫;”!‪“C++\t‬‬
‫پس ساختار کلی ‪ cout‬را می توان به شکل زیر نوشت‪:‬‬

‫;‪cout << “String1 \n\t\a…” << “String2 \n\t\a…” << … << endl‬‬

‫حال میپردازیم به متغیرهای و ثابتها‪.‬‬


‫در سی پالس پالس‪ ،‬تعدادی متغیرهای پیشفرض وجود دارد‪ .‬برای ساخت‬
‫متغیرهای غیر پیشفرض و جدید در فصل مقدمه ای از برنامه نویسی پیشرفته به آن‬
‫می پردازیم‪ .‬انواع متغیرهای پیشفرض سی پالس پالس‪:‬‬

‫‪ :int‬ذخیره اعداد صحیح‪ 4 .‬بایت‪ .‬ذخیره از ‪ -231‬تا ‪.231 − 1‬‬

‫‪ :float‬ذخیره اعداد اعشاری تا ‪ 7‬رقم اعشار‪ 4 .‬بایت‪.‬‬

‫‪ :double‬ذخیره اعداد اعشاری تا ‪ 15‬رقم اعشار‪ 8 .‬بایت‪.‬‬

‫‪ :char‬ذخیره یک کاراکتر‪ 1 .‬بایت‪.‬‬

‫‪ :string‬جهت ذخیره چند کاراکتر در کنار هم (یک رشته متنی)‪.‬‬

‫‪ :bool‬ذخیره صفر و یک به عنوان درست و غلط‪ 1 .‬بیت‪.‬‬

‫‪ ‬توجه‪ :‬مقدار هر یک از این متغیرها در کامپیوترهای مختلف امکان دارد فرق‬


‫کند‪.‬‬
‫‪ ‬نکته‪ :‬صفر به معنای نادرست و یک به معنای درست می باشد‪.‬‬

‫‪7‬‬
‫‪ ‬نکته‪ :‬نام یک متغیر نباید با عدد شروع شود‪.‬‬

‫برای ساخت یک متغیر از ساختار زیر استفاده می کنیم‪:‬‬

‫;‪VariableType VariableName‬‬
‫یا‬

‫;‪VariableType VariableName = VariableValue‬‬


‫همانطور که می بینید‪ ،‬مقداردهی به متغیر در هنگام ساخت آن‪ ،‬اختیاری است‪.‬‬
‫نکته ای که وجود دارد این است که هنگام چاپ متغیرها‪ ،‬نباید آنها را در گیومه قرار‬
‫داد‪ .‬به مثال توجه کنید‪.‬‬

‫>‪#include <iostream‬‬

‫;‪using namespace std‬‬

‫{ )( ‪int main‬‬

‫‪int age; // Creating a variable called age with integer type.‬‬

‫;‪age = 27‬‬

‫;”‪cout << “You are “ << age << “ years old.‬‬

‫;‪return 0‬‬

‫}‬

‫‪You are 27 years old.‬‬

‫همانطور که می بینید‪ ،‬در اینجا ما یک متغیر به نام ‪ age‬از نوع ‪ int‬ساختهایم‬


‫(چون سن نمی تواند اعشاری باشد) و در خط بعد‪ ،‬به آن مقداری می دهیم که در‬
‫اینجا برنامه نویس مقدار ‪ 27‬را به ‪ age‬نسبت داده است‪ .‬سپس به کمک دستور‬
‫‪ cout‬سن شخص را چاپ کردهایم‪ .‬همانطور که مشاهده میکنید‪ age ،‬خارج از‬
‫گیومه است‪( .‬چون اگر داخل گیومه بود‪ ،‬عینا همان عبارت چاپ می شد و مقدار آن‬
‫چاپ نمیشد‪).‬‬
‫‪8‬‬
‫البته مقداردهی فوق را می توان به روش دوم نیز انجام داد‪ .‬می توان بجای‬

‫;‪int age‬‬
‫;‪age = 27‬‬
‫نوشت‪:‬‬

‫;‪int age = 27‬‬


‫اما امکان دارد نخواهیم برنامه نویس به متغیرها مقدار دهد و بجای آن‪ ،‬کاربر مقدار‬
‫دهد‪ .‬برای اینکار از دستور ‪ cin‬با اعالئم >> استفاده میکنیم‪.‬‬

‫ساختار ‪ cin‬بصورت زیر می باشد‪:‬‬

‫;‪cin >> VariableName‬‬


‫حال مثال باال را به کمک ‪ cin‬اجرا می کنیم‪.‬‬

‫>‪#include <iostream‬‬

‫;‪using namespace std‬‬

‫{ )( ‪int main‬‬

‫;‪int age‬‬

‫;‪cin >> age‬‬

‫;”‪cout << “You are “ << age << “ years old‬‬

‫;‪return 0‬‬

‫}‬

‫حال برنامه منتظر می ماند کاربر عددی وارد کند‪ .‬مثال کاربر عدد ‪ 30‬را وارد میکند‪.‬‬
‫خروجی به شکل زیر در خواهد آمد(مقادیری که کاربر وارد میکند با | شروع شده)‪:‬‬

‫‪9‬‬
‫‪|30‬‬

‫‪You are 30 years old.‬‬

‫اگر چند متغیر‪ ،‬مثال به نام ها ‪ b ،a‬و ‪ c‬داشتید و میخواهید به ترتیب مقادیر آنها‬
‫را از کاربر بخوانید‪ ،‬به روش یکی از روش های زیر میتوانید عمل کنید‪:‬‬

‫;‪cin >> a‬‬


‫;‪cin >> b‬‬
‫;‪cin >> c‬‬
‫یا‬

‫;‪cin >> a >> b >> c‬‬


‫که حالت دوم ساختار کلی تر دستور ‪ cin‬را نشان می دهد‪.‬‬

‫در مورد متغیرها هم (اگر از یک نوع بودند) می توان به جای‪:‬‬

‫;‪int age = 22‬‬


‫;‪int score = 16‬‬
‫نوشت‪:‬‬

‫;‪int age = 22, score = 16‬‬


‫پس ساختاری مشابه زیر پیدا می کند‪:‬‬

‫;‪VariableType VariableName1, …, VariableNameN‬‬


‫که مقدار دادن یا ندادن به آن اختیار می باشد‪.‬‬

‫‪10‬‬
‫‪ ‬نکته‪ :‬اگر عددی اعشاری به متغیری از نوع ‪ int‬نسبت داده شود‪ ،‬اعشار آن‬
‫حذف شده و فقط قسمت صحیح آن ذخیره می شود‪ .‬و بلعکس اگر به‬
‫متغیری از نوع ‪ double‬یا ‪ ،float‬عددی صحیح نسبت داده شود‪ ،‬نوع متغیر‬
‫آنها به ‪ int‬تغییر پیدا می کند‪.‬‬
‫‪ ‬نکته‪ :‬تقسیم دو عدد صحیح همواره عددی صحیح خواهد بود‪ .‬اگر در‬
‫تقسیمی‪ ،‬حداقل یکی از عناصر اعشاری باشد‪ ،‬حاصل تقسیم عددی اعشاری‬
‫خواهد بود‪.‬‬

‫نکات باال را می توان در مثال زیر مشاهده نمود‪:‬‬

‫>‪#include <iostream‬‬

‫;‪using namespace std‬‬

‫{ )( ‪int main‬‬

‫;‪int int1, int2‬‬

‫;‪double double1, double2‬‬

‫;‪int1 = 3/2‬‬

‫;‪int2 = 3/2.0‬‬

‫;‪double1 = 3/2‬‬

‫‪double2 = 3.0/2 // Or 3/2.0 or 3.0/2.0 returns the same results.‬‬

‫“ = ‪cout << “int1 = “ << int1 << “\nint2 = “ << int2 << “\ndouble1 = “ << double1 << “\ndouble2‬‬
‫;‪<< doubel2‬‬

‫;‪return 0‬‬

‫}‬

‫‪int1 = 1‬‬

‫‪int2 = 1‬‬

‫‪double1 = 1‬‬

‫‪double2 = 1.5‬‬

‫‪11‬‬
‫همانطور که مشاهده میکنید‪ ،‬در ‪ 3 int1‬و ‪ 2‬هر دو مقداری صحیح هستند و‬
‫حاصل تقسیم آنها مقداری صحیح بوده و عدد ‪ 1‬در ‪ int1‬ذخیره میشود‪.‬‬

‫در ‪ ،int2‬یکی از عوامل تقسیم عددی اعشاریست و حاصل تقسیم ‪ 1.5‬میشود‪ ،‬اما‬
‫چون متغیر ‪ ،int2‬از نوع ‪ int‬میباشد‪ ،‬مقدار اعشار آن حذف شده و مقدار ‪ 1‬در‬
‫‪ int2‬ذخیره میشود‪.‬‬

‫در ‪ 3 ،double1‬و ‪ 2‬هر دو مقداری صحیح هستند و حاصل تقسیم آنها مقداری‬
‫صحیح بوده و عدد صحیح ‪ 1‬در ‪ double1‬ذخیره میشود‪ .‬چون ‪ double1‬عددی‬
‫صحیح به آن نسبت داده شده است‪ ،‬به نوع ‪ int‬تغییر میکند‪.‬‬

‫در ‪ ،double2‬یکی از عوامل تقسیم عددی اعشاری است و حاصل تقسیم ‪ 1.5‬می‪-‬‬
‫شود‪ ،‬و چون ‪ double2‬نیز یک متغیر اعشاریست‪ ،‬مقدار ‪ 1.5‬در این متغیر ذخیره‬
‫میشود‪.‬‬

‫‪12‬‬
‫حال به یک مثال ساده دیگر میپردازیم که دو عدد صحیح از کاربر گرفته و مجموع‬
‫آنها را نشان میدهد‪.‬‬

‫>‪#include <iostream‬‬

‫;‪using namespace std‬‬

‫{ )( ‪int main‬‬

‫;‪int a, b, sum‬‬

‫;‪cout << “Enter a:“ << endl‬‬

‫;‪cin >> a‬‬

‫;‪cout << “Enter b:“ << endl‬‬

‫;‪cin >> b‬‬

‫;‪sum = a + b‬‬

‫;‪cout << a << “ + “ << b << “ = “ << sum‬‬

‫;‪return 0‬‬

‫}‬

‫حال بطور مثال اگر کاربر عداد ‪ 2‬و ‪ 3‬را وارد کند‪ ،‬داریم‪:‬‬

‫‪Enter a:‬‬

‫‪|2‬‬

‫‪Enter b:‬‬

‫‪|3‬‬

‫‪2+3=5‬‬

‫همانطور که میبینید‪ ،‬مقادیر ‪ a‬و ‪ b‬از کاربر خوانده شده و حاصل جمع آنها در‬
‫متغیری به نام ‪ sum‬ذخیره میشود‪ ،‬و سپس مقدار ‪ sum‬را نمایش میدهیم‪ .‬البته‬
‫بدون متغیر ‪ sum‬هم این کار را انجام داد‪ .‬متغیر ‪ sum‬را حذف کرده و خط ‪cout‬‬
‫را بصورت زیر بازنویسی میکنیم‪.‬‬

‫;‪cout << a << “ + “ << b << “ = “ << a + b‬‬

‫‪13‬‬
‫و نتیجه ای مشابه حاصل میشود‪ .‬پس میتوان بعد از عالئم << در دستور ‪،cout‬‬
‫یک عبارت ریاضی نیز نوشت‪.‬‬

‫از اعمال ریاضی میتوان به جمع (‪ ،)+‬تفریق (‪ ،)-‬ضرب (*)‪ ،‬تقسیم (‪ )/‬و پیمانه یا‬
‫باقیمانده (‪ )%‬اشاره کرد‪ .‬برای اولویت دهی به اعمال ریاضی از پرانتز استفاده می‬
‫شود‪.‬‬

‫‪ ‬توجه‪ :‬ترتیب اولویت ها‪ – 1 :‬پرانتز ‪ – 2‬ضرب و تقسیم و پیمانه ‪ – 3‬جمع و‬


‫تفریق‪.‬‬

‫با توابع ریاضی نیز در فصل های آینده آشنا خواهید شد‪.‬‬

‫حال میخواهیم به بحث ثابت ها بپردازیم‪ .‬ممکن است در برنامهتان‪ ،‬بخواهید از‬
‫عددی استفاده کنید که قرار نیست در برنامه تغییر کند‪ .‬به بیانی دیگر‪ ،‬این عدد‬
‫ثابت خواهد ماند‪ .‬برای ساخت ثابت (‪ )constant‬دو روش وجود دارد‪:‬‬

‫یک استفاده از ‪( const‬در داخل تابع)‪:‬‬

‫;‪const Type Name = Value‬‬


‫دو استفاده از ‪( #define‬خارج از تابع‪ ،‬بعد از کتابخانه ها)‪:‬‬

‫‪#define Name Value‬‬


‫‪ ‬توجه‪ :‬چون خط ‪ define‬با ‪ #‬شروع میشود‪ ،‬نباید بعد آن ; گذاشت‪.‬‬
‫‪ ‬نکته‪ :‬متغیر ها و ثابت ها تنها در داخل کروشه }{ مربوطه وجود داشته و‬
‫خارج از آن ها وجود ندارند‪ .‬به بیانی دیگر‪ ،‬متغیرها و ثابت ها پس از کروشه‬
‫مربوط به آنها‪ ،‬پاک می شوند‪ .‬متغیر های جهانی (‪ )global‬در سرتاسر برنامه‬
‫می توانند استفاده شوند و تنها با به پایان رسیدن برنامه پاک می شوند‪.‬‬

‫‪14‬‬
‫‪ ‬نکته‪ :‬هنگام ساخت ثابت‪ ،‬بالفاصله باید مقداردهی شوند و نمیتوان آنها را‬
‫رها کرد‪.‬‬
‫‪ ‬توجه‪ :‬اگر متغیری هنوز وجود داشته باشد‪ ،‬نمی توان دوباره متغیر با همان‬
‫نام ساخت و موجب ارور می شود‪.‬‬

‫در برنامه زیر‪ ،‬به ساخت متغیر و ثابت های جهانی و محلی می پردازیم‪:‬‬

‫>‪#include <iostream‬‬

‫‪#define Pi 3.14 // Global constant‬‬

‫‪int a = 2; // Global variable‬‬

‫;‪using namespace std‬‬

‫{ )( ‪int main‬‬

‫‪int b = 4; // Local variable‬‬

‫‪const float e = 2.7 // Local constant‬‬

‫;‪return 0‬‬

‫}‬

‫در آخر هم به مطلب ‪ casting‬میپردازیم که در فصل های آتی مورد نیاز میباشند‪.‬‬
‫‪ Cast‬کردن به معنای تبدیل یک متغیر یا یک ثابت از یک نوع به نوع دیگر‬
‫(بصورت موقت)‪ .‬برای اینکار از پرانتز و داخل پرانتز نوع مورد نظر و بعد از پرانتز نام‬
‫متغیر را مینویسیم‪ Casting .‬تنها در همان خط بصورت موفت اجرا میشود و از‬
‫آن خط به بعد‪ ،‬به حالت اول بر میگردد‪.‬‬
‫ساختار ‪:casting‬‬

‫‪(Goal VariableType)VariableName‬‬

‫‪15‬‬
‫گفته شد هر متغیر ‪ char‬یک کاراکتر را در خود نگه میدارد‪ .‬اعدادی از ‪ -128‬تا‬
‫‪ 127‬به هر کاراکتر نسبت داده میشود‪ .‬مثال عدد نسبت داده شده به کاراکتر ‪97 ،a‬‬
‫می باشد‪ ،‬یا عدد نسبت داده شده به کاراکتر @‪ ،‬عدد ‪ 40‬می باشد‪ .‬حال می‬
‫خواهیم برنامهای بنویسیم که یک کاراکتر از کاربر خوانده و عدد متناظر با آن با‬
‫نشان دهد‪.‬‬

‫>‪#include <iostream‬‬

‫;‪using namespace std‬‬

‫{ )( ‪int main‬‬

‫;‪char n‬‬

‫;‪int a‬‬

‫;‪cout << “Enter a character: “ << endl‬‬

‫;‪cin >> n‬‬

‫‪a = (int)n; // Casting n which is a char to int and saving it to a.‬‬

‫;‪cout << a‬‬

‫;‪return 0‬‬

‫}‬

‫‪Enter a character:‬‬
‫*|‬

‫‪52‬‬

‫با جستجو در گوگل‪ ،‬می توانید کدهای نسبت داده شده به کاراکترها را مشاهده‬
‫کنید (‪.)ASCII Table‬‬

‫در آخر این فصل هم‪ ،‬اشاره ای می کنیم به روش خالصه تر عملیات ریاضی‪ .‬بطور‬
‫مثال‪ a = a * n ،a = a + n ،‬و ‪ ..‬را میتوان به شکل ‪،a*=n ،a -=n ،a +=n‬‬
‫‪ a /= n‬و ‪ a %=n‬نشان داد‪ .‬به دلیل کاربرد زیاد ‪ ،a = a + 1‬و ‪ ،a = a – 1‬این دو‬

‫‪16‬‬
‫را به صورت ‪ a++‬یا ‪ ++a‬و ‪ a--‬یا ‪ --a‬نیز نشان میدهند‪ .‬تفاوت ‪ a++‬و ‪ ++a‬بدین‬
‫معناست که در ‪ a++‬اول عملیات کلی صورت می گیرد و سپس عملیت جمع بعالوه‬
‫یک‪ ،‬اما در ‪ ++a‬اول ‪ a‬با ‪ 1‬جمع می شود و سپس دیگر دستورات اجرا می شوند‪.‬‬
‫مثال اگر ‪ a = 5‬باشد‪ ،‬در ‪ ،b = a++‬مقادیر نهایی ‪ a‬و ‪ 6 b‬و ‪ 5‬اما در‬
‫‪ ،b = ++a‬مقادیر نهایی ‪ 6 a‬و ‪ 6 b‬می شود‪.‬‬

‫‪17‬‬
‫تمرین ها‬

‫پاسخ برخی از تمرینها در کالس حل تمرین‬

‫*‪ :1-1‬با فرض آنکه امسال سال ‪ 2020‬است‪ ،‬برنامه ای بنویسید که سن کاربر‬
‫دریافت کند و پس از دریافت عدد‪ ،‬بوق سیستم به صدا در آید و سپس سال تولد‬
‫میالدی کاربر را چاپ کند‪.‬‬

‫*‪ :1-2‬برنامه ای بنویسید که دو عدد ‪ a‬و ‪ b‬را از کاربر خوانده‪ ،‬سپس حاصل‬
‫باقیمانده ‪ a‬بر‪ b‬را به توان دو رسانده و پس حاصل به اضافه ‪ 5‬را در پیمانه ‪10‬‬
‫حساب کرده و سپس حاصل را نشان دهد‪.‬‬

‫*‪ :1-3‬برنامه ای بنویسید که قدر نسبت ‪ ،d‬تعداد ‪ n‬و جمله اول ‪ a0‬را دریافت‬
‫کرده و مجموع کل عناصر دنباله حسابی را نمایش دهد‪.‬‬

‫*‪ :1-4‬برنامه ای بنویسید که سه عدد را دریافت کرده و مجموع‪ ،‬میانگین و حاصل‬


‫ضرب آنها را نشان دهد‪.‬‬

‫*‪ :1-5‬برنامه ای بنویسید که شکل زیر را چاپ کند‪:‬‬

‫*‬

‫*‬ ‫*‬

‫*‬ ‫*‬

‫*‬ ‫*‬

‫*‬

‫**‪ :1-6‬برنامه ای بنویسید که یک حرف الفبای انگلیسی کوچک از کاربر گرفته و‬


‫حرف بزرگتر آن را نشان دهد‪ .‬بطور مثال ‪ a‬را از کاربر گرفته و ‪ A‬را نمایش دهد‪.‬‬

‫*‪ :1-7‬برنامه ای بنویسید که روز و ماه تولد را بصورت عددی ‪ 4‬رقمی وارد کرده و‬
‫ماه و روز تولد را جدا کرده و به شکل روبرو نمایش دهد‪Mah: ab Saal: cd :‬‬

‫‪18‬‬
‫فصل ‪ - 2‬ساختارهای کنترلی‬

‫تا اینجا با مفاهیم اولیه زبان سی پالس پالس آشنا شدهایم‪ .‬حال میخواهیم به‬
‫عملگرهای مقایسه بپردازیم‪ .‬از فصل قبل به یاد دارید که صفر به معنای نادرست و‬
‫یک به معنای درست است‪ .‬عملگرها مقایسه‪:‬‬

‫‪ :== .1‬برابر‬

‫‪ :!= .2‬نابرابر‬

‫‪ > .3‬و <‪ :‬بزرگتر و کوچکتر‬

‫‪ >= .4‬و =<‪ :‬بزرگتر مساوی و کوچکتر مساوی‬

‫‪ :|| .5‬یا ریاضی – برای دو عبارت شرطی‪ ،‬حداقل یکی از شرط ها درست باشند‬

‫‪ :&& .6‬و ریاضی – هر دو عبارت شرطی درست باشند‪.‬‬

‫‪ ‬نکته‪ :‬برای نشان دادن بازه نمیتوان‪ ،‬بطور مثال‪ ،‬از ‪ 1 < a < 5‬استفاده کرد‪.‬‬
‫بجای آن باید از "یا" و "و" ریاضی استفاده کرد‪a > 1 && a < 5 .‬‬
‫‪ ‬توجه‪ :‬گذاشتن فاصله در داخل این عملگرها (مثال نوشتن = ! بجا =!) سبب‬
‫خطا میشود‪.‬‬

‫حال میخواهیم با ساختار ‪ if‬آشنا شویم‪:‬‬

‫{ )‪If (Condition‬‬
‫;‪Codes‬‬
‫}‬

‫‪19‬‬
‫ساختار کلی دستور ‪ if‬بدین صورت است‪ .‬اگر شرط موجود در پرانتز درست (یک)‬
‫باشد‪ ،‬کد داخل بلوک ‪ if‬اجرا شده و اگر شرط موجود در پرانتز نادرست (صفر) باشد‪،‬‬
‫دستورات موجود در بلوک ‪ if‬اجرا نمیشود و سی پالس پالس از آن میگذرد‪.‬‬

‫‪ ‬توجه‪ :‬نوشتن عملگر انتساب (=) بجای عملگر مقایسه (==) سبب خطای‬
‫منطقی می شود‪.‬‬
‫‪ ‬توجه‪ :‬گذاشتن ; بعد از پرانتز دوم ‪ ،if‬سبب خطای منطقی شده و در هیچ‬
‫حالتی دستورات موجود در بلوک ‪ if‬اجرا نمیشود‪.‬‬

‫با ساختار ‪ if‬آشنا شدید و گفته شد اگر شرط درست باشد‪ ،‬دستورات اجرا شده‬
‫وگرنه‪ ،‬سی پالس پالس از آن گذشته و اتفاقی نمی افتد‪ .‬اما اکثر اوقات نیاز است که‬
‫در صورت نادرست بودن شرط‪ ،‬کدی دیگر اجرا شود‪ .‬در اینجا از از ساختار ‪else‬‬
‫استفاده می شود‪ ،‬که در صورت اجرا نشدن ‪ if‬قبلی‪ ،‬اجرا خواهد شد‪.‬‬

‫{ )‪If (Condition‬‬
‫;‪Codes‬‬
‫{ ‪} else‬‬
‫;‪Codes‬‬
‫}‬

‫‪20‬‬
‫برای فهم بیشتر‪ ،‬به برنامه زیر که فرد یا زوج بودن عدد وارد شده را بررسی میکند‪،‬‬
‫دقت کنید‪.‬‬
‫>‪#include <iostream‬‬

‫;‪using namespace std‬‬

‫{ )( ‪int main‬‬

‫;‪int a‬‬

‫;‪cin >> a‬‬

‫{ )‪if (a % 2 == 0‬‬

‫;”‪cout << “ZOJ‬‬

‫{ ‪} else‬‬

‫;”‪cout << “FARD‬‬

‫}‬

‫;‪return 0‬‬

‫}‬

‫‪|7‬‬

‫‪FARD‬‬

‫برای مثال‪ ،‬زمانی که کاربر عدد ‪ 7‬را وارد میکنید‪ ،‬اول عدد ‪ 7‬در متغیر ‪ a‬ذخیره‬
‫میشود‪ .‬سپس حاصل باقیمانده تقسیم ‪ 7‬به ‪ 2‬را در شرط ‪ if‬حساب میکند‪ .‬چون‬
‫باقیمانده ‪ 1‬شده است و برابر با ‪ 0‬نیست‪ ،‬دستور ‪ if‬اجرا نمی شود‪ .‬و چون دستور ‪if‬‬
‫اجرا نشده است‪ ،‬دستور ‪ else‬اجرا می شود‪ .‬اما اگر عددی مثل ‪ 4‬وارد می شد‪،‬‬
‫چون حاصل تقسیمش بر ‪ 2‬صفر بوده و شرط ‪ if‬درست می شد‪ ،‬بلوک دستورات ‪if‬‬
‫اجرا می شد‪ ،‬و به علت اجرا شدن دستورات ‪ ،if‬دیگر ‪ else‬اجرا نمیشد‪.‬‬

‫تا اینجای کار با شرایطی که دو حالت دارند آشنا شدید و آموختید که به کمک ‪ if‬و‬
‫‪ else‬میتوان این دو حالت را بررسی کنید‪ .‬اما برای مواقعی که سه یا بیشتر حالت‬
‫وجود دارد‪ ،‬باید چه کرد؟ در این شرایط‪ ،‬از ساختار ‪ else-if‬استفاده میکنیم که به‬

‫‪21‬‬
‫کمکش‪ ،‬می توانیم شرایطی که بیشتر از ‪ 2‬حالت برایشان امکان دارند را بررسی‬
‫کنیم‪:‬‬

‫{ )‪if (Condition 1‬‬


‫;‪Codes‬‬
‫{ )‪} else if (Condition 2‬‬
‫;‪Codes‬‬
‫}‬
‫…‬
‫{ )‪} else if (Condition N‬‬
‫‪Codes‬‬
‫{ ‪} else‬‬
‫;‪Codes‬‬
‫}‬
‫نکته ای که در مورد ‪ else-if‬وجود دارد این است‪ ،‬که سی پالس پالس شرایط را از‬
‫باال با پایین بررسی میکند‪ .‬اولین شرطی که درست باشد‪ ،‬کدهایش اجرا شده‪ ،‬و ‪if‬‬
‫های دیگر را بررسی نمیکند‪ .‬اگر هیچ شرطی درست نباشد‪ ،‬دستورات بلوک ‪else‬‬
‫اجرا خواهند شد‪ .‬حال برنامهای مینویسیم که اگر نمره دانشجو باالتر از ‪ 17‬باشد‪،‬‬
‫کلمه ‪ ،Good‬اگر بین ‪ 10‬تا ‪ 17‬باشد‪ ،‬کلمه ‪ ،Passed‬و در غیر این صورت‪ ،‬کلمه‬
‫‪ Failed‬را در خروجی چاپ کند‪ .‬فرض می شود کاربر عددی بزرگتر از صفر وارد‬
‫میکند‪.‬‬

‫‪22‬‬
‫>‪#include <iostream‬‬

‫;‪using namespace std‬‬

‫{ )( ‪int main‬‬

‫;‪double a‬‬

‫;‪cin >> a‬‬

‫{ ) )‪if ( (a >= 17) && (a <= 20‬‬

‫;”‪cout << “Good‬‬

‫{ )‪} else if (a >= 10‬‬ ‫)‪// Or (a >= 10) && (a < 17‬‬

‫;”‪cout << “Passed‬‬

‫{ ‪} else‬‬

‫;”‪cout << “Failed‬‬

‫}‬

‫;‪return 0‬‬

‫}‬

‫‪|12‬‬

‫‪Passed‬‬

‫اوال از آنجایی که نمره عددی اعشاریست‪ ،‬باید از متغیر ‪ double‬یا ‪ float‬استفاده‬


‫کنیم‪ .‬پس از آنکه کاربر عددی مثل ‪ 12‬وارد می کند‪ ،‬ابتدا شرط اول اول بررسی‬
‫میشود‪ .‬عدد ‪ 12‬در بازه ‪ 17‬تا ‪ 20‬نیست‪ ،‬پس ‪ if‬اول اجرا نمیشود‪ .‬سپس ‪ if‬دوم‬
‫بررسی میشود‪ 12 .‬عددی بزرگتر یا مساوی ‪ 10‬میباشد‪ ،‬پس شرط ‪ if‬دوم درست‬
‫بوده و دستوراتش اجرا میشود‪ .‬اما چون شرط دوم درست بوده‪ ،‬دیگر ‪ else‬اجرا‬
‫نمیشود‪ .‬در ‪ if‬دوم نوشته شده است‪ ،a >= 10 ،‬و شاید این سوال پیش آید که چرا‬
‫مانند ‪ if‬اولی‪ ،‬سقف تعیین نکردهایم‪ .‬گفتیم که شرطهای ‪ if‬ها به ترتیب بررسی‬
‫میشوند و تا آنجایی پیش میرود تا به یک شرط درست برسد و اگر هم نرسد‪،‬‬
‫دستورات ‪ else‬اجرا میشوند‪ .‬مثال در مورد عدد ‪ ،12‬سی پالس پالس نخست شرط‬
‫‪ if‬اول را چک میکند و به ‪ if‬دوم میرسد‪ .‬زمانی به شرط دوم میرسد که شرط اول‬
‫‪23‬‬
‫نادرست باشد‪ ،‬یعنی در بازه ‪ 17‬تا ‪ 20‬نباشد‪ ،‬پس از آنجایی که عدد ما حتما در بازه‬
‫‪ 17‬تا ‪ 20‬نیست‪ ،‬فقط الزم است شرط بزگتر از ‪ 10‬بودن را برای بازه ‪ 10‬تا ‪17‬‬
‫بررسی کنیم‪ ،‬و نیازی به گذاشتن شرط کوچکتر از ‪ 17‬وجود ندارد (چون حتما عدد‬
‫ما کوچکتر از ‪ 17‬بوده که ‪ if‬اول اجرا نشده است)‪ .‬منطق ‪ else-if‬بدین صورت‬
‫است‪.‬‬

‫گاهی نیاز است که چند شرط مختلف را بررسی کنیم‪ .‬در این صورت از به روش‬
‫درختی‪ ،‬النهای یا ‪ Nested ifs‬استفاده میشود‪ .‬روش همان روش قبلیست‪ ،‬اما‬
‫چند ‪ if‬تو در تو داریم‪.‬‬

‫بعضی اوقات‪ ،‬تعداد ‪ if‬ها بسیار زیاد میشود‪ .‬در صورتی که مقادیر مورد بحث‪،‬‬
‫مقادیری گسسته باشند‪ ،‬می توان از ساختار ‪ switch‬استفاده کرد که عملکردی‬
‫مشابه ‪ if‬دارد اما کمی خالصهتر است‪ .‬از ‪ switch‬برای مقادیر پیوسته (مثل بازه‬
‫نمرات در مثال قبلی) نمی توان استفاده کرد (یا اینکه بسیار دشوار می شود)‪.‬‬
‫ساختار ‪ switch‬بصورت زیر است‪:‬‬

‫{ )‪switch (Expression‬‬
‫‪case Condition1:‬‬
‫;‪Codes‬‬
‫;‪break‬‬
‫‪case Condition2:‬‬
‫;‪Codes‬‬
‫;‪break‬‬
‫…‬

‫‪24‬‬
‫‪case ConditionN:‬‬
‫;‪Codes‬‬
‫;‪break‬‬
‫‪default:‬‬
‫;‪Codes‬‬
‫}‬
‫برای درک بهتر‪ ،‬مثال زوج یا فرد بودن را با ‪ Switch‬پیاده سازی میکنیم‪.‬‬

‫>‪#include <iostream‬‬

‫;‪using namespace std‬‬

‫{ )( ‪int main‬‬

‫;‪int a‬‬

‫;‪cin >> a‬‬

‫{ )‪switch (a‬‬

‫‪case 0:‬‬

‫;”‪cout << “ZOJ‬‬

‫;‪break‬‬

‫‪case 1:‬‬

‫;”‪cout << “FARD‬‬

‫;‪break‬‬

‫}‬

‫;‪return 0‬‬

‫}‬

‫در عبارت )‪ switch (a‬میگوییم در مورد چه متغیری میخواهیم شرط گذاری‬


‫کنیم‪ .‬در ‪ case 0‬و ‪ case 1‬میگوییم اگر مقدار ‪ a‬یک بود چه کار کند و اگر ‪0‬‬
‫بود چه کار کند‪ .‬در واقع ‪ case 0‬می گوید آیا ‪a == 0‬؟ اگر صحیح بود‪ ،‬دستورات‬
‫‪25‬‬
‫مربوطه اجرا خواهند شد‪ .‬با ‪ break‬در آینده آشنا خواهیم شد‪ default .‬هم مانند‬
‫‪ else‬در ساختار ‪ else-if‬است‪ .‬اگر هیج ‪case‬یی اجرا نشود‪ default ،‬نهایتا اجرا‬
‫میشود که استفاده از آن اجباری نیست‪.‬‬

‫‪ ‬توجه‪ :‬پس از ‪ ،case‬نذاشتن فاصله باعث خطای منطقی می شود‪.‬‬

‫‪26‬‬
‫تمرین ها‬

‫*‪ :2-1‬برنامه ای بنویسید که دو عدد بگیرد و بگوید آیا اولی مضربی از دومی است‬
‫یا خیر‪.‬‬

‫*‪ :2-2‬برنامه ای بنویسید که ‪ 5‬عدد بگیرد و کوچک ترین و بزرگ ترین آنها را چاپ‬
‫کند‪.‬‬

‫*‪ :2-3‬برنامه ای بنویسید که ‪ 3‬عدد اعشاری ‪ b ،a‬و ‪ c‬را از یک معادله درجه دو‬
‫بگیرد و ریشه های آن معادله را بیابد‪.‬‬

‫*‪ :2-4‬مسعود نوجوان درشتی است و قد و وزن اون زیاد است‪ .‬بهخاطر همین‬
‫همیشه برای عبور از درها با چالش روبرو است (معموال درهایی که ارتفاعشان بلند‬
‫است‪ ،‬عرض کوچکی دارند و درهایی که عرضشان بزرگ است‪ ،‬ارتفاع کوتاهی‬
‫دارند)‪.‬حال مسعود میخواهد خانه بخرد و از صاحبخانه اندازهی عرض و ارتفاع در‬
‫ورودی خانه را گرفته است و میخواهد بداند که آیا میتواند از در خانه عبور کند یا‬
‫نه و برای حل این مسئله از شما کمک میخواهد‪ .‬دقت کنید که مسعود همیشه‬
‫صاف وارد خانه میشود و به هیچوجه برای رد شدن از در‪ ،‬انعطافی از خود نشان‬
‫نمیدهد‪ .‬اگر می توانند از درب در شوند‪ YES ،‬و در غیر این صورت کلمه ‪ NO‬را‬
‫چاپ کند‪( .‬کوئرا کالج)‬

‫**‪ :2-5‬سه ظرف خیلی بزرگ داریم که در ابتدا به ترتیب در آنها ‪ a ,b ,c‬لیتر‬
‫شیر وجود دارد‪ .‬در هرگام می توانیم دو ظرف انتخاب کرده و مقداری شیر (می‬
‫تواند این مقدار اعشاری هم باشد) از یک ظرف به ظرف دیگر منتقل کنیم (از‬
‫آنجایی که ظرفها خیلی بزرگ هستند و ما نیز خیلی حواسجمع هستیم‪ ،‬حتی‬
‫یک قطره شیر نیز هدر نمیرود و همهی آن داخل ظروف باقی میماند)‪.‬‬

‫‪27‬‬
‫هدف برابر کردن مقدار شیر در هر سه ظرف است‪ ،‬کمینه تعداد حرکات الزم را در‬
‫خروجی چاپ کنید‪ .‬سه عدد به شما داده می شود که بیانگر مقدار شیر هر ظرف‬
‫است‪ .‬در تنها خط خروجی کمینه تعداد گام های الزم برای برابر کردن مقدار شیر‬
‫در هر سه ظرف را چاپ کنید‪( .‬کوئرا کالج)‬

‫*‪ :2-6‬برنامه ای بنوسید که کاربر با وارد کردن شماره صندلی و ردیف‪ ،‬بگوید که‬
‫اول باید کاربر در سالن به راست حرکت یا چپ‪ .‬سپس بگوید کاربر باید چند دریف‬
‫به پایین رود و چند صندلی باید طی کند تا به صندلی خودش برسد‪ .‬اگر صندلی ‪1‬‬
‫تا ‪ 10‬بود‪ ،‬کاربر از راست (راست کاربر) و اگر از ‪ 11‬تا ‪ 20‬بود از چپ برود‪( .‬کوئرا‬
‫کالج)‬

‫**‪ :2-6‬برنامه ای بنویسید که کاربرد طول و عرض رئوس یک مستطیل افقی در‬
‫صفحه دکارتی را به شما بدهد‪ ،‬و برنامه طول و عرض گوشه چهارم را نمایش دهد‪.‬‬

‫‪28‬‬
‫***‪ :2-7‬بعد از مدتها که لیته توانست با فیته تماس بگیرد و قرار بگذارند‪ .‬لیته‬
‫در نقطه ‪ a‬شهر زندگی میکند و فیته نقطه ‪ b‬را برای اولین قرار انتخاب کردهاست‪.‬‬

‫در این شهر دو نوع قطار برای جابهجایی وجود دارد‪:‬‬

‫نوع اول‪ :‬نقطه ‪ x‬و ‪ x + 1‬را با یک مسیر دو طرفه به هم متصل میکند‪( .‬به‬ ‫‪‬‬

‫ازای هر ‪x‬صحیح)‬

‫نوع دوم‪ :‬نقطه ‪ k * x‬و )‪ k * (x + 1‬را با یک مسیر دوطرفه به هم متصل‬ ‫‪‬‬

‫میکند‪ ( .‬به ازای هر ‪ x‬صحیح و ‪ k‬داده شده در ورودی )‬

‫هم چنین میدانیم فاصله طی کردن یک مسیر بین دو نقطه به ازای هرنوع قطار‬
‫دقیقا یک دقیقه است‪ .‬وظیفه شما به عنوان دوست و رفیق لیته این است که به او‬
‫بگویید زودترین زمان ممکن رسیدن لیته به محل قرار چقدر است‪ .‬سه عدد صحیح‬
‫‪ b ،a‬و ‪ k‬در ورودی داده می شود‪( .‬کوئرا کالج)‬

‫*‪ :2-8‬برنامه ای بنویسید که ‪ 3‬عدد از کاربر بگیرد و آنها را از بزرگ به ک‪.‬چک‬


‫مرتب کند‪.‬‬

‫*‪ :2-9‬برنامه ای بنویسید که ‪ 3‬عدد اعشاری از کاربر بگیرد و پس از مرتب سازی‬


‫آنها‪ ،‬بگوید که آیا می توان با آن اعداد مثلث قائم الزاویه ساخت یا نه‪( .‬فرض می‬
‫شود کاربر اعداد نامنفی وارد می کند)‬

‫‪29‬‬
:‫ مشکل(ها) قطعه برنامه رو بگویید‬:2-10*

Cin << gender;


if (Gender == 1) {
cout << “Woman” << endl;
}
else;
cout << “Man” << endl;
//26 and 27 else moalagh and 56

30
‫فصل ‪ – 3‬حلقه ها‬

‫بعضی اوقات نیاز است کاری را بصورت پشت سر هم انجام دهید‪ .‬مثال می خواهید‬
‫اعداد یک تا هزار را چاپ کنید‪ .‬واضح است نوشتن دستور ‪ cout‬برای هر عدد کاری‬
‫طاقت فرساست و بسیار زمان گیر است‪ .‬بدین منظور‪ ،‬استفاده از حلقه های تکرار‬
‫کار ما را بسیار آسان میکنند‪ .‬در سی پالس پالس چند نوع حلقه تکرار همچون‬
‫‪ do-while ،while ،for‬و ‪ foreach‬وجود دارد که در اینجا سه مورد اول را‬
‫معرفی میکنیم‪.‬‬

‫در آغاز با حلقه تکرار ‪ while‬شروع میکنیم‪ .‬همانطور که از فصلهای قبلی به یاد‬
‫دارید‪ a++ ،‬برابر ‪ a = a + 1‬است‪ .‬ساختار کلی ‪ while‬بصورت زیر است‪:‬‬

‫{ )‪while (Condition‬‬
‫;‪Codes‬‬
‫}‬
‫نحوه کار حلقه ‪ while‬بدین صورت است که اول شرط آن بررسی میشود‪ .‬سپس‬
‫وارد حلقه شده و دستورات موجود در آن اجرا میشود‪ .‬پس از انجام دستورات‪،‬‬
‫دوباره به شرط بر میگردد و دوباره شرط را بررسی میکند‪ .‬اگر درست بود‪ ،‬دوباره‬
‫دستورات اجرا میشوند‪ .‬این کار تا جایی پیش میرود که شرط حلقه نادرست شود‪.‬‬
‫در این صورت دیگر دستورات اجرا نشده و سی پالس پالس از این حلقه میگذرد و‬
‫کدهای بعدی را اجرا میکند‪.‬‬

‫در مورد حلقهها‪ ،‬دو دستور مهم وجود دارد که یکی از آن ها را در فصل قبلی‬
‫دیدید‪ .‬اولی ‪ break‬و دومی ‪ continue‬است‪ .‬زمانی که می خواهید یک حلقه به‬
‫پایان رسد و دیگر اجرا نشود‪ ،‬از دستور ‪ break‬استفاده میشود‪ .‬زمانی که بخواهیم‬

‫‪31‬‬
‫که بعضی از دستورات اجرا نشوند‪ ،‬از ‪ continue‬استفاده می شود‪ .‬با این دو‬
‫دستور مهم در مثال های آتی بیشتر آشنا می شوید‪.‬‬

‫نخست می خواهیم برنامه ای را بنویسیم که اعداد صحیح یک تا هزار را چاپ کند‪.‬‬


‫به کمک حلقه های تکرار‪ ،‬این کار بسیار آسان خواهد شد‪.‬‬

‫>‪#include <iostream‬‬

‫;‪using namespace std‬‬

‫{ )( ‪int main‬‬

‫;‪int i = 1‬‬

‫{ )‪while (i <= 1000‬‬

‫;‪cout << i << endl‬‬

‫;‪i++‬‬

‫}‬

‫;‪return 0‬‬

‫}‬

‫به کمک حلقه تکرار ‪ ،while‬توانستیم اعداد یک تا هزار را بسادگی چاپ کنیم‪.‬‬
‫روش کار این برنامه بدین صورت است که نخست شرط ‪ i‬کوچکتر از ‪ 1000‬بررسی‬
‫میشود‪ .‬از آنجایی که ‪ i‬برابر یک و کوچکتر از هزار است‪ ،‬وارد حلقه شده و ‪ i‬چاپ‬
‫می شود‪ .‬سپس یک واحد به ‪ i‬اصافه میشود و ‪ i‬میشود ‪ .2‬سپس دوباره شرط‬
‫بررسی میشود‪ .‬چون ‪ 2‬کوچکتر از ‪ 1000‬است‪ ،‬وارد حلقه شده و عدد ‪ 2‬نیز چاپ‬
‫میگردد‪ .‬سپس یک واحد به ‪ i‬اضافه شده و مقدار آن ‪ 3‬میشود‪ .‬این کار همینطور‬
‫پیش میرود و اعداد چاپ میشوند‪ .‬بعد از چندین مرحله‪ 1000 i ،‬می شود و این‬
‫عدد چاپ میشود‪ ،‬سپس یک واحد به ‪ i‬اضافه میشود و مقدار ‪ 1001 i‬می شود‪ .‬در‬
‫این حالت شرط حلقه ‪ while‬درست نبوده و سپس برنامه از حلقه ‪ while‬میگذرد‬
‫و برنامه پایان مییابد‪.‬‬

‫‪32‬‬
‫حال برای درک بهتر ‪ break‬و ‪ continue‬به دو مثال زیر دقت کنید‪ .‬گفته شد‬
‫‪ break‬باعث از شکسته شدن حلقه و ‪ continue‬باعث اجرا نشدن بعضی‬
‫دستورات در شرایط خاص میباشد‪.‬‬

‫>‪#include <iostream‬‬

‫;‪using namespace std‬‬

‫{ )( ‪int main‬‬

‫;‪int i = 1‬‬

‫{ )‪while (i <= 5‬‬

‫{ )‪if (i == 3‬‬

‫;‪break‬‬

‫}‬

‫;‪cout << i << endl‬‬

‫;‪i++‬‬

‫}‬

‫;‪return 0‬‬

‫}‬

‫‪1‬‬
‫‪2‬‬

‫در این برنامه‪ ،‬می خواهیم اعداد یک تا پنج را چاپ کنیم‪ .‬اول عدد یک چاپ می‪-‬‬
‫شود‪ i .‬برابر ‪ 3‬نیست‪ ،‬پس ‪ if‬اجرا نشده و یک مقدار به آن اضافه میگردد‪ .‬به همین‬
‫صورت برای عدد ‪ .2‬پس از چاپ عدد ‪ ،2‬به ‪ i‬یک مقدار اضافه میشود و مقدارش‬
‫برابر ‪ 3‬میشود‪ 3 .‬هنوز کوچکتر از ‪ 5‬است‪ ،‬پس دوباره برنامه وارد حلقه میشود‪.‬‬
‫این بار ‪ i‬برابر ‪ 3‬است و دستور ‪ if‬اجرا میشود‪ .‬دستور ‪ break‬حلقه را میشکند و‬
‫بدین معناست که دستورات داخل حلقه بعد از آن اجرا نمیشوند و برنامه از حلقه‬
‫بیرون میآید و ادامه کد ها‪ ،‬یعنی ‪ return 0‬اجرا شده و برنامه پایان میپذیرد‪.‬‬

‫‪33‬‬
‫پس در صورت استفاده از ‪ ،break‬دستورات داخل حقله بعد از آن اجرا نمیشود و‬
‫حلقه پایان مییابد و دستورات بعد از حلقه اجرا می شوند‪.‬‬

‫حال به مثالی از ‪ continue‬دقت کنید‪.‬‬

‫>‪#include <iostream‬‬

‫;‪using namespace std‬‬

‫{ )( ‪int main‬‬

‫;‪int i = 0‬‬

‫{ )‪while (i <= 5‬‬

‫;‪i++‬‬

‫{ )‪if (i == 3‬‬

‫;‪continue‬‬

‫}‬

‫;‪cout << i << endl‬‬

‫}‬

‫;‪return 0‬‬

‫}‬

‫‪1‬‬
‫‪2‬‬
‫‪4‬‬
‫‪5‬‬

‫مانند مثال قبل‪ ،‬قصد داریم اعداد یک تا ‪ 5‬را چاپ کنیم‪ .‬بطور مشابه‪ ،‬اعداد ‪ 1‬و ‪2‬‬
‫چاپ میشوند‪ .‬بعد از چاپ عدد ‪ ،2‬مقدار ‪ i‬برابر ‪ 3‬شده و وارد حلقه میشود‪ ،‬اما این‬
‫بار شرط ‪ if‬درست بوده و وارد بلوک ‪ if‬میشود‪ .‬اما این بار بعد آن‪ ،‬دستور‬
‫‪ ،continue‬وجود دارد‪ .‬این بدین معناست که دستورات بعد ‪( continue‬چاپ‬

‫‪34‬‬
‫عدد) اجرا نشده و حلقه برای اعداد بعدی تکرار میشود‪ .‬در هر دو حالت‬
‫‪ continue‬و ‪ ،break‬دستورات بعد آنها اجرا نمیشوند‪ ،‬اما در ‪ ،continue‬فقط‬
‫برای یک حالت خاص اجرا نمیشود ولی در ‪ ،break‬حلقه کال از بین میرود و‬
‫برنامه از آن میگذرد‪.‬‬

‫در این برنامه میخواهیم میانگین معدلهای یک کالس ‪ 30‬نفره را حساب کنیم‪ .‬اما‬
‫برای دانشجویان ‪ 15 ،5‬و ‪ 21‬بعالت اینکه معدلشان بسیار پایین است‪ ،‬از آنها صرف‬
‫نظر خواهیم کرد‪ .‬بجای ساختن ‪ 30‬متغیر‪ ،‬می توان تنها با دو سه متغیر و حلقه‬
‫تکرار‪ ،‬این کار را انجام داد‪.‬‬
‫>‪#include <iostream‬‬

‫;‪using namespace std‬‬

‫{ )( ‪int main‬‬

‫;‪double i = 0, sum = 0, a‬‬

‫{ )‪while (i <= 30‬‬

‫;‪i++‬‬

‫;‪cin >> a‬‬

‫{ ))‪if ((i != 5) || (i != 15) || (i != 21‬‬

‫;‪continue‬‬

‫;‪} else sum += a‬‬

‫}‬

‫‪cout << sum/27.0; // Or cast it: (double)sum/27; in case sum became integer‬‬

‫;‪return 0‬‬

‫}‬

‫در این برنامه‪ ،‬ابتدا به کمک حلقه تکرار ‪ ،while‬نمرات دانشجویان را خوانده و‬
‫مجموع آن را در ‪ sum‬ذخیره میکنیم‪ .‬در مورد دانشجویان شماره ‪ 15 ،5‬و ‪،21‬‬
‫بعلت وجود ‪ ،continue‬دستور بعد ‪ ،continue‬یعنی ;‪ sum +=a‬اجرا نشده و‬
‫معدل های آن سه تاثییری ندارد‪ .‬وقتی که نمره نفر سی ام نیز دریافت شد‪ ،‬چون ‪i‬‬

‫‪35‬‬
‫‪ 31‬می شود‪ ،‬برنامه از حلقه بیرون آمده و میانگین نهایی را چاپ میکند‪ .‬از آنجایی‬
‫که احتمال دارد مجموع نمرات وارد شده عددی صحیح باشد‪ ،‬محض احتیاط آن را‬
‫تقسیم بر عددی اعشاری میکنیم که حاصل عددی اعشاری شود‪.‬‬

‫حال میپردازیم به حلقه ‪ .do-while‬این حلقه کارکرد تقریبا مشابهی با حلقه‬


‫‪ while‬دارد‪ ،‬با این تفاوت که دستورات حلقه ‪ do-while‬حداقل برای یکبار اجرا‬
‫میشوند ولی دستورات ‪ while‬امکان دارد هیچ وقت اجرا نشوند‪ .‬ساختار حلقه ‪do-‬‬
‫‪ while‬بصورت زیر است‪:‬‬

‫{ ‪do‬‬
‫;‪Codes‬‬
‫;)‪} while (Condition‬‬
‫به زبانی دیگر‪ ،‬ابتدا کد داخل حلقه اجرا شده و سپس شرط حلقه بررسی میگردد‪.‬‬

‫حال میخواهیم با حلقه ‪ for‬آشنا شویم‪ .‬به حالت کلی حلقه ‪ while‬دوباره نگاهی‬
‫بیاندازید‪:‬‬

‫;‪int counter‬‬
‫{ )‪while (Condition‬‬
‫;‪Codes‬‬
‫;‪counter++‬‬
‫}‬
‫این قطعه کد از حلقه ‪ while‬برابر با حلقه ‪ for‬است‪:‬‬

‫{ )‪for (int counter; Condition; counter++‬‬


‫;‪Codes‬‬
‫}‬
‫‪36‬‬
‫استفاده از حلقه تکرار ‪ for‬برای شرایطی است که تعداد بار تکرار را میدانیم‪ .‬بطور‬
‫مثال زمانی که میانگین معدل ‪ 30‬دانشجو را میخواستیم حساب کنیم‪ ،‬بهتر از ‪for‬‬
‫استفاده کنیم‪ .‬و در زمانی که تعداد تکرار را نمی دانیم‪ ،‬بهتر از حلقه ‪ while‬یا ‪do-‬‬
‫‪ while‬بسته به شرایط استفاده کنیم‪.‬‬

‫همانطور که میبینید‪ ،‬در پرانتز حلقه ‪ ،for‬سه جمله وجود دارد‪ .‬جمله اول می گوید‬
‫که شمارنده یا ‪counter‬ات را تعریف کن‪ .‬جمله سوم میگوید که شمارنده ات قرار‬
‫است چگونه حرکت کند‪ .‬یکی یکی؟ دوتا دوتا؟ و جمله دوم نیز شرط حلقه است‪.‬‬
‫برای درک بهتر‪ ،‬می توانید ساختار ‪ while‬با ‪ for‬را در باال مقایسه کنید‪.‬‬

‫حال می خواهیم برنامه ای بنویسیم که یک عدد صحیح از کاربر گرفته و مقدار‬


‫فاکتوریل آن عدد را حساب کند‪ .‬از آنجایی که میدانیم قرار است حلقه ما چند بار‬
‫تکرار شود‪ ،‬بهتر است از ‪ for‬استفاده کنیم‪ ،‬ولی این بدین معنا نیست که نمیتوانیم‬
‫از ‪ while‬استفاده کنیم‪.‬‬
‫>‪#include <iostream‬‬

‫;‪using namespace std‬‬

‫{ )( ‪int main‬‬

‫‪int p = 1, n; // Stores the amount of factorial in p.‬‬

‫;‪cin >> n‬‬

‫‪for (int i = 1; i <= n; i++) { // Creating counter called i and = 1; condition; How counter moves.‬‬

‫;‪p *= i; // p = p * i‬‬

‫}‬

‫;‪cout << “Factorial of “ << n << “is: “ << p‬‬

‫;‪return 0‬‬

‫}‬

‫‪37‬‬
‫‪|5‬‬

‫‪Factorial of 5 is: 120‬‬

‫از حلقه های تکرار در بعضی از دیگر جاها مانند محاسبه سری نیز میتوان استفاده‬
‫کرد که مثال های مربوط به آن در تمرین ها وجود دارد‪ .‬کلید تسلط بر حلقه ها‪،‬‬
‫حل مسئله میباشد‪.‬‬

‫‪ ‬توجه‪ :‬در پراتنتز مربوط به ‪ ،for‬از ; باید استفاده شود‪ ،‬نه ‪.,‬‬

‫حال میخواهیم برنامه ای بنویسیم که سه حرف ‪ b ،a‬و ‪ c‬را تا زمانی که کاربر‬


‫حرف ‪ z‬را وارد نکرده‪ ،‬کاراکتر میخواند و در آخر تعداد هر کدام را می گویید‪.‬‬
‫همانطور که گفته شد‪ ،‬از آنجایی که نمیدانیم کاربر چند کاراکتر وارد میکند‪ ،‬از‬
‫حلقه ‪ while‬استفاده میکنیم‪ .‬فرض کنید تمام حروف وارد شده‪ ،‬کوچک اند‪.‬‬

‫>‪#include <iostream‬‬

‫;‪using namespace std‬‬

‫{ )( ‪int main‬‬

‫;‪char a‬‬

‫;‪int aCount = 0, bCount = 0, cCount = 0‬‬

‫;‪cin >> a‬‬

‫{ )’‪while (a != ‘z’ || a != ‘Z‬‬

‫{ )‪switch (a‬‬

‫‪case ‘a’:‬‬

‫;‪aCount++‬‬

‫;‪break‬‬

‫‪case ‘b’:‬‬

‫;‪bCount++‬‬

‫;‪break‬‬

‫‪38‬‬
case ‘c’:

cCount++;

break;

default:

cout << “Invalid character” << endl;

} // End of loop

cout << “A:\t” << aCount << endl;

cout << “B:\t” << bCount << endl;

cout << “C:\t” << cCount << endl;

return 0;

|a

|b

|b

|a

|c

|d

Invalid character

|c

|a

A: 3

B: 2

C: 2

39
‫در آخر هم می خواهیم مفاهیم ‪ ،long ،unsigned ،signed ،over flow‬و‬
‫‪ short‬را با توجه به اینکه در حل سری ها شاید بکار آید را معرفی میکنیم‪ .‬در‬
‫ابتدا به ‪ signed‬و ‪ unsigned‬میپردازیم‪ .‬همانطور که گفتیم‪ ،‬هر متغیری‪،‬‬
‫اعدادی مثبت و منفی را میپذیرد‪ ،‬اما اگر در شرایطی که میدانیم کاربر قرار نیست‬
‫عددی منفی وارد کند (مثل سن)‪ ،‬میتوان هنگام ساخت برنامه‪ ،‬عبارت ‪unsigned‬‬
‫را به پشت آن اضافه کرد‪ .‬سپس این متغیر تنها مقادیر نامنفی را ذخیره میکند‪.‬‬
‫ضمنا اگر متغیر به طور مثال اگر از حدود ‪ -32000‬تا ‪ 32000‬را ذخیره میکرد‪ ،‬با‬
‫‪ unsigned‬کردن آن‪ ،‬مقادیر ‪ 0‬تا ‪ 64000‬را میپذیرد‪.‬‬

‫‪unsigned int a; //Stores only positive numbers.‬‬


‫‪signed int a; //Stores positive and negative, equal to int a‬‬
‫همانطور که مشاهده میکنید‪ ،‬نوشتن عبارت ‪ signed‬اجباری نمیباشد‪ ،‬چون متغیر‬
‫ها بصورت پیشفرض‪ signed ،‬هستند‪ ،‬یعنی اعداد مثبت و منفی میتوانند اختیار‬
‫کنند‪.‬‬

‫حال فرض کنید که متغیری داریم که اعداد ‪ -128‬تا ‪ 127‬را در خود ذخیره می‬
‫کند‪ .‬اگر مقدار ‪ 127‬را به این متغیر نسبت دهیم و سپس یک واحد به آن اضافه‬
‫کنیم‪ ،‬چون عدد ‪ 128‬از حجمش بزگتر است‪ overflow ،‬رخ میدهد و کمترین‬
‫مقدار یعنی ‪ -128‬در این متغیر ذخیره میشود‪ .‬حال فرض کنید اگر مقدار متغیر‬
‫‪ 127‬باشد و سپس سه واحد به آن اضافه کنیم‪ ،‬ابتدا ‪ overflow‬رخ میدهد و‬
‫مقدارش ‪ -128‬می شود و سپس بعالوه ‪ 2‬واحد باقیمانده میشود و مقدار نهایی‬
‫‪ -126‬در آن ذخیره میشود‪.‬‬

‫برای جلوگیری از ‪ overflow‬باید ازمتغیر هایی با حجم باالتر استفاده کرد‪ .‬بدین‬
‫منظور‪ ،‬برای متغیر های از نوع ‪ int‬میتوان با استفاده از عبارت های ‪ short‬و‬
‫‪ ،long‬حجم آن را تعیین کرد‪ .‬بطور مثال در حالت عادی‪ ،‬حجم ‪ 4 int‬بایت است‪.‬‬

‫‪40‬‬
‫متغیر ‪ ،short int‬حجمش ‪ 2‬بایت و ‪ long int‬حجمش ‪ 8‬بایت میباشد که‬
‫بیشترین مقدار ممکن برای ‪ int‬است‪ .‬برای اعداد اعشاری نیز کوچکترین مقدار‬
‫‪ ،float‬سپس ‪ double‬و سپس ‪ long double‬می باشد‪ .‬دقت کنید ‪short‬‬
‫‪ short double ،double‬و‪ ...‬وجود ندارند‪ .‬پس به طور کلی می توان نوشت‪:‬‬

‫;‪signed/unsigned short/long VariableType VariableName‬‬


‫مانند‪:‬‬

‫;‪unsigned long int sum‬‬


‫همانطور که می بینید‪ ،long int ،‬بزرگترین حجم را میسازد‪ ،‬اما این متغیر مقادیر‬
‫مثبت و منفی را میپذیرد‪ .‬با نوشتن ‪ ،unsigned‬حجم مورد استفاده برای اعداد‬
‫منفی‪ ،‬به اعداد مثبت داده میشود و بیشترین عدد مثبتی که میتوان در آن ذخیره‬
‫کرد‪ 18446744073709551615 ،‬می باشد‪ .‬اما اگر ‪ unsigned‬را نمینوشتیم‪،‬‬
‫نصف حجم به اعداد منفی اختصاص داده می شد و بازه ای بین‬
‫‪ -9223372036854775808‬تا ‪ 9223372036854775807‬می داشت‪.‬‬

‫بهتر است در مواقعی که نیاز به ذخیره اعداد صحیح بزرگ داریم‪ ،‬از ‪ long int‬یا‬
‫‪ unsigned long int‬و برای اعداد اعشاری از ‪ long double‬یا ‪unsigned‬‬
‫‪ long double‬استفاده کنیم‪( .‬مانند مثال قبلی درباره محاسبه فاکتوریل)‬

‫در آخر هم به یک مثال مهم میپردازیم‪ .‬در این مثال میخواهیم به کمک حلقه‬
‫های تکرار‪ ،‬یک عدد که نمیدانیم چند رقمیست از کاربر دریافت کنیم و ارقام آن را‬
‫جدا کرده و چاپ کنیم‪.‬‬

‫‪41‬‬
‫>‪#include <iostream‬‬

‫;‪using namespace std‬‬

‫{ )( ‪int main‬‬

‫;‪long int x‬‬

‫;‪cin >> x‬‬

‫{ )‪while (x > 0‬‬

‫;‪cout << x % 10 << endl‬‬

‫;‪x = x / 10‬‬

‫}‬

‫;‪return 0‬‬

‫}‬

‫‪|542‬‬

‫‪2‬‬
‫‪4‬‬
‫‪5‬‬

‫به ساختار برنامه باال دقت کنید‪ .‬در اینجا چون تعداد ارقام را نمیدانیم‪ ،‬از حلقه‬
‫‪ while‬استفاده کردهایم‪ .‬نخست رقم یکان عدد ‪ ،542‬یعنی ‪ 2‬را به کمک ‪x % 10‬‬
‫چاپ میکنیم‪ .‬سپس عدد ‪ 542‬را بر ‪ 10‬تقسیم کرده‪ ،‬حاصل ‪ 54.2‬میشود‪ ،‬اما‬
‫بعلت اینکه متغیر ‪ int‬است‪ ،‬به ‪ 54‬تغییر یافته و عدد ‪ 54‬در ‪ x‬ذخیره میگردد‪ .‬عدد‬
‫‪ 54‬بزرگتر از صفر بوده و دوباره وارد حلقه میشود‪ .‬رقم یکان ‪ ،54‬یعنی ‪ 4‬به روش‬
‫قبل چاپ میشود‪ .‬سپس ‪ 54‬دوباره بر ‪ 10‬تقسیم شده و مشابها‪ ،‬عدد ‪ 5‬ذخیره می‪-‬‬
‫گردد‪ .‬هنوز عدد ‪ 5‬بزرگتر از صفر است‪ ،‬پس دوباره وارد حلقه شده و باقیمانده‬
‫تقسیم ‪ 5‬بر ‪ ،10‬یعنی همان ‪ 5‬چاپ میشود‪ .‬این بار‪ ،‬در تقسیم عدد ‪ 5‬بر ‪،10‬‬
‫حاصل ‪ 0.5‬میشود اما بعلت اینکه از متغیر ‪ integer‬استفاده میکنیم‪ ،‬مقدار صفر‬

‫‪42‬‬
‫ذخیره میگردد‪ .‬شرط دوباره چک شده و از آنجایی که شرط حلقه صحیح نمیباشد‪،‬‬
‫برنامه از حلقه میگذرد و برنامه پایان مییابد‪.‬‬

‫‪43‬‬
‫تمرین ها‬

‫*‪ :3-1‬به کمک دستور ‪ continue‬و عملگر ‪ ،%‬برنامه ای بنویسید که اعداد‬


‫‪ 3 k + 1‬را در بازه ‪ 1‬تا ‪ 100‬را چاپ کند‪.‬‬

‫*‪ :3-2‬در ساختار ‪ while‬چه اشکال (ها)ی وجود دارد؟‬

‫{ ;)‪while (a > 0‬‬


‫};‪sum += a‬‬
‫*‪ :3-3‬برنامه زیر را ‪ trace‬کنید‪.‬‬

‫;‪int sum = 0, N = 2, M = 3‬‬


‫;‪float x = 5.6‬‬
‫{ )‪for (int i = 0; i <= 100; i++‬‬
‫;‪sum++‬‬
‫}‬
‫;)‪cout << sum << end << (int(x) * N + 6 % M++‬‬
‫*‪ :3-4‬تفاوت خروجی این دو حلقه را بگویید‪:‬‬

‫;‪n = 1‬‬
‫)‪while (n < 10‬‬
‫;‪cout << n++ << endl‬‬

‫)‪while (n < 10‬‬


‫;‪cout << ++n << endl‬‬

‫‪44‬‬
‫*‪ :3-5‬برنامه ای بنویسید تا زمانی که کاربر عدد ‪ -1‬را وارد نکرده است‪ ،‬از کاربر‬
‫لیتر مصرفی و مسافت پیموده شده را از کاربر بگیرد و نهایتا میانگین نسبت مسافت‬
‫پیموده شده به لیتر (مصرف سوخت) را بگوید‪.‬‬

‫**‪ :3-6‬در یک شرکت‪ ،‬کارمندان باید ماهی حداقل ‪ 35‬تا ‪ 40‬ساعت کار کنند‪ .‬اگر‬
‫کارمندی بیش از ‪ 40‬ساعت کار کند‪ ،‬به ازای هر ساعت اضافه کاری‪ ،‬ساعتی ‪1.5‬‬
‫برابر حقوق عادی می گیرد‪ .‬مثل اگر شخصی در ماه ‪ 42‬ساعت کار کرده باشد و‬
‫حقوق ساعتی او ‪ 10‬دالر باشد‪ 400 ،‬دالر حقوق پایه و ‪ 5‬ساعت اضافه کاری‪1.5 ،‬‬
‫برابر حقوق عادی یعنی ‪ 15‬دالر دریافت می کند‪ ،‬و بابت دو ساعت‪ 30 ،‬دالر و‬
‫مجموعا ‪ 430‬دالر دریافت می کند‪ .‬مالیت برای تمامی کارکنان ‪ 9‬درصد بوده و‬
‫افرادی که کمتر از ‪ 35‬ساعت کار کرده اند‪ ،‬بیست درصد از حقوق ساعتی آنها کم‬
‫می شود‪ .‬مثال بجای ساعتی ‪ 10‬دالر‪ 8 ،‬دالر دریافت میکند‪ .‬برنامه ای بنویسید که‬
‫تا زمای که عدد ‪ 1-‬وارد نشده است‪ ،‬از کاربر تعداد ساعت و حقوق ساعتی را دریافت‬
‫کرده و حقوق دریافتی خالص را چاپ کند‪.‬‬

‫*‪ :3-7‬به کمک حلقه های تو در تو‪ ،‬برنامه ای بنویسید که با دریافت دو عدد ‪ m‬و‬
‫‪ ،n‬و به کمک دنباله گریز ‪ ،\t‬جدول ضرب ‪ m‬در ‪ n‬را ترسیم کند‪.‬‬

‫*‪ :3-8‬برنامه ای بنویسید که عددی از کاربر گرفته و بگویید عدد چند رقمی است‪.‬‬

‫**‪ :3-9‬برنامه ای بنویسید که بگویید وارد شده خودمقلوب است یا نه‪ .‬عدد‬
‫خودمقلوب به عددی میگویند که چه از راست و چه از چپ خوانده شود‪ ،‬یک عدد‬
‫است‪ ،‬مانند ‪ 1001‬یا ‪.121‬‬

‫*‪ :3-10‬برنامه ای بنویسید که عددی مثبت از کاربر بگیرد و اعداد اول قبل از آن را‬
‫نمایش دهد‪.‬‬

‫‪45‬‬
‫**‪ :3-11‬به کمک حلقه های تکرار‪ ،‬برنامه ای بنویسید که مصتطیل زیر را چاپ‬
‫کند‪.‬‬

‫****‬

‫*‬ ‫*‬

‫*‬ ‫*‬

‫****‬

‫**‪ :3-12‬برنامه ای بنویسید عددی مثبت از کاربر بگیرد و مستطیلی با طول و‬


‫عرض عدد داده شده مانند مثال قبل چاپ کند‪.‬‬

‫*‪ :3-13‬به کمک حلقه های تکرار‪ ،‬اشکال زیر را چاپ کنید‪.‬‬

‫*‬ ‫****‬ ‫****‬ ‫*‬

‫**‬ ‫***‬ ‫***‬ ‫**‬

‫***‬ ‫**‬ ‫**‬ ‫***‬

‫****‬ ‫*‬ ‫*‬ ‫****‬

‫**‪ :3-14‬برنامه ای بنویسید که عددی صحیح به هنوان مجموع اضالع مثلث از‬
‫کاربر گرفته و بگوید که آیا می توان با مجموع داده شده‪ ،‬مثلثی قائم الزاویه با طول‬
‫صحیح ساخت؟ اگر می شود‪ ،‬اندازه صحیح آن سه ضلع را چاپ کند‪ ،‬در غیر‬
‫اینصورت کلمه ‪ NO‬را چاپ کند‪.‬‬

‫*‪ :3-15‬مقدار سری های زیر را بدست آورید‪ x( .‬و ‪ ،n‬تعداد جمالت‪ ،‬را کاربر وارد‬
‫میکند)‬

‫‪46‬‬
‫𝟏‬ ‫𝟏‬
‫… ‪e = 1 + 𝟏! + 𝟐! +‬‬

‫𝑥‬ ‫𝑥‬ ‫‪𝑥2‬‬


‫‪𝑒 = 1 + 1! +‬‬ ‫…‪+‬‬
‫!‪2‬‬
‫𝟒‬ ‫𝟒‬ ‫𝟒‬
‫‪𝛑=𝟒−‬‬ ‫‪+‬‬ ‫‪−‬‬ ‫‪+ ...‬‬
‫𝟑‬ ‫𝟓‬ ‫𝟕‬

‫*‪ :3-16‬برنامه ای بنویسی که نمران ‪ 20‬دانشجو را گرفته و بزگترین و کوچکترین‬


‫آن را چاپ نماید‪.‬‬

‫***‪ :3-17‬برنامه ای به کمک حلقه های تکرار بنویسید که شکل زیر را چاپ کند‪.‬‬

‫*‬

‫***‬

‫*****‬

‫*******‬

‫*****‬

‫***‬

‫*‬

‫***‪ :3-18‬برنامه ای بنویسید که عددی از کاربر گرفته و لوزی مشابه مسال قبلی‬
‫به ارتفاع عدد وارد شده چاپ نماید‪.‬‬

‫**‪ :3-19‬حنا وارد مسابقه هندونهخوری شده است‪ .‬در این مسابقه ‪ n‬هندوانه وجود‬
‫دارد که به ترتیب با شمارههای ‪ 1‬تا ‪ n‬نامگذاری شدهاند‪ ،‬همچنین وزن هندوانه ‪i‬‬
‫ام‪ w ،‬است‪( .‬وزن هندوانهها متمایز است)‪.‬‬

‫‪47‬‬
‫حنا در هر مرحله از این مسابقه دو هندوانهای که کمترین شماره را دارند را انتخاب‬
‫میکند و هندوانهای که سبکتر است را میخورد‪ .‬حنا به این کار ادامه میدهد تا‬
‫فقط یک هندوانه باقی بماند‪.‬‬

‫بعد از مسابقه حنا به این فکر رفته که آخرین هندوانه چه شمارهای داشت اما از‬
‫آنجا که خیلی هندوانه خورده‪ ،‬فکرش کار نمیکند‪ .‬به حنا کمک کنید و با‬
‫گرفتن ‪ w‬ها شماره آخرین هندوانه را بگویید‪.‬‬

‫در سطر اول ‪ n‬تعداد هندوانهها آمده است‪.‬‬

‫در سطر بعدی وزن هندوانه ها آمده است‪ .‬شماره هندوانه ای که در آخر باقی میماند‬
‫را چاپ کنید‪( .‬کوئرا کالج)‬

‫**‪ :3-20‬برنامه ای بنویسید که عددی از کاربر گرفته و اولین عدد توان دو بزرگتر‬
‫از آن عدد را چاپ کند‪.‬‬

‫**‪ :3-21‬برنامه ای بنویسید که عددی از کاربر دریافت کند و بگوید آیا عدد وارد‬
‫شده کامل است یا نه‪ .‬عدد کامل به عددی گفته می شود که مجموع مقسوم علیه‬
‫های غیر خودش‪ ،‬برابر با خودش باشد‪ .‬بطور مثال‪ ،‬مقسوم علیه های غیر خود عدد‬
‫‪ 1 ،6‬و ‪ 2‬و ‪ 3‬می باشد که مجموع آنها برابر عدد ‪ 6‬است‪.‬‬

‫**‪ :3-22‬برنامه ای بنویسید که دو عدد مثبت دریافت کرده و اعداد اول بین آن‬
‫بازه را نمایش دهد‪.‬‬

‫**‪ :3-23‬برنامه ای بنویسید که ‪ 5‬عدد گرفته و ک‪.‬م‪.‬م و ب‪.‬م‪.‬م دو عدد بزرگتر را‬
‫نشان دهد‪.‬‬

‫‪48‬‬
‫*‪ :3-24‬برنامه ای بنویسید که عددی از کاربر گرفته و مقسوم علیه های مثبت آن‬
‫را نشان دهد‪.‬‬

‫*‪ :3-25‬برنامه ای بنویسید که دو عدد را بگیرد و تمام حالت های مکمن برای‬
‫همنشینی را چاپ کند‪ .‬بطور مثال پیمانه های مکمن برای دو عدد ‪ 1‬و ‪،2 ،1 ،13‬‬
‫‪ 6 ،4 ،3‬و ‪ 12‬می باشد‪.‬‬

‫***‪ :3-26‬در کشوری رییس جمهور به این نحو انتخاب میشود‪:‬‬

‫اگر ‪ n‬نفر کاندید شده باشند (‪ )2≤n‬ابتدا طی مراسمی با قرعه کشی به هر‬
‫کاندیدی یک عدد از ‪ 1‬تا ‪ n‬تعلق میگیرد‪ .‬کاندیدها به ترتیب شمارههایشان‪ ،‬دور‬
‫میزی مینشینند و یکی در میان با شروع از شمارهی ‪ 2‬حذف میشوند‪.‬‬

‫حاال شما برنامهای بنویسید که شمارهی کاندید پیروز را با گرفتن تعداد کاندیدها از‬
‫ورودی چاپ کند‪( .‬کوئرا)‬

‫**‪ :3-27‬تابع )‪ f(n‬به این صورت تعریف میشود‪ :‬کمارزشترین رقم ناصفر عدد ‪.n‬‬
‫برای مثال کم ارزشترین رقم ناصفر اعداد ‪4650‬و ‪ ،347‬به ترتیب ‪ 5‬و ‪ 7‬میباشد‪.‬‬
‫پس ‪ f(4650)=5‬و ‪.f(347)=7‬‬
‫حال عدد ‪ n‬را به شما داده و شما باید )!‪ f(n‬را خروجی دهید‪.‬‬

‫‪49‬‬
‫فصل ‪ – 4‬تابع‬

‫تا به حال با کلیات اولیه زبان ‪ C++‬آشنا شده اید‪ .‬در این فصل به بحث توابع می‪-‬‬
‫پردازیم‪.‬‬

‫تابع مفهوم مشابهی با توابع در ریاضیات دارد‪ .‬همانطور که در ریاضیات متغیری‬


‫چون ‪ x‬به )‪ f(x‬داده و تغییراتی روی ‪ x‬اعمال میکنید‪ ،‬در ‪ C++‬هم عمل‬
‫مشابهیست‪ .‬تابع مانند کارخانه ایست که مواد اولیه را داده و فراورده را تحویل می‪-‬‬
‫گیریم‪ ،‬اما در برنامه نویسی ممکن است تابعی هیچ ورودیی نداشته باشد‪ .‬در پروژه‬
‫های بزرگتر و واقعی تر‪ ،‬برنامه نویسان به منظور کنترل بهتر‪ ،‬بیهنه سازی و عیب‬
‫یابی از توابع استفاده میکنند‪ .‬استفاده از توابع نیز باعث جلوگیر از تکرار کدهای‬
‫مشابه نیز میشود‪.‬‬

‫همانطور که در فصل اول گفتیم‪ ،‬کتابخانه های استاندارد ‪ C++‬دارای برخی توابع‬
‫پرکاربرد هستند که با اضافه کردن کتابخانه ها‪ ،‬می توانید از توابع آنها استفاده کنید‪.‬‬
‫یکی از کتابخانه های پرکاربرد‪ ،‬کتابخانه ریاضی ‪( math‬یا ‪ )math.h‬میباشد که با‬
‫‪ include‬کردن آن‪ ،‬میتوان از توابعش استفاده کرد‪ .‬به عنوان مثال میتوانید تابع‬
‫تولید عدد ردنوم و کتابخانه مربوط به آن را در اینترنت جستجو کنید‪ .‬برخی از توابع‬
‫کتابخانه ریاضی‪ .sqrt(x) ،pow(x, y) ،cos(x) ،sin(x) :‬تابع )(‪ ،pow‬تابع توان‬
‫بوده و حاصل ‪ x‬به توان ‪ y‬را باز میگرداند‪ .‬تابع )(‪ sqrt‬نیز مقدار جذر ‪ x‬را باز‬
‫میگرداند‪ .‬در مثال باال‪ ،‬به ‪ x‬ها و ‪ ،y‬ورودی یا آرگومان تابع میگویند‪ ،‬که با اعمال‬
‫تغییرات بر روی مقادیر ورودی‪ ،‬یک خروجی به ما باز میگردانند‪ .‬توجه کنید که‬
‫بعضی از توابع ورودی خاصی ندارند (مانند تابع )(‪ delete‬که متغیر ها را پس از‬
‫اتمام برنامه از حافظه پاک میکند)‪.‬‬

‫برای استفاده از توابع‪ ،‬باید آنها را فراخواند‪ .‬برای این کار باید نام تابع را نوشته و‬
‫سپس آرگومان ها تابع را داخل پرانتزها مینویسیم‪ .‬اگر تابع آرگومان نداشته باشد‪،‬‬
‫‪50‬‬
‫پرانتز را خالی گذاشته‪ ،‬و اگر بیش از یک آرگومان داشته باشد‪ ،‬آنها را با کاما از‬
‫یکدیگر جدا میکنیم‪ .‬واضح است که ترتیب آرگومان ها مهم است‪ ،‬مثال مقدار‬
‫)‪ pow(x, y‬با )‪ pow(y, x‬متفاوت است‪.‬‬

‫;)… ‪Function name (Argument 1, Argument 2,‬‬


‫حال میخواهیم به روش ایجاد یک تابع دلخواه بپردازیم‪ .‬توابع فرقی با دستور ها و‬
‫کدهایی که تا االن گفته ایم فرقی ندارند و تنها فرق این کدها داخل ‪ main‬یا داخل‬
‫تابع این است که تابع ما ممکن است نیاز به ورودی داشته باشد‪ ،‬اما دستورات داخل‬
‫تابعی که می نویسیم‪ ،‬تقریبا فرقی با قبل ندارد‪.‬‬

‫در اینجا با دو نوع تابع آشنا می شویم‪ .‬نوع اول توابع ‪ void‬میباشند‪ .‬توابع ‪void‬‬
‫مقداری را به تابع ‪ main‬بر نمیگرداند‪ ،‬مانند تابعی که پیامی را در خروجی چاپ‬
‫میکند‪ .‬نوع دوم توابعی هستند که مقداری را بر میگردانند‪ .‬مانند تابع فاکتوریل که‬
‫عدد ‪ n‬را به آن داده و !‪ n‬را محاسبه کرده و به تابع ‪ main‬باز میگرداند‪.‬‬
‫توابع را میتوان در دو قسمت‪ ،‬قبل و بعد تابع ‪ .main‬اگر تابع را بعد از تابع ‪main‬‬
‫بنوسیم‪ ،‬باید به ‪ C++‬اعالم کنیم که همچین تابعی وجود دارد‪ ،‬چون دستورات خط‬
‫به خط اجرا میشوند و اگر تابع ما بعد از ‪ main‬باشد‪ ،‬باید اعالم گردد‪ .‬شکل کلی‬
‫توابع‪:‬‬

‫{ )… ‪Type FunctionName (Input Argument 1, 2,‬‬


‫;‪Codes‬‬
‫}‬
‫اگر تابع بعد از ‪ main‬باشد‪:‬‬

‫‪Type FunctionName (Input …); // Function prototype‬‬


‫}{ )( ‪int main‬‬

‫‪51‬‬
‫{ )… ‪Type FunctionName (Input Argument 1, 2,‬‬
‫;‪Codes‬‬
‫}‬
‫در قسمت ‪ type‬باید مشخص کنیم تابع ما چه چیزی بر میگرداند‪ .‬اگر چیزی بر‬
‫نمیگرداند‪ ،void ،‬اگر عددی صحیح باز میگرداند از ‪ ،int‬اگر عددی اعشاری باز‬
‫میگرداند‪ ،‬از ‪ ،float‬اگر کاراکتری را باز میگرداند از ‪ char‬و ‪ ...‬استفاده می کنیم‪.‬‬

‫‪ ‬نکته‪ :‬آرگومان ها و متغیرهای داخل تابع محلی می باشند‪ ،‬بدین معنا که این‬
‫متغیر ها تنها در تابع مورد استفاده قرار میگیرند و فقط مربوط به همان تابع‬
‫اند‪ .‬بطور مثال اگر متغیر ‪ a‬در تابع ‪ main‬و متغیر ‪ a‬در یک تابع داشته‬
‫باشید‪ ،‬این دو از هم مجزا بوده و ربطی به هم ندارند‪ ،‬یعنی متغیرها محلی اند‪.‬‬

‫بعنوان مثال میخواهیم برنامه ای به کمک تابع ‪ fact‬بنویسیم که عددی از کاربر‬


‫خوانده و تعداد صفر های فاکتوریل عدد وارد شده را محاسبه کند‪.‬‬
‫>‪#include <iostream‬‬

‫;‪using namespace std‬‬

‫‪long int fact (int a); //Function prototype‬‬

‫{ )( ‪int main‬‬

‫;‪int x, counter = 0‬‬

‫;‪cin >> x‬‬

‫;‪long int n‬‬

‫;)‪n = fact (x‬‬

‫{ )‪while (n > 0‬‬

‫{ )‪if (n % 10 == 0‬‬

‫;‪counter++‬‬

‫}‬

‫;‪n = n / 10‬‬

‫}‬

‫;‪cout << counter‬‬


‫‪52‬‬
‫;‪return 0‬‬

‫}‬
‫{‬
‫{ )‪long int fact (int a‬‬

‫;‪long int p = 1‬‬

‫{ )‪for (int i = 0; i <= a; i++‬‬

‫‪p *= i; // p = p * i‬‬

‫}‬

‫;‪return p‬‬

‫}‬

‫‪|5‬‬

‫‪1‬‬

‫همانطور که می بینید‪ ،‬تابع ‪ fact‬را بعد از تابع ‪ main‬نوشتهایم و به ‪function‬‬


‫‪ prototype‬قبل از تابع ‪ main‬نیاز داریم‪ .‬کافیست که خط اول تابع را کپی کرده‬
‫و بجا کروشه‪ ،‬سمیکالن ; بگذاریم‪.‬‬

‫;)‪long int fact (int a‬‬


‫البته میتوانستیم کل تابع را قبل از تابع ‪ main‬مینوشتیم و نیازی به ‪function‬‬
‫‪ prototype‬نبود‪ .‬همانطور که میبینید‪ ،‬تابع ما ‪ void‬نباید باشد‪ ،‬چون باید‬
‫مقداری را حساب کرده و مقدار آن را به تابع ‪ main‬برگرداند‪ .‬بدین منظور از نوع‬
‫‪ long int‬استفاده کرده ایم‪ int .‬به این معنیست که مقداری را که تابع باز می‪-‬‬
‫گرداند‪ ،‬از نوع عدد صحیح میباشد‪ .‬وجود ‪ long‬اختیاریست‪ ،‬اما چون فاکتوریل‬
‫اعداد‪ ،‬مقداری بزرگ هستند‪ ،‬از ‪ long‬استفاده میکنیم تا تعداد رقم بیشتری را‬
‫بتواند حساب کند‪ .‬در داخل پرانتز‪ int a ،‬همان آرگومان یا ورودی تابع ماست‪ .‬تابع‬
‫‪ fact‬تنها نیاز به یک ورودی دارن‪ .‬در داخل تابع نیز متغیر ‪ p‬را تعریف کردیم که‬
‫اعداد را به ترتیب ضرب میکند‪ .‬مثال وقتی عدد ‪ 5‬را به تابع میفرستیم‪ ،‬تابع اول به‬
‫کمک حلقه اعداد ‪ 4 ،3 ،2 ،1‬و ‪ 5‬را در هم ضرب میکند و در هر بار ضرب در ‪p‬‬
‫‪53‬‬
‫ذخیره میکند‪ ،‬سپس به کمک ‪ ،return‬مقدار نهایی فاکتوریل عدد را به تابع‬
‫‪ main‬میفرستیم‪ .‬در تابع ‪ main‬گفته ایم‪ n = fact(x); :‬یعنی عدد ‪ x‬را به تابع‬
‫‪ fact‬بفرست‪ ،‬سپس مقدار بازگردی (‪ )return p‬را در ‪ n‬ذخیره کن‪ .‬سپس به‬
‫کمک حلقه ‪ ،while‬تعداد صفرهای عدد را میشماریم‪.‬‬

‫‪ ‬توجه‪ :‬هنگام تعریف آرگومان های تابع‪ ،‬هر آرگومان باید بصورت جداگانه‬
‫تعریف شود‪ .‬در مثال باال آرگومان ما ‪ int a‬است‪ ،‬یعنی ورودیی به نام ‪ a‬از‬
‫نوع ‪ .int‬اگر نیاز به چند ورودی داشتیم باید مثال بصورت‬
‫)‪Type FunctionName (int a, int b, int c, float d‬‬
‫نوشت‪ .‬نوشتن بصورت ‪ int a, b, c‬برای آرگومان ها اشتباه است‪.‬‬

‫همچنین توابع را هم می توان در درون هم فراخوانی کرد‪ .‬بطور مثال‪:‬‬


‫;))‪a = sqrt(pow(9,3‬‬
‫توابع درون برنامهای به توابعی گفته میشوند که کامایلر یه کپی از کد را گرفته و‬
‫هنگام فراخوانی‪ ،‬کد کپی شده اجرا می شود که در باعی میشود سرعت فراخوانی‬
‫توابع باال رفته اما حجم برنامه افزایش باید‪ .‬برای اینکار کافیست عبارت ‪ inline‬را به‬
‫اول تابع و قبل از ‪ type‬وارد کنید‪.‬‬

‫‪54‬‬
‫تمرین ها‬

‫تمام مثال های حل شده در فصل های قبلی را می توان با تابع نوشت‪ .‬به عنوان‬
‫تمرین می توانید مثال ها و تمرین های فصل های قبل را به کمک تابع حل کنید‪.‬‬

‫‪55‬‬
‫فصل ‪ – 5‬آرایه‬

‫شاید تا به حال در سوالی نیاز بود که تعداد زیادی داده را در متغیر های مختلف‬
‫ذخیره کنید‪ .‬به کمک آرایه ها‪ ،‬محل ها متوالی از حافظه هستند که نام و نوعشان‬
‫یکسان بوده‪ .‬برای دسترسی به هر عنصر آرایه‪ ،‬باید از نام و اندیسش استفاده کنیم‪.‬‬
‫برای ساخت یک آرایه یک بعدی به روش زیر عمل میکنیم‪:‬‬

‫;]‪ArrayType ArrayName [Amount‬‬


‫به عنوان مثال‪ ،‬می خواهیم یک آرایه پنج عضوی که اعداد صحیح را در خود ذخیره‬
‫میکند بسازیم‪ int a [5]; .‬که یک آرایه یک بعدی از نوع ‪ int‬بوده که ‪ 5‬واحد‬
‫پشت سر هم از حافظه را به خود اختصاص میدهد‪ .‬از آنجایی که ‪ 4 int‬بایت بوده‪،‬‬
‫پس ‪ 5x4‬یعنی ‪ 20‬بایت از حافظه را به خود اختصاص میدهد‪ .‬برای مقدار دهی به‬
‫آرایه یا میتوان داخل برنامه از }{ استفاده کرد یا با یک حلقه ‪ for‬آنها را از کاربر‬
‫بخواند‪ .‬بطور مثال }‪ .int a [5] = {1, 3, 9, 4, 7‬البته وقتی که برنامه نویس‬
‫مقدارد دهی میکند‪ ،‬نیاز به وارد کردن عدد ‪( 5‬اندازه آرایه) نیست‪ .‬یعنی میتوان به‬
‫شکل }‪ int a [] = {1, 3, 9, 4, 7‬نیز نوشت‪ C++ .‬تعداد عناصر را شمرده و‬
‫خودش به آرایه اندازه ‪ 5‬را میدهد‪ ،‬اما دقت کنید اگر قرار است که کاربر مقدار دهی‬
‫کند (از حلقه استفاده میکنید و از }{ استفاده نمیکنید) حتما باید به آرایه اندازه‬
‫نسبت داد‪ .‬آرایه ها با اندیس صفر شروع میشوند‪ .‬در این مثال‪ ،‬اولین مقدار آرایه‪،‬‬
‫که عدد ‪ 1‬است‪ ،‬با اندیس ‪ 0‬نشان داده میشود‪:‬‬

‫… ‪a[0] = 1, a[1] = 3, a[2] = 9, a[3] = 4, a[4] = 7 , and‬‬


‫آرایه یک بعدی را میتوان به یک ماترسی خطی تشبیه نمود که با اندیس صفر‬
‫شروع میشود‪.‬‬

‫]‪Array = [a0 a1 a2 … an‬‬

‫‪56‬‬
‫ دوباره آنها را نمایش داده و‬،‫ دانشجو را گرفته‬5 ‫حال فرض کنید میخواهیم نمره‬
.‫ دانشجو را نشان دهیم‬5 ‫سپس میانگین این‬

#include <iostream>

using namespace std;

int main () {

float score [5], sum = 0.0;

for (int i = 0; i < 5; i++) {

cin >> score[i];

sum += score[i];

for (int i = 0; i < 5; i++) {

cout << “Student ” << i + 1 << “ score:” << score[i] << endl;

cout << “Avg = “ << sum / 5;

return 0;

|10

|15.5

|13

|18.25

|20

Student 1 score: 10

Student 2 score: 15.5

Student 3 score: 13

Student 4 score: 18.25

Student 5 score: 20

Avg= 15.35

57
‫در ابتدا یک آرایه ‪ 5‬عضوی به نام ‪ score‬و از نوع ‪ float‬ساختهایم‪ .‬یک متغیر‬
‫‪ sum‬برای محاسبه میانگین نیز ساختهایم‪ .‬همانطور گه گفتیم‪ ،‬اندیس آرایه از صفر‬
‫شروع میشود و تا ‪ n-1‬پیش میرود‪ ،‬پس باید از یک حلقه ‪ for‬از ‪ 0‬تا ‪ 4‬استفاده‬
‫کرد‪ .‬در حلقه بعدی هم به همین شکل از ‪ 0‬تا ‪ 4‬شروع میشود‪ .‬دقت کنید از‬
‫آنجایی که دانشجو صفرم معنی ندارد و شماره دانشجویان ‪ i + 1‬است‪ ،‬پس در‬
‫‪ cout‬نیز ‪ Student i + 1‬باید چاپ شود‪ ،‬نه ‪ .i‬در آخر نیز میانگین را حساب می‪-‬‬
‫کنیم‪ .‬توجه کنید که هنگام دسترسی به یک عنصر‪ ،‬داخل کروشه میتوان عبارت‬
‫ریاضی نوشت‪ ،‬اما مقدار نهایی آن باید در بازه تعریف شده اندازه آرایه باشد‪.‬‬

‫تا اینجا با آرایه های یک بعدی آشنا شدید‪ .‬حال میخواهیم به آرایه های دو بعدی‬
‫بپردازیم‪ .‬آرایه های دو بعدی را میتوان به ماتریسی تشبیه کرد که اندیسهایش‬
‫بجای یک‪ ،‬از صفر شروع میشوند‪.‬‬

‫‪Array = a00 a01 a02 … a0n‬‬


‫‪a10 a11 a12 … a1n‬‬
‫‪a20 a21 a22 … a2n‬‬
‫…‬
‫‪am0 am1 am2 … amn‬‬
‫همانطور که میبینید‪ ،‬ماتریس باال ‪ m‬سطر و ‪ n‬ستون دارد که میتوان به شکل‬
‫یک آرایه دو بعدی نشان داد‪ .int a[m][n] :‬واضح است برای پر کردن ماتریس به‬
‫یک حلقه تو در تو نیاز است‪ ،‬که یکی از ‪ 0‬تا ‪ m‬پیمایش کند و یکی از ‪ 0‬تا ‪ n‬برای‬
‫هر سطر پیمایش کند‪ ،‬که بصورت شکل مقابل میشود‪( .‬با توجه به ماتریس باال)‬

‫‪58‬‬
for (int i = 0; i <= m; i++) {
for (int j = 0; j <= n; j++) {
codes
}
}
‫ حال میخواهیم به‬.‫ عناصر سطر اول را پر میکند‬j ‫ حلقه‬،‫ است‬i = 0 ‫مثال زمانی که‬
‫ فیزیک و‬،‫ نمرات سه درس ریاضی‬،‫ دانشجو‬4 ‫عنوان مثال برنامه ای بنویسیم که از‬
‫ میانگین هر درس و معدل هر دانشجو را‬،‫شیمی را خوانده و بصورت جدولی نمرات‬
.‫نشان دهد‬

#include <iostream>

using namespace std;

int main()

float score[4][3], sum[4] = {0.0, 0.0, 0.0, 0.0}, sumsubject[4] {0.0, 0.0, 0.0, 0.0}, avg = 0.0;

for (int i = 0; i < 4; i++) {

for (int j = 0; j < 3; j++) {

cin >> score[i][j];

sum[i] += score[i][j];

cout << "Student Number\t" << "Math\t" << "Physics\t" << "Chemistry\t" << "Average" <<
endl;

for (int i = 0; i < 4; i++) {

cout << "Student " << i+1 << "\t";

for (int j = 0; j < 3; j++) {

cout << score[i][j] << "\t";

cout << "\t" << sum[i]/3 << endl;


59
cout << "Average\t\t";

for (int i = 0; i < 3; i++) {

for (int j = 0; j < 4; j++) {

sumsubject[i] += score[j][i];

avg += (sumsubject[i] / 4.0); // Either calculate from sumsubject or sum.

cout << sumsubject[i] / 4.0 << "\t";

cout << "\t" << avg / 3;

return 0;

|19
|18.5
|13.5
|16.25
|14.5
|17
|13.75
|14.5
|16
|17
|11.5
|9
Student Number Math Physics Chemistry Average

Student 1 19 18.5 13.5 17

Student 2 16.25 14.5 17 15.9167

Student 3 13.75 14.5 16 14.75

Student 4 17 11.5 9 12.5

Average 16.5 14.75 13.875 15.0417

60
‫به مثال باال و توضیحات توجه کنید‪ .‬در این مثال ‪ 4‬دانشجو با ‪ 3‬نمره وجود دارند‪.‬‬
‫پس به یک آرایه ‪ 2‬بعدی با ‪ 4‬سطر (تعداد دانشجویان) و ‪ 3‬ستون (تعداد دروس)‬
‫نیاز داریم‪ .‬به همین دلیل یک آرایه دو بعدی ]‪ score[4][3‬ساختیم‪ .‬حال به کمک‬
‫یک حلقه تو در تو‪ ،‬نمره هر درس را میخوانیم که در ]‪ ،score[i][j‬به معنای نمره‬
‫درس ‪j‬ام دانشجو ‪i‬ام است‪ .‬یک آرایه یک بعدی ‪ 4‬عضوی (‪ 4‬دانشجو) به نام ‪sum‬‬
‫ساخته ایم که مجموع نمرات هر دانشجو را در خود ذخیره میکند‪ .‬واضح است که با‬
‫تقسیم ]‪ sum[i‬بر ‪( 3‬تعداد دروس) معدل هر دانشجو بدست میآید‪ .‬نمرات و‬
‫معدل هر دانشجو را در حلقه دوم چاپ میکنیم‪ .‬در خط آخر‪ ،‬میانگین هر درس و‬
‫در درایه آخر‪ ،‬میانگین کلی را درج میکنیم‪ .‬برای اینکار‪ ،‬آرایه ای با نام‬
‫‪ sumsubject‬ساختهایم که مثال تمام نمرات ریاضی دانشجویان را در خود ذخیره‬
‫کرده و با تقسیم ]‪ sumsubject[i‬بر ‪ ،4‬میانگین هر درس به دست می آید‪ .‬نکته‬
‫ای که وجود دارد‪ ،‬در حلقه های قبلی بصورت سطری پیمایش میکردیم‪ ،‬یعنی در‬
‫]‪ ،score[i][j‬در یک سطر ‪ i‬ثابت و ‪ j‬تغییر میکرد‪ ،‬اما برای جمع دروس‪ ،‬باید‬
‫بصورت ستونی پیمایش کنیم‪ ،‬که برای اینکار در ]‪ score[i][j‬در هر ستون باید ‪j‬‬
‫ثابت باشد و به مقدار ‪ i‬اضافه گردد‪ .‬برای اینکار یا میتوانیم در حلقه تو در تو‪ ،‬حلقه‬
‫بیرونی را ‪ j‬بنامیم و حلقه درونی را ‪ ،i‬یا اینکه اگر حلقه بیرونی ‪ i‬است‪ ،‬بصورت‬
‫]‪ score[j][i‬پیمایش کنیم تا بتوانیم جمع نمرات هر ستون را حساب کنیم‪( .‬با‬
‫توجه به حدکثر مقادیر ‪ i‬و ‪ .)j‬حال میانگین هر درس را با تقسیم بر ‪ 4‬نشان می‪-‬‬
‫دهیم‪ .‬برای محاسبه آخرین درایه که میانگین کلی است‪ ،‬می توان یا از آرایه ‪sum‬‬
‫استفاده کرد یا از ‪ sumsubject‬استفاده کرد‪ ،‬که بعنوان مثال ما از مورد دومی‬
‫استفاده کردهایم‪ .‬الزم به ذکر است که میتوان بعضی از دستورات را دی حلقه های‬
‫قبلی استفاده نمود و کد را خالصه تر کرد‪ ،‬اما برای واضح بودن‪ ،‬سعی شد دستورات‬
‫کمتری در هر حلقه باشد‪.‬‬

‫‪61‬‬
‫‪ ‬نکته‪ :‬آرایه }… ‪ a[N] = {0, 0, 0,‬معادل }{ = ]‪ a[N‬است‪ .‬در مثال باال می‬
‫توانستیم از }{ نیز استفاده کنیم‪.‬‬

‫با روش حلقه های تو در تو برای مقداردهی به آرایه دو بعدی آشنا شدید‪ .‬برای‬
‫مقداردهی در داخل برنامه میتوانید به روش زیر عمل کنید‪.‬‬

‫}} … ‪A[m][n] = {{a00, a01 … a0n}, {a10, a11, …a1n} … {am0, am1,‬‬
‫اگر آرایه ای در تابع ‪ main‬داشته باشید و میخواهید به یک تابع‪ ،‬آرایه ارسال‬
‫کنید‪ ،‬نخست باید یک آرایه بعنوان آرگومان و یک آرگومان دیگر برای اندازه آرایه‬
‫ساخت‪:‬‬

‫)‪Type FunctionName (int Arr[], int n‬‬


‫سپس هنگام ارسال آرایه از تابع‪ ،‬الزم نیست کروشه هایش را بگذارید‪ .‬بعنوان مثال‪:‬‬

‫;}‪int arr[] = {0, 2, 5‬‬

‫;)‪arrayfunc (arr, 3‬‬


‫که بدین صورت آرایه به تابع ارسال میگردد‪ .‬توجه کنید که در سواالت این بخش‪،‬‬
‫اندازه آرایه به شما داده میشود و شما با آرایه های داینامیک کاری ندارید و اندازه‬
‫آرایه هایتان همیشه ثابت است‪ .‬ایجاد آرگومان برای دریافت اندازه آرایه اجباری‬
‫نیست و صرفا باعث ساده سازی می شود‪ .‬در این حالت می توانید با تقسیم کل سایز‬
‫آرایه به سایز یکی از اعضای آرایه‪ ،‬اندازه آرایه را بدست آورید‪.‬‬

‫گاهی نیاز است که در یک آرایه‪ ،‬داده ای را بیابید‪ .‬برای اینکار روش های متنوعی‬
‫وجود دارد که به ذکر دو مثال میپردازیم‪ .‬در روش اول‪ ،‬مقایسه هر عنصر از آرایه با‬
‫عندصر مورد نظر است‪ .‬برای اینکار با یک حلقه ساده‪ ،‬یک به یک عناصر آرایه را با‬
‫داده مطلوب مقیاسه میکنیم‪.‬‬
‫در روش دوم‪ ،‬فرض کنید آرایه ای مرتب دارید‪ .‬نخست عنصر وسط را با داده مطلوب‬

‫‪62‬‬
‫مقایسه میکنیم‪ . .‬اگر هم که همان عنصر وسطی بود که یعنی عنصر مطلوب را‬
‫یافته ایم‪ .‬اگر داده مطلوب از آن عدد کوچک تر باشد‪ ،‬پس باید در نیمه اول به‬
‫دنبال آن بگردیم (بدلیل مرتب بودن آرایه)‪ .‬اگر از عنصر وسط بزرگتر بود‪ ،‬باید در‬
‫نیمه دوم به دنبال آن عنصر بگردیم‪ .‬سپس برای بازه های دیگر این کار را تکرار‬
‫کرده تا به عنصر مطلوب برسیم‪ .‬واضح است که سرعت این روش از روش باالیی‬
‫بیشتر است (چون بعضی از داده ها اصال بررسی نمی شوند)‪ .‬به مثال زیر دقت کنید‪.‬‬

‫>‪#include <iostream‬‬

‫;‪using namespace std‬‬

‫)(‪int main‬‬

‫{‬

‫;‪int a[] = {1, 3, 4, 5, 6, 8, 11, 13, 15, 16}, high, low, mid, x = 15‬‬

‫;‪bool found = false‬‬

‫;‪low = 0‬‬

‫;‪high = 9‬‬

‫{ )‪while (low <= high‬‬

‫;‪mid = (high + low)/2‬‬

‫{ )]‪if (x == a[mid‬‬

‫;‪cout << "Found! Index is: " << (high + low)/2‬‬

‫;‪found = true‬‬

‫;‪break‬‬

‫}‬

‫{ )]‪if (x > a[mid‬‬

‫;‪low = mid + 1‬‬

‫}‬

‫{ )]‪if (x < a[mid‬‬

‫;‪high = mid - 1‬‬

‫}‬

‫}‬

‫{ )‪if (!found‬‬

‫;"‪cout << "Not found‬‬ ‫‪63‬‬


‫}‬

‫};‪return 0‬‬
‫‪Found! Index is 8‬‬

‫در اینجا ما به ‪ x‬یک مقدار اولیه دادهایم‪ ،‬اما می شد کاربر عدد را وارد کند که فرقی‬
‫ندارد‪ .‬در اینجا سه متغیر ‪ low ،high‬و ‪ mid‬داریم که ‪ high‬منظور اندیس‬
‫ماکسیمم بازه‪ mid ،‬اندیس مینیمم بازه و ‪ mid‬عنصر وسطی است‪ .‬بطور مثال به‬
‫دنبال عدد ‪ 15‬در این آرایه ایم‪ .‬نخست مقادیر ‪ max ،min‬و ‪ mid‬آرایه مشخص‬
‫می گردند که ]‪ a[0‬مینیمم و ]‪ a[9‬ماکسیمم و ]‪ a[4‬عنصری وسطی است‪ .‬سپس‬
‫متغیر ‪ x‬با ]‪ a[4‬مقایسه میگردد‪ .‬چون آرایه مرتب بوده و ‪ x‬از ]‪ a[4‬بزرگتر است‪،‬‬
‫پس یعنی باید در نیمه دوم به دنبال ‪ x‬باشیم‪ .‬پس برای نیمه دوم‪ ،‬به ترتیب ]‪ a[5‬و‬
‫]‪ a[9‬را بعنوان مینیمم و ماکسیم و ]‪ a[7‬را نیز بعنوان عنصر وسطی انتخاب‬
‫میکنیم‪ .‬دوباره عنصر ‪ x‬را با ]‪ ،a[7‬عنصر وسط‪ ،‬مقایسه میکنیم‪ x .‬از ]‪ a[7‬بزرگتر‬
‫است‪ ،‬پس باید در نیمه دوم (]‪ a[7‬تا ]‪ )a[9‬به دنبال ‪ x‬باشیم‪ .‬دوباره مینیمم را‬
‫]‪ a[8‬فرض کرده و ماکسیمم همان ]‪ ،a[9‬فرض میکنیم‪ .‬اندیس عنصر وسط =‬
‫‪ 8 = (8+9)/2‬سپس ]‪ a[8‬با ‪ x‬مقایسه شده و عنصر مطلوب پیدا میگردد‪ .‬شرط‬
‫حلقه ‪ while‬بدین صورت است که اندیس ‪ low‬نباید از اندیس ‪ high‬بزگتر شود‪،‬‬
‫مثال اگر عدد مورد نظر ‪ 15‬نبود‪ ،‬در مرحله بعد هم ‪ low‬هم ‪ 9 ،high‬شده و در‬
‫مرحله بعد ‪ 10 low‬و ‪ 9 high‬میشود که تناقض است و بدین معناست که عنصر‬
‫مربوطه در آرایه وجود ندارد‪.‬‬

‫در آخر این فصل هم به مرتب کردن آرایه ها میپردازیم‪ .‬برای مرتب کردن آرایه ها‬
‫میتوانید از توابع آماده (همچون ‪ )sort‬استفاده کنید‪ .‬یکی از الگوریتمهای معروف‬
‫‪ Bobble Sort‬میباشد‪ .‬در این روش عنصر ‪i‬ام را عنصر بعدی اش مقایسه می‪-‬‬
‫کنید‪ .‬اگر عنصر اول کوچکتر از دومی بود‪ ،‬جای آنها را با هم عوض میکنید‪ .‬اینکار‬
‫را آنقدر ادامه میدهیم که کل آرایه مرتب گردد‪ .‬اگر آرایه ای ‪ n‬عضو داشته باشد و‬

‫‪64‬‬
‫در بد ترین حالت اگر عضو آخر کوچکترین باشد‪ ،‬بدترین حالت می باشد‪ ،‬که در هر‬
‫بار‪ ،‬فقط یکبار عقب می آید‪ .‬یعنی در هر بار سورت کردن‪ ،‬در بدترین حالت‪ ،‬جای‬
‫یک عنصر تعیین میگردد‪ .‬پس به تعداد عناصرش سورت کردن را تکرار کنیم‪ .‬بدین‬
‫منظور باید از یک حلقه تو در تو استفاده کرد در بدترین حالت نیز عناصر را مرتب‬
‫کند‪ .‬فرض کنید آرایه زیر را میخواهیم مرتب کنیم‪.‬‬

‫}‪Arr[] = { 5, 13, 7, 2, 9, 1‬‬

‫‪ 5‬از ‪ 13‬کوچکتر است‪ ،‬پس کاری نمیکنیم‪ 7 .‬از ‪ 13‬کوچکتر است پس جای این دو‬
‫رو عوض میکنیم‪ 5, 7, 13, 2, 9, 1.‬سپس ‪ 13‬را با ‪ 2‬مقایسه و جابجا می کنیم‪.‬‬
‫‪ 5, 7, 2, 13, 9, 1‬حال جای ‪ 13‬و ‪ 9‬را جابجا میکنیم‪ 5, 7, 2, 9, 13, 1 .‬و در‬
‫آخر نیز جای ‪ 13‬و ‪ 1‬را عوض میکنیم‪ .‬همانطور که میبینید‪ ،‬جای اصلی عدد ‪13‬‬
‫در یکبار سورت کردن مشخص شد‪ .‬پس باید ‪ n‬بار (‪ n‬اندازه آرایه) آن را سورت‬
‫کنیم تا جای همه عناصر مشخص گردند‪ 5 5, 7, 2, 9, 1, 13 .‬کوچکتر از ‪ 7‬هست‬
‫پس کاری نمیکنیم‪ 7 .‬بزرگتر از ‪ 2‬است‪ ،‬پس باید جایشان را با هم عوض کنیم‪5, .‬‬
‫‪ 7 .2, 7, 9, 1, 13‬کوچک تر از ‪ 9‬بوده و کاری با آن نداریم‪ ،‬حال جای ‪ 1‬را با ‪9‬‬
‫عوض کرده و میشود ‪ ،5, 2, 7, 1, 9, 13‬که در دومین سورت‪ ،‬مکان دومین عنصر‬
‫نیز پیدا شد‪ .‬حال اگر این روش را ‪ 6‬بار (اندازه آرایه) تکرار کنیم‪ ،‬آرایه مرتب می‪-‬‬
‫شود‪ .‬کد مربوط به مرتب سازی بدین شکل است‪:‬‬

‫;}‪int arr[] = {5, 13, 7, 2, 9, 1‬‬

‫{ )‪for (int i = 0; i < 6; i++‬‬

‫{ )‪for (int j = 0; j < 6 – 1; j++‬‬

‫{ )‪if(arr[j] > arr[j+1‬‬

‫]‪spaw(arr[j], arr[j+1]) ; // Or use temp variable to change arr[j] and arr[j+1‬‬

‫}‬

‫}‬

‫}‬

‫‪65‬‬
‫تمرین ها‬

‫*‪ :5-1‬برنامه ای بنویسید که آرایه ای ‪ 5‬عضوی از کاربر دریافت کرده و پس از‬


‫مرتب کردن آن‪ ،‬بگوید که آیا این اعداد می توانند تشکیل دنباله حسابی دهند‪.‬‬

‫*‪ :5-2‬برنامه ای بنویسید که آرایه ای ‪ 10‬عضوی از کاربر گرفته و ‪ 3‬عدد بزرگ این‬
‫اعداد را مشخص کند‪.‬‬

‫*‪ :5-3‬تمرین ‪ 5-2‬را بگونه ای انجام دهید که ‪k‬امین عدد بزرگ را اعالم کنید‪ k .‬را‬
‫نیز کاربر وارد می کنید‪.‬‬

‫**‪ :5-4‬به کمک سه تابع‪ ،‬میانه‪ ،‬مد و میانگین یک مجموعه عدد ‪20‬تایی را حساب‬
‫کنید‪.‬‬

‫**‪ :5-5‬برنامه ای بنویسید که کوچکترین عنصر گمشده در یک آرایه ‪ 5‬عضوی را‬


‫مشخص کند‪ .‬به عنوان مثال اگر آرایه ‪ 0, 1, 3, 4, 6‬داشته باشیم‪ ،‬کوچکترین‬
‫عنصر گمشده عدد ‪ 2‬است‪.‬‬

‫**‪ :5-6‬برنامه ای بنویسید که آرایه ای ‪ 20‬عضوی را بصورت زیگزاگ مرتب کند‪.‬‬


‫‪ a<b>c<d>e‬و ‪...‬‬

‫**‪ :5-7‬برنامه ای بنویسید که آرایه ای ‪ 10‬عضوی از کاربر گرفته و اعداد زوج را‬
‫بصورت صعودی در اول آرایه و اعداد فرد را بصورت صعودی در آخر آرایه بگذارد‪.‬‬

‫*‪ :5-8‬برنامه ای بنویسید که آرایه ای ‪ 20‬عضوی از کاربر بگیرد‪ ،‬سپس یک عدد از‬
‫کاربر بگیرد و بگوید چند بار آن عدد در آرایه تکرار شده است‪.‬‬

‫*‪ :5-9‬برنامه ای بنویسید که آرایه ای ‪ 20‬عضوی بگیرد و اعضای منحصر بفرد آرایه‬
‫را نشان دهد‪( .‬تکراری نباشند)‬

‫‪66‬‬
‫**‪ :5-10‬به کمک تابع بازگشتی‪ ،‬کوچکترین عضو یک آرایه ‪ 10‬عضوی را اعالم‬
‫کنید‪.‬‬

‫‪###‬‬

‫‪67‬‬

You might also like