آموزش برنامه‌نویسی – بخش پنجم – چرا هر آموزشی باید عنوان داشته باشد؟

سلام. با بخش پنج آموزش برنامه‌نویسی در خدمت‌تون هستیم.

توی بخش قبل ما یاد گرفتیم این‌جوری چندتا متغیر بسازیم و درجا مقداردهی‌شون هم بکنیم:

int ali = 1, reza = 3, hadi = 3;

و این‌جوری هم مقدار متغیر رو از کاربر بگیریم:

cin >> ali >> hadi >> reza;

و اینی که می‌بینید توی آمورش قبلی ۲۰۰۰کلمه از من تایپیدن گرفت!

دفعه‌ی قبل بعد از خلاصه‌ای که اول آموزش گفتیم یه بخش مفهومی هم داشتیم تا ببینیم پشت اون کدهایی که می‌نویسیم واقعا چی می‌گذره ولی امروز چون درس‌مون به‌جایی نرسیده که چیز خاصی رو بتونم توضیح بدم (یا به ذهنم نمی‌رسه که چیزی رو توضیح بدم) امروز از این خبرا نیست.

توی جلسه‌ی قبل یادمون رفت که بگیم چجوری یه متغیر رو چاپ کنید و البته فکر کنم خودتون حدس زدید که چجوریه ولی چون من باید به رسالت آموزشی خودم (!!!) عمل کنم پس بهتون می‌گم چجوری. واضحه که برای چاپ متغیر باید از cout  استفاده کنیم و بعد از >>  بدون این‌که علامت دیگه‌ای بزاریم اسم متغیر رو می‌نویسیم. یعنی این‌جوری:

cout << reza << ali << hadi << endl;

پس همین‌جا می‌تونیم نتیجه بگیریم که endl  هم خودش یه متغیر از یه نوعیه که نمی‌شناسیم‌ش که باعث می‌شه “n”  منتشر بشه.

فعلا بهش نمی‌پردازیم باشه بعدا.

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

محتویات پرانتزها

ضرب و تقسیم

جمع و تفریق

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

عملگر باقیمانده با %  نمایش داده می‌شه و واضحه که باقیمانده‌ی عدد سمت چپ‌ش بر عدد سمت راست‌ش رو خروجی می‌ده و اون عدد سمت راست یا چپ می‌تونه متغیر هم باشه.

مثلا

6 % 3

خروجی‌ش 0  خواهد بود و

6 % 4

هم 2  رو خروجی می‌ده و توی کد زیر:

int ali=100, reza= 80;
cout << ali % reza;

عدد 20 رو خروجی می‌گیریم و البته اگر عدد سمت راست از عدد سمت چپ بزرگ‌تر باشه خروجی همون عدد سمت چپ می‌شه. (بدیهی‌نامه!)

خوب ما الان متغیرمون رو هم داریم ولی بازم به دردمون نمی‌خوره چون تهِ‌تهِ‌ش کار خاصی نمی‌تونیم با متغیرمون بکنیم.

برای این‌که برنامه‌مون یه‌ذره پویاتر باشه باید اطلاعاتی که از کاربرامون می‌گیریم رو به روش‌های مختلف پردازش کنیم. اولین و تقریبا پرکاربردترین روش پردازش این اطلاعات استفاده از شرط‌هاست. یادتونه توی اولین آموزش‌مون وقتی روبات‌مون یه‌ذره خنگ‌تر بود و شرایط رو نرمال در نظر گرفته بودیم، توی الگوریتم بهش می‌گفتیم «اگه یه چیز جامد سفید دیدی اون رو بریز توی لیوان»؟ این از اولین شرط‌هایی بود که باهم باهاشون آشنا شدیم و البته شرط‌هایی که من یادم نمیاد ولی فکر کنم بودن!

مطمئن باشید که توی سی‌پلاس‌پلاس هم ما از این شرط‌ها داریم وگرنه که نمی‌شه اسم‌ش رو زبان برنامه‌نویسی گذاشت

توی سی‌پلاس‌پلاس شرط‌ها با if  مشخص می‌شن که توی انگلیسی هم «اگر» معنی می‌ده (برا همین می‌گن سی‌پلاس‌پلاس به زبان انسان‌ها نزدیکه! البته زبان کفار بی‌ناموس خدانشناس عرق‌خور مالِ‌مردم‌خور شیطان‌پرست فراماسون دجال‌پرست تئوری توطئه‌ی انگلیسی زبان!) و عبارت شرطی رو بعد از if توی یه پرانتز می‌نویسیم و اگر چندتا شرط داشته‌باشیم هم اونا رو توی پرانتزهای جداگانه می‌نویسیم وبزارید اینا رو بعدا توضیح بدم.

اول این‌که توی پرانتزی که جلوی if  می‌ذاریم باید عبارت شرطی‌مون رو بنویسیم. فعلا عبارت‌های شرطی‌مون عبارت‌های مقایسه‌ای هستن. یعنی باید دوتا مقدار رو باهم مقایسه کنیم و البته در نهایت شرط‌های پیچیده‌تر یا شرط‌هایی که مقایسه‌ای نیستن هم توی برنامه‌نویسی به شرط‌های مقایسه‌ای بر می‌گردن (یعنی در نهایت چه بخواهید چه نخواهید شرط‌ها مقایسه‌ای هستن. مثلا «اگر آمریکا حمله کنه» که در جواب شرط‌ش برنامه‌مون جواب دندان‌شکنی به آمریکا می‌ده شرطیه که از مقایسه‌ی یک وضعیت منطقه قبل از برخورد بمب‌های آمریکا‌ی کافرِ مسلمون‌کشِ بی‌دینِ «خون جوانان ما می‌چکد از چنگ تو»ِ «مرگ به نیرنگ تو»ِ استعمار جهانی و وضعیت همون منطقه بعد از برخورد بمب‌های همون آمریکایی که گفتم، بدست آورد.)

عبارت شرطی شامل دوتا مقدار هم‌نوع و یک عملگر (operator) شرطی‌ه و بعدا عبارت‌های شرطی‌ای که در ظاهر مقایسه‌ای نیستن ولی در پشت‌پرده از کلی شرط مقایسه‌ای تشکیل شدن رو هم بررسی می‌کنیم.

اون دوتا مقدار هم‌نوع معمولا متغیر هستن (یا حداقل یکی‌شون متغیره) و ما فعلا فقط int رو بلدیم و عملگرهای مقایسه‌ای هم عملگرهای مقایسه‌ای‌ای هستن که توی دوم دبستان یاد گرفتیم (و البته چندتا دیگه که تو دوم دبستان یاد نگرفتیم!) یعنی بزرگتر و کوچکتر >  <  و تساوی که برای این‌که با عملگر مقداردهی متغیر قاطی نشه از دوتا تساوی پشت‌سرهم استفاده می‌کنیم == و عملگر بزرگتر مساوی و کوچکتر مساوی <=  و «>= » و نامساوی <>. یادتون نره که توی عبارت‌های شرطی نمی‌تونیم از یک علامت تساوی استفاده کنیم.

و البته عبارت‌های شرطی هم خودشون خروجی‌ای از نوع یه متغیر دیگه به اسم bool که از کلمه‌ی boolean گرفته‌شده می‌دن و if  هم در واقع به اون خروجی نگاه می‌کنه. پس می‌شه به‌جای عبارت‌های شرطی از متغیرهایی از نوع bool استفاده کرد و البته این متغیرها رو هم می‌شه با عبارت‌های شرطی مقداردهی کرد.

در نهایت بعد از پرانتزی که توش عبارت‌های شرطی‌مون یا متغیر boolمون رو قرار دادیم باید دستوری رو بنویسیم که اگر محتویات پرانتز درست بود اون دستور اجرا بشه. اگر بخواهیم بیش از یک دستور را اجرا کنیم باید به یک‌طوری به کامپایلر بفهمونیم که قراره چه دستوراتی در صورت درست‌بودن شرط اجرا بشه و ما به کمک علامت‌های } و { این کار رو انجام می‌دهیم. به‌طور کلی هم این علامت‌ها برای دسته‌بندی (بسته‌بندی!) کدها مورد استفاده قرار می‌گیرن و البته ما تاحالا این علامت‌ها رو توی قالب کدنویسی‌مون دیدیم:

int main()
{
}

در آینده هم بیش‌تر باهم آشنا می‌شیم!

خوب حالا برای این‌که بیش‌تر متوجه بشیم بیاید باهم یه مثال حل کنیم. فرض کنیم می‌خوایم سن علی و رضا رو از کاربر بگیریم و اون‌ها رو باهم مقایسه کنیم و بگیم که سن اینا نسبت به هم چه وضعیتی داره. پس برنامه‌مون یه‌چیزی مثل این می‌شه:

int main()
{
int ali, reza;
cout << "please enter the age of Ali and Reza";
cin >> ali >> reza;
if (ali==reza)
cout << "They are in the same age!";
if (ali > reza)
cout << "Ali is older than Reza!";
if (ali < reza)
cout << "Reza is older that Ali!";
}

و البته می‌شه این رو به شکل‌های دیگه هم پیاده کرد.

اگر دقت کنید می‌بینید که توی مثال بالا شرط سوم ما برعکس شرط دوم ماست و البته شرط دوم و سوم هم برعکس شرط اول هستن. یکی از راه‌هایی که به کامپایلر بگیم که در صورت درست‌نبودن شرط چه کاری انجام بده اینه که از کلیدواژه‌ی else استفاده کنیم و اتفاقا این خیلی هم معمول و معقوله!

ما می‌تونیم برای این‌که برنامه‌مون کارایی بیش‌تری داشته باشه از else استفاده کنیم. چرا؟ برای این‌که فرض کنید عبارت‌های شرطی اول و دوم و سوم نیاز به پردازش بسیار زیادی داشته باشند. در برنامه‌ی بالا بدون توجه به این‌که کدوم شرط درسته هر سه عبارت شرطی ما پردازش می‌شن و این ممکنه توی برنامه‌های بزرگ فاجعه به بار بیاره و البته این فاجعه هم چیزی نیست جز یکی از کابوس‌های برنامه‌نویس‌ها، کمبود منابع! و البته شما الان دارید (احتمالا) به این قضیه می‌خندید ولی وقتی مثل آهو تو عسل گیر کردید این برنامه‌تونه که به شما می‌خنده (و البته اون شکلک معروف ترول رو می‌تونید به‌جای قیافه‌ی برنامه‌تون تصور کنید! و بدانید و آگاه باشید که به همه‌ی اون شکلک‌ها نمی‌گن ترول بلکه اسم‌شون ……….. هستش و جادی هم نوشته‌ی خوبی در توضیح این قضیه داره.)

و البته یه قضیه‌ی دیگه هم اینه که شما می‌تونید هر تعدادی که دوست دارید توی ifهاتون یه if دیگه استفاده کنید و اصطلاحا بهش if تو در تو (یا 2×2!) می‌گن!

حالا بیاید مثال قبلی‌مون رو بازنویسی کنیم

int main()
{
int ali, reza;
cout << "please enter the age of Ali and Reza";
cin >> ali >> reza;
if (ali==reza)
cout << "They are in the same age!";
else
{
if (ali > reza)
cout << "Ali is older than Reza!";
else
cout << "Reza is older that Ali!";
}
}

خوب حالا بیاید بررسی کنیم که چرا استفاده از else باعث می‌شه برنامه‌مون بهینه‌تر بشه: ببینید وقتی که برنامه اجرا می‌شه در حالت قبلی همون‌طور که گفتم همه‌ی عبارت‌های شرطی اجرا می‌شه ولی این‌جا در بهترین حالت ali == reza درسته و برنامه دیگه سراغ پردازش محتویات else بعد از شرط اول نمی‌ره و اگر هم این نباشه ali > reza پردازش می‌شه و اگر هم این درست نباشه چون شرط سوم رو حذف کردیم و جاش else گذاشتیم بازهم برنامه‌مون از حالت قبل سریع‌تر کارش رو انجام می‌ده.

برای همین هم پیشنهاد می‌کنم تو همچین عبارت‌های شرطی‌تون رو براساس احتمال درست‌بودن از بزرگ به کوچیک تو برنامه قرار بدید تا برنامه‌تون از این نظر در بهترین حالت خودش باشه. البته ما هم این قضیه رو توی مثال‌مون رعایت نکردیم که اگر بخواهیم رعایت کنیم برنامه‌مون می‌شه این:

int main()
{
int ali, reza;
cout << "please enter the age of Ali and Reza";
cin >> ali >> reza;
if (ali<reza)
cout << "Ali is older than Reza!";
else
{
if (ali > reza)
cout << "Reza is older that Ali!";
else
cout << "They are in the same age!";
}
}

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

یه ماشین‌حساب ساده بنویسید که اول دوتا عدد از کاربر بگیره و بعدش به کاربر بگید که اگر می‌خواد اینا رو باهم جمع کنه عدد ۱ اگر می‌خواد تفریق کنه ۲ و تقسیم ۳ و ضرب ۴ رو وارد کنه و برنامه‌ی شما هم خروجی رو حساب کنه و به کاربر بگه. (پیشنهاد می‌کنم اولیت شرط‌هاتون این‌جوری باشه جمع، ضرب، تفریق و تقسیم)

یه برنامه بنویسید که سن سه نفر رو بگیره و اسم‌شون رو بر اساس ترتیب سن‌شون از بزرگ به کوچیک چاپ کنه.

یه برنامه بنویسید که توش سن دو نفر رو بگیره و بررسی کنه ببینه که آیا اختلاف سنی‌شون اون‌قدر کم هست که بتونن باهم دوست‌های صمیمی بشن یا نه (و خوب خودتون خلاقیت به‌خرج بدید در مورد حدود اختلاف‌سنی مناسب!)

تا جلسه‌ی بعدی خدانگهدار… 

0 دیدگاه در “آموزش برنامه‌نویسی – بخش پنجم – چرا هر آموزشی باید عنوان داشته باشد؟

  1. سلام
    ی سوال بی‌ربط به پست:
    من در ویندوز 8 وقتی view را بر روی medium-size icon یا بزرگتر تنظیم میکنم،thumbanil تصاویر و ویدیوها نمایش داده نمیشه
    چطوری باید این مشکل را حل کرد؟؟

    1. متوجه نشدم که دقیقا چی می‌گید. پیشنهاد می‌کنم سوال‌تون رو توی عجوبه (ojobeh.com) مطرح کنید. احتمال این‌که جواب بگیرید بیش‌تره!

    1. این‌جا من در مورد عملگر باقیمانده‌ی صحیح توضیح دادم و شرط‌ها. کدوم بخش رو متوجه نشدید؟

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *