کاتلین یاد بگیریم! (قسمت ۵)

حلقه‌ها - Loops
حلقه‌ها - Loops

سلام به دوستان عزیزم و همراهان جانم. قبل از هرچیز باید عذرخواهی بکنم که برنامه هفتگیمون بهم ریخت و هفته قبل محتوایی نگذاشتم. یک ساز و کار جدید برای خودم گذاشتم و اون اینکه از این به بعد حجم مطالب را کمتر میکنم و روال یک هفته را رعایت خواهم کرد. چون به نظر خودم استمرار در این کار مهمتر از حجم مطلب هر دفعه هست. عذرخواهی من را پذیرا باشید و منتظر استمرار باشید :)


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

https://virgool.io/@sobhanattar/%DA%A9%D8%A7%D8%AA%D9%84%DB%8C%D9%86-%DB%8C%D8%A7%D8%AF-%D8%A8%DA%AF%DB%8C%D8%B1%DB%8C%D9%85-%D9%82%D8%B3%D9%85%D8%AA-%DB%B4-hmkm6adugdpw

در زبان برنامه‌نویسی کاتلین ۵ نوع حلقه وجود داره:

  • while
  • do-while
  • for
  • forEach
  • repeat

۱. حلقه while

حلقه‌ها به طور کلی برای این هستند که ما یک مجموعه از دستورات را برای تعداد مشخصی و یا تا رسیدن به شرایط مشخصی تکرار کنیم. استفاده از حلقه while در زبان کاتلین خیلی شبیه به زبان‌هایی مثل جاوا و PHP است:

https://gist.github.com/sobhanattar/2405e18d859f741b2c8b5b0ce7943f6c

در مثال زیر میتونیم بهتر ببینیم چه اتفاقی میفته:

https://gist.github.com/sobhanattar/bc5d4659353175461aafd14f79a39913

در این حلقه مادامیکه مقدار fuel کوچتر از 5 هست، مقدار fuel چاپ میشه و به مقدارش یکی اضافه میشه. هر زمان که مقدارfuel بزرگتر از 5 شود آنگاه پیامی مبنی بر اینکه fuel is 5 است چاپ می شود.

۲. حلقه do..while

علاوه بر حلقه while کاتلین شامل حلقه do..while هست.

اصلی‌ترین تفاوت این دو تا حلقه این هست که حلقه do..while همیشه حداقل یکبار اجرا میشه.

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

https://gist.github.com/sobhanattar/7f1de188fabc39f6b41ceb4a17e1e1d2

و مثال زیر بهتر این تفاوت را نشون میده:

https://gist.github.com/sobhanattar/2a7b0439867ab2f104f658e78a5d2676

همونطور که در این مثال میبینیم اینجا با وجود اینکه شرط ما برای اجرای این هست که fuel بزرگتر از 1 باشه ولی همونطور که میبینید علیرغم اینکه fuel مقدار 1 داره اما باز هم شرط یکبار اجرا میشه.

یک نکته و اون اینکه مراقب شرط‌ها باشیم. چون بعضی وقت‌ها شرط‌های پایانی رخ نمیدهند و در یک حلقه بی نهایت یا Infinite Loop خواهیم افتاد و این خطا را میگیریم:

https://gist.github.com/sobhanattar/f5ec08f1ad0c2938ced39548d4e68183

۳. حلقهfor

ساختار حلقهfor با ساختار این حلقه در بسیاری از زبان‌ها از جمله جاوا متفاوت است. ساختار این حلقه به شکل زیر است:

https://gist.github.com/sobhanattar/21fad3742fa1a25c59693aa1d0ba9b04

در زبان کاتلین حلقه for روی range ها و دیگر ساختارهای گردش‌پذیر یا iterable ها کار میکنه. اما برای توضیح range یا بازه و کارکرد حلقه بهترین کار زدن یک مثاله :)

https://gist.github.com/sobhanattar/95741148a101af21919b77e962785dbe

همانطور که در مثال بالا میبینید حلقه for روی اعداد بین 1 تا 5 حرکت کرده و هربار با نسبت دادن یکی از این اعداد به متغیر a، اون را چاپ میکنه. به عبارت دیگه در هر تکرار، حلقه for مقدار بعدی در range را به متغیر a نسبت میده و در داخل حلقه ما میتونیم از این متغیر استفاده کنیم. حلقه for این امکان را به ما میده که روی بازه‌ها، کالکشن‌ها و سایر ساختارهای گردش‌پذیر(iterables) - که در مورد آن‌ها در پست های بعدی صحبت خواهیم کرد - حلقه را اجرا کنیم.

اما برای اینکه اینجا بازار داغه الان در مورد آرایه‌ها هم یک مثال میاریم. برای گردش و با توجه به اینکه نیاز داریم به اندیس آرایه برای اشاره به آیتم مورد نظرمون دو روش وجود داره. یکی استفاده از تابع ()withIndex است و دیگری ویژگی indices آرایه. بریم براشون مثال ببینیم:

