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



Программирование вообще можно определить как проектирование, кодирование и тестирование программы.

Структурное программирование это проектирование, написание и тестирование программы в соответствии с заранее определенной дисциплиной.

Раньше хорошими программистами считали тех, кто писал весьма хитроумные программы, которые занимали минимум основной памяти и выполнялись за кратчайшее время. Это было естественно, потому что в старое доброе время основная память была более дорогой, машины были намного медленнее, чем сегодня. Результатом хитроумного кодирования оказывались программы, которые трудно было (если не совершенно невозможно) понять другим лицам. Программисты зачастую сами признавали, что свою собственную программу они с трудом понимают уже через полгода, а то и через месяц. Фактически каждая написанная программа впоследствии модифицируется при изменении внешних требований или для ликвидации ошибок. Изменения, вносимые в запутанную программу, еще больше усложняют ее понимание впоследствии. Подобные программы получили название BS-программ (Bowl of Spaghetti блюдо спагетти), так как при попытке разобраться в них необходимо нарисовать нечто напоминающее блюдо спагетти.

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

Исходя из этих проблем, лучшие программисты 70-х годов Э.Дейкстра и Н.Вирт разработали строгие правила разработки программ, которые получили название “Методология структурного программирования”. Они рассматривают программу (алгоритм) как совокупность иерархических модулей, которые позволяют четко структурировать программу, что улучшает ее понимание программистами, позволяет выполнять математическое доказательство ее корректности и тем самым повысить надежность функционирования программ и сократить срок их разработки.

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

1. Алгоритм (программ) должна разделяться на независимые части, называемые модулями.

2. Модуль имеет одну входящую и одну выходящую точку.

3. Модуль – это независимый блок, который физически и логически отделен от других модулей.

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

5. В модуле используются только базовые управляющие конструкции (ветвление, повторение, следование, вход, выход).

6. Вложенность операторов IF не должна быть более трех.

В 1966 году Бом и Якопини доказали следующую теорему: любую блок-схему с одним входом и одним выходом можно построить, используя базисное множество базовых структур (следование, ветвление, цикл-пока).

Блок-схема называется структурированной, если она построена на основе базисного множества базовых структур.

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

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

Пример. Построить структурированную блок-схему алгоритма для вычисления функции

              

             1-2x, если x<0;

Y=  1, если 0<=x<1;

             2x-5, если x>=1.

 

На первом шаге задачу представим в виде одного блока, в котором запишем кратко условие задачи.

 


                                                           

Вычислить Y
                                                                                              

На втором шаге функциональный блок преобразуем в развилку, где выделено вычисление Y при x<0.

 

 

 

 


                                                        

 

Y=1-2x
Продолжение исследования Х и вычисление Y
                                                                                                              

 

 

На последнем шаге функциональный блок предыдущей схемы заменяем развилкой.

 


Начало
                                               

 

     
 

 


Конец
Вывод Y
                                                                                                                 

 

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

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

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

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

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

Формальных критериев декомпозиции не существует, поэтому процесс, особенно для нестандартных задач, является в большой степени творческим и требует навыка и опыта. Парадоксальным на первый взгляд, но наиболее конструктивным критерием выделения подзадач является такой: каждая подзадача должна быть сформулирована кратко, точно и емко («Найти сумму..», «Проверить наличие элементов …» и т.д.).  

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

Ниже приведена общая схема нисходящего проектирования.

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

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

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

Такой процесс отладки дает на каждом уровне два важных результата:

- возможность отладки уже готовых частей программы;

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

При этом то, что уже отлажено, далее меняться не должно, и все усилия можно сосредоточить на раскрытии еще не решенных подзадач.

Восходящая разработка алгоритма ("снизу-вверх").. Восходящее программирование - методика разработки программ, при которой крупные блоки собираются из ранее созданных мелких блоков. Восходящее программирование начинается с разработки ключевых процедур и подпрограмм, которые затем постоянно модифицируются.

"Восходящая" разработка характеризует так называемое исследовательское программирование, когда система строится вокруг ключевых компонентов и программ, которые создаются на ранних стадиях проекта, а затем постоянно модифицируются. Отсутствие четкого плана, минимальное управление проектом, большое число сторонних территориально удаленных разработчиков, свободный обмен идеями и кодами — все это атрибуты нового программирования. Об особенностях исследовательского программирования написано немало статей. Так, швейцарские профессора А.Киральф, К.Чен и Й.Нивергельт выделили следующие важные моменты:

  1. разработчик ясно представляет направление поиска, но не знает заранее, как далеко он сможет продвинуться к цели;
  2. нет возможности предвидеть объем ресурсов для достижения того или иного результата;
  3. разработка не поддается детальному планированию, она ведется методом проб и ошибок;
  4. такие работы связаны с конкретными исполнителями и отражают их личностные качества.

 


Дата добавления: 2020-12-12; просмотров: 1104; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!