Есть программа на с++ по вычислению дня недели по дате. Вот она
#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 дней, если не поможете мне капец, вылечу с универа. Заранее, огромное спасибо.
14 декабря 2008 в 19:04
Почему именно это число – не знаю. Но заменить его можно на любое другое число, эквивалентное этому по модулю 7. А нужно оно для того, чтобы понедельнику соответствовало наименьшее число (т.е. 1 в данном случае, почему 0 не подошел – для меня загадка). Если его не вычитать, то, если не ошибаюсь, дни недели будут начинаться с пятницы.
ЗЫ Вместо tmp-floor(tmp/7)*7 лучше использовать tmp % 7 – результат тот же, а работает быстрее, да и сразу понятно, что делается.
14 декабря 2008 в 19:00
Осталась последняя неясность с числом 621050. Можно ли его поменять на другое и почему имеено это число?
14 декабря 2008 в 9:04
Help!!!
14 декабря 2008 в 6:02
Какая-то дата что ли? А можно сделать точкой отсчета 1 января 1999? У меня по заданию она дана
13 декабря 2008 в 22:01
621050, это я так понимаю некая точка отсчета принятая за понедельник
13 декабря 2008 в 21:02
А что за число 621050 такое?
13 декабря 2008 в 20:02
Эт надо, чтобы
floor(365.25*year)+floor(30.6*month)
работало правильно.
Первое округление – это учет високосного года, а второе – разного количества дней в месяцах.
13 декабря 2008 в 17:02
Не, високосный год в формуле 365,25, это чето про январь и февраль скорее всего
12 декабря 2008 в 23:05
Особо не разбирался, но похоже, что таким образом обрабатывают високосный год. Типа, январь, февраль считаем нормально, а в остальных случаях за счет округлений у нас иногда получается день на единицу меньше (для високосного года), чем было бы в остальных случаях.
12 декабря 2008 в 18:03
Кстати, если ввести 30 ФЕВРАЛЯ 2008 (!!!), то получится ВТОРНИК (!!!)
12 декабря 2008 в 18:00
Там скорее всего пытались проверку на корректность ввода месяца ввести.))
12 декабря 2008 в 18:00
Не там нет никакой проверки на правильность ввода
12 декабря 2008 в 17:04
Не братан, ты не понял. Чо все эти функции делают я понимаю и знаю. Мне непонятен исключительно сам алгоритм. Не пойму условие которое там есть с месяцем. Предполагаю что в ютом условии январь и февраль, но как это работает непонятно.
12 декабря 2008 в 17:03
Хорошо, давай вместе запускай поисковик (напр: //www.google.com.ua/)
Пишем: что такое #include
Смотрим результат поиска.
Раньше бело тяжелее, в бумажной книге нет такой кнопочки как Поиск.
12 декабря 2008 в 16:05
Да правильно понял, поможешь?
12 декабря 2008 в 16:03
Я так понял, чторечь идет о комментировании строк алгоритма))
12 декабря 2008 в 15:05
//ru.wikipedia.org/wiki/Алгоритм_вычисления_дня...
Возьми за образец этот
12 декабря 2008 в 15:00
))). У нас препод говорил: "Читай, хелп".
А это ты, что серьезно?