- •Тема 3. Технология разработки алгоритмов и программ.
- •3.1. Основные этапы разработки программного обеспечения.
- •3.2. Проектирование алгоритмов.
- •3.2.1. Требования к алгоритмам.
- •3.2.2. Временная и емкостная сложность алгоритмов.
- •3.2.3. Алгоритмы полиномиальной сложности и np-полные алгоритмы.
- •3.2.4. Эвристические алгоритмы.
- •3.2.5. Итеративные и рекурсивные алгоритмы.
- •3.2.6. Восходящий и нисходящий методы проектирования алгоритмов.
- •3.2.7. Базовые управляющие структуры алгоритмов и структурное прог-
- •3.2.8. Модульный метод разработки алгоритмов.
- •3.3. Проектирование данных.
- •3.3.1. Типы данных и объекты данных.
- •3.3.2. Классификация типов данных в системе программирования Turbo
- •Integer -32768 .. 32767 16 битов со знаком
- •3.3.3. Основные структуры данных и их представления.
- •3.4. Отладка и тестирование программ.
- •3.4.1. Классификация ошибок в программах.
- •3.4.2. Цели и задачи отладки и тестирования.
- •3.4.3. Основные возможности интегрированного отладчика системы
3.2.6. Восходящий и нисходящий методы проектирования алгоритмов.
Практика показывает, что программирование, понимаемое как проекти-
рование и формулирование алгоритмов, процесс сложный, требующий учета
многочисленных деталей и владения специальной техникой. Наиболее общая
тактика программирования состоит в разложении процесса на отдельные
действия, а соответствующих программ на отдельные инструкции. На каждом
таком шаге декомпозиции нужно удостовериться, что
(а) решения частных задач приводит к решению общей задачи,
(б) выбранная последовательность индивидуальных действий разумна и
(в) выбранная декомпозиция позволяет получить инструкции, в ка-
ком-либо смысле более близкие к языку, на котором в конечном счете будет
сформулирована программа.
Если видеть в поэтапной декомпозиции и одновременном развитии и де-
тализации программы постепенное продвижение вглубь, то такой метод при
решении задач можно характеризовать как нисходящий (сверху вниз). И нао-
борот, возможен такой подход к решению задачи, когда программист сначала
изучает имеющуюся в его распоряжении вычислительную машину и/или язык
программирования, а затем собирает некоторые последовательности инструк-
ций в элементарные процедуры или "кластеры действий", типичные для реша-
емой задачи. Элементарные процедуры затем используются на следующем
уровне иерархии процедур. Такой метод (из глубины примитивных машинных
команд к задаче, лежащей "на поверхности") называется восходящим (снизу
вверх). На практике разработку программы никогда не удается провести
строго в одном направлении (сверху вниз или снизу вверх). Однако при
конструировании новых алгоритмов нисходящий метод обычно доминирует!
3.2.7. Базовые управляющие структуры алгоритмов и структурное прог-
раммирование.
Истоки структурного программирования лежат в решении проблемы дока-
зательства правильности программ, т. е. в разработке математически стро-
гих методов доказательства правильности программ, которые бы устранили
их тестирование. Структурное программирование базируется на строго дока-
занной теореме о структурировании, которая утверждает, что любую пра-
вильную программу (с одним входом и одним выходом, без зацикливаний и
недостижимых команд) можно написать с использованием только следующих
управляющих структур:
- последовательности двух или более операторов;
- выбора одного из двух операторов (конструкция if-then-else);
- повторения оператора, пока выполняется некоторое условие
(конструкция while-do).
Комбинации правильных программ, полученные с использованием трех
основных (базовых) управляющих структур, также являются правильными
программами. При использовании только указанных трех структур отпадает
необходимость в безусловных переходах и метках!!!
Хотя теоретически возможно написать все правильные программы,
используя только три перечисленные базовые структуры, небольшое расшире-
ние этого базиса облегчает программирование. Введенные структуры должны
иметь один вход и один выход. Обычно включают конструкции case-of,
repeat-until и for-do.
Структурный подход к программированию включает в себя:
- нисходящее ("сверху вниз") проектирование алгоритма;
- непосредственное структурное программировани (кодирование) с
использованием базовых управляющих структур;
- сквозной структурный контроль.
