Самый эффективный способ корректировки значения
Я работаю над системой, которая запускает процесс на основе заданного значения времени (startHour). Пользователь устанавливает час начала и может выбирать только значения от 00 до 23. Меня попросили начать один и тот же процесс с интервалом в 6 часов, чтобы он повторялся 4 раза в течение дня.
Я изначально хотел добавить еще три переменные: SecondStartHour, ThirdStartHour и FourStartHour. SecondStartHour будет присвоено значение на 6 часов раньше startHour, ThirdstartHour — на 12 часов раньше startHour, а fourStartHour — на 18 часов раньше startHour. Затем я мог бы использовать любую переменную startHour для запуска процесса.
Я написал код (ниже), который будет работать, но мне интересно, есть ли лучший и более эффективный способ сделать это.
//устанавливаем второйStartHour на 6 часов раньше startHour
if (startHour <= 5)
{
secondStartHour = startHour - 18;
}
else
{
secondStartHour = startHour + 6;
}
//устанавливаем ThirdStartHour на 12 часов раньше startHour
if (startHour <= 11)
{
thirdStartHour = startHour - 12;
}
else
{
thirdStartHour = startHour + 12;
}
//устанавливаем fourStartHour на 18 часов раньше startHour
if (startHour <= 17)
{
fourthStartHour = startHour - 6;
}
else
{
fourthStartHour = startHour + 18;
}
Мне пришлось написать код так, как я это сделал выше, потому что я работаю с 24-часовым форматом времени, поэтому в некоторых случаях добавление времени к startHour фактически уменьшит его значение. Под этим я подразумеваю, что если startHour равен 23 (23:00), и мне нужно добавить к нему 6 часов, чтобы получить второйStartHour, результат будет 5 (05:00), поэтому я не могу просто написать код, чтобы сказать SecondStartHour = startHour + 6. Код кажется слишком длинным и запутанным, но я не могу придумать лучшего способа его написать. Я мог бы использовать оператор выбора случая, но тогда у меня было бы 24 случая с назначениями для каждой из новых переменных в каждом случае, так что это кажется хуже, любые идеи будут оценены по достоинству.
@user1649972, 👍1
Обсуждение2 ответа
Лучший ответ:
Вместо сравнения вы можете использовать оператор по модулю:
secondStartHour = (startHour + 6) % 24;
И то же самое для остальных:
thirdStartHour = (startHour + 12) % 24;
fourthStartHour = (startHour + 18) % 24;
Пока xxxStartHour >= 24, 24 будет удаляться до тех пор, пока не окажется в диапазоне [0, 24).
Если вам нужно смещение, вы также можете добавить несколько часов курса после модуля (я не совсем понимаю ваш пример, который может иметь значения >= 24.
Кроме того, если вам нужно выполнять одну и ту же задачу каждые 6 часов, вы можете использовать один раз и «перезапускать» ее каждые 6 часов (и, возможно, с учетом летнего/зимнего времени).
Большое спасибо, Мишель, оператор мода - это именно то, что мне нужно, он сделает код намного короче и чище. еще раз спасибо, @user1649972
Пожалуйста. Вы можете использовать его во многих случаях, которые связаны с чем-то периодическим., @Michel Keijzers
Если подумать логически, у вас на самом деле есть только 6 стартовых часов. Дела могут начинаться только в период с 0 до 5 утра включительно. Все остальное кратно 6 часам с этого момента. Любое время после 5 утра фактически является будущим временем более раннего времени начала.
Таким образом, вы можете просто «модулировать» заданное время, чтобы оно было одним из первых 6 часов дня:
startHour = startHour % 6;
А затем каждый раз прибавляйте 6 для остальных часов:
secondStartHour = startHour + 6;
thirdStartHour = startHour + 12;
fourthStartHour = startHour + 18;
Таким образом, ваше расписание часов может быть только:
0 6 12 18
1 7 13 19
2 8 14 20
3 9 15 21
4 10 16 22
5 11 17 23
Если вы указали 15-й час в качестве времени начала, 15 % 6 равно 3 (разделите 15 на 6, вы получите 2 с оставшимися 3), то есть вы находитесь в шаблоне времени «3 9 15 21».
>- Нужна помощь с моими кодами? для моего проекта: Наполнение и укупорка с помощью Arduino uno
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Что лучше использовать: #define или const int для констант?
- Функции со строковыми параметрами
- Как работать с аналоговыми контактами в цикле?
- Какие есть другие IDE для Arduino?
- Построение графика на Python с использованием Tkinter Canvas
- Как использовать переменные и функции в нескольких файлах .ino
Если подумать – если это происходит 4 раза в день через равные промежутки времени, то на самом деле у вас может быть только 6 стартов…, @Majenko
Привет, Маженко, спасибо за ответ, но это не так, поскольку пользователь выбирает период времени, в который он хочет, чтобы произошел первый процесс., @user1649972
Но это противоположно тому, что вы говорите в своем вопросе: «Меня попросили запустить один и тот же процесс с интервалом в 6 часов, чтобы он происходил 4 раза в течение дня»., @Majenko
Да, каждые 6 часов, но это основано на том факте, что «Пользователь устанавливает час начала и может выбирать только значения от 00 до 23». То есть каждые 6 часов, но меняется в зависимости от выбранного времени., @user1649972
Да, но какая разница между вводом 4 и вводом 10?, @Majenko