تبلیغات

آموزش کار با حلقه for در کاتلین

مفهوم حلقه را قبلا در «این مطلب» به طور کامل بیان کردیم. و اما حالا قصد داریم تا با نحوه‌ی استفاده از حلقه‌ی for در کاتلین آشنا شویم.

تعریف یک for ساده

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

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

شاید با نگاه به کد بالا، نوشتن حلقه‌ی  for در کاتلین کمی عجیب و غریب به نظر برسد؛ اما واقعا زیباست! در کد بالا، 1..10 نوعی طرز نوشتن کد است که منجر به تولید یک نوع  Range عددی، از 1 تا خود 10 می‌شود. (Range: محدوده و دامنه‌ای از یک مقدار تا یک مقدار دیگر!)

و در واقع کد بالا می‌گوید: به ازای (for) هر داده‌ای در داخل (in) محدوده‌ی تعیین شده، بدنه‌ی حلقه را با مقدار داده‌ی جدید اجرا کن؛ و از این رو، در هر اجرا، مقدار  متغیر i با توجه به محدوده‌ی تعیین شده تغییر خواهد یافت.

و در نهایت کد بالا، منجر به چاپ اعداد 1 تا 10، در هر خط جدیدی خواهد شد!

بهتر است بدانید!
شاید بد نباشد که بدانید از in، در نوشتن شرط نیز استفاده می‌شود! فرضا تصورک نید می‌خواهیم بررسی کنیم که آیا عدد x، در محدوده‌ی 1 تا 10 قرار دارد یا خیر! پس:

به نظرتان Yes چاپ می‌شود یا No؟! و همچنین به اعشاری بودن x نیز توجه کنید.

شمارش معکوس!

اگر بخواهیم از 10 تا 1 اجرا شود، به چه صورتی باید عمل کنیم؟! آیا به صورت زیر؟!

اما در کمال تعجب، بدنه‌ی این حلقه هرگز اجرا نخواهد شد؛ چراکه مقدار چپ دونقطه‌ها،بایستی همیشه از راست آن بزرگتر باشد!

پس برای شمارش معکوس، به چه صورتی باید عمل کرد؟! در واقع باید به جای دونقطه‌ها، از چیز دیگری استفاده کنیم:

بله؛ استفاده از downTo یعنی اینکه از عدد بزرگتر به عدد کوچکتر برود! و برعکس دونقطه‌ها، طبیعتا مقدار چپ downTo باید از مقدار راست آن بزرگتر باشد!

تعیین گام

دو مثال بالا، یک واحد یک واحد شمارنده را حرکت می‌دادند! اما فرض کنید بخواهیم شمارنده را دو واحد دو واحد تغییر دهیم! به مثال زیر دقت کنید:

از کلیدواژه‌ی step برای تعیین مقدار گام (قدم)، استفاده شده است! بنابراین کد بالا منجر به چاپ اعداد 1، 3، 5، 7، 9 خواهد شد. و البته فراموش نکنید که از همین step، برای downTo نیز می‌توان استفاده کرد!

مثالی برای درک بهتر Range

فرض کنید می‌خواهیم تابعی بنویسیم تا با دریافت عدد اول، عدد دوم و تعداد گام، شروع به چاپ اعداد بین آنها کند! پس به صورت زیر عمل می‌کنیم:

IntProgression، کلاسی موجود در پکیج kotlin.range می‌باشد که برای یک محدوده یا دامنه‌ی عددی Int استفاده می‌شود. ما مقدار آن را با توجه به بزرگ بودن from از to یا کوچک بودن آن از to، مقداردهی کرده‌ایم! در واقع اگر بزرگتر باشد، بایستی downTo شود و اگر کوچکتر باشد، بایستی دونقطه شود! چرا که طبق همان چیزی که در مثال‌های قبلی گفته شد، دونقطه و downTo، منجر به تولید یک نوع Range می‌شوند و در اینجا این نوع، IntProgression خواهد بود! چرا که طرفین آنها عدد صحیح هستند.

و در ادامه‌ی کد، این متغیر range تعریف شده را در مقابل in حلقه‌ی for قرار داده‌ایم و step را که از طریق متغیر s دریافت می‌شود، مشخص کرده‌ایم! برای راحتی کار نیز مقدار پیشفرض step را داخل تابع، برابر 1 قرار داده‌ایم تا اگر گام‌‌های ما برابر 1 بود، نیازی به نوشتن آن نباشد.

در نهایت برای اجرای تابع بالا، می‌توان به صورت‌های مختلف زیر عمل کرد:

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

