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


#63
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 это конечно ЖЕСТЬ! Без подглядывания в решения, моих математическо-арифметических знаний в жизни бы не хватило.


#64

Подскажите почему не работает
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}
}


#65

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


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

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;
  }    

}


#67

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


#68

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


#69

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


#70

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


#71

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


#72

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


#73
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 - и что это такое: так суббота вычисляется?


#74

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–;
}


#75

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


#76

оператор % это оператор деления с остатком. таким образом, допустим индекс дошел до номера 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, опять. то есть это выражение отвечает за поиск субботы.
и, если одно из этих выражений (оператор ИЛИ ||) выполняется по отношению к предоставленному индексу - значит это выходной день. если нет - будний. надеюсь я понятно объяснил?)


#77

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


#78

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


#79

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


#80

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


#81

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


#82

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