Гм. До сих пор, я был лучшего мнения об издательстве "Питер".
Собственно, небрежность и отсутствие вычитки чувствуются во всем.
Даже такое известное имя, как Hamming (метрика Хэмминга), написано с
орфографической ошибкой.
Очевидно, что этот код - прилагаемый к книге - НИКОГДА не проверялся и
НИКОГДА не компилировался.
Его просто невозможно скомпилировать - и из-за огромного количества
типографских ошибок, и из-за отсутствия некоторых модулей, которые
пришлось перепечатывать из DJVU-копии книги.
И вот, сделано, наконец, то, что давно должен был сделать если и не автор,
то, хотя бы, рецензент или технический редактор - скомпилировано "это".
Вероятно, "это" следует поместить в какой-нибудь раздел "антипаттерны".
Давненько я не видел такого похабного кода. К сожалению, глупостей
понаписано столько, что нет никакой возможности выправить за один раз все,
и нет никакой уверенности, что удастся заставить "это" работать.
(Оно запускается и что-то считает, но я не пытался проверить правильность).
Судя по использованию 'cout' и перегруженных функций (тогда почему бы уж
не Templates взамен Copy/Paste кода под каждый новый тип?), автору,
вероятно, казалось, что он пишет на C++.
На самом деле, это код "не тянет" даже на Basic. Копирование массивов
(POD-типа), например, выполняется в цикле. Взамен собственных функций
сортировки, вероятно, следовало бы вызывать qsort(), но я поленился с этим
разбираться.
Стиль форматирования лучше всего охарактеризовать как "отвратительный".
Точнее сказать, он везде разный - никакого единого стиля нет - но везде
отвратительный.
Внешне неразличимые символы - такие как 1 и l, например, всюду используются
совместно. Исключая названия функций, ни одного осмысленного наименования
код не содержит. Где-то пропущены скобки или точка с запятой - восстановил,
где-то, возможно, что-то более существенное. В одном месте локальная в блоке
переменная перекрывала другую с тем же именем, но из внешнего блока.
Заметить удалось только благодаря разнице в типах (из-за ошибки инициализации).
Сколько еще такого осталось незамеченным - бог знает.
Понятно, что такой грязный код нуждается в тотальном тестировании.
Глупейшая экономия на всем - на пробелах, на пустых строках, на скобках
(отличный тест на запоминание приоритетов всех операций). Декларации
лепятся в одну строку, инициализации - в заголовок цикла, присваивания -
в условие оператора if, переменные, за редким ислючением, никогда не
инициализуются, а иногда, даже, и не используются.
Автор, очевидно, не понимает ни разницы между целым и действительным типом
переменных, ни разницы между целыми и указателями. Числа с плавающей точкой
регулярно проверяются на точное равенство целому нулю, а если и
инициализируются - то, опять же, целыми значениями.
Компилятор выдает множество предупреждений о возможном использовании
переменных без инициализации.
Who care?
Про булевские переменные автор, вероятно, никогда не слышал, и всюду наглядно
использует 0 и -1.
Ну, и за однобуквенные идентификаторы, надо просто давать срок.
Использование метода Якоби для вычисления собственных значений (вместо
SVD), и инвертирование по Гауссу, а не по Пенроузу-Муру, мне кажется
сомнительным.
Откровенно говоря, все это было бы проще написать заново.
|