Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Календарь, Как вычислить день недели 
:(
    Опции темы
Gorbatovsky
Дата 23.10.2003, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 4.9.2003
Где: Киев

Репутация: нет
Всего: нет



Как вычислить день недели для определенного дня месяца и года.
Например, 22 декабря 2003 года.
PM MAIL ICQ   Вверх
Nastya
Дата 23.10.2003, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: нет
Всего: 44



Я задавала этот в раздале "алгоритмы". Поищи там есть ответы


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
podval
Дата 23.10.2003, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: 18
Всего: 62



http://doors.infor.ru/allsrs/alg/index.html
Элементарно ищется тем же Яндексом.
PM WWW ICQ   Вверх
December
Дата 16.11.2003, 02:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: нет
Всего: 57



Цитата(podval @ 23.10.2003, 15:41)
http://doors.infor.ru/allsrs/alg/index.html
Элементарно ищется тем же Яндексом.

Там алгоритмы требуют программы, которую нужно покупать - пусть 100р. не деньги, чем тащиться в обменный пункт, сбербанк и т.п., проще самому алгоритм придумать.


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Waters
Дата 16.11.2003, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 16.11.2003

Репутация: нет
Всего: нет



День недели можно определить из числа юлианских дней, прошедших с Р.Х.
Алгоритм из Numerical Recipes, работает с любым годом (в том числе и отрицательным - до нашей эры)

Код

#define IGREG (15+31L*(10+12L*1582)) //Gregorian Calendar adopted Oct. 15, 1582.
 /*
In this routine julday returns the Julian Day Number that begins at noon ofthe calendar date
speci.ed by month mm, day id, and year iyyy, all integer variables. Positive year signi.es A.D.;
negative, B.C. Remember that the year after 1 B.C. was 1 A.D.
*/
long julday(int id, int mm, int iyyy)
{
 long jul;
 int ja,jy=iyyy,jm;
 if (jy == 0)
   return -1;
 if (jy < 0) ++jy;
 if (mm > 2)
   jm=mm+1;
 else
 {
   --jy;
   jm=mm+13;
 }
 jul = (long) (floor(365.25*jy)+floor(30.6001*jm)+id+1720995);
 if (id+31L*(mm+12L*iyyy) >= IGREG)
 {
   //Test whether to change to Gregorian Calendar.
   ja=(int)(0.01*jy);
   jul += 2-ja+(int) (0.25*ja);
 }
 return jul;
}


void main(void)
{
 long d=julday(18, 11, 2003);
 // день недели
 int week_day=(d+1)%7; // 0-воскресенье, 1-пон. и т.д.

}



wbr, waters

Это сообщение отредактировал(а) Waters - 16.11.2003, 08:44
PM MAIL   Вверх
NiJazz
Дата 17.11.2003, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: нет
Всего: 23



Или вот паскалевский вариант:

Код

uses crt;
var day, month, year: integer;
   dayw: integer;
   s,s1: string;
   i,j: integer;
   date: array[1..3] of string;

Function DayOfWeek (day, month, year: integer) : integer;
var century, yr, dw: integer;
begin
if month < 3 then begin
 Inc(month, 10);
 Dec(year);
end
else Dec(month, 2);
century := year div 100;
yr := year mod 100;
dw := (((26*month - 2) div 10)+day+yr+(yr div 4)+
          +(century div 4) - (2*century)) mod 7;
if dw < 0 then DayOfWeek := dw + 7
else DayOfWeek := dw;
end;

begin
clrscr;
write('Введите дату (дд.мм.гг): ');
read(s);
s1:='';
j:=0;
for i:=1 to length(s)+1 do begin
 if (s[i]='.') or (i = length(s)+1)  then begin
  j:=j+1;
  date[j]:=s1;
  s1:='';
 end
 else s1:=s1+s[i];
end;
val(date[1],day,day);
val(date[2],month,month);
val(date[3],year,year);
if ((day<1) or (day>31)) or ((month<1) or (month>12)) then begin
 writeln('Неправильный формат даты');
 readln;
 readln;
 exit;
end;
dayw:=DayOfWeek(day,month,year);
writeln;
write('День недели числа ',s,' - ');
case dayw of
 0: writeln('Воскресенье');
 1: writeln('Понедельник');
 2: writeln('Вторник');
 3: writeln('Среда');
 4: writeln('Четверг');
 5: writeln('Пятница');
 6: writeln('Суббота');
end;
readln;
readln;
end.


PM MAIL   Вверх
Guest
Дата 5.12.2003, 09:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Зачем все так сложно, гораздо проще вот так
Код

int days[];//массив дней в месяцах
int sum_mes(int i)
{
int sum=0;
for(int j=0;  j<i;  j++)
{
sum+=days[j];
}
return sum;
}
sum_day=((year-1)*365 + year/4 + sum_mes(mes-1) + day);
if(year%4 == 0  && mes<=2 && day<29)
{
sum_day--;
}
day_week = sum_day%7;


и получается
0- ВС
1 - ПН
и т.д.
  Вверх
Waters
Дата 6.12.2003, 04:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 16.11.2003

Репутация: нет
Всего: нет



Цитата
и получается ...

Код

int year=2003;  
 int mes=12;
 int day=6;
...

результат 0 (т.е. воскрес.)
ы?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.