Третья программа "Протеиновый коктейль"

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

Определение субботы в виде i % 7 == 6 это конечно ЖЕСТЬ! Без подглядывания в решения, моих математическо-арифметических знаний в жизни бы не хватило.

3 лайка

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

var total=0;

for (var i=period; i<=days; i=i+period){
if ( i%6===0 || i%7===0 ) { total=total+100}
else {total=total+200}
}

Значения “100” и “200” заложены в переменных, почему вы их не используете?

Подскажите, почему такой вариант не работает

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

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

if(i % 3 === 0 && i % 7 !== 0 && i % 7 !== 6){
   total += workDayAmount;
}
if(i % 7 === 0 || i % 7 === 6){
  total += weekendAmount;
  }    

}

Не работает, потому что условия должны быть вложенными.

Всем спасибо разобрался

Объясните, пожалуйста, как total накапливает данные
Благодарю

Цикл выполняется, пока истинно условие в скобках. На каждом следующем круге цикла берется предыдущее значение total и увеличивается на количество протеина.

1 лайк

благодарю, видимо неправильно понял суть исходя из предыдущих заданий

Задание из серии, как нарисовать сову. Вот тут мы тебе покажем как счетчик цикла увеличить на один, вот тут мы покажем, как счетчик цикла увеличить на два, а тут на, соображай как хочешь, что остаток от деления 6 на 7 равен 6. Это не считая того, что про % написано только в подсказке, а подсказка так удачно спрятана, что я про ее наличие узнал только тут на форуме)

5 лайков
for (var i = days; i > 0; i--){
      currentDay = i%period;
        if (currentDay === 0){
          if (i%7 === 6 || i%7 === 0) {
         total = total + weekendAmount;
        }

Я что-то не могу прочувствовать эту строчку
currentDay = i%period;
if (currentDay === 0)
если день будет 14-й, а период равен 3-м, то условие не выполнится и расчету крышка? Или я неверно понимаю смысл остатка от деления? i%7 === 6 - и что это такое: так суббота вычисляется?

cократил код при помощи тернорного оператора…

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

for (var i = period; i <= days; i += period) {
(i%7 === 0 || i%7 === 6) ? (total += weekendAmount) : (total += workDayAmount);
}

но потом понял, что есть еще более элегантный способ, увы, уже приведенный в коментах в одну строку ((

ведь total += повторяется в коде… а значит нарушает принцип DRY. и можно было бы его вынести в левую часть условия, ведь сначала рассчитывается все справа от оператора присвоения +=.
эх

поэтому, напишу и второй вариант… если брать цикл на уменьшение:

for (var i = days; days >= period; days -= period) {
total += (days%7 === 0 || days%7 === 6) ? weekendAmount : workDayAmount;
}

ну и еще вариантик, если кто то захочет поиспользовать циклы while (но осторожнее с отрицательными днями или периодами… а то впадете в сингулярность):
while (days) {
if (days%period === 0) {
total += (days%7 === 0 || days%7 === 6) ? weekendAmount : workDayAmount;
}
days–;
}

Круто. Помогите, пожалуйста, понять разницу между (i % 6 == 0) и (i % 7 == 6) в данном задании.

оператор % это оператор деления с остатком. таким образом, допустим индекс дошел до номера 7, воскресенье. 7%7 (i%7) будет равно нулю, так как после такого деления на 7 остатка не остается. точно также и с днем номер 14 - вторым воскресеньем, остатка не остается и со всеми остальными воскресеньями. следовательно к определению того является ли день, считываемый индексом, воскресеньем - подходит выражение i%7 === 0
что касается выражения i%7 === 6. это выражение будет действтельным, если в результате деления индекса (дня) на 7 в остатке останется 6. например i = 13. тогда 13%7 === 6 (в остатке), так мы находим субботы. прибавим еще 7 дней. следующей субботой будет 20 число. 20%7 === 6, опять. то есть это выражение отвечает за поиск субботы.
и, если одно из этих выражений (оператор ИЛИ ||) выполняется по отношению к предоставленному индексу - значит это выходной день. если нет - будний. надеюсь я понятно объяснил?)

1 лайк

Спасибо, alexgrand.
Моя загвоздка,как я понимаю, заключалась в том, что субботу я вычислял как (i % 6 == 0), а в неделе то 7 дней))
При (i % 6 == 0) выпадает 1-я суббота, а затем это выражение вычисляет на 1 день недели меньше каждые 7 дней (пятница ,четверг, среда и т.д.)

Ошибка разработчиков курса “Основы JavaScript” в том что они перед этой задачей не поставили никаких примеров задач на остатки %

3 лайка

прикол в том что даже при 6%7, т.е при делении 6 на 7 , остатком будет все делимое , т.е - 6

Можеет быть очередной глупый вопрос, но зачем total присваивать значение равное нулю? Если total не определять, то программа не работает. При этом при проверке пишет, что значение total равно null.

Переменную надо объявлять в любом случае. Если значение переменной не задано, то оно равно undefined и это не тоже самое, что “0”. Получается, что начальное значение имеет другой тип данных, отличный от number. При сложении с любым числом в результате получается NaN - совсем не то, что нужно по условию.

Скажите, пожалуйста, а откуда остаток от деления н-р( i = 9 % 7 === 6)? У меня 2 получается. Просто у меня почти такой же код, только (i % 7 === 2) и он тоже проходит проверку.