Easyelectronics.ru

Электроника для всех
Текущее время: 22 сен 2019, 17:50

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: График дежурства рассчитать по аналогии дня недели.
СообщениеДобавлено: 09 янв 2015, 10:22 
Старожил
Аватара пользователя

Зарегистрирован: 02 фев 2010, 00:24
Сообщения: 727
Откуда: Челябинск
Я являюсь автором разработки Многомер "Солянка". Если кратко - это часы синхронизированные по GPS. День недели в этих часах рассчитывается программно, по аналогии взятой в обсуждении с этой ветки форума.
if (month > 2){ month -= 2;}
else{ month += 10; year--; };
day =((date + year + (year>>2) + ((31 * month) / 12)) % 7);
if (day == 0) day = 7;

//---------------------отображаем------------------------------------------------------------

switch (day) {
case 1: sprintf(lcd_string_B0,"Monday(1) ");break;
case 2: sprintf(lcd_string_B0,"Tuesday(2) ");break;
case 3: sprintf(lcd_string_B0,"Wednesday(3)");break;
case 4: sprintf(lcd_string_B0,"Thursday(4) ");break;
case 5: sprintf(lcd_string_B0,"Friday(5) ");break;
case 6: sprintf(lcd_string_B0,"Saturday(6) ");break;
case 7: sprintf(lcd_string_B0,"Sunday(7) ");break;
default:sprintf(lcd_string_B0,"ReedDayERROR");break; }

работает без нареканий. По этому же принципу я решил вести расчет кто сегодня дежурит, с той лишь разницей, что дежурящих человек в нашей семье всего трое. Поэтому в конце рассчетов брал ОСТАТОК 3

if (month > 2){ month -= 2;}
else{ month += 10; year--; };
duty =((date + year + (year>>2) + ((31 * month) / 12)) % 3);
if (duty == 0) duty = 3;

//---------------------отображаем------------------------------------------------------------

switch (duty) {
case 1: sprintf(lcd_string_B2," Lena ");break;
case 2: sprintf(lcd_string_B2," Artem ");break;
case 3: sprintf(lcd_string_B2," Nikita ");break;
default:sprintf(lcd_string_B2," Error! ");break;} // Ошибка!

На практике получилось что при переходе на новый месяц отдежуривший человек снова назначен дежурным! Хотя день недели исправно "перелистывается". В математике не силен, подскажите как исправить ситуацию?

_________________
Когда компьютеры были большими - программы были маленькими!.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: График дежурства рассчитать по аналогии дня недели.
СообщениеДобавлено: 09 янв 2015, 14:38 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Отказаться при расчете графика от месяца. Рассчитываем по дням недели, дни недели накладываем на текущий месяц.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: График дежурства рассчитать по аналогии дня недели.
СообщениеДобавлено: 09 янв 2015, 15:11 
Старожил
Аватара пользователя

Зарегистрирован: 02 фев 2010, 00:24
Сообщения: 727
Откуда: Челябинск
Простите demiurg1978, несколько раз перечитал ваше сообщение, так и не понял что вы имели в виду.

_________________
Когда компьютеры были большими - программы были маленькими!.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: График дежурства рассчитать по аналогии дня недели.
СообщениеДобавлено: 09 янв 2015, 15:51 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
noblako писал(а):
Простите demiurg1978, несколько раз перечитал ваше сообщение, так и не понял что вы имели в виду.

Вы расчет делаете каждый раз из месяца. Месяц заканчивается, а неделя нет. И с началом месяца вы заново расчет делаете. Поэтому, при новом расчете, при новом месяце у вас распорядок в соответствии со списком и получается.
А нужно сделать так: расчет делается один раз. Никаких остатков не нужно. Получился расчет, день такой-то, дежурит тот-то. Накладываем распорядок на текущий месяц. Теперь, месяц заканчивается, а неделя нет. И вам нужно продолжить расчет распорядка. Уже на основании уже имеющегося графика продолжаем дни недели и график.
Мой вам совет. Берете бумажку, сначала прикидываете что-то вроде ТЗ. Потом пробуете нарисовать алгоритм. Когда этот алгоритм у вас перед глазами, накидать код вам уже будет гораздо проще.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: График дежурства рассчитать по аналогии дня недели.
СообщениеДобавлено: 09 янв 2015, 16:25 
Старожил
Аватара пользователя

