
سلام به دوستان عزیزم و همراهان جانم. قبل از هرچیز باید عذرخواهی بکنم که برنامه هفتگیمون بهم ریخت و هفته قبل محتوایی نگذاشتم. یک ساز و کار جدید برای خودم گذاشتم و اون اینکه از این به بعد حجم مطالب را کمتر میکنم و روال یک هفته را رعایت خواهم کرد. چون به نظر خودم استمرار در این کار مهمتر از حجم مطلب هر دفعه هست. عذرخواهی من را پذیرا باشید و منتظر استمرار باشید :)
خوب امروز روز حلقه ها است. بدیهیه برامون که اگر میخواهیم این قسمت را بخونیم باید قسمت قبلی را خونده باشیم
در زبان برنامهنویسی کاتلین ۵ نوع حلقه وجود داره:
whiledo-while forforEach 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 صحبت میکنیم. باهامون باشید و تا میتونیم با چیزهایی که تا حالا گفتیم تمرین حل کنیم و باهاشون بازی کنیم. از ترکیب آرایه ها، حلقه ها میشه بازیهای باحالی ساخت. فرصت را از دست ندیم :)