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;

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

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


Студентка, по всей видимости.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

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 06:36 am
Powered by Dreamwidth Studios