Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проверка мозгов

435
20 июля 2003 года
avatara
188 / / 07.07.2003
Вот очередная проверка мозгов.
Условия -
Необходимо найти день недели, если человек вводит день, месяц и год.
Также надо учесть все високосные года.
год високосный если:
1. делится на 4 без остатка
2. не делится на 100 без остатка
3. делится на 400 без остатка.
Подсказка
При расчете можно стартовать с какой-то известной даты, например Рождество. 01.01.0001 - воскресенье.
Приложение должно быть консольным!!
550
21 июля 2003 года
matwey
82 / / 03.12.2002
Цитата:
Originally posted by avatara
Вот очередная проверка мозгов.
Условия -
Необходимо найти день недели, если человек вводит день, месяц и год.
Также надо учесть все високосные года.
год високосный если:
1. делится на 4 без остатка
2. не делится на 100 без остатка
3. делится на 400 без остатка.
Подсказка
При расчете можно стартовать с какой-то известной даты, например Рождество. 01.01.0001 - воскресенье.
Приложение должно быть консольным!!



Это я не понял сам не можешь, или как. Здесь обычно помощи просят.

550
21 июля 2003 года
matwey
82 / / 03.12.2002
Цитата:
Originally posted by avatara
Вот очередная проверка мозгов.
Условия -
Необходимо найти день недели, если человек вводит день, месяц и год.
Также надо учесть все високосные года.
год високосный если:
1. делится на 4 без остатка
2. не делится на 100 без остатка
3. делится на 400 без остатка.
Подсказка
При расчете можно стартовать с какой-то известной даты, например Рождество. 01.01.0001 - воскресенье.
Приложение должно быть консольным!!



Хотя наверное ты прав.
Это всеобщая проблема: а выход: взять, запихнуть извесную дату в класс CTime и взять от туда день недели.

p.s консольное приложение - это полноправное windowsкое приложение не имебщее своей графической оболочки и поэтому вынужденое исполняться в командносй строке.

Так что если эта фраза была обращена на "библиотеками MFC не пользоваться" (коли мы в форуме про MS VC++)

435
22 июля 2003 года
avatara
188 / / 07.07.2003
Цитата:
Originally posted by matwey


Хотя наверное ты прав.
Это всеобщая проблема: а выход: взять, запихнуть извесную дату в класс CTime и взять от туда день недели.

p.s консольное приложение - это полноправное windowsкое приложение не имебщее своей графической оболочки и поэтому вынужденое исполняться в командносй строке.

Так что если эта фраза была обращена на "библиотеками MFC не пользоваться" (коли мы в форуме про MS VC++)



Ты правильно сказал "библиотеками MFC не пользоваться" - именно это я имел ввиду.
Часть кода все-таки приведу
// программа определения високосного года

int Year;
cout<<"Please, enter Year : ";
cin>>Year;
if (Year%4==0 && Year%400==0)
{
cout<<"\n";
cout<<" This is a leap-year ";
}
else if (Year%100!=0)
{
cout<<"\n";
cout<<" This is a leap-year ";
}
else
cout<<"\n This is no leap-year ";

cout<<"\n";

2.4K
22 июля 2003 года
Locky
11 / / 07.04.2003
Все гораздо прозаичнее и проще... Для вычисления дня недели по дате есть оч. интересная формула. Как-нибудь на досуге запостю :)
З.Ы. Кстати, откуда взято что 01.01.0001 это воскресенье?
435
23 июля 2003 года
avatara
188 / / 07.07.2003
Цитата:
Originally posted by Locky
Все гораздо прозаичнее и проще... Для вычисления дня недели по дате есть оч. интересная формула. Как-нибудь на досуге запостю :)
З.Ы. Кстати, откуда взято что 01.01.0001 это воскресенье?



01.01.0001 - это точно воскресенье, насчет этого библия не обманывает. А вот очень интересную формулу хотелось бы очень увидеть, а то решение такой задачи оказывается очень длинным.

550
23 июля 2003 года
matwey
82 / / 03.12.2002
Цитата:
Originally posted by avatara


Ты правильно сказал "библиотеками MFC не пользоваться" - именно это я имел ввиду.
Часть кода все-таки приведу
// программа определения високосного года

int Year;
cout<<"Please, enter Year : ";
cin>>Year;
if (Year%4==0 && Year%400==0)
{
cout<<"\n";
cout<<" This is a leap-year ";
}
else if (Year%100!=0)
{
cout<<"\n";
cout<<" This is a leap-year ";
}
else
cout<<"\n This is no leap-year ";

cout<<"\n";



Это здорово, но 99% людей волпользуються библиотьеками при написании реальной программы, и решение свелдеться к моим двум строчкам, т.е. так выгоднее в комерческом смысле

