spamsink: (Default)
[personal profile] spamsink posting in [community profile] besm6
Декомпилируя разбросанные на образах дисков кусочки Джина, я наткнулся на код, реализующий

Приказ 'календарь'


По приказу 'календарь' выдается календарь на три месяца, ближайшие к указанной дате. Календарь верен для всех дат двадцатого столетия. Дореволюционные даты даются по новому стилю. Заказанная дата отмечается на календаре круглыми скобками. Форма обращения:

КАЛ-ендарь  [ <дата> ]

Под ближайшими понимаются текущий, предыдущий и последующий месяцы. Если дата не указана, то принимается текущая дата.

Дата задается в виде: ДД.ММ.ГГ

Нули можно не указывать.



В нём, в частности, есть процедура, вычисляющая количество дней в месяце по номеру месяца и номеру года.
Выглядит она так (с точностью до идентификаторов; код компилируется идентично оригиналу):

_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;

Не может же быть, думал я, чтобы В. В. Кобелёв, автор "Джина", был настолько плох?

А разгадка была проста:
Программу для этого приказа разработала О.А.Черненко.


Студентка, по всей видимости.

Date: 2023-10-29 12:48 pm (UTC)
ufm: (Default)
From: [personal profile] ufm
Из википедии:
год, номер которого кратен 400, — високосный;
остальные годы, номер которых кратен 100, — невисокосные (например, годы 1700, 1800, 1900, 2100, 2200, 2300);
остальные годы, номер которых кратен 4, — високосные;
все остальные годы — невисокосные.

Profile

Сообщество любителей БЭСМ-6

December 2025

S M T W T F S
 123456
78910111213
14151617181920
21222324252627
282930 31   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 14th, 2026 08:46 am
Powered by Dreamwidth Studios