مثالی دیگر: عدد اول

در ریاضیات، مفهومی به نام عدد اول وجود دارد! این عدد، عددیست که تنها بر 1 و خودش بخش‌پذیر است! و همچنین یک عدد، هنگامی بر یک عدد دیگر بخش‌پذیر است که باقی‌مانده‌ی تقسیم آن عدد بر دیگری، برابر صفر شود! و البته این عدد هرگز نمی‌تواند برعددی بزرگتر از خود بخش‌پذیر باشد! پس اگر بخواهیم تابعی بنویسیم که عدد اول را تشخیص داده و در آن از حلقه‌ی for استفاده کنیم، می‌توان به صورت زیر عمل کرد:

برای تشخیص اول بودن یک عدد: بایستی بررسی کنیم که آیا از 1 تا خود آن عدد، عدد دیگری به جز 1 و خود آن عدد وجود دارد که بر آن بخش پذیر باشد یا خیر!

بدین منظور، در کد بالا، Range را از عدد 2 تا یکی کوچکتر از عدد دریافتی تعیین می‌کنیم! چراکه از قبل می‌دانیم هر عددی همواره بر یک و خودش بخش‌پذیر بوده و اگر بر عدد دیگری نیز بخش‌پذیر باشد، عدد اول نیست!

حالا بخش‌پذیری را با استفاده از % انجام می‌دهیم! همانطور که باید بدانید، این علامت باعث تقسیم x بر i شده و به جای خارج قسمت، باقی مانده را به ما می‌دهد! و طبق تعریف بخش پذیری، اگر باقی مانده برابر 0  شود، پس بخش پذیر است.

بنابراین اگر x بر عددی بخش پذیر باشد، همانجا به طور مستقیم مقدار false را به بیرون تابع برمی‌گرداند؛ که یعنی عدد اول نیست! (چرا که return در هرجای تابع، باعث خروج از آن تابع می‌شود)؛ اما اگر طی شمارش، برچیزی بخش پذیر نباشد، پس اول است. (چرا که حلقه تمام شده و به معنای این است که return صورت نگرفته؛ پس چیزی پیدا نشده و خارج از حلقه تایید می‌کنیم که اول است.

for بدون شمارنده!

الزاما range همیشه قرار نیست عدد باشد! چراکه range یک دامنه‌ایست که بازه‌ای از اعداد را مشخص می‌کند و i که به عنوان متغیر تعریف شده است، هر عضو این range می‌باشد! برای درک این موضوع، به مثال زیر توجه کنید:

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

نکات
– کد بالا را می‌توانستیم به صورت range نوشته و از طریق ایندکس آرایه و به کمک شمارنده‌ی range، مقادیر را دریافت کنیم! (در ادامه مورد بررسی قرار می‌دهیم).
– چیزی که بعد از in نوشته می‌شود، الزاما range نیست! بلکه بایستی اولا یک کالکشن یا مجموعه باشد و ثانیا امکان iterate کردن آن وجود داشته باشد! تا بتوان درون آن را پیموده و مقادیر را بیرون کشید.
– چیزهایی مثل دونقطه و downTo، یک نوع تابع هستند که ورودی آن‌ها، مقادیر سمت راست و چپشان می‌باشند! (لینک توضیحات بیشتر به زودی در اینجا قرار خواهد گرفت.)

کد بالا با range عددی

به صورت زیر عمل می‌کنیم:

طول range را از 0 قرار داده‌ایم. چرا که آرایه‌ها ایندکسشان از 0 شروع می‌شود. بنابراین بایستی انتهای آن را یکی کمتر از طولش قرار دهیم! چراکه اگر اینکار را نکنیم، در مثال بالا که 6 عضو دارد، ایندکس ششم نیز مورد بررسی قرار گرفته و منجر به تولید خطا می‌شود!

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

و البته until

اما برای اینکه کد بالا را نیز ساده‌تر نوشته و یک range عددی ایندکسی را به راحتی تعریف کنیم:

در اینجا، until باعث می‌شود تا range عددی ما، یکی کمتر از انتهای بازه باشد! پس دیگر نیازی به منهای یک آن نخواهد بود تا عنصر مورد نظر از آرایه گرفته شود!

 

تبلیغات
0
کانال تلگرام فول کده
تبلیغات

درباره نویسنده

هادی اکبرزاده

[ مدیر فول کده ]

علاقه‌مند به اشتراک گذاری اطلاعات در هر زمینه‌ای / برنامه‌نویس / مدیر فول کده

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

نظرات ثبت شده بدون دیدگاه