550
23 июля 2003 года
matwey
82 / / 03.12.2002
Цитата:
Originally posted by Locky
Все гораздо прозаичнее и проще... Для вычисления дня недели по дате есть оч. интересная формула. Как-нибудь на досуге запостю :)
З.Ы. Кстати, откуда взято что 01.01.0001 это воскресенье?



Через юлианскую дату?

2.4K
23 июля 2003 года
Locky
11 / / 07.04.2003
Цитата:
Originally posted by avatara


01.01.0001 - это точно воскресенье, насчет этого библия не обманывает. А вот очень интересную формулу хотелось бы очень увидеть, а то решение такой задачи оказывается очень длинным.



Я конечно дико извиняюсь, но покажи мне строку в библии где написано что Исуус родился именно в воскресенье. К тому же календарь менялся в 1583 году. Так что сказать с уверенность что было 01.01.01 воскресенье или, например, среда нельзя. А если еще и учесть переход после революции на новый стиль (13 дней разницы, если не ошибаюсь, приведут к смещению дней недели)...... :)
http://u.pereslavl.ru/~gene/probset/chap1.koi8.html - ссылка на эту тему. Формулка там есть, но я точно не помню такой я пользовался или нет. Завтра постараюсь запостить то что обещал.

461
23 июля 2003 года
gerard
102 / / 20.12.1999
Цитата:
Originally posted by Locky


Я конечно дико извиняюсь, но покажи мне строку в библии где написано что Исуус родился именно в воскресенье. К тому же календарь менялся в 1583 году. Так что сказать с уверенность что было 01.01.01 воскресенье или, например, среда нельзя. А если еще и учесть переход после революции на новый стиль (13 дней разницы, если не ошибаюсь, приведут к смещению дней недели)...... :)
http://u.pereslavl.ru/~gene/probset/chap1.koi8.html - ссылка на эту тему. Формулка там есть, но я точно не помню такой я пользовался или нет. Завтра постараюсь запостить то что обещал.



Таких формул есть очень много. Вот, например, программа, основанная на одной из них:

#include <stdio.h>
int main(int argc, char* argv[])
{
char d, m;
short y;
char w;
sscanf(argv[1], "%u.%u.%u", &d, &m, &y);
if (m<3) { m+=12; y--; }
char j = y%100;
char c = y/100;
w = (d + 13*(m+1)/5 + j + j/4 - 2*c + c/4 - 1)%7;
if (w<0) w+=7;
printf("%i\n", w);
return 0;
}

Вводите дату в виде ДД.ММ.ГГГГ и получаете номер дня недели (0 - воскресенье, 1 - понедельник и т.д.) Применима для любой даты по новому стилю.

Другой вопрос в том, когда был введен новый стиль. В России, например, это произошло в 1918 году (после 31 января было сразу 14 февраля), в Европе на новый стиль первыми перешли католические страны в 1582 году (после 4 октября было 15 октября). Другие переходили и в 17 веке, и в 18.

Для старого стиля формула будет выглядеть так:
w = (d + 13*(m+1)/5 + j + j/4 - c - 3)%7.

И, кстати, о Рождестве Христове - оно ведь, если не ошибаюсь, было 25 декабря. А что касается года, то по многим историческим данным это могло быть не позже 4 года до н.э. Такой вот парадокс. Что вполне объяснимо: в те времена считали годы либо от сотворения мира, либо от основания Рима, а от Рождества Христова начали считать века с пятого, когда его точная дата уже была подзбыта.

435
24 июля 2003 года
avatara
188 / / 07.07.2003
Цитата:
Originally posted by gerard


Таких формул есть очень много. Вот, например, программа, основанная на одной из них:

Для старого стиля формула будет выглядеть так:
w = (d + 13*(m+1)/5 + j + j/4 - c - 1)%7



Возможно и еще одно решение. К сожалению оно работает только для дат после 1900 года, да и вводить их приходится извращенским способом
например, чтобы ввести 2003 год - нужно писать 103. Ну конечно можно вводить и 2003 - только потом вычитать 1900.
Кстати этот алгоритм возьмите на заметку!!

#include <iostream.h>
#include <stdio.h>
#include <time.h>
char day[] [20]={
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};
int Y,M,D;
cout<<"Input Day (1 - 31) - ";
cin>>D;
cout<<"\n";
cout<<"Input Month (1 - 12) - ";
cin>>M;
cout<<"\n";
cout<<"Input Year (after 1900) - ";
//2003 - это 103 год
cin>>Y;
cout<<"\n";
struct tm t;
t.tm_mday=D;
t.tm_mon=M-1;
t.tm_year=Y;
t.tm_hour=0;
t.tm_min=0;
t.tm_sec=0;
t.tm_isdst=0;

mktime(&t);
cout<<"The Day is - "<<day[t.tm_wday];
cout<<"\n";

С уважением AvatarA

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог