1. Разработка алгоритма «сверху вниз» (метод пошаговой детализации).
Начиная со спецификации, полученной в результате анализа задачи, выделяют небольшое число достаточно самостоятельных подзадач и описывают спецификации для каждой. Это будет первый шаг детализации. С каждой из выделенных подзадач поступают так же (второй шаг детализации) и т.д. Таким образом получается последовательность все более детальных спецификаций, приближающаяся к окончательной версии программы.
2. Модульность.
Метод пошаговой детализации дает возможность разбить алгоритм на части (модули), каждая из которых решает самостоятельную подзадачу. Размеры модулей должны быть небольшими, а инструкции, входящие в состав модуля, должны давать исчерпывающее представление о действиях, выполняемых модулем. Связи по управлению между модулями осуществляются посредством обращений к ним, а обмен информацией - через параметры и глобальные переменные.
3. Каждый модуль должен иметь один вход и один выход.
Это позволяет упростить стыковку модулей в сложной программе.
4. Логика алгоритма должна опираться на небольшое число достаточно простых базовых управляющих структур:
1. Следование
2 Развилка
3. Цикл:
а) цикл с предусловием б) цикл с постусловием
4. Выбор из нескольких альтернатив (переключатель)
Фундаментом структурного программирования является теорема о структурировании. Она утверждает, что как бы ни сложна была задача, схема алгоритма может быть представлена с использованием ограниченного числа элементарных управляющих структур.
Теорема о полноте. Базовые элементарные структуры: следование, разветвление и цикл - обладают функциональной полнотой, то есть любой алгоритм может быть реализован в виде композиции этих конструкций.
Пример. Применим принципы структурного программирования для разработки и описания алгоритма решения следующей небольшой задачи.
Требуется определить, пройдет ли кирпич с ребрами a, b и c в прямоугольное окно со сторонами х, у. Грани кирпича должны быть параллельны или перпендикулярны сторонам окна.
Если бы стороны окна и ребра кирпича были упорядочены, то для решения задачи достаточно сравнить меньшую сторону с меньшим ребром и большую сторону со средним ребром.
Выделяем подзадачи:
1. Упорядочение пары чисел по неубыванию.
2. Упорядочение тройки чисел по неубыванию.
3. Определение, пройдет ли кирпич с ребрами a£b£c в прямоугольное окно со сторонами х £ у.
Алгоритмы решения задач 1 и 2 опишем, как алгоритмы для подпрограмм, в дальнейшем на них можно ссылаться в предопределенных блоках.
Спецификация алгоритма Sort2.
Sort2(а, b) сортирует пару вещественных чисел a и b по неубыванию.
Входные параметры: a, b - вещественные числа.
Выходные параметры: a, b, удовлетворяющие условию a £ b.
Аналогично описывается спецификация алгоритма Sort3.
Решение задачи сортировки пары заключается в обмене значениями переменных a и b,если a > b. Обмен значениями пары переменных - еще одна подзадача (подзадача подзадачи). Назовем эту подзадачу Swap.
Язык программирования - это строгий набор правил, символов и конструкций, которые позволяют в формульно-словесной форме описывать алгоритмы для обработки данных на ЭВМ.
Каждая ЭВМ имеет свою систему команд, и программа в машинных кодах может быть выполнена сразу. Вначале язык машинных кодов был единственным языком программирования. Но использование этого языка - очень трудоемкий процесс, программы получаются громоздкими, их трудно отлаживать, модифицировать, практически невозможно перенести на другую ЭВМ. Возникла необходимость создания новых способов и средств записи программ. Стали появляться новые языки программирования. Их создание шло по двум направлениям: машинно ориентированные и машинно независимые (алгоритмические) языки. Машинно ориентированные языки (ассемблер, автокод) - языки низкого уровня, требующие указания мелких деталей процесса обработки данных. Алгоритмических языков - языков высокого уровня - в настоящее время более 500. Каждый язык имеет свои особенности, но есть ряд общих черт, отличающих алгоритмические языки от языков низкого уровня:
1. Алгоритмические языки обладают большими выразительными возможностями, имея широкий алфавит, что повышает наглядность текста программ.
2. Набор операций не зависит от машинных операций, а выбирается для удовлетворения потребностей конкретной прикладной области.
3. Операции задаются в удобном виде.
4. Одним предложением можно задать значительный этап обработки данных.
5. Программным объектам, над которыми выполняются действия, присваиваются имена, и обращение к ним происходит по имени.
6. В алгоритмических языках предусмотрен широкий набор типов данных.
При использовании алгоритмических языков мы идем на издержки. Во-первых, программа должна быть оттранслирована (переведена на язык машинных кодов программой-транслятором), на это требуется время. Во-вторых, полученная после трансляции программа может быть менее эффективной, чем составленная опытным программистом на языке низкого уровня с учетом специфики системы команд и организации памяти. Но эти недостатки окупаются удобствами для программиста.