Тайное всегда становится явным
Oct. 28th, 2023 12:25 amДекомпилируя разбросанные на образах дисков кусочки Джина, я наткнулся на код, реализующий
В нём, в частности, есть процедура, вычисляющая количество дней в месяце по номеру месяца и номеру года.
Выглядит она так (с точностью до идентификаторов; код компилируется идентично оригиналу):
Тут мы видим массу разных вещей: и бессмысленную проверку на равенство неотрицательных чисел нулю с помощью "< 1",
и непонимание, что присваивать переменной-результату можно более чем в одном месте,
и самое главное, безумное логическое выражение для определения, 30 дней в месяце или 31.
Любой уважающий себя программист того времени, желающий минимизировать размер кода, написал бы вместо того if-а хотя бы
_if m < 8 _then monlen := 30 + res _else monlen := 31 - res;
а если бы подумал ещё немного, то вся функция превратилась бы в
_if m = 2 _then monlen := 28 + ord(y _mod 4 = 0) _else monlen := 30 + (m _mod 2 + m _div 8) _mod 2;
Не может же быть, думал я, чтобы В. В. Кобелёв, автор "Джина", был настолько плох?
А разгадка была проста:
Студентка, по всей видимости.
Приказ 'календарь'
По приказу 'календарь' выдается календарь на три месяца, ближайшие к указанной дате. Календарь верен для всех дат двадцатого столетия. Дореволюционные даты даются по новому стилю. Заказанная дата отмечается на календаре круглыми скобками. Форма обращения:
КАЛ-ендарь [ <дата> ]
Под ближайшими понимаются текущий, предыдущий и последующий месяцы. Если дата не указана, то принимается текущая дата.
Дата задается в виде: ДД.ММ.ГГ
Нули можно не указывать.
В нём, в частности, есть процедура, вычисляющая количество дней в месяце по номеру месяца и номеру года.
Выглядит она так (с точностью до идентификаторов; код компилируется идентично оригиналу):
_function monlen(y, m:integer):integer;
_var res: integer;
_begin
_if m = 2 _then _begin
_if y _mod 4 < 1
_then res := 29
_else res := 28;
_end _else _begin
res := m _mod 2;
_if (res = 1) _and (m < 8) _or (res < 1) _and (m >= 8)
_then res := 31
_else res := 30;
_end;
monlen := res;
_end;
Тут мы видим массу разных вещей: и бессмысленную проверку на равенство неотрицательных чисел нулю с помощью "< 1",
и непонимание, что присваивать переменной-результату можно более чем в одном месте,
и самое главное, безумное логическое выражение для определения, 30 дней в месяце или 31.
Любой уважающий себя программист того времени, желающий минимизировать размер кода, написал бы вместо того if-а хотя бы
_if m < 8 _then monlen := 30 + res _else monlen := 31 - res;
а если бы подумал ещё немного, то вся функция превратилась бы в
_if m = 2 _then monlen := 28 + ord(y _mod 4 = 0) _else monlen := 30 + (m _mod 2 + m _div 8) _mod 2;
Не может же быть, думал я, чтобы В. В. Кобелёв, автор "Джина", был настолько плох?
А разгадка была проста:
Программу для этого приказа разработала О.А.Черненко.
Студентка, по всей видимости.
no subject
Date: 2023-10-29 12:48 pm (UTC)год, номер которого кратен 400, — високосный;
остальные годы, номер которых кратен 100, — невисокосные (например, годы 1700, 1800, 1900, 2100, 2200, 2300);
остальные годы, номер которых кратен 4, — високосные;
все остальные годы — невисокосные.
no subject
Date: 2023-10-29 05:38 pm (UTC)Я же говорю о формуле для длины остальных месяцев.