Главная  Полное построение алгоритма 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [ 69 ] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117]

Вообще следуйте золотому правилу: пишите такую программу, которую вам было бы приятно читать.

Избегайте нестандартных средств версии языка. Если вы предполагаете, что программа должна использоваться другими, и, особенно, если, как вы ожидаете, работать на других машинах, хорошо бы указать все нестандартные средства Фортрана, используемые в программе (см. Стандарт Фортрана ANSI (1966)). Это можно сделать без подмешивания в тело программы дополнительных карт комментария. Соответствующие операторы можно пометить символами в колонках с 73 по 80.

Описывайте правильно все входные и выходные данные. Документация должна давать пользователю всю необходимую информацию для успешного ввода данных. Эту информацию можно включить в программу, если она еще не перегружена документацией. Обширные спецификации входных данных следует помещать в руководстве для пользователя, а в прологе должна быть явная ссылка на такое руководство.

Можно утверждать, что выходная информация является наиболее важным документом любой программы, так как она может оказаться единственным документом, который видят многие пользователи. Разработчик программы должен стараться сделать всю выходную информацию очевидной.

Программист должен заботиться о пользователе. Обычно следует распечатывать входные данные в удобном для чтения виде. Это дает пользователю возможность проверить еще раз входную информацию, а также обеспечивает более полную запись прогона. Разработчик программы должен также помогать" пользователю, составляя осмысленные сообщения об ошибках. Следует попытаться предвидеть, какие возможны неприятности, и приготовиться к появлению ошибок, так как они появятся рано или поздно. Особое внимание нужно уделить возможным ошибкам во входных данных и вырожденным случаям (например, циклам DO, которые ничего не делают при дайной входной информации), входным массивам и переменным, значения которых слишком малы или слишком велики, и т. д.

Одной из самых скучных и непривлекательных частей этапа реализации и документации является работа по подготовке привлекательных для глаза форматов выходной информации. Однако эту работу следует выполнять тщательно, так как некрасивая или неразборчивая распечатка компрометирует всю программу.

Обслуживание

Многие программисты полагают, что не существует больших программ, свободных от ошибок или полностью протестированных. Так как число возможных путей в программе зависит экспоненциально



от числа операторов IF в тексте программы, редко удается (или редко оказывается целесообразным) проверить все эти пути. Поэтому часто приходится слышать об ошибках в довольно больших программах, которые не обнаруживались месяцами или годами, после того, как программа была признана правильной. Исправлять такие программы трудно, если они документированы плохо.

Суш;ествует множество других причин, по которым программы нужно обновлять, развивать или как-то модифицировать со временем. Например, может понадобиться изменить значения программных переменных, увеличить объем входных данных, подсчитать и выдать некоторую дополнительную статистическую информацию, вставить более эффективный алгоритм вместо имеющегося или переписать программу полностью либо для новой конфигурации машины или системы, либо на другом языке программирования.

Эта деятельность относится к категории обслуживания программы. Это важная работа, увеличивающая время полезной жизни программы. Ее важность возросла и она стала требовать столько времени, что простота обслуживания программы может оказаться важнее ее эффективности. Программы, предельно изощренные, компактные, эффективные и быстрые, обычно труднее обслуживать. Лучше пожертвовать частью скорости программы ради простоты обслуживания.

Ни в коем случае не проводите обновление или другое изменение единственной колоды или ленты с текстом программы (в любом случае должна существовать по меньшей мере одна копия). Все работы по обслуживанию следует выполнять над копией программы. Копию старой версии следует хранить неприкосновенной в течение значительного периода. Все изменения в ходе работ по обслуживанию следует тщательно фиксировать. Старую документацию следует обновлять; это касается не только описания изменений, но и удаления устаревшей или неправильной документации. Любую виеншюю документацию желательно снабжать приложением, которое должно содержать подробное описание работы по обслуживанию, включая такую информацию, как даты изменений, их причины и т. д.

Подпрограмма PR IM

На рис. 4.2.1 приведена достаточно хорошо документированная реализация алгоритма PRIM, которая является результатом улучшений, рассмотренных в ходе анализа первой реализации на рис. 4.1.7.

Пролог программы мог бы содержать больше информации, но и та, что приведена, в достаточной степени объясняет цель программы, природу входных и выходных данных, определяет все переменные. Комментарии в тексте программы сведены к минимуму, отделены пустыми картами и соответствуют блок-схеме на рис. 4.1.6. Текст раз-Делен на обозримые куски и разбит на страницы в точках естественного соединения логических ветвей. Метки некоторых операторов программы использованы для отображения внутренней логики программы.



Глава 5. Алгоритмы машинной математики

в первых четырех главах мы обсудили ббльшую часть принципов, на которых основывается процесс разработки алгоритма. В данной главе эти принципы будут применены в некоторых областях вычислительной математики,

В разд. 5.1 и 5.2. разработан ряд алгоритмов, относящихся к важной практической области, связанной с вопросами сортировки и поиска информации. В разд. 5.1 обсуждаются и анализируются два из наиболее сложных алгоритма сортировки, QUICKSORT и HEAP-SORT, и доказывается, что никакой алгоритм сортировки с помощью сравнений не может иметь лучшую среднюю трудоемкость, чем 0(N In N). В разд. 5.2 обсуждаются два эффективных алгоритма отыскания данной записи в множестве записей, отсортированных по некоторому ключу. Мы также рассматриваем алгоритм оптимального размещения записей в структуре дерева в соответствии с заданными вероятностями появления этих записей. Показано, что при использовании такой структуры дерева среднее число сравнений, необходимых для отыскания произвольной записи, минимально.

В этой главе мы приводим примеры алгоритмов из трех других областей: арифметические выражения, страничная обработка в вычислительных системах с виртуальной памятью и параллелизм.

В разд. 5.3 дано индуктивное определение как арифметических, так и логических выражений. Рассматриваются инфиксные, префиксные и постфиксные формы для описания арифметического выражения как линейной последовательности символов, а также средства представления этих выражений с использованием двоичных деревьев. Предлагаются два алгоритма - один для вычисления арифметического выражения в постфиксной форме, другой для преобразования арифметического выражения из инфиксной в постфиксную форму.

В разд. 5.4 на элементарном уровне обсуждается вопрос о распределении памяти в вычислительной системе с виртуальной памятью. После рассмотрения пяти алгоритмов, обрабатывающих страничйые отказы в такой вычислительной системе, представлена простая модель работы программы. Она используется для проверки относительной эффективности этих алгоритмов.

Завершается глава введением в параллельные алгоритмы (разд. 5.5) - предмет, который находится в начальной стадии развития, но может сыграть важную роль в будущем.



[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [ 69 ] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117]

0.0013