سلام به دوستان عزیزم و همراهان جانم. قبل از هرچیز باید عذرخواهی بکنم که برنامه هفتگیمون بهم ریخت و هفته قبل محتوایی نگذاشتم. یک ساز و کار جدید برای خودم گذاشتم و اون اینکه از این به بعد حجم مطالب را کمتر میکنم و روال یک هفته را رعایت خواهم کرد. چون به نظر خودم استمرار در این کار مهمتر از حجم مطلب هر دفعه هست. عذرخواهی من را پذیرا باشید و منتظر استمرار باشید :)
خوب امروز روز حلقه ها است. بدیهیه برامون که اگر میخواهیم این قسمت را بخونیم باید قسمت قبلی را خونده باشیم
در زبان برنامهنویسی کاتلین ۵ نوع حلقه وجود داره:
while
do-while
for
forEach
repeat
while
حلقهها به طور کلی برای این هستند که ما یک مجموعه از دستورات را برای تعداد مشخصی و یا تا رسیدن به شرایط مشخصی تکرار کنیم. استفاده از حلقه while
در زبان کاتلین خیلی شبیه به زبانهایی مثل جاوا و PHP است:
در مثال زیر میتونیم بهتر ببینیم چه اتفاقی میفته:
در این حلقه مادامیکه مقدار fuel
کوچتر از 5
هست، مقدار fuel
چاپ میشه و به مقدارش یکی اضافه میشه. هر زمان که مقدارfuel
بزرگتر از 5
شود آنگاه پیامی مبنی بر اینکه fuel is 5
است چاپ می شود.
do..while
علاوه بر حلقه while
کاتلین شامل حلقه do..while
هست.
اصلیترین تفاوت این دو تا حلقه این هست که حلقه do..while
همیشه حداقل یکبار اجرا میشه.
به عبارت دیگه اگر شما از این حلقه استفاده میکنیم قصد داریم که حداقل یکبار کد داخل do..while
اجرا شود. این موضوع در ساختار این حلقه مشهوده. ببینیم:
و مثال زیر بهتر این تفاوت را نشون میده:
همونطور که در این مثال میبینیم اینجا با وجود اینکه شرط ما برای اجرای این هست که fuel
بزرگتر از 1
باشه ولی همونطور که میبینید علیرغم اینکه fuel
مقدار 1
داره اما باز هم شرط یکبار اجرا میشه.
یک نکته و اون اینکه مراقب شرطها باشیم. چون بعضی وقتها شرطهای پایانی رخ نمیدهند و در یک حلقه بی نهایت یا Infinite Loop خواهیم افتاد و این خطا را میگیریم:
for
ساختار حلقهfor
با ساختار این حلقه در بسیاری از زبانها از جمله جاوا متفاوت است. ساختار این حلقه به شکل زیر است:
در زبان کاتلین حلقه for
روی range
ها و دیگر ساختارهای گردشپذیر یا iterable ها کار میکنه. اما برای توضیح range
یا بازه و کارکرد حلقه بهترین کار زدن یک مثاله :)
همانطور که در مثال بالا میبینید حلقه for
روی اعداد بین 1
تا 5
حرکت کرده و هربار با نسبت دادن یکی از این اعداد به متغیر a
، اون را چاپ میکنه. به عبارت دیگه در هر تکرار، حلقه for
مقدار بعدی در range
را به متغیر a
نسبت میده و در داخل حلقه ما میتونیم از این متغیر استفاده کنیم. حلقه for
این امکان را به ما میده که روی بازهها، کالکشنها و سایر ساختارهای گردشپذیر(iterables) - که در مورد آنها در پست های بعدی صحبت خواهیم کرد - حلقه را اجرا کنیم.
اما برای اینکه اینجا بازار داغه الان در مورد آرایهها هم یک مثال میاریم. برای گردش و با توجه به اینکه نیاز داریم به اندیس آرایه برای اشاره به آیتم مورد نظرمون دو روش وجود داره. یکی استفاده از تابع ()withIndex
است و دیگری ویژگی indices
آرایه. بریم براشون مثال ببینیم:
همانطور که در مثال بالا میبینیم ما برای گردش روی آرایه از تابع ()withIndex
روی آرایه numbers
استفاده کردیم. همونطور که میبینیم این تابع هر آیتم آرایه در قالب index
و value
داخل دو متغیری که در ابتدای حلقه ()for
قرار دادیم میذاره و داخل حلقه میتونیم ازشون استفاده کنیم.
توجه کنیم نامindex
وvalue
اختیاری هست و میتونه هر نامی باشه
در نحوه استفاده از indices
مثال زیر کاملا گویاست:
همونطور که در این مثال میبینیم ما با استفاده از ویژگی indices
مقدار ایندکس یا شاخص آرایه numbers
را داخل متغیر index
قرار میدهیم و داخل حلقه با استفاده از اون متغیر میتونیم به المانهای آرایه دست بیابیم.
توجه کنید نام index
اختیاری هست و میتونه هر نامی باشه
خوب اما یسری نکات باحال بگیم در مورد حلقه for
و بازهها. اینارو تند میگیم اینجا و مثال میزنیم ولی لازمه که حتما باهاشون مثالهای خلاقانه حل کنید:
۱. نکته باحال اینه که range
را نمیتونید برعکس استفاده کنید یعنی نمیتونید 1..10
توی حلقه for
بذارید. برای این منظور باید از کلمه کلیدی downTo
استفاده کنیم:
کلمات کلیدی یا keywords
کلماتی هستد که شما نمیتونید از آنها به عنوان نام در برنامتون استفاده کنید.
همونطور که میبینیم براتون سر و ته چاپ میکنه :)
۲. برای حذف کردن آخرین مقدار در بازه از کلمه کلیدی until
استفاده میشه:
همونطور که میبینید عدد 4 در خروجی نیست.
۳. برای پریدن از روی مقادیر در range
از کلمه کلیدی step
استفاده میشه:
۴. و خوب میتونیم اینها را با هم ترکیب هم بکنیم. سعی کنید با ترکیب این دستورات برنامه های خلاقانه بنویسید. مثلا چاپ اعدد فرد، یا اعداد اول و ...
forEach
حلقه forEach
بدون شک یکی از بهترین انواع حلقه هست که اختراع شده. این نوع حلقه را به دو شکل میشه استفاده کرد. یکی با استفاده از it
و یکی هم به شکل توابع بینام یا Lambda Expressions
. به مثالهای زیر توجه کنید:
در مثال بالا it
یک متغیر کلیدی است. یعنی نمیتونید با نام دیگری جایگزینش کنید. این متغیر در واقع روی اعداد موجود در بازه حرکت میکنه و در هربار اجرا، it
حاوی عدد بعدی در بازه اعداد 2
تا 5
است. اما اگر حتما بخواین از نام it
استفاده نکنین میتونین به این شکل و با استفاده از Lambda
حلقه را بازنویسی کنید:
در این مثال همون شرایطی که برای it
برقرار بود برای i
هم برقرار هست، با این تفاوت که میتونید i
را با هر نام متغیری جایگزین کنید. البته ما در آینده مفصل در مورد توابع و توابع بینام صحبت خواهیم کرد.
repeat
آخرین حلقهای که امروز در موردش صحبت میکنیم حلقه repeat
هست. این حلقه به ما اجازه میده که برای تعداد دفعات مشخصی دستورات مورد نظرمون را اجرا کنیم:
در مثال بالا ما برای 3
بار خروجی هایی که میبینید را پشت سر هم تولید میکنیم. توجه کنید که تعداد دفعات تکرار به عنوان پارامتر به حلقه repeat
داده میشه.
خوب اینم از بحث حلقه ها. جلسه بعد درباره گردش برنامه یا Control Flow صحبت میکنیم. باهامون باشید و تا میتونیم با چیزهایی که تا حالا گفتیم تمرین حل کنیم و باهاشون بازی کنیم. از ترکیب آرایه ها، حلقه ها میشه بازیهای باحالی ساخت. فرصت را از دست ندیم :)