مسیرها
/
JavaScript
JavaScript
/
تمرین‌ها
/
آبمیوه‌های مخلوط
آبمیوه‌های مخلوط

آبمیوه‌های مخلوط

تمرین یادگیری

مقدمه

حلقه‌ی while

با یک «حلقه‌ی while» می‌توانید تا زمانی که شرط خاصی برقرار باشد، کد را به‌صورت تکراری اجرا کنید. این حلقه با «کلیدواژه»ی while نوشته می‌شود که پس از آن، شرطی داخل پرانتز و یک «بلوک کد» قرار می‌گیرد که «بدنه»ی حلقه را درون آکولاد در بر دارد.

while (condition) {
  // code that is executed repeatedly as long as the condition is true
}

JavaScript یک حلقه‌ی do-while هم دارد. در این حلقه، شرط پس از اجرای بدنه‌ی حلقه بررسی می‌شود. این موضوع زمانی مفید است که شرط به ارزیابی‌هایی وابسته باشد که در بدنه انجام می‌شود.

do {
  // The code here will always be executed once and then
  // repeatedly while the condition is true.
} while (condition);

درون بدنه‌ی حلقه، می‌توانید از کلیدواژه‌ی break برای توقف کامل اجرای حلقه استفاده کنید. در مقابل، کلیدواژه‌ی continue فقط اجرای تکرار جاری را متوقف می‌کند و با تکرار بعدی ادامه می‌دهد. با continue می‌توانید اغلب از قرار دادن بخش‌های زیادی از بدنه‌ی حلقه درون یک دستور شرطی اجتناب کنید.

let i = 0;

while (i < 100) {
  i = i + 2;

  if (i % 3 === 0) {
    continue;
  }

  // The code here will only be executed when i was not divisible
  // by 3 in the check above.
}

دستور switch

JavaScript علاوه بر دستور شرطی، یک دستور switch هم دارد تا منطق را به‌صورت شرطی اجرا کند. از این دستور زمانی استفاده می‌شود که یک متغیر واحد باید با چند حالت مختلف مقایسه شود. مقایسه با بررسی «برابری اکید» (===) انجام می‌شود؛ به مفهوم مقایسه نگاه کنید. برای متغیری مانند x، دستور switch در JavaScript «نحوه‌ی نگارش» زیر را دارد.

switch (x) {
  case option1:
    // code that is executed when "x === option1" is true
    break;
  case option2:
    // code that is executed when "x === option2" is true
    break;
  default:
    // code that is executed when x does not equal any of the options
}

حالت default اختیاری است و زمانی به کار می‌رود که بخواهید در صورتی که هیچ‌یک از گزینه‌های دیگر با متغیر مطابقت نداشت، کدی را اجرا کنید.

دستورهای break بالا لازم هستند، چون در JavaScript به‌طور پیش‌فرض همه‌ی حالت‌ها «ریزش» دارند. یعنی بدون هیچ دستور break، همه‌ی کدی که در حالت‌های پایین‌تر از اولین گزینه‌ی منطبق قرار دارد اجرا می‌شود، حتی اگر x با آن حالت‌ها مطابقت نداشته باشد. این رفتار «ریزش پیش‌فرض» دامی رایج هنگام استفاده از switch در JavaScript است. درون یک تابع، می‌توان به جای break از return هم استفاده کرد تا از این مشکل جلوگیری شود.

دستورالعمل‌ها

دوست شما لی مه یک آبمیوه‌فروشی دارد که در آن آبمیوه‌های ترکیبی خوشمزه‌ای می‌فروشد. شما مشتری همیشگی مغازه‌ی او هستید و متوجه شده‌اید که می‌توانید زندگی دوستتان را راحت‌تر کنید. تصمیم می‌گیرید از مهارت‌های برنامه‌نویسی‌تان استفاده کنید تا به لی مه در کارش کمک کنید.

1. تعیین مدت زمان ترکیب یک آبمیوه

