Третья программа: «Протеиновый коктейль!» Подробное объяснение

//Решение Инески (Третья программа "Протеиновый коктейль"), понравилось, постараюсь разложить на составляющие, т.к. сам потерял не один час, пока дошло. Сам бы никогда не решил, пришлось подсматривать. Код немного изменил в смысле подробности для лучшего усвоения.

var days = 9; // Дней в периоде
var period = 3; // Как часто я ем протеин (раз в три дня)
var workDayAmount = 200; // Количество протеина в будни
var weekendAmount = 100; // Количество протеина в выходные
var total = 0;
var currentDay;

for (var i = days; i > 0; i = i - 1) {
currentDay = i % period;
if(currentDay === 0) {
if (i % 7 === 6 || i % 7 === 0 ) {
total = total + weekendAmount;
} else {
total = total + workDayAmount;
}
}
}

  1. var total = 0; - объявляем переменную total, которая запрашивалась в условии задачи. Переменная должна быть приравнена к нулю. Если просто объявить переменную (без нуля), программа не работает. Если поставить любое число, оно будет прибавляться к результату расчетов.

  2. var currentDay - объявляем переменную “текущего дня” для удобства расчетов.

  3. for (var i = days; i > 0; i–) код цикла (цикл будет отрицательным, т.е. расчет будет происходить в обратном порядке, как печать листов от конца к началу): объявляется переменная i, равная количеству расчетного периода в днях (конечное число расчетов); i должен быть больше нуля, первый день (начальное число расчетов); переменная счетчик i = i - 1, означающая, что переменная будет уменьшаться от “days” до “0” с шагом в 1 день.

  4. Далее идет тело цикла {currentDay = i % period; , обозначающее, что для текущего расчетного дня “currentDay” необходимое количество дней “i” делится на период “period” с вычислением остатка деления. В данном случае нас интересует только деление без остатка, т.к. это будет означать третий день, т.е. день приема протеина. Получаем, что если условие третьего дня выполняется (3 строка), то будет прием пищи, который в последствии (в п.5) будет излагаться в скобках { } (с учетом будней и выходных).
    for (var i = days; i > 0; i = i - 1) {
    currentDay = i % period;
    if (currentDay === 0) { }
    }

  5. Теперь разбираемся с приемом протеина. if (i % 7 === 6 || i % 7 === 0 ) Если переменная i делится на количество дней в неделе 7 и получается остаток 6, т.е. шестой день недели (суббота) или без остатка, т.е. седьмой день недели (воскресенье), выполняется условие {total = total + weekendAmount;}, т.е. total равен предыдущим суммам съеденного протеина плюс норма выходного дня (100 г). В противном случае, если деление “i % 7” получилось с остатками 1, 2, 3, 4 или 5 (будние дни), выполняется условие else {total = total + workDayAmount;}, т.е. total равен предыдущим суммам съеденного протеина плюс норма буднего дня (200 г). В общем виде пятый пункт объяснения выглядит так:
    if (i % 7 === 6 || i % 7 === 0 ) {
    total = total + weekendAmount;
    } else {
    total = total + workDayAmount;
    }

  6. Осталось собрать два пункта в один.
    for (var i = days; i > 0; i–) {
    currentDay = i % period;
    if (currentDay === 0) {
    if (i % 7 === 6 || i % 7 === 0 ) {
    total = total + weekendAmount;
    } else {
    total = total + workDayAmount;
    }
    }
    }

В чем смысл этой ветки?

Не кормить в первый и второй день

А если мы эту ветку уберем, то кушать будет в первый и второй день?)

Без ветки получается незаконченная связка if - else

Это нормальная практика, нет такого понятия как незаконченная связка if- else

Напиши, как ты видишь?

for (var i = days; i > 0; i -= 1) {
  currentDay = i % period;
  if (currentDay === 0) {
    if (i % 7 === 6 || i % 7 === 0 ) {
      total += weekendAmount;
    } else {
      total += workDayAmount;
    }
  }
}

Логично, работает)))

Форматируйте свой код в первом сообщении с помощью кнопки </> в редакторе сообщений, пожалуйста.

Ready

Видимо не ready

Было бы намного удобнее, если бы Вы, разработчики, детально разбирали КАЖДОЕ задание. Теория преподается из рук вон, приходится ползать по сторонним сайтам. Странно, что я взял решение админа, которое должно быть образцовым, а потом вылезают непонятные ляпы. И Ваш раздел по JS просто ужасен, даже по сравнению с остальными темами. Простите за резкость

1 лайк

@juwain, @GreenLera, :point_up: отзыв по разделу js.

Не видела решения админа, поделитесь?

1 лайк

Здесь js изучается не в контексте программирования, а в контексте оживления верстки. Для первого знакомства not bad

Не то чтобы прям ужасен, но определенно он не дотягивает до уровня курсов по CSS ни по теории, ни по продуманности заданий. Да и в курсах по JS ребячество с Кексиками уже неуместно, забивает голову ерундой.

let days = 9; // Дней в периоде
let evenDayAmount = 200; // Количество протеина в чётные дни
let oddDayAmount = 100; // Количество протеина в нечётные дни
let total = 0; // Общее количество протеина

for (let i = 1; i <= days; i++) {

if (i % 2 === 0) {
total += evenDayAmount;
console.log('чётные ’ + total)
} else {
total += oddDayAmount;
console.log('нечётные ’ + total)
}
}

1 лайк

Решил двумя способами.
Первый - корявый, но так же верный.
А вот второй - общепринятый))

/* первый способ */

let days = 9; // Дней в периоде
let evenDayAmount = 200; // Количество протеина в чётные дни
let oddDayAmount = 100; // Количество протеина в нечётные дни
let total = 0; // Общее количество протеина

if (days%2===0) {
total=(days/2)*evenDayAmount + (days/2)*oddDayAmount
}
else if (days%2!==0) {
total = days%2 * oddDayAmount + (days - days%2) /2 * evenDayAmount + (days - days%2) /2 * oddDayAmount
}

/* второй способ */

let days = 9; // Дней в периоде
let evenDayAmount = 200; // Количество протеина в чётные дни
let oddDayAmount = 100; // Количество протеина в нечётные дни
let total = 0; // Общее количество протеина

for (let i=1; days>=i; i++) {
if (i%2!==0) {
total += oddDayAmount;
}
else {
total += evenDayAmount;
}
}

> for (let i = 1; i <= days; i++) {
>   if (i % 2 === 0) { 
>     total += evenDayAmount;
>   }
>   else {
>     total += oddDayAmount;
>   }
> }