Господа, есть формула для вычисления номера дня недели для любой даты.
Вот как это описано в Википедии:
Сообщение от :
Стандартный алгоритм
Январь — это 1, Декабрь — 12 месяц. Для определения сдвига используется следующая формула: a=(14-месяц) div 12 (a — вспомогательная величина). Затем определяются год и месяц с учётом поправки: y=год-a; (год — увеличиваем на 1 от исходного). m=месяц+12·a-2.
После вспомогательных операций вычисляется сам день недели:
result=(7000+(день+y+y div 4-y div 100+y div 400+(31*m) div 12)) mod 7
Для юлианского календаря формула выглядит так:
result=(6998+(день+y+y div 4+(31*m) div 12)) mod 7
Результат — число от 0 до 6, где 0 — суббота, 1 — воскресенье, 2 — понедельник, 3 — вторник, 4 — среда, 5 — четверг, 6 — пятница.
Я нашел в интернете готовое решение:
Сообщение от :
// -------------------- вычислить день недели по дате --------------------------------------
unsigned char date2day(void) {
unsigned int y, m,a;
y = bcd2bin(year);
m = bcd2bin(month);
if (m > 2) { m -= 2; }
else { m += 10; y--; }
day = (unsigned char)((bcd2bin(date) + y + (y>>2) + ((31 * m) / 12)) % 7);
if (day == 0) day = 7;
return day;
}//-----------------------------------------------------------------------------------------
Я использовал этот готовый алгоритм и все было хорошо до 16 апреля. А 16 апреля день недели перескочил с пятницы сразу на воскресенье. Вернувшись к алгоритму, описанному в Википедии я вообще получил кривые результаты. Я не уверен что в википедии грамотно расставлены скобки.
Может быть кто-то реализовывал вечный календарь по этим формулам? Как решить имеющуюся проблему с перескоком?
[Ответ]
Ассемблерная вставка убила напрочь)))
Там же все просто, примерно так: http://en.wikipedia.org/wiki/Zeller%27s_congruence
Когда-то реализовывал, но это было лет так десять назад, потому исходников, понятно, не осталось. Но, помню, я не стал по вышеприведенным формулам действовать, а просто циклом шел от первого января 1970 года (http://ru.wikipedia.org/wiki/1970), вставляя через каждые четыре года сдвиг на день. От цикла вполне можно избавиться, просто для верности его сделал. А так, количество високосных годов можно получить простым делением на четыре.
[Ответ]
-=Женек=- 16:01 30.04.2011
Ассемблерная вставка из стандартной библиотечной функции CodeVision.
Пример из википедии - видимо я в уме считал коряво, ввел алгоритм в контроллер - все заработало.
ProcXel.A,
Сообщение от :
Используй бумажный календарь. Он надежнее.
Мне больше нравится Zewa, она еще мягче и безопасней.
[Ответ]
Spectator 16:34 30.04.2011
Сообщение от -=Женек=-:
Ассемблерная вставка из стандартной библиотечной функции CodeVision.
На просторах интернета нашлась еще одна книга по Си для AVR, на этот раз основательно описывается компилятор CodeVision AVR (CVAVR). Честно говоря, я не люблю CodeVision. Да, конечно, там замечательный мастер проектов и новичок на нем получит работающую программу буквально за несколько минут. Все очень просто и наглядно… но когда я как то раз глянул в код, в сгенерированный ассемблерный листинг… БУЭЭЭЭ такой лажи не делал даже GCC на минимальных настройках оптимизиации. Еще и денег стоит. Короче, снес я его нафиг. Найти бы еще нормально крякнутый IAR… вот он генерит поистине шедевральный код. По нему можно изучать ассемблерные приемы. А тут… В общем, не впечатлил меня этот компилятор. Но книжку выкладываю. Т.к. им пользуются очень многие. Книгу не читал, выкладываю как есть. Книга толстая весит так много изза того, что качественный скан и очень много страниц - почти 600. Солидный труд. Качайте пока есть.
Прокомментируете, если сами знакомы?
Сообщение от -=Женек=-:
Пример из википедии - видимо я в уме считал коряво, ввел алгоритм в контроллер - все заработало.
Вот и замечательно) Там вообще всё просто, на самом деле. Главное - аккуратность.
[Ответ]
Hopkroft 21:39 06.05.2011
Сообщение от Spectator:
Прокомментируете, если сами знакомы?
А что комментировать? Вон ID Software свой шедевр Wolfenstein 3D в Borland C++ 3.1 писали, хотя это один из самых ужасных компиляторов. Однако написали продукт, который к тому-же стал популярным.
Так что, под каждый инструмент можно подстроиться.
[Ответ]
Spectator 16:25 07.05.2011
Сообщение от Hopkroft:
А что комментировать? Вон ID Software свой шедевр Wolfenstein 3D в Borland C++ 3.1 писали, хотя это один из самых ужасных компиляторов. Однако написали продукт, который к тому-же стал популярным.
Так что, под каждый инструмент можно подстроиться.
Я, вообще, не Вас спрашивал)) К слову.
Если бы Вы почитали Абраша (http://bookfi.org/g/Abrash M.), у Вас бы появилось понимание что там от C++ нужна была только возможность создания ассемблерных вставок, и на Basic можно было бы написать, чисто теоретически))) Понятно что в интерпретируемый язык ассемблерные вставки не особо впихнешь.
Это раз. К тому же, на тот момент Borland C++ 3.1 был очень даже неплох Не знаю, отчего Вы решили что он "ужасен". Испортился Borland начиная уже со следующей версии, 4.5, но "тройка" была очень даже. Сейчас то понятно, последние продукты Inprise / Borland ничего кроме восклицаний "какое унылое говно" не вызывают. Но в свое время они были неплохи.
[Ответ]
Hopkroft 21:48 07.05.2011
Сообщение от Spectator:
Я, вообще, не Вас спрашивал)) К слову.
Думаю уважаемый мсье забыл, что это форум, и здесь бывают такие ситуации.
Сообщение от Spectator:
там от C++ нужна была только возможность создания ассемблерных вставок
Ну если на то пошло, то можно было воспользоваться популярным тогда компилятором Watcom. Но ребята решили сделать ставку на Borland.
Сообщение от Spectator:
К тому же, на тот момент Borland C++ 3.1 был очень даже неплох
Ну да, если знать несколько фишек, и в нужный момент перезапускать среду, то он вполне даже неплох.
Сообщение от Spectator:
Сейчас то понятно, последние продукты Inprise / Borland ничего кроме восклицаний "какое унылое говно" не вызывают
Сообщение от Hopkroft:
Думаю уважаемый мсье забыл, что это форум, и здесь бывают такие ситуации.
Это была не полемика, а конкретный вопрос к конкретному человеку.
Сообщение от Hopkroft:
Ну если на то пошло, то можно было воспользоваться популярным тогда компилятором Watcom. Но ребята решили сделать ставку на Borland.
Еще раз говорю - там всё равно было на каком компиляторе делать игру, поскольку все базовые, низкоуровневые алгоритмы делались на ASMе. Почитайте книжонку то, интересно ведь.
Сообщение от Hopkroft:
Ну да, если знать несколько фишек, и в нужный момент перезапускать среду, то он вполне даже неплох.
Я говорю о скорости компиляции и качестве кода. В первую очередь - о последнем.
Сообщение от Spectator:
Почитайте книжонку то, интересно ведь.
Сами-то читали книжку?
Если не ошибаюсь речь идёт о Чёрной книжке по программировании графики. В своё время найти её не мог.
Сообщение от Spectator:
Я говорю о скорости компиляции и качестве кода. В первую очередь - о последнем.
Кхм...ну когда во время прогона программы, результат координально отличаются от ожидаемого. Хотя на 100% известно, что при данных входных данных программа выдаст другой результат. А после перезапуска среды, всё становиться на свои места. То тут у любого начали бы появляться сомнения в используемой среде
Сообщение от Spectator:
codegear rad studio 2010, к примеру
Ну об этой среде я тоже нечего хорошего не слышал...
[Ответ]