https://gist.github.com/sobhanattar/0e185ce5d6e09e3987ece998364fa073

همانطور که در مثال بالا میبینیم ما برای گردش روی آرایه از تابع ()withIndex روی آرایه numbers استفاده کردیم. همونطور که میبینیم این تابع هر آیتم آرایه در قالب index و value داخل دو متغیری که در ابتدای حلقه ()for قرار دادیم میذاره و داخل حلقه میتونیم ازشون استفاده کنیم.

توجه کنیم نام index و value اختیاری هست و میتونه هر نامی باشه

در نحوه استفاده از indices مثال زیر کاملا گویاست:

https://gist.github.com/sobhanattar/939dd9d25e83299424ecf5490db4befc

همونطور که در این مثال میبینیم ما با استفاده از ویژگی indices مقدار ایندکس یا شاخص آرایه numbers را داخل متغیر index قرار میدهیم و داخل حلقه با استفاده از اون متغیر میتونیم به المان‌های آرایه دست بیابیم.

توجه کنید نام index اختیاری هست و میتونه هر نامی باشه

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

۱. نکته باحال اینه که range را نمیتونید برعکس استفاده کنید یعنی نمیتونید 1..10 توی حلقه for بذارید. برای این منظور باید از کلمه کلیدی downTo استفاده کنیم:

کلمات کلیدی یا keywords کلماتی هستد که شما نمیتونید از آن‌ها به عنوان نام در برنامتون استفاده کنید.
https://gist.github.com/sobhanattar/ca3bb2536b88b02adf60539f3a210046

همونطور که میبینیم براتون سر و ته چاپ میکنه :)

۲. برای حذف کردن آخرین مقدار در بازه از کلمه کلیدی until استفاده میشه:

https://gist.github.com/sobhanattar/04bfa3b07bbc2a431eea89f232d3f8af

همونطور که میبینید عدد 4 در خروجی نیست.

۳. برای پریدن از روی مقادیر در range از کلمه کلیدی step استفاده میشه:

https://gist.github.com/sobhanattar/cac7fa2d653ffb58fb4cf4ad0e4b1202

۴. و خوب میتونیم این‌ها را با هم ترکیب هم بکنیم. سعی کنید با ترکیب این دستورات برنامه های خلاقانه بنویسید. مثلا چاپ اعدد فرد، یا اعداد اول و ...

https://gist.github.com/sobhanattar/a36912e3e927daeb92baf863eeaf1acb

۴. حلقه forEach

حلقه forEach بدون شک یکی از بهترین انواع حلقه هست که اختراع شده. این نوع حلقه را به دو شکل میشه استفاده کرد. یکی با استفاده از it و یکی هم به شکل توابع بی‌نام یا Lambda Expressions. به مثال‌های زیر توجه کنید:

https://gist.github.com/sobhanattar/929c290a3a05b320d108ba1e804484ca

در مثال بالا it یک متغیر کلیدی است. یعنی نمیتونید با نام دیگری جایگزینش کنید. این متغیر در واقع روی اعداد موجود در بازه حرکت میکنه و در هربار اجرا، it حاوی عدد بعدی در بازه اعداد 2 تا 5 است. اما اگر حتما بخواین از نام it استفاده نکنین میتونین به این شکل و با استفاده از Lambda حلقه را بازنویسی کنید:

https://gist.github.com/sobhanattar/26c6cc9ea73ea96eae44850fac2aafcf

در این مثال همون شرایطی که برای it برقرار بود برای i هم برقرار هست، با این تفاوت که میتونید i را با هر نام متغیری جایگزین کنید. البته ما در آینده مفصل در مورد توابع و توابع بی‌نام صحبت خواهیم کرد.

۵. حلقه repeat

آخرین حلقه‌ای که امروز در موردش صحبت میکنیم حلقه repeat هست. این حلقه به ما اجازه میده که برای تعداد دفعات مشخصی دستورات مورد نظرمون را اجرا کنیم:

https://gist.github.com/sobhanattar/526459d7e30d5a3f0fe73605c7d7810c

در مثال بالا ما برای 3 بار خروجی هایی که میبینید را پشت سر هم تولید میکنیم. توجه کنید که تعداد دفعات تکرار به عنوان پارامتر به حلقه repeat داده میشه.

خوب اینم از بحث حلقه ها. جلسه بعد درباره گردش برنامه یا Control Flow صحبت میکنیم. باهامون باشید و تا میتونیم با چیزهایی که تا حالا گفتیم تمرین حل کنیم و باهاشون بازی کنیم. از ترکیب آرایه ها، حلقه ها میشه بازی‌های باحالی ساخت. فرصت را از دست ندیم :)