(c) Jessica Justice, г.Колпашево
В ZX-Ревю N1-2/97 в разделе
"Этюды" Василий объявил конкурс
на процедуру-календарь. Мне из-
вестна отличная формула для вы-
числения дня недели. Формула
взята из книги "Задачи по прог-
раммированию" (авторы - С.А.Аб-
рамов, Г.Г.Гнездилова и др., се-
рия "Библиотечка программиста",
изд. "Наука" 1988), а ее авторы
ссылаются на "Computer programs
that work!" (authors Lee J.D.,
Beech G., Lee T.D.). Итак, фор-
мула: считается, что год лежит в
диапазоне от 1582 до 4902. Тог-
да номер дня недели (0-воскре-
сенье, 1-понедельник, ... 6-суб-
бота) равен остатку от деления
на 7 значения выражения:
[2.6m-0.2]+d+y+[y/4]+[c/4]-2c
где d - номер дня в месяце (1...
31), m - номер месяца в году
(нумерация начинается с марта,
т.е. 1-март, 2-апрель,... 10-де-
кабрь, январь и февраль считают-
ся месяцами с номерами 11 и 12
предыдущего года); c - две стар-
шие цифры года (15...49); y -
младшие цифры года (00...99);
[x] - означает целую часть чис-
ла.
На Бейсике программа может
выглядеть так:
10 INPUT "day=",day
20 INPUT "month=",month
30 INPUT "year=",year
40 IF month<3 THEN LET month=month+12 :
LET year=year-1 : REM Если январь или
февраль, то это последние месяцы преды-
дущего года
50 LET month=month-2 :
REM Нумерация начинается с марта
60 LET y$=STR$ year
70 LET c=VAL (y$(1 TO 2)) :
REM Первые две цифры года
80 LET y=VAL (y$(2 TO 4)) :
REM Вторые две цифры года
90 LET value=INT (2.6*month-02)+day+y+INT
(y/4)+INT (c/4)-2*c
100 LET week=value-7*(INT(value/7)) :
REM week - остаток от деления
выражения на семь и является номером
дня недели
110 PRINT "Day of week -";week
В результате на экране полу-
чим номер дня недели (0..6).
Чтобы воплотить все это в ма-
шинном коде, придется обратиться
к помощи калькулятора. Увы, я не
настолько хорошо знаю калькуля-
тор, быть может, кто-то из чита-
телей "Ревю" сможет выполнить
этот алгоритм в Ассемблере?
* * *