Зарегистрирован: 23 авг 2010, 12:10
Сообщения: 1143
Откуда: Ижевск
А почему нельзя при переходе через 0 часов 00 минут инкрементировать 2 битный счётчик и в случае совпадения его с 11 обнулять. На выходе все следующие сутки будет точно: 00, 01 или 10

_________________
Жизнь - повидло)))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: График дежурства рассчитать по аналогии дня недели.
СообщениеДобавлено: 09 янв 2015, 17:36 
Старожил
Аватара пользователя

Зарегистрирован: 02 фев 2010, 00:24
Сообщения: 727
Откуда: Челябинск
Sergio писал(а):
А почему нельзя при переходе через 0 часов 00 минут инкрементировать 2 битный счётчик и в случае совпадения его с 11 обнулять. На выходе все следующие сутки будет точно: 00, 01 или 10

Хотел так сделать, и даже в ЕЕПРОМ можно каждый день это значение записывать - ресурсов хватит. Только вдруг свет на несколько дней вырубят и из ЕЕПРОМ мы достанем старое/несоответсвующее значение.

_________________
Когда компьютеры были большими - программы были маленькими!.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: График дежурства рассчитать по аналогии дня недели.
СообщениеДобавлено: 09 янв 2015, 17:49 
Заглядывает иногда

Зарегистрирован: 29 сен 2011, 12:23
Сообщения: 98
Откуда: Санкт-Петербург
Код:
enum Weekday
{
    Sunday,
    Monday,
   ....
};

struct Date
{
    uint8_t day;
    uint8_t month;
    uint16_t year;
    Weekday weekday;
};

uint16_t dateToDay(Date date);
Date dayToDate(uint16_t);


Придумываете объект хранящий дату, например, структура Date.
Реализуете 2 функции, которые переводят порядковый день года в дату и наоборот.

Т.е. чтобы узнать чье сегодня дежурство, по сегодняшней дате выясняете день года и делите на 3 с взятием остатка, как вы и делали.
Код:
Date currentDate;
......
uint16_t currentDayOfYear = dateToDay(currentDate);

uint16_t dutyNumber = currentDayOfYear % 3;

const char * name = '\0';
switch (dutyNumber )
{
case 0:
    name = "Artem";
    break;
case 1:
    name = "Nikita";
    break;
case 2:     
    name = "Lena";
    break;
}
sprintf(lcd_string_B2, name);


UPD немного поправил.


Последний раз редактировалось tugo 09 янв 2015, 17:58, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: График дежурства рассчитать по аналогии дня недели.
СообщениеДобавлено: 09 янв 2015, 17:52 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Как у вас отображается график дежурств? Если у вас полноценный дисплей, календарь - это одно. Если у вас символьный дисплей и отображается кто сегодня дежурит - это другое.
Берем второй вариант. Тогда действительно, вам уже предложили вариант. При наступлении следующих суток инкрементируется счетчик от 0 до 2 или от 1 до 3 и switch-case выводим текущее дежурство.
Если же календарь, тогда вам нужно один раз инициализировать первое дежурство, дальше расчет. Как сделать алгоритм, я вам сказал. Извините, дальше углубляться не буду. Занят.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: График дежурства рассчитать по аналогии дня недели.
СообщениеДобавлено: 09 янв 2015, 18:06 
Старожил
Аватара пользователя

Зарегистрирован: 23 авг 2010, 12:10
Сообщения: 1143
Откуда: Ижевск
А что в случае нарушения графика? Например отъезд или болезнь одного из членов семьи? В любом случае удобнее иметь возможность корректировки из интерфейса, пусть даже из скрытого сервисного меню. А в таком случае привязка графика к календарю бессмысленна.

_________________
Жизнь - повидло)))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: График дежурства рассчитать по аналогии дня недели.
СообщениеДобавлено: 09 янв 2015, 18:20 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Sergio писал(а):
А что в случае нарушения графика? Например отъезд или болезнь одного из членов семьи? В любом случае удобнее иметь возможность корректировки из интерфейса, пусть даже из скрытого сервисного меню. А в таком случае привязка графика к календарю бессмысленна.

Ну, перестройка графика - ничего сложного. В EEPROM массив-порядок дежурящих. Привязка делается каждый раз, когда это требуется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: График дежурства рассчитать по аналогии дня недели.
СообщениеДобавлено: 09 янв 2015, 18:45 
Старожил
Аватара пользователя

Зарегистрирован: 23 авг 2010, 12:10
Сообщения: 1143
Откуда: Ижевск
Я не про пропуск одного дня, а исключение из расчёта. 1 2 3 1 2 3 1 2 3 (3 уехал) 1 2 1 2 1 2 (3 приехал) 1 2 3 1 2 3
Не перестраивать график в каждый третий отсутствия, а просто исключить из расчёта.

Допустим уехал на один день
1 2 3 1 (2 уехал) 3 1 2 3

_________________
Жизнь - повидло)))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: График дежурства рассчитать по аналогии дня недели.
СообщениеДобавлено: 09 янв 2015, 18:54 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Sergio писал(а):
Я не про пропуск одного дня, а исключение из расчёта. 1 2 3 1 2 3 1 2 3 (3 уехал) 1 2 1 2 1 2 (3 приехал) 1 2 3 1 2 3
Не перестраивать график в каждый третий отсутствия, а просто исключить из расчёта.

Допустим уехал на один день
1 2 3 1 (2 уехал) 3 1 2 3

И это можно сделать в настройках.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: График дежурства рассчитать по аналогии дня недели.
СообщениеДобавлено: 09 янв 2015, 19:10 
Старожил
Аватара пользователя

Зарегистрирован: 02 фев 2010, 00:24
Сообщения: 727
Откуда: Челябинск
demiurg1978 писал(а):
Как у вас отображается график дежурств?

У меня символьный дисплей и вариант предложенный tugo мне очень подходит. Головной болью остается только реализация двух функций, которые переводят порядковый день года в дату и наоборот.

Sergio писал(а):
А что в случае нарушения графика? Например отъезд или болезнь одного из членов семьи?

На "камень, ножницы, бумага" оставшиеся пусть решают )))

_________________
Когда компьютеры были большими - программы были маленькими!.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: График дежурства рассчитать по аналогии дня недели.
СообщениеДобавлено: 09 янв 2015, 23:52 
Заглядывает иногда

Зарегистрирован: 29 сен 2011, 12:23
Сообщения: 98
Откуда: Санкт-Петербург
noblako писал(а):
Головной болью остается только реализация двух функций, которые переводят порядковый день года в дату и наоборот.

http://stackoverflow.com/questions/6054 ... given-date


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: График дежурства рассчитать по аналогии дня недели.
СообщениеДобавлено: 10 янв 2015, 00:22 
Старожил
Аватара пользователя

Зарегистрирован: 30 янв 2010, 01:03
Сообщения: 647
Откуда: Херсон
Цитата:
Головной болью остается только реализация двух функций, которые переводят порядковый день года в дату и наоборот.
http://stackoverflow.com/questions/6054 ... given-date

А тут по нашенски написано. С примерами.
http://zonax2006.narod.ru/Book/Book_C_B ... ter9/1.htm

_________________
Если руки золотые, то не важно с какого места они растут.
Изображение
Изображение


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB