Всем привет. Сейчас завершил 5й уровень. И появился вопрос. Для простоты понимания сформулирую в виде задачки.
Вводим дату (пускай будет целое число от 1го до 365) и назовем day. эта day - первый день, когда начинается график работы, скажем на производстве, от которого начинается вот такой отсчет: 2дня работаем, 3 отдыхаем, затем 1 день работаем, 2 отдыхаем и пошло по новой (2 рабочих, 3 отдыха, 1 рабочий, 2 отдыха). И вводим ещё один день (пускай будет i, тоже от 1 до 365). Так надо узнать i - выходной или рабочий?
Циклы понятно, как применить при цикличности, а при не стандартных повторениях? есть ли для этого методы? Если есть, то прошу подсказать. А то сам придумал себе задачку и уже 2ой день она покоя мне не дает. Ниже, что удалось придумать... но не работает)))
public static boolean positiveWeek(int day, int i) {
boolean n = false;
day = day + 1; // здесь учитываются первые 2 рабочих дня и false - значит рабочий
if (day >= i)
return n
else{
for (int a = 1; a == i; a++){ // это я цикл сделал (где значения a - от балды взял) :)
n = true;
day = day + 3; // идут 3 выходных;
if (day >= i)
break;
day = day + 1; // затем 1 рабочий
n = false;
if (day >= i)
break;
day = day + 2; // 2 выходных
n = true;
if (day >= i)
break;
day = day + 2; // 2 рабочих
n = false;
if (day >= i)
break;
}
return n;
}
Вроде логически правильно всё расписал, но всегда возвращает n = false (в самом начале кода). Меняю на true, возвращает true. Также очень буду благодарен, другим отличающимся от моего решениям. Для саморазвития. Спасибо.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
И метод с выталкиванием бита — с удовольствием прочитал. Понятно вроде всё, но появился вопрос. по этому коду:
Я так понимаю метод isWorkDayVersion2(int day, int i) — это укороченный метод с проверкой isWorkDay(int day, int i)? Т.е. isWorkDay(int day, int i) это — апендикс? :) Просто он в примере применения смущает. Дум
жестко задан постоянный график работы.
Небольшие замечания:
1) Функции, возвращающие логическое значение, обычно начинают именовать с is (например isGreen() — является зеленым, isAvailable() — является доступным)
2) Я не знаю, знакома ли Вам двоичная арифметика, если нет — почитайте (например, в Wikipedia).
3) Лучше вначале функции проверять валидность (правильность переданных параметров). И в случае некорректных параметров — отреагировать (например, сгенерировать ошибку — на 9м уровне Вы узнаете подробности).
Вот функция с комментариями:
Вот она с проверкой валидности и «схлопнутым» вычислением результата: