سلام
به بخش ششم آموزش برنامهنویس خوش اومدید
توی بخش قبلی یهذره با شرطها آشنا شدیم و حالا میخواهیم بیشتر باهاشون آشنا بشیم.
ما یاد گرفتیم که شرطهای ما باید اینجوری باشن:
if(/*if statement*/) { //do something... } else { //if not do this job... }
و البته اینکه میشه توی ifهامون از ifهای دیگه هم استفاده کنیم و برای این کار هیچ محدودیتی وجود نداره.
همینطور فهمیدیم که چیزی که توی پرانتزهای جلوی if مینویسیم درواقع یک نتیجهی شرطی بر میگردونه و براساس اون نتیجه دستور داخل if اجرا میشه یا اجرا نمیشه.
همونطور که متغیرهای عددیمون یکسری عملیات ریاضی داشتن برای متغیرهای منطقی (یعنی همین درست یا غلط خودمون) هم یکسری عملیات وجود داره که اتفاقاً خیلی هم کاربردیه. البته قبلاً هم بدون این که بدونیم از این عملیات ها استفاده کردیم ولی خودمون خبر نداشتیم.
اولین عملگری که بررسی میکنیم روی چندتا متغیر منطقی کار نمیکنه بلکه فقط روی یکی متغیر منطقی تغییر ایجاد میکنه. این عملگر مقدار برعکس متغیر منطقیمون رو برمیگردونه. یعنی اگر «درست» باشه «غلط» رو بر میگرونه و بلعکس. توی سیپلاسپلاس هم با علامت تعجب «!» نمایش داده میشه. مثلاً فرض کنیم میخواهیم چک کنیم که فرد مورد نظر ۱۰ سالش نباشه. برنامهمون اینجوری میشه:
int main() { int age; cin >> age; if(!(age==10)) cout << “The Age is not 10!”; }
و همونطور که میبینید مثل عبارتهای ریاضی میتونیم به مقدار لازم و دلخواه از پرانتز هم استفاده کنیم تا کدمون خواناتر بشه و البته توی مثال بالا حتماً باید از پرانتز استفاده کنیم وگرنه داریم به کامپیوتر میگیم که نقیض متغیر age رو برگردون در صورتی که age متغیر عددیه و نقیض نداره و این باعث میشه برنامهمون کامپایل ارور بگیره.
عملگر بعدی and هستش. اگر یه ذره انگلیسی بلد باشید حتماً میدونید که and حرف اضافهی «و» هستش و توی عملیات منطقی هم زمانی «درست» رو بر میگردونه که همهی متغیرهای منطقیای که با and کنار هم میذاریم درست باشن. توی سیپلاسپلاس برای and از علامت && استفاده میشه. دقت کنید که & با && فرق داره!
مثلاً فرض کنید میخواهیم چک کنیم که سن یه آقایی (یا خانومی) از ۱۸ بزرگتر و از ۱۰۰ کوچکتر باشه. برنامهمون میشه این:
int main() { int age; cin >> age; if(age > 18 && age < 99) cout << “The Age is correct!”; }
و خوب چون در منطق روزمره هم از مفهموم «و» استفاده میکنیم فکر نمیکنم درکش سخت باشه.
عملگر منطقی بعدی که میخواهیم در موردش صحبت کنیم or یا «یا» به زبان فارسی هستش و بازهم فکر کنم واضح باشه که چیکار میکنه. اگر از چندتا عملگری که باهم orشون میکنیم فقط یکیشون درست باشه نتیجهی نهایی درست خواهد بود. توی سیپلاسپلاس «یا» رو با || (Shift + پ توی کیبورد غیر استاندارد!) نمایش میدیم. باز هم دقت کنید که از دوتا | استفاده میکنیم یعنی ||
مثلاً میخواهیم بررسی کنیم که عددمون به ۲ یا ۳ بخشپذیر باشه. برنامهمون اینجوری میشه
int main() { int n; cin >> n; if((n%2)==0 || (n%3)==0 ) cout << “It's ok!”; }
عملگرهای دیگهای هم هستند که چون کاربردشون خیلی کمتره وقتی لازممون شد باهاشون آشنا میشیم.
مبحث پرکاربرد بعدی که امروز در موردش یاد میگیریم مبحث حلقههاست. یکی از اصلیترین کاربرد کامپیوتر برای افراد عادی و برنامهنویسا اینه که کارای تکراریشون رو بدن به کامپیوتر انجام بده (حالا بگید برنامهنویسا تنبل نیستن!) مثلاً بیستبار بنویسه سلام یا مثلاً نمرهی همهی دانشآموزها رو ۲ نمره اضافه کنه و اینا کارهای به غایت دشواریه که برنامهنویسها اینا رو به کامپیوتر میدن تا براشون انجام بده.
حلقهها هم انواع مختلفی دارند که ما با for شروع میکنیم. توی انگلیسی for رو معمولاً به معنی «برای» دیدیم ولی «به مقدار…» هم معنی میده. هر for یک متغیر شمارنده داره که اصولاً کارها رو با اون انجام میدیم. برای استفاده از for شما باید متغیر شمارندهش رو به برنامه معرفی کنید و برای اتمام for یه شرط تعیین کنید و بگید که هربار که کاری رو که باید انجام بده انجام داد چه بلایی سر متغیر شمارنده بیاد. (عمرا اگه فهمیده باشید با طرز بیان رویایی من!)
مثل if مواد لازم برای for رو هم توی یه پرانتز روبروی اون بهش میدیم. چون اینجا سهتا چیز رو باید به for بدیم لازمه که اونا رو از هم جدا کنیم. به کمک ; (نقطهویرگول) این سهتا رو از هم جدا میکنیم.
اولین چیزی که باید به for بدیم متغیر شمارندهی for هستش که لازم نیست قبل از for تعریف بشه. بلکه میتونیم موقع تحویل بسازیمش. و البته متغیر شمارندهمون باید یه مقدار هم داشته باشه (معمولاً مقدارش صفره).
بخش تعیین متغیر شمارنده (که اولین بخشه) فقط یکبار و اونهم قبل از شروع for اجرا میشه و برنامه دیگه به اون بخش کاری نخواهد داشت.
چیز بعدیای که باید به for بدیم شرط اجراشدن دستورات for هستش. یعنی مثل if اینجا هم یک مقدار منطقی میگیره که اگر «درست» باشه دستوراتش رو اجرا میکنه و اگر «غلط» بود کارش رو تمومشده فرض میکنه و از for میاد بیرون.
و بخش آخر هم بخشیه که اونجا دستوری رو مینویسیم که هروقت یک حلقهی for تموم شد اون دستور اجرا میشه.
بهصورت خلاصه و مرحله به مرحله وقتی برنامه به for میرسه برای اولین بار، اول بخش اول رو اجرا میکنه (متغیر شمارنده رو تعریف و مقداردهی میکنه) و بعد شرط بخش دوم رو چک میکنه و اگر شرط درست بود دستورات for رو اجرا میکنه و بعد بخش سوم رو اجرا میکنه (یه بلایی سر متغیر شمارنده میاره) و شرط بخش دوم رو چک میکنه و اگر درست بود دوباره دستورات رو اجرا میکنه و دوباره بخش سوم رو اجرا میکنه و این کارها رو (بخش سوم -> بخش دوم -> دستورات) تا زمانی که شرط بخش دوم درست باشه انجام میده و زمانی که بخش دوم غلط شد از for بیرون میاد و دستورات بعد از for رو اجرا میکنه. (دستورات بعد از for یعنی دستورات بعد از for و بلاککد بعد از for!)
برای مثال بیاد اعداد ۱ تا ۱۰ رو چاپ کنیم:
for (int i=1;i<11;i++) { cout << i; }
اگر یادم رفته قبلاً بهتون بگم الان میگم که ++ یعنی این که به متغیر ما یک عدد اضافه کن و – هم یعنی از متغیر یکدونه کم کن. شما میتونید ++ رو قبل یا بعد از اسم متغیر بهکار ببرید. اگر ++ قبل از متغیر باشه قبل از این که مقدار متغیر بازگردانی بشه مقدار اون یکی اضافه میشه و بعد خروجی داده میشه. ولی اگر بعد از اسم متغیر ++ بذاریم اول مقدار متغیر خروجی داده میشه و بعد مقدار اون یکی اضافه میشه. البته اگر داشته باشیم: C++; با ++C; (برای متغیر فرضی C) فرقی نخواهد داشت (چون مقداری خروجی نمیگیریم) ولی cout >> C++; با cout >> ++C; فرق دارن و اولی مقدار اولیهی C رو چاپ میکنه ولی دومی مقدار اولیهی C رو با یک جمع میکنه و بعد چاپ میکنه و البته در هر دو دستور مقدار نهایی C برابر جمع مقدار اولیهی C با یک هستش و مقدار C در این عملیات تغییر میکنه.
توی مثال بالا بخش تعریفکردن متغیر بخش int i=1 هستش؛ بخش شرطمون i<11 هستش و بخش سوم (که یه بلایی سر متغیر حلقه میاریم) i++ هستش که همونطور که توضیح دادم مقدار i رو یکی اضافه میکنه.
خوب بیاید مثال رو یهذره پیچیدهترش کنیم و عددهایی که مضرب ۳ هستن رو از ۱ تا ۱۰۰ چاپ کنیم. برنامهمون اینجوری میشه:
for (int i=1;i<101;i++) { if(i%3==0) cout << i; }
خوب تو اینجا توی بلاک کد for از یه if استفاده کردیم. تا اگر عددمون که اینجا i باشه بر ۳ بخشپذیر بود اون رو چاپ کنیم.
همونطور که میدونید از تودرتو بودن بلاکهای کد هیچ محدودیتی وجود نداره واینجا هم ما برای استفاده از for توی یه for دیگه هیچ مشکلی نداریم. یک مثال خوب این قضیه هم چاپکردن جدول ضربه که اینجوری میشه:
for(int i=1;i<11;i++) { for(int j=1;j<11;j++) { cout << i*j << "t"; } cout << endl; }
و برنامهتون همون جدول ضربی که توی ابتدایی یاد گرفتیم رو برامون چاپ میکنه.
یا مثال دیگه میتونه چاپکردن یه مربع باشه که بازهم مثل جدول ضرب خواهد بود:
for(int i=1;i<11;i++) { for(int j=1;j<11;j++) { cout << "*"; } cout << endl; }
و یا حتی میتونی متغیر for داخلی رو وابسته به for خارجی قرار بدیم تا باهاش یه مثلث چاپ کنیم:
for(int i=1;i<11;i++) { for(int j=i;j<11;j++) { cout << "*"; } cout << endl; }
که تنها کاری که کردیم این بود که توی for دوم بهجای int j=0 قرار دادیم int j=i و نتیجهش هم شکلی مثل این شد:
********** ********* ******** ******* ****** ***** **** *** ** *
برای تمرین
۱. ب.ب.ک شکل روبرو رو چاپ کنه و بعدش برنامهتون رو جوری تغییر بدید که تعداد خطهای مثلث رو از کاربر بگیره.
* ** *** **** ***** ****** ******* ******** *********
۲. ب.ب.ک یک مثلث متساویالساقین چاپ کنه.
۳. ب.ب.ک یک لوزی چاپ کنه.
واقعا عالی و “متفاوت” بود! ممنون.
خیلی خیلی عالی بود