Подскажите почему не работает
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}
}
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 и увеличивается на количество протеина.
Задание из серии, как нарисовать сову. Вот тут мы тебе покажем как счетчик цикла увеличить на один, вот тут мы покажем, как счетчик цикла увеличить на два, а тут на, соображай как хочешь, что остаток от деления 6 на 7 равен 6. Это не считая того, что про % написано только в подсказке, а подсказка так удачно спрятана, что я про ее наличие узнал только тут на форуме)
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 - и что это такое: так суббота вычисляется?
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–;
}
оператор % это оператор деления с остатком. таким образом, допустим индекс дошел до номера 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, опять. то есть это выражение отвечает за поиск субботы.
и, если одно из этих выражений (оператор ИЛИ ||) выполняется по отношению к предоставленному индексу - значит это выходной день. если нет - будний. надеюсь я понятно объяснил?)
Спасибо, alexgrand.
Моя загвоздка,как я понимаю, заключалась в том, что субботу я вычислял как (i % 6 == 0), а в неделе то 7 дней))
При (i % 6 == 0) выпадает 1-я суббота, а затем это выражение вычисляет на 1 день недели меньше каждые 7 дней (пятница ,четверг, среда и т.д.)
Можеет быть очередной глупый вопрос, но зачем total присваивать значение равное нулю? Если total не определять, то программа не работает. При этом при проверке пишет, что значение total равно null.
Переменную надо объявлять в любом случае. Если значение переменной не задано, то оно равно undefined и это не тоже самое, что “0”. Получается, что начальное значение имеет другой тип данных, отличный от number. При сложении с любым числом в результате получается NaN - совсем не то, что нужно по условию.
Скажите, пожалуйста, а откуда остаток от деления н-р( i = 9 % 7 === 6)? У меня 2 получается. Просто у меня почти такой же код, только (i % 7 === 2) и он тоже проходит проверку.