2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Как вычислить день недели?
Сообщение01.01.2009, 06:28 


25/11/08
449
Код:
program dae;
var
  g1,g2,m1,m2,d1,d2,n:longint;
  day:byte;
const
  Cm: array[3..14] of integer=(0,31,61,92,122,153,184,214,245,275,306,337);

begin
  writeln('enter data: d m g');
  readln(d2,m2,g2);
  d1:=29;m1:=12;g1:=2008;
  {29 декабря 2008 был ПН. т.е. = 0(mod 7)}
 
  {делаем март первым месяцем}
  if m1<=2 then
  begin
    m1:=m1+12;
    g1:=g1-1;
  end;
  if m2<=2 then
  begin
    m2:=m2+12;
    g2:=g2-1;
  end;

  n:=(g2-g1)*365+((g2 div 4)-(g1 div 4))+Cm[m2]-Cm[m1]+d2-d1;
  {n=разность между введенной датой и известной}

  if n<0 then
  begin
    n:=-n;
    day:=(n mod 7);
    if day<>0 then day:=7-day;
  end
  else
    day:=(n mod 7);

  case day of
    0:writeln('day=pn');
    1:writeln('day=vt');
    2:writeln('day=sr');
    3:writeln('day=cht');
    4:writeln('day=pt');
    5:writeln('day=sb');
    6:writeln('day=vs');
  end;
  readln;
end.
Проверял по календарю -выдает неправильный ответ. Где ошибка? :cry:

 Профиль  
                  
 
 
Сообщение01.01.2009, 06:50 


05/09/08
59
Вы високосный год не учитываете. Как минимум.

 Профиль  
                  
 
 
Сообщение01.01.2009, 13:29 


27/11/05
183
Северодонецк
Рекомендую для подобной задачи книгу (ее без проблем найдете в Интернете):

Касаткин В.Н. Логическое программирование в занимательных задач.

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

 Профиль  
                  
 
 
Сообщение01.01.2009, 17:23 


25/11/08
449
Усталый писал(а):
Вы високосный год не учитываете. Как минимум.
Учитываю. ((g2 div 4)-(g1 div 4)) и есть поправка.

 Профиль  
                  
 
 
Сообщение01.01.2009, 19:35 


05/09/08
59
Условие является ли год високосным на самом деле чуть более сложное.
Код:
( year mod 4 = 0 and year mod 100 <> 0 ) or year mod 400 = 0


Потом, наврядли выйдет отделаться такой поправкой. Между датами может быть несколько високосных лет.

 Профиль  
                  
 
 
Сообщение02.01.2009, 09:52 


27/11/05
183
Северодонецк
Усталый писал(а):
Потом, наврядли выйдет отделаться такой поправкой. Между датами может быть несколько високосных лет.


Любите книгу, источник знаний! У Касаткина все эти проблемы разрешены.

 Профиль  
                  
 
 
Сообщение02.01.2009, 13:47 


05/09/08
59
Цитата:
Любите книгу, источник знаний! У Касаткина все эти проблемы разрешены.

Верю.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group