singlepost

Проблема с алгоритмом!!! << На главную или назад  

Есть программа на с++ по вычислению дня недели по дате. Вот она
#include <iostream.h>
#include <conio.h>
#include <math.h>

void main()
{
int day,month,year;
{
clrscr();
cout<<"Enter the year: "; cin>>year;
cout<<"Enter the month: "; cin>>month;
cout<<"Enter the day: "; cin>>day;

unsigned long tmp,res;

if(month>2)
month++;
else
{
month+=13;
year-=1;
}
tmp=floor(365.25*year)+floor(30.6*month)+day-621050;
res=tmp-floor(tmp/7)*7+1;

switch(res)
{
case 1: cout<<"This day is Monday"; break;
case 2: cout<<"This day is Tuesday"; break;
case 3: cout<<"This day is Wednesday"; break;
case 4: cout<<"This day is Thursday"; break;
case 5: cout<<"This day is Friday"; break;
case 6: cout<<"This day is Saturday"; break;
case 7: cout<<"This day is Sunday"; break;
}
getch();
}
}
Вроде со всем разобрался но есть одно но, не могу понять как работает сам алгоритм, по какому принципу. Не могу дать ему логического объяснения. А именно вот эта часть программы
if(month>2)
month++;
else
{
month+=13;
year-=1;
}
tmp=floor(365.25*year)+floor(30.6*month)+day-621050;
Помогите, пожалуйста в объяснении алгоритма. Курсовую сдавать через 5 дней, если не поможете мне капец, вылечу с универа. Заранее, огромное спасибо.

18 ответов в теме “Проблема с алгоритмом!!!”

  1. 18
    Павел Потапов ответил:

    Почему именно это число – не знаю. Но заменить его можно на любое другое число, эквивалентное этому по модулю 7. А нужно оно для того, чтобы понедельнику соответствовало наименьшее число (т.е. 1 в данном случае, почему 0 не подошел – для меня загадка). Если его не вычитать, то, если не ошибаюсь, дни недели будут начинаться с пятницы.

    ЗЫ Вместо tmp-floor(tmp/7)*7 лучше использовать tmp % 7 – результат тот же, а работает быстрее, да и сразу понятно, что делается.

  2. 17
    Юра Рыбарук ответил:

    Осталась последняя неясность с числом 621050. Можно ли его поменять на другое и почему имеено это число?

  3. 16
    Юра Рыбарук ответил:

    Help!!!

  4. 15
    Юра Рыбарук ответил:

    Какая-то дата что ли? А можно сделать точкой отсчета 1 января 1999? У меня по заданию она дана

  5. 14
    Роберт Бакиров ответил:

    621050, это я так понимаю некая точка отсчета принятая за понедельник

  6. 13
    Юра Рыбарук ответил:

    А что за число 621050 такое?

  7. 12
    Павел Потапов ответил:

    Эт надо, чтобы
    floor(365.25*year)+floor(30.6*month)
    работало правильно.
    Первое округление – это учет високосного года, а второе – разного количества дней в месяцах.

  8. 11
    Юра Рыбарук ответил:

    Не, високосный год в формуле 365,25, это чето про январь и февраль скорее всего

  9. 10
    Павел Потапов ответил:

    Особо не разбирался, но похоже, что таким образом обрабатывают високосный год. Типа, январь, февраль считаем нормально, а в остальных случаях за счет округлений у нас иногда получается день на единицу меньше (для високосного года), чем было бы в остальных случаях.

  10. 9
    Дмитрий Ерохин ответил:

    Кстати, если ввести 30 ФЕВРАЛЯ 2008 (!!!), то получится ВТОРНИК (!!!)

  11. 8
    Сергей Артюх ответил:

    Там скорее всего пытались проверку на корректность ввода месяца ввести.))

  12. 7
    Юра Рыбарук ответил:

    Не там нет никакой проверки на правильность ввода

  13. 6
    Юра Рыбарук ответил:

    Не братан, ты не понял. Чо все эти функции делают я понимаю и знаю. Мне непонятен исключительно сам алгоритм. Не пойму условие которое там есть с месяцем. Предполагаю что в ютом условии январь и февраль, но как это работает непонятно.

  14. 5
    Сергей Артюх ответил:

    Хорошо, давай вместе запускай поисковик (напр: //www.google.com.ua/)
    Пишем: что такое #include
    Смотрим результат поиска.
    Раньше бело тяжелее, в бумажной книге нет такой кнопочки как Поиск.

  15. 4
    Юра Рыбарук ответил:

    Да правильно понял, поможешь?

  16. 3
    Сергей Артюх ответил:

    Я так понял, чторечь идет о комментировании строк алгоритма))

  17. 2
    Дмитрий Ерохин ответил:

    //ru.wikipedia.org/wiki/Алгоритм_вычисления_дня...

    Возьми за образец этот

  18. 1
    Сергей Артюх ответил:

    ))). У нас препод говорил: "Читай, хелп".
    А это ты, что серьезно?

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.