Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычисление дня недели 
:(
    Опции темы
NiJazz
  Дата 16.11.2003, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


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

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



Нужно решить задачу, не используя стандартных типов вроде TDateTime...

Задача выглядит так: "Для заданной даты вычислить день недели".
PM MAIL   Вверх
Vit
Дата 16.11.2003, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


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

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



Надо читать правила построения Григорианского календаря, когда там эти високосные годы и т.п., а затем чистая арифметика.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
NiJazz
Дата 16.11.2003, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


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

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



Vit, а где это взятьconfused.gif
PM MAIL   Вверх
Kurt
Дата 16.11.2003, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


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

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



Во!
Рекомендую! Подходит для любого ЯП!
Рассказываю алгоритм..
Пусть n - день недели (n=0 - воскресение, n=1 - понедельник и т.д n=6 - суббота)
d - число месяца(дата);
m - номер месяца, если начинать счет с марта: 1 - март, 2 - апрель,.. 12 - февраль.(такая нумерация - для устранения проблем с февралем - то 28 то 29 дней..).
y - номер года в столетии;
c - количество столетий с учетом того, что январь считается 11-м, а февраль - 12-м месяцем предыдущего года).
Т.е для, допустим, 2000г., то для даты на январь-февраль, считаем y=99, c=19, для других месяцев y=0, c=20.
Далее вычисляем число W:
W = d+[(13*m-1)/5]+y+[y/4]+[c/4]-2*c
[] - целая часть от числа (например, [3.14]=3, [-3.14]=-4)
Теперь n = остаток от деления на 7 числа W.
Все. Как интерпретировать n я описал.
Если W отрицательно, то остаток от деления на 7 все равно должен быть >= 0.
Например, W=-25=7*(-4)+3. Пеэтому n=3 - среда.
Алгоритм точно работает для ЛЮБОЙ даты н.э. (проверено!).
Как ДО Н. Э. - честно говоря, не знаю, не пробовал.

Enjoy it! smile.gif




--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
NiJazz
Дата 17.11.2003, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


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

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



Kurt, спасибо. Пока не смотрел, но выложу готовый свой вариант...

Код

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   Вверх
NiJazz
Дата 17.11.2003, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


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

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



С русским не продумал... Но ничего, и так ясно... smile.gif
PM MAIL   Вверх
December
Дата 17.11.2003, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


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

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



В "Алгоритмы" обсуждалось недавно.


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


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

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


 




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


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

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