لی مه دوست دارد از قبل به مشتریانش بگوید که برای آبمیوه‌ای که از منو سفارش داده‌اند چقدر باید منتظر بمانند. او به سختی اعداد دقیق را به خاطر می‌سپارد، چون زمان لازم برای ترکیب آبمیوه‌ها متفاوت است. ترکیب 'Pure Strawberry Joy' 0.5 دقیقه طول می‌کشد، 'Energizer' و 'Green Garden' هر کدام 1.5 دقیقه، 'Tropical Island' 3 دقیقه و 'All or Nothing' 5 دقیقه. برای همه‌ی نوشیدنی‌های دیگر (مثلاً پیشنهادهای ویژه) می‌توانید زمان آماده‌سازی 2.5 دقیقه را در نظر بگیرید.

برای کمک به دوستتان، تابعی به اسم timeToMixJuice بنویسید که یک آبمیوه از منو را به عنوان ورودی می‌گیرد و تعداد دقیقه‌هایی را که ترکیب آن نوشیدنی طول می‌کشد برمی‌گرداند.

timeToMixJuice('Tropical Island');
// => 3

timeToMixJuice('Berries & Lime');
// => 2.5

2. تأمین دوباره‌ی ذخیره‌ی قاچ‌های لیموترش

بسیاری از ساخته‌های لی مه شامل قاچ‌های لیموترش است، چه به عنوان یک ماده‌ی اولیه و چه به عنوان بخشی از تزئین. بنابراین وقتی صبح شیفتش را شروع می‌کند، باید مطمئن شود که سطل قاچ‌های لیموترش برای ادامه‌ی روز پر است.

تابع limesToCut را پیاده‌سازی کنید. این تابع تعداد قاچ‌های لیموترشی را که لی مه باید ببرد، و آرایه‌ای را که ذخیره‌ی لیموهای کاملِ در دسترسش است، به عنوان ورودی دریافت می‌کند. او می‌تواند از یک لیموترش 'small' 6 قاچ، از یک لیموترش 'medium' 8 قاچ و از یک لیموترش 'large' 10 قاچ به دست آورد. او همیشه لیموها را به همان ترتیبی که در فهرست آمده‌اند می‌برد و از اولین عنصر شروع می‌کند. او این کار را ادامه می‌دهد تا به تعداد قاچ‌های مورد نیازش برسد یا اینکه لیموهایش تمام شوند.

لی مه دوست دارد از قبل بداند که چند لیمو باید ببرد. تابع limesToCut باید تعداد لیموهای لازم برای بریدن را برگرداند.

limesToCut(25, ['small', 'small', 'large', 'medium', 'small']);
// => 4

3. تمام کردن شیفت

لی مه همیشه تا ساعت ۳ بعدازظهر کار می‌کند. سپس کارمندش دمیتری کار را بر عهده می‌گیرد. اغلب وقتی شیفت لی مه تمام می‌شود، نوشیدنی‌هایی هستند که سفارش داده شده‌اند اما هنوز آماده نشده‌اند. دمیتری آن‌وقت آبمیوه‌های باقی‌مانده را آماده می‌کند.

برای اینکه تحویل کار ساده‌تر شود، تابع remainingOrders را پیاده‌سازی کنید. این تابع تعداد دقیقه‌های باقی‌مانده از شیفت لی مه و آرایه‌ای از آبمیوه‌ها را که سفارش داده شده‌اند اما هنوز آماده نشده‌اند، به عنوان ورودی می‌گیرد. این تابع باید سفارش‌هایی را برگرداند که لی مه نمی‌تواند پیش از پایان روز کاری‌اش آماده‌سازی آن‌ها را شروع کند.

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

remainingOrders(5, ['Energizer', 'All or Nothing', 'Green Garden']);
// => ['Green Garden']
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
JavaScript Exercism

آماده‌اید آبمیوه‌های مخلوط را شروع کنید؟

در Exercism ثبت‌نام کنید تا JavaScript را همراه با 37 مفهوم159 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.