Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Алгоритм нахождения праздничной даты в C. / 12 сообщений из 12, страница 1 из 1
01.02.2015, 10:42
    #38868661
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм нахождения праздничной даты в C.
Есть RTC.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
struct sRTC
{
    uint8_t rtcYear;
    uint8_t rtcMonth;
    uint8_t rtcDay;
    uint8_t rtcDayOfWeek;
    uint8_t rtcHour;
    uint8_t rtcMin;
    uint8_t rtcSec;

};

extern struct sRTC rtc;


Инициализирую
Код: c#
1.
2.
3.
4.
5.
6.
7.
rtc.rtcYear = 2015;
rtc.rtcMonth = 1;
rtc.rtcDay = 29;
rtc.rtcDayOfWeek = 5;
rtc.rtcHour = 12;
rtc.rtcMin = 30;
rtc.rtcSec = 10;


Нужно послать сигнал когда праздник подошел . Скажем 9 Мая. Как это сделать? Думал забить таблицу праздников на 20 лет вперед и каждый час сравнивать текущую дату но подозреваю это не самое лучшее решение.
...
Рейтинг: 0 / 0
01.02.2015, 10:45
    #38868662
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм нахождения праздничной даты в C.
хочу уточнить. пишу под микроконтролер в С. важно быстродействие кода.
...
Рейтинг: 0 / 0
01.02.2015, 10:50
    #38868663
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм нахождения праздничной даты в C.
jenya7Думал забить таблицу праздников на 20 лет вперед
Смотря что ты понимешь под праздниками. Например для определения 9 мая достаточно проверить день и месяц, есть случаи посложнее "Пасха празднуется в первое воскресенье после весеннего полнолуния" тут проще таблицу на 20 лет вперед.

jenya7 и каждый час сравнивать текущую дату но подозреваю это не самое лучшее решение.
А зачем каждый час? Раз в сутки достаточно.
...
Рейтинг: 0 / 0
01.02.2015, 11:07
    #38868669
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм нахождения праздничной даты в C.
Dima Tjenya7Думал забить таблицу праздников на 20 лет вперед
Смотря что ты понимешь под праздниками. Например для определения 9 мая достаточно проверить день и месяц, есть случаи посложнее "Пасха празднуется в первое воскресенье после весеннего полнолуния" тут проще таблицу на 20 лет вперед.

jenya7 и каждый час сравнивать текущую дату но подозреваю это не самое лучшее решение.
А зачем каждый час? Раз в сутки достаточно.
можно и раз в сутки. не хочется перебирать все даты в for loop. я думал про какой нибудь офсет.
...
Рейтинг: 0 / 0
01.02.2015, 11:17
    #38868672
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм нахождения праздничной даты в C.
jenya7не хочется перебирать все даты в for loop. я думал про какой нибудь офсет.
Не надо все перебирать. Храни в отсортированном массиве и ищи двоичным поиском
Хотя 1-2 тысячи элементов раз в сутки можно тупо перебрать.
...
Рейтинг: 0 / 0
01.02.2015, 11:33
    #38868677
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм нахождения праздничной даты в C.
Dima Tjenya7не хочется перебирать все даты в for loop. я думал про какой нибудь офсет.
Не надо все перебирать. Храни в отсортированном массиве и ищи двоичным поиском
Хотя 1-2 тысячи элементов раз в сутки можно тупо перебрать.
то есть сделать из дат числа, забить в массив, отсортировать и раз в день находить дату бинарным поиском? можно попробовать.
...
Рейтинг: 0 / 0
01.02.2015, 11:42
    #38868680
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм нахождения праздничной даты в C.
а что если так. взять первый праздник в году и от него отсчитывать дни. при старте системы посчитать где наша дата по отношению к первому празднику.
и потом обрабатывать случаи. скажем прошло сто дней - значит второй праздник, 150 дней - третий праздник и.т.д.
...
Рейтинг: 0 / 0
01.02.2015, 16:38
    #38868777
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм нахождения праздничной даты в C.
jenya7а что если так. взять первый праздник в году и от него отсчитывать дни. при старте системы посчитать где наша дата по отношению к первому празднику.
и потом обрабатывать случаи. скажем прошло сто дней - значит второй праздник, 150 дней - третий праздник и.т.д.
Есть гарантия что никто часы не переведет?

jenya7то есть сделать из дат числа, забить в массив, отсортировать и раз в день находить дату бинарным поиском? можно попробовать.
Зачем числа делать? Сделать массив стуктур sRTC и функцию сравнения двух стуктур на больше/меньше.

Можно промежуточный вариант: последовательный массив месяцев, т.е. индекс массива = Год*12 + Месяц - Начало. Где "Начало" - константа, первый месяц списка. А в массиве месяцев указатель на массив празников этого месяца (День, Название праздника). Тогда первым шагом получаешь указатель на список праздников месяца, затем его перебираешь.
...
Рейтинг: 0 / 0
01.02.2015, 18:23
    #38868813
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм нахождения праздничной даты в C.
Dima Tjenya7а что если так. взять первый праздник в году и от него отсчитывать дни. при старте системы посчитать где наша дата по отношению к первому празднику.
и потом обрабатывать случаи. скажем прошло сто дней - значит второй праздник, 150 дней - третий праздник и.т.д.
Есть гарантия что никто часы не переведет?

jenya7то есть сделать из дат числа, забить в массив, отсортировать и раз в день находить дату бинарным поиском? можно попробовать.
Зачем числа делать? Сделать массив стуктур sRTC и функцию сравнения двух стуктур на больше/меньше.

Можно промежуточный вариант: последовательный массив месяцев, т.е. индекс массива = Год*12 + Месяц - Начало. Где "Начало" - константа, первый месяц списка. А в массиве месяцев указатель на массив празников этого месяца (День, Название праздника). Тогда первым шагом получаешь указатель на список праздников месяца, затем его перебираешь.

интересно. надо проверить. спасибо.
...
Рейтинг: 0 / 0
02.02.2015, 01:47
    #38868973
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм нахождения праздничной даты в C.
jenya7,

а зачем хранить день недели ? Это вычисляемый атрибут по году, месяцу и дню.
Или вы не хотите тратить на это время и жертвуете памятью ?
...
Рейтинг: 0 / 0
02.02.2015, 11:36
    #38869215
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм нахождения праздничной даты в C.
SashaMercuryjenya7,

а зачем хранить день недели ? Это вычисляемый атрибут по году, месяцу и дню.
Или вы не хотите тратить на это время и жертвуете памятью ?

мне нужно минимизировать любые вычисления так как приборчик питается от батарейки. быстро порешал здачи и пошел спать.
...
Рейтинг: 0 / 0
19.02.2015, 14:42
    #38884006
iskatelsql
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм нахождения праздничной даты в C.
jenya7,

можно попробовать так:

1 в эксель выписать все праздники с датами на 20 лет :)

при этом вычислить вычисляемые типа Пасхи, повторить повторяемые

2. отсортировать по возростанию дат

3. вычислить разницу между соседними (типа сколько дней от этого праздника до следующего)

в контроллере, просыпаясь каждый день увеличивать счетчик, сравнивать его со "сколько дней до следующего", если совпало:

1 отправить сигнал
2 обнулить счетчик
3 удалить с верхушки массива прошедший праздник

Для расчета дня первого праздника и на случай замены батарейки сохранять и оригинальные даты

Думаю это минимальные затраты батарейки всего пара операций в день
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Алгоритм нахождения праздничной даты в C. / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]