سلام!
بعد از کلی دردسر و تنبلی دوباره اینجاییم که آموزش برنامهنویسی رو ادامه بدیم.
قبل از شروع میگم که ما تو سهتا آموزش قبلی دقیقا چیکار کردیم: ما توی بخش اول آموزش یادگرفتیم که الگوریتمها چی هستند و از این حرفها. توی بخش دوم یه ترجمه از جادی در مورد برنامهنویسی گرفتیم و گوش کردیم و توی بخش سوم هم سیپلاسپلاس رو شروع کردیم و یاد گرفتیم که توی سه تا محیط برنامهنویسی پروژهی سیپلاسپلاس بسازیم و همینطور اینکه به کمک دستور cout چجوری یه چیزی برای کاربر بنویسیم.
و امروز چون خیلی از جلسهی قبلی گذشته روی درس جلسهی قبل یه مروری خواهیم داشت. البته بهجز آموزش ساختن پروژه!
ما برای چاپ نوشتهای روی کنسول از دستور cout استفاده میکنیم و طرز کارش هم آسونه. (به اون صفحهی مشکی که وقتی برنامهمون اجرا میشه باز میشه کنسول، ترمینال صفحهی CMD، CMD و کلی چیز دیگه میگن!)
cout << {} << {} << {};
اول cout رو مینویسیم و
<<
رو مینویسیم بهطوری که نوک تیزشون سمت
cout
باشه (سعی کنید اینجوری یاد بگیرید و البته راههای دیگهای هم وجود داره!) و بعدش هم اگر میخواهیم نوشتهای چاپ کنیم، اون رو توی دبل کوتیشن میذاریم و بعدا هم یاد میگیریم که چیزای دیگه رو هم خروجی بدیم.
و اگر چیز دیگهای خواستیم بنویسیم هم دوباره
<<
رو میذاریم و همینطور ادامه میدیم کار رو؛ محدودیت هم نداره! و یا میتونیم از یه cout دیگه استفاده کنیم و یادمون هم نمیره که آخر دستوراتمون حتما نقطهویرگول فراموش نشه!
و اگر هم میخواهیم بریم به خط بعد میتونیم از دو راه استفاده کنیم: اول اینکه دوتا علامت کوچیکتر همجهت بذاریم و یه endl بنویسیم و دوباره اون دوتا علامت و بعدش هم کار رو ادامه میدیم. حالا جایی که برنامه به endl میرسه، نوشتههای بعدیش رو در خط بعد مینویسیه و بهقول معلم جبرمون ما پیروزیم همانطور که اسلام پیروز است!
cout << "hi" << endl << "welcome!";
و روش دوم هم استفاده از کارکترهای ویژه مثل /n و /t و کلی کارکتر دیگهست که توضیحاتش رو توی آموزش قبلی دادم و اینجا هم هرجا استفاده کنیم توضیحش رو بهتون میدم که توی اینجا برای رفتن به خط بعد هرجا لازم شد توی نوشتهمون که توی دبل کوتیشن مینویسیمش یه بکاسلش و یه n مینویسیم و برنامه هم هرموقع به اینجا رسید میره خط بعدی.
cout << "hinwelcome!";
خوب تا الان درسهای جلسهی قبل رو مرور کردیم و هرچقدرش رو هم که نگفتم (و این یعنی یادم رفته بگم) رو به بزرگی خودتون ببخشید.
حالا که یهذره کار عملی کردیم بیاین یهذره تئوری هم بحث کنیم. میخوایم ببینیم که یه برنامهای که ما توی محیط ویرایشگر مینویسیم چجوری تبدیل میشه به یه فایل اجرایی که هر ویندوزی بدون نیاز به اینکه بدونه کد ما چیبوده اون رو اجرا میکنه.
بعلاوه یک بخشی از کدهایی که توی آموزش قبلی گفتم وجودشون اجباریه رو دلیل وجودشون رو توضیح میدم تا بدانید و آگاه باشید که اینا رو ما از الکی و برای خوشگلی تو برنامهمون نمیذاریم!
در ضمن بگم که من این اطلاعات رو از یادداشتهایی که چندسال پیش توی کلاس آموزش سیپلاسپلاس مجتمع فنی برداشتهبودم میخونم.
- اولین مرحله اینه که برنامهمون رو توی محیط ویرایشگر مینویسیم.
- وقتی که به کامپایلر میگیم که برنامهمون رو برامون کامپایل کنه اول یه چیزی به اسم Pre Compiler میاد برنامهمون رو بررسی میکنه و یکسری از دستورات خاص رو که ما اونها رو با علامت # مشخص کردیم رو پردازش میکنه.ما هم به این دستورات خاص که توی ویرایشگرهای ما هم با یه رنگ دیگه مشخص میشن میگیم دستورات پیشپردازنده. مثلا اگر یادتون باشه اولین دستوری که ما مینویسیم
#includeهستش. اینجا داریم میگیم که این دستوریه که باید پیشپردازنده پردازشش کنه.
حالا ببینیم این یعنی چی! ببینید یکی از چیزایی که سیپلاسپلاس داره اینه که توی خودش هیچ دستور خاصی نداره و فقط یکسری کلمهی کلیدی داره و یکسری چیز دیگه که بعدا بهنوبت بهشون میرسیم. و دستورهایی که استفاده میکنیم رو توی یه جاهایی به اسم کتابخانه گنجونده و ما هم از همون کتابخانهها استفاده میکنیم یا کتابخونهی خودمون رو که دستورات خودمون توش هستند رو اجرا میکنیم.
البته باید بگم که استفاده از واژهی دستور اینجا غلطه ولی من جایگزین دیگهای براش پیدا نکردم. حالا توی قسمتهای بعدی توضیح میدم که قضیه چیه ولی فعلا از همون واژهی دستور استفاده میکنیم.
حالا برای استفاده از کتابخونههای سیپلاسپلاس ما به پیشپردازنده میگیم که محتویات یه کنابخونهی خاص رو بزار بالای کد ما. یعنی انگار تمام کدهای اون رو بالای کد من کپی – پیست کن تا من که توی برنامهم ازش استفاده میکنم کامپایلر ارور نده که فلان دستور رو نداریم و از این حرفا.
و البته پیشپردازنده یکسری دستور دیگه هم داره که بهوقتش توضیح میدیم! - مرحلهی بعدی اینه که کامپایلر میاد و کد ما + اونچیزی که پیشپردازنده تولید کرده رو به کدهای زبانماشین تولید میکنه و یه فایل با پسوند obj میسازه.
- تو مرحلهی چهارم که توی سیستمعاملهای مختلف تفاوت اینجا میشه اینه که لینکر کتابخانههای سیستمعامل رو صدا میزنه. مثلا اگر برنامهی شما صدای بیب سیستمعامل رو در میاره. این توی ویندوز و لینوکس شیوهی متفاوتی داره که لینکر کارش اینه که توی هر سیستمعامل این شیوه رو عملی کنه.البته این قضیه خودش یهذره پیچیدهست که چجوریه که فایلهایی که به زبون ماشین هستن توی سیستمعاملهای مختلف یکسان نیستن که منم دقیقا نفهمیدم قضیه چیه و فکر هم نمیکنم که انقدر مهم باشه.
و حالا فایل اجرایی ما که میشه فایل exe توی ویندوز یا نمیدونم چی توی لینوکس ساخته میشه. این نمیدونم چی هم واقعی بود چون دقیقا نمیدونم ساختار برنامهها توی لینوکس چجوریه. - حالا وقتی میخوایم برنامهمون رو اجرا کنیم اول لودر برنامهمون رو روی رم سیستم آدرسدهی میکنه و بعدش هم برنامه توسط CPU پردازش میشه.
خوب این نمونهی یک برنامهایه که هیچ کاری نمیکه و فقط اون قالبیه که ما دفعهی قبل گفتیم باید باشه:
#include <iostream> using namespace std; int main() { }
و ما خط اول رو توضیح دادیم. حالا توی خطی که مینویسیم
using namespace std;
و نقطهویرگول هم یادمون نمیره! یکی از مشکلات اساسیای که ممکنه تو برنامهنویسی پیش بیاد رو حل میکنیم.
ببینید فرض کنید که من یه کتابخونهای مینویسم که خیلی پرکاربرده و توی اون یه دستوری دارم مثلا به اسم دستور a که یه کار خاص انجام میده برای من. و شما هم یه کتابخونهی پرکاربرد دیگه دارید و توی اون هم یه دستوری دارید به اسم دستور a و یه کار دیگه متفاوت با کار من انجام میده. حالا یه کاربری توی برنامهش میخواد هم از کتابخونهی من و هم از کتابخونهی شما استفاده کنه و میکنه و حالا توی برنامهش از دستور a استفاده میکنه. و معلومه که کامپایلر گیر میکنه بین اینکه از a من استفاده کنه یا از a شما و برای همین هم کامپایل ارور میگیریم!
برای حل این مشکل یه چیزی هست به اسم
namespace
یا به فارسی خودمون میشه فضای نام. حالا این یعنی چی؟ یعنی اینکه اگر من دستور a رو منتشر کردم اون رو تحت فضاینام خودم منتشر میکنم و کاربر باید با شیوهی خاصی که بعدا میگیم a رو از فضاینام من صدا بزنه و aای که شما منتشر کردید رو هم از فضاینام خودتون صدا بزنه.
این شاید یهذره پیچیده باشه و توی سیپلاسپلاس هم جز در همین قضیهای که دیدیم یعنی اول برنامه جای دیگهای باهاش روبرو نمیشیم ولی توی سیشارپ بیشتر باهم آشنا میشید و بهتر بحث میکنیم.
حالا بریم سراغ کدنویسیمون.
همونطور که بالا گفتیم ما الان بلدیم برای کاربرمون یه چیزی بنویسیم. ولی اینجوری کارمون اصلا جلو نمیره. باید از کاربر ورودی هم بتونیم بگیریم و برای گرفتن ورودی باید یهجایی برای ذخیرهکردن ورودی هم داشته باشیم پس اول دربارهی متغیرها باهاتون حرف میزنیم.
ببینید بهصورت ساده متغیر یه جایی برای ذخیرهکردن اطلاعاته. فعلا هم همین رو داشته باشید تا بعدا مباحث سختترش رو هم باهم میبینیم. برای تعریف متغیر به دوتا چیز نیاز داریم. یعنی لازمه دوتا چیز رو به کامپایلر بگیم تا اون برای ما متغیر بسازه. ما الان میگیم این چیزی نیست که. ولی به فکر برنامهنویسای قبل از سی و سیپلاسپلاس باشید که برای یه متغیر ساده کلی کد باید مینوشتن و کلی هم سختی داشتن که اون متغیر رو مدیریت کنن. حالا اینا به کنار وای به حالشون اگر میخواستن یه نوشته رو ذخیره کنن. واقعا کار شاقی بوده این!
حالا بیخیال این بحث. اون دوتا چیزی که کامپایلر میخواد برای ساختن متغیر اول از همه اسم متغیره و دومی هم نوعشه. اسم متغیر میتونه از اعداد و حروف و underline تشکیل بشه ولی اولش نمیتونه عدد باشه ولی با underline مشکلی نداره یعنی اول اسم متغیرمون میتونه underline هم باشه.
دومین چیزی که لازمه یعنی نوع متغیره یعنی اینکه توی متغیرتون میخواید چی بریزید عدد بریزید یا نوشته یا چیزای دیگه. و به این قضیه هم بیشتر میپردازیم. در واقع به وقتش بهش میپردازیم.
اولین متغیری که میسازیم نوعش عددیه و عدد صحیح هم هست. اگر دروس ریاضی یادتون نمیاد (که حتما باید بیاد وگرنه برنامهنویسی براتون کار عبثی خواهد بود!) هم باید بگم که عدد صحیح هست اعداد طبیعی یعنی یک، دو، سه، چهار و همینطور ادامه بدید تا بینهایت و همینطور اعداد منفی و صفر.
برای تعریف یک متغیر تو سیپلاسپلاس اول نوعش رو مینویسیم و بعد هم اسمش رو و بقیش هم با کامپایلره و بازهم تاکید میکنم که آخرش نقطهویرگول یادمون نمیره! مثلا اگر متغیرمون رو اسمش رو بذاریم ali و نوعش هم عدد صحیح باشه که بالا گفتم ما توی اولین خط یا هر جایی که خواستیم متغیر رو معرفی کنیم (واقعا هرجایی! البته فکر کنم باید بعد از
#include <iostream>
باشه) مینویسیم
int ali;
که همونطور که گفتم اول نوع و بعد هم اسم متغیر رو آوردیم.
حالا که متغیرمون رو ساختیم این اجازه رو داریم که بهش مقدار هم بدیم. میتونیم خودمون بهش مقدار بدیم یا اینکه مقدارش رو از کاربرمون بپرسیم. برای اینکه خودمون بهش مقدار بدیم بهراحتی از علامت = استفاده میکنیم.
مثلا ما که متغیر ali رو بالا معرفی کردیم حالا هرجا بخواهیم بهش مقدار بدیم مینویسیم
ali = 2;
و نقطهویرگول یادمون نمیره (البته اینو اگر هم یادمون بره مطمئن باشید محیط ویرایشگر کد یا کامپایلر یادش نمیره ولی وقتی چند هزار خط کد نوشته باشید و برنامهتون Compile Error بگیره خیلی شاکی خواهید شد اگر این ارور بهخاطر فراموش کردن نقطهویرگول در خط ۱۳۲۳۴ باشه!)
همونطور که گفتیم هرجایی که لازم داشتهباشیم میتونیم متغیر تعریف کنیم و مثل پاسکال نیست که متغیرهامون باید جای مشخصی داشته باشن و البته موقع تعریف متغیر هم میتونیم اون رو مقداردهی کنیم یعنی بهجای اینکه دوخط داشته باشیم که توی اولی
int ali;
باشه و تو دومی
ali = 2;
میتونیم داشتهباشیم
int ali = 2;
و البته این راحتتر از قبلیه.
و در ضمن میتونیم چندتا متغیر رو که همنوع هستند (یعنی همهشون مثلا int هستن که ما فعلا فقط int رو بلدیم!) رو یکجا باهم تعریف کنیم. اینجوری که اول نوع متغیر رو مینویسیم و اول اسم اولین متغیر رو و اگر هم خواستیم با علامت = مقدار دهیش میکنیم و بعد علامت , رو میذاریم و اسم متغیر بعدی رو و اگر هم خواستیم با = مقداردهیش میکنیم و همینطور تا آخر.
و البته چیزایی که گفتم مال تنبلی برنامهنویسهاست که بعدا خودتون متوجه میشید که برنامهنویسها اصولا از تنبلترین افراد جامعه هستن و بهترین مدرکهاش هم برنامههایی که هر روز مینویسن.
مثلا حوصله ندارن توی دیکشنری دنبال معنی کلمه بگردن پس یه برنامه مینویسن که این کار رو براشون بکنه یا حال کار توی سیستمعامل متنی یعنی سیستمعاملی که فقط با نوشتن دستور کار میکنه رو ندارن و برای همین هم سیستمعامل گرافیکی مینویسن و کلی مصداق دیگهش رو هم شما میتونید پیدا کنید..!
برای اینکه از کاربر مقداری بگیریم باید از دستور
cin
استفاده کنیم. طرز استفادهش هم مشابه coutه یعنی اول cin رو مینویسیم و بعد برعکس cout که از دوتا علامت بزرگتر یا کوچکتر که تیزیشون به سمت cout بود استفاده میکردیم دوتا از همین علامتها ولی بهشکلی که تیزیشون به سمت cin نباشه میذاریم و بعدش هم اسم متغیر رو مینویسیم.
مثلا
int ali; cin >> ali;
و اگر میخوایم مقدار چندتا متغیر رو بگیریم مثل cout که چندبار از اون علامت استفاده میکردیم؛ اسم هر متغیر رو مینویسیم و بعدش اون علامت رو دوباره مینویسیم و بعدش هم اسم متغیر بعدی و بازهم این عمل رو میتونیم نامحدود بار انجام بدیم.
مثلا
int ali,hasan,reza; cin >> reza >> ali >> hasan;
و فکر کنم تا الان فهمیده باشید که c اول این دوتا دستور مخفف consoleه و همینطور in و out هم که واضحن!
و البته اون تیزیها رو هم میشه اینجوری توجیه کرد که اگر تیزی رو مثل یه فلش درنظر بگیریم، در واقع داریم میگیم که جناب cin، مقداری که میگیری رو بریز توی این متغیری که داره بهش اشاره میشه و همینطور جناب cout که داره بهت اشاره میشه، اون چیزی که داره بهت اشاره میکنه رو چاپ کن.
-خلاصه
ما توی این جلسه یاد گرفتیم که برنامهای که مینویسیم توی چهار مرحله به فایل اجرایی تبدیل میشه، فهمیدیم متغیرها چی هستن و چجوری باید بسازیمشون و ازشون استفاده کنیم و چجوری مقداردهیشون کنیم و چجوری از کاربر مقدار متغیرمون رو بگیریم.
برای تمرین هم برید سرچ کنید ببینی چجوری میتونیم از متغیرهامون توی cout استفاده کنیم و چندتا برنامه بنویسید که یه عدد از کاربر بگیره و مثلا پنج برابرش رو چاپ کنه.
خوب این بود چهارمین بخش از آموزش ما! یادتون نره سوالها و نظرهاتون رو بنویسید. یادتون نره اینایی که گفتیم رو تمرین کنید و تا بخش بعد خدانگهدارتون…
ممنون
اگه قول بدی اين درسها رو ادامه بدی من خوانندهٔ ثابت وبلاگت ميشم.
D:
حقیقتش به خاطر فیدبک نگرفتن، نه ایدهای داشتم که آیا آموزشهام خوبن یا نه و کمکم انرژیم برای ادامهشون هم ته کشید.