Информатика - Учебное пособие

Основы структурного программирования

 

На заре эры компьютеров (50-e и 60-e г.г.) стоимость hardware (аппаратной части ЭВМ) была весьма велика, а ее возможности ограниченны. Это приводило к тому, что программисты в процессе создания программного обеспечения (software) и написания программ решения задач придумывали различные хитрые методы, направленные на сокращение времени решения, экономию  памяти  ЭВМ  и  т.  д.  Программирование  становилось  чем-то  вроде  искусства,  в котором огромную роль играют интуиция и личный опыт, и вершинами которого, как известно, овладевают немногие.

В то время, как в области hardware наблюдался неуклонный рост производительности и падение себестоимости, затраты на ПО возрастали. Иногда они доходили до 80\% общей стоимости вычислительной системы. По мере возрастания сложности решаемых на ЭВМ

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

Итак, к концу 60-х годов в программном мире сложилась ситуация, получившая название "кризис программного обеспечения". На этом фоне весьма плодотворным вкладом в теорию программирования оказалась работа Э. Дейкстры "Заметки по структурному программированию", опубликованная в 1968 году. Главным объектом критики Дейкстра избрал команду безусловного перехода (оператор GOTO). Весьма полезная в некоторых случаях, она в то же время затрудняет восприятие программы человеком. Чтение программы с использованием этой команды похоже на то, как если бы при чтении романа приходилось все время перелистывать книгу на несколько страниц то вперед, то назад. Такие перерывы в логической

последовательности алгоритма      весьма затрудняют    возможность  хорошо           разобраться    в программе всем, кроме ее автора.

Вместо GOTO Дейкстра предложил использовать при написании программ три типа управляющих структур: простую последовательность, ветвление, повторение. Это предложение опирается  на  хорошо  известную  теперь  теорему  о  структурировании,  являющуюся фундаментом структурного программирования.

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

В основу структурного программирования как научной методологии разработки алгоритмов и программ заложен ряд принципов системного подхода:

1) программа должна составляться поэтапно небольшими шагами;

2) размер шага определяется количеством решений, применяемых программистом на этом шаге;

3) сложная задача должна разбиваться на простые, легко воспринимаемые блоки, каждый из которых имеет один вход и один выход;

4) логика алгоритма и программы должна опираться на минимальное число достаточно простых базовых управляющих структур.

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

Сначала   идеи   Э.   Дейкстры   вызывали   лишь   усмешку   программистов.   Ситуация изменилась после того, как в начале 70-х годов группа сотрудников фирмы IBM применила идеи  структурного  программирования  для  создания  информационной  базы  данных  газеты "Нью-Йорк Таймс". Работа над проектом шла на удивление гладко, а законченная программа почти  не  содержала  ошибок.  С  тех  пор  структурное  программирование  стало  оказывать заметное влияние на развитие ПО всех рангов. Важной вехой на пути признания методов структурного программирования явился 1975-й год, когда Д. Кемени и Т. Курц, авторы языка "Бейсик", ввели в него структурные возможности и практически выбросили оператор GOTO. В настоящее время имеется уже несколько языков высокого уровня, основанных на принципах структурного программирования (Паскаль, Модула, Ада, Си).

Структурное программирование наиболее эффективно в следующих случаях:

1) когда разрабатываются большие программы;

2) если объем памяти и быстродействие ЭВМ не являются критичными;

3) если стоимость разработки программного обеспечения является существенным фактором.

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

В качестве примера использования нисходящего проектирования рассмотрим разработку алгоритма решения задачи табуляции функции одной переменной z(x)

 

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

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

На последнем этапе, подставляя детализированные на предыдущих этапах блоки, получаем окончательную схему алгоритма задачи: