Структурное
программирование — методология
разработки программного обеспечения,
в основе которой лежит представление
программы в виде иерархической структуры
блоков. Предложена в 1970-х годах Э.
Дейкстрой и др.
В
соответствии с данной методологией
любая программа строится без использования
оператора goto из трёх базовых управляющих
структур: последовательность, ветвление,
цикл; кроме того, используются подпрограммы.
При этом разработка программы ведётся
пошагово, методом «сверху вниз».
Методология
структурного программирования появилась
как следствие возрастания сложности
решаемых на компьютерах задач, и
соответственно, усложнения программного
обеспечения. В 1970-е годы объёмы и сложность
программ достигли такого уровня, что
традиционная (неструктурированная)
разработка программ перестала
удовлетворять потребностям практики.
Программы становились слишком сложными,
чтобы их можно было нормально сопровождать.
Поэтому потребовалась систематизация
процесса разработки и структуры программ.
Цель структурного программирования —
повысить производительность труда
программистов, в том числе при разработке
больших и сложных программных комплексов,
сократить число ошибок, упростить
отладку, модификацию и сопровождение
программного обеспечения.
Такая
цель была поставлена в связи с ростом
сложности программ и неспособностью
разработчиков и руководителей крупных
программных проектов справиться с
проблемами, возникшими в 1960 – 1970 годы
в связи с развитием программных средств.
Принципы структурного программирования
Становление
и развитие структурного программирования
связано с именем Эдсгера Дейкстры.
Принцип 1. Следует отказаться от
использования оператора безусловного
перехода goto. Принцип 2. Любая
программа строится из трёх базовых
управляющих конструкций: последовательность,
ветвление, цикл.
-
Последовательность — однократное
выполнение операций в том порядке, в
котором они записаны в тексте программы. -
Бертран Мейер поясняет: «Последовательное
соединение: используйте выход одного
элемента как вход к другому, подобно
тому, как электрики соединяют выход
сопротивления со входом конденсатора». -
Ветвление — однократное выполнение
одной из двух или более операций, в
зависимости от выполнения заданного
условия. -
Цикл — многократное исполнение одной
и той же операции до тех пор, пока
выполняется заданное условие (условие
продолжения цикла).
Принцип
3. В программе базовые управляющие
конструкции могут быть вложены друг в
друга произвольным образом. Никаких
других средств управления последовательностью
выполнения операций не предусматривается.
Принцип
4. Повторяющиеся фрагменты программы
можно оформить в виде подпрограмм
(процедур и функций). Таким же образом
(в виде подпрограмм) можно оформить
логически целостные фрагменты программы,
даже если они не повторяются.
-
В этом случае в тексте основной программы,
вместо помещённого в подпрограмму
фрагмента, вставляется инструкция
«Вызов подпрограммы». При выполнении
такой инструкции работает вызванная
подпрограмма. После этого продолжается
исполнение основной программы, начиная
с инструкции, следующей за командой
«Вызов подпрограммы». -
Бертран Мейер поясняет: «Преобразуйте
элемент, возможно, с внутренними
элементами, в подпрограмму, характеризуемую
одним входом и одним выходом в потоке
управления».
Принцип 5. Каждую логически
законченную группу инструкций следует
оформить как блок (block). Блоки являются
основой структурного программирования.
Блок — это логически сгруппированная
часть исходного кода, например, набор
инструкций, записанных подряд в исходном
коде программы. Понятие блок означает,
что к блоку инструкций следует обращаться
как к единой инструкции. Блоки служат
для ограничения области видимости
переменных и функций. Блоки могут быть
пустыми или вложенными один в другой.
Границы блока строго определены.
Например, в if-инструкции блок ограничен
кодом BEGIN..END (в языке Паскаль) или фигурными
скобками {…} (в языке C) или отступами (в
языке Питон). Принцип 6. Все
перечисленные конструкции должны иметь
один вход и один выход. Произвольные
управляющие конструкции (такие, как в
блюде спагетти) могут иметь произвольное
число входов и выходов. Ограничив себя
управляющими конструкциями с одним
входом и одним выходом, мы получаем
возможность построения произвольных
алгоритмов любой сложности с помощью
простых и надежных механизмов.
Принцип 7. Разработка программы
ведётся пошагово, методом «сверху вниз»
(top–down method)
Соседние файлы в папке Doc-Ответы (Все)
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
Хотя C# создавался строго в парадигме ООП, рассмотренные выше операторы языка позволяют реализовать и структурное программирование.
Напомним, что его становление и развитие связано с именем Эдсгера Дейкстры, который опубликовал своё знаменитое письмо «Оператор Go To считается вредным» (1968 год). Это поистине исторический документ, оказавший заметное влияние на дальнейшее развитие программирования.
Вам необходимо освоить технологию структурного программирования для написания «правильных» подпрограмм (структурных единиц ваших программ).
Принципы структурного программирования:
Принцип 1. Следует отказаться от использования оператора безусловного перехода goto.
Принцип 2. Любая программа строится из трёх базовых управляющих конструкций: последовательность, ветвление, цикл.
Последовательность — однократное выполнение операций в том порядке, в котором они записаны в тексте программы.
Ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения заданного условия.
Цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется заданное условие (условие продолжения цикла).
Принцип 3. В программе базовые управляющие конструкции могут быть вложены друг в друга произвольным образом. Никаких других средств управления последовательностью выполнения операций не предусматривается.
Принцип 4. Повторяющиеся фрагменты программы можно оформить в виде подпрограмм (процедур и функций). Таким же образом (в виде подпрограмм) можно оформить логически целостные фрагменты программы, даже если они не повторяются. В этом случае в тексте основной программы, вместо помещённого в подпрограмму фрагмента, вставляется инструкция «Вызов подпрограммы». При выполнении такой инструкции работает вызванная подпрограмма. После этого продолжается исполнение основной программы, начиная с инструкции, следующей за командой «Вызов подпрограммы».
Принцип 5. Каждую логически законченную группу инструкций следует оформить как блок. Блоки являются основой структурного программирования. Блок — это логически сгруппированная часть исходного кода, например, набор инструкций, записанных подряд в исходном коде программы. Понятие блок означает, что к блоку инструкций следует обращаться как к единой инструкции. Блоки служат для ограничения области видимости переменных и функций. Блоки могут быть пустыми или вложенными один в другой. Границы блока строго определены. Например, в операторе if блок ограничен кодом BEGIN..END (в языке Паскаль) или фигурными скобками {…} (в языках C, С++, C#).
Принцип 6. Все перечисленные конструкции должны иметь один вход и один выход. Произвольные управляющие конструкции (такие, как в блюде спагетти) могут иметь произвольное число входов и выходов. Ограничив себя управляющими конструкциями с одним входом и одним выходом, мы получаем возможность построения произвольных алгоритмов любой сложности с помощью простых и надежных механизмов.
Принцип 7. Разработка программы ведётся пошагово, методом «сверху вниз».
Конец цитаты.
Примечание (терминологическое) к Принципу 4.
«Подпрограммам» в разных языках соответствуют разные названия:
В Паскале это procedure и function, в Бейсике – subroutine и function, в С и С++ — только функции. В C# используется термин «функция-член». Напомним, что основной единицей инкапсуляции в C# является класс, который определяет форму объекта. Он описывает данные, а также код, который будет ими оперировать. В C# описание класса служит для построения объектов, которые являются экземплярами класса. Код и данные, составляющие вместе класс, называют членами. Данные, определяемые классом, называют полями, или переменными экземпляра. А код, оперирующий данными, содержится в функциях-членах, самым типичным представителем которых является метод. В C# метод служит в качестве аналога подпрограммы (к числу других функций-членов относятся свойства, события и конструкторы). Таким образом, методы класса содержат код, воздействующий на поля, определяемые этим классом.
Следует отметить, что в C# метод, как функция-член обязательно относится к какому-либо классу. При попытке объявить метод вне класса, в пространстве имен, диагностируется ошибка:
«Пространство имен не может непосредственно содержать такие члены, как поля или методы».
Даже в стандартном консольном приложении объявляется один класс Program и один метод static void Main(string[] args) этого класса, имеется одна точка входа и одна точка выхода. Другие методы, объявленные в этом классе, могут вызываться как подпрограммы как прямо, так и опосредованно из Main().
Можно считать, что консольное приложение, в котором учитываются 7 указанных выше принципов (не использовать goto, применять только три управляющие структуры и т.д.), вполне соответствует идеологии структурного программирования.
В Windows-приложении в целом, как уже отмечалось, принцип «один вход — один выход» не применим (какие-либо действия являются реакцией на некоторые события), однако реализация каждого метода должна соответствовать принципам структурного программирования.
ЗАКЛЮЧЕНИЕ
Итак, мы рассмотрели синтаксис операторов языка C# с небольшими примерами. Каждый из них вы должны проверить в консольном приложении и, изменяя что-либо, поэкспериментировать.
Теперь нам надо закрепить изученный материал раздела «Основы языка С#». Для этого вы можете изучить примеры решения задач и написать программы, реализующие задания для самостоятельной работы в следующем части курса «Основы языка C#. Задачи«.
NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.
Помощь проекту:
Пламенный привет посетителям этой страницы, пришедшим из социальных сетей, да и всем остальным тоже! В апреле 2021-го года наблюдал удивительное явление: обильный поток посетителей из 4-х социальных сетей. В связи с этим настоятельно рекомендую всем неоднократно и регулярно посещать сайт rtbsm.ru — там в общих чертах изложена Российская Теннисная Балльная Система Марии (Шараповой).
Приглашаю всех полюбоваться на Фото и Видео красавицы Марии — надеюсь, что Вы поделитесь адресом сайта rtbsm.ru с друзьями и знакомыми.
Главная проблема — известить Марию, чтобы она лично как можно скорее заявила на весь мир о РТБСМ.
Привожу подробную информацию о том, что такое Python Структурное программирование:
Структурное программирование
— методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. Предложена в 1970-х годах Э. Дейкстрой и др.
В соответствии с данной методологией любая программа строится без использования оператора goto из трёх базовых управляющих структур: последовательность, ветвление, цикл; кроме того, используются подпрограммы.
При этом разработка программы ведётся пошагово, методом «сверху вниз».
Методология структурного программирования появилась как следствие возрастания сложности решаемых на компьютерах задач, и соответственно, усложнения программного обеспечения.
В 1970-е годы объёмы и сложность программ достигли такого уровня, что традиционная (неструктурированная) разработка программ перестала удовлетворять потребностям практики.
Программы становились слишком сложными, чтобы их можно было нормально сопровождать. Поэтому потребовалась систематизация процесса разработки и структуры программ.
Методология структурной разработки программного обеспечения была признана «самой сильной формализацией 70-х годов».
По мнению Бертрана Мейера, «Революция во взглядах на программирование, начатая Дейкстрой, привела к движению, известному как структурное программирование, которое предложило систематический, рациональный подход к конструированию программ.
Структурное программирование стало основой всего, что сделано в методологии программирования, включая и объектное программирование».
История
Первоначально идея структурного программирования появилась на свет в связи с оператором goto и сомнениями в целесообразности его применения.
Впервые подобные сомнения высказал Хайнц Земанек (Heinz Zemanek) на совещании по языку Алгол в начале 1959 года в Копенгагене. Однако это выступление не привлекло к себе внимания и не имело последствий.
Эдсгер Дейкстра (Edsger Dijkstra) вспоминает: «До некоторой степени я виню себя за то, что в то время не смог оценить значимость этой идеи».
Ситуация коренным образом изменилась через десять лет, когда в марте 1968 года Дейкстра опубликовал своё знаменитое письмо «Оператор Go To считается вредным» (Go To Statement Considered Harmful). Это поистине исторический документ, оказавший заметное влияние на дальнейшее развитие программирования.
Судьба самого документа очень интересна. Дело в том, что Дейкстра дал статье совсем другое название: «Доводы против оператора GO TO» (A Case against the GO TO Statement).
Однако в момент публикации произошло нечто непонятное — статья почему-то загадочным образом превратилась в «Письмо к редактору», причём прежнее название столь же загадочно исчезло. Что произошло на самом деле?
Дейкстра объяснил таинственное превращение статьи в письмо лишь много лет спустя, в 2001 году, за год до смерти.
Журнал Communications of the ACM опубликовал мой текст под названием «Оператор GOTO считается вредным». В последующие годы его часто цитировали. К сожалению, зачастую это делали люди, которые видели в нём не больше, чем сказано в заголовке. Этот заголовок стал краеугольным камнем моей славы…
Как все это случилось? Я отправил статью под названием «Доводы против оператора GO TO». Чтобы ускорить публикацию, редактор превратил мою статью в «Письмо к редактору». При этом он придумал для статьи новое название, которое изобрел сам. Редактором был Никлаус Вирт.
Цель
Цель структурного программирования — повысить производительность труда программистов, в том числе при разработке больших и сложных программных комплексов, сократить число ошибок, упростить отладку, модификацию и сопровождение программного обеспечения.
Такая цель была поставлена в связи с ростом сложности программ и неспособностью разработчиков и руководителей крупных программных проектов справиться с проблемами, возникшими в 1960 – 1970 годы в связи с развитием программных средств.
Спагетти-код
Структурное программирование призвано, в частности, устранить беспорядок и ошибки в программах, вызванные трудностями чтения кода, несистематизированным, неудобным для восприятия и анализа исходным текстом программы.
Такой текст нередко характеризуют как «спагетти-код».
Спагетти-код (spaghetti code) — плохо спроектированная, слабо структурированная, запутанная и трудная для понимания программа, содержащая много операторов goto (особенно переходов назад), исключений и других конструкций, ухудшающих структурированность.
Самый распространённый антипаттерн программирования.
Спагетти-код назван так потому, что ход выполнения программы похож на миску спагетти, то есть извилистый и запутанный. Иногда называется «кенгуру-код» (kangaroo code) из-за множества инструкций jump.
В настоящее время термин применяется не только к случаям злоупотребления goto, но и к любому «многосвязному» коду, в котором один и тот же небольшой фрагмент исполняется в большом количестве различных ситуаций и выполняет много различных логических функций.
Спагетти-код может быть отлажен и работать правильно и с высокой производительностью, но он крайне сложен в сопровождении и развитии.
Доработка спагетти-кода для добавления новой функциональности иногда несет значительный потенциал внесения новых ошибок. По этой причине становится практически неизбежным рефакторинг (code refactoring) — главное лекарство от спагетти.
Оператор goto
Начиная с 1970-х годов оператор безусловного перехода goto оказался в центре систематической и всевозрастающей критики.
Неправильное и необдуманное использование оператора goto в исходном тексте программы приводит к получению запутанного, неудобочитаемого «спагетти-кода». По тексту такого кода практически невозможно понять порядок исполнения и взаимозависимость фрагментов.
Впервые эта точка зрения была отражена в статье Эдсгера Дейкстры «Оператор Go To считается вредным». Дейкстра заметил, что качество программного кода обратно пропорционально количеству операторов goto в нём.
Статья приобрела широкую известность, в результате чего взгляды на использование оператора goto были существенно пересмотрены. В работе «Заметки по структурному программированию» Дейкстра обосновал тот факт, что для кода без goto намного легче проверить формальную корректность.
Код с goto трудно форматировать, так как он может нарушать иерархичность выполнения (парадигму структурного программирования) и потому отступы, призванные отображать структуру программы, не всегда могут быть выставлены правильно.
Кроме того, оператор goto мешает оптимизации компиляторами управляющих структур.
Некоторые способы применения goto могут создавать проблемы с логикой исполнения программы:
- Если некоторая переменная инициализируется (получает значение) в одном месте и потом используется далее, то переход в точку после инициализации, но до использования, приведёт к тому, что будет выбрано значение, которое находилось в памяти, выделенной под переменную, до момента выделения (и которое, как правило, является произвольным и случайным).
- Передача управления внутрь тела цикла приводит к пропуску кода инициализации цикла или первоначальной проверки условия.
- Аналогично, передача управления внутрь процедуры или функции приводит к пропуску её начальной части, в которой производится инициализация (выделение памяти под локальные переменные).
Доводы против оператора goto оказались столь серьёзными, что в структурном программировании его стали рассматривать как крайне нежелательный. Это нашло отражение при проектировании новых языков программирования.
Например, goto запрещён в Java и Ruby.
В ряде современных языков он всё же оставлен из соображений эффективности в тех редких случаях, когда применение goto оправданно. Так, goto сохранился в Аде — одном из наиболее продуманных с точки зрения архитектуры языков за всю историю.
Однако в языках высокого уровня, где этот оператор сохранился, на его использование, как правило, накладываются жёсткие ограничения, препятствующие использованию наиболее опасных методов его применения: например, запрещается передавать управление извне цикла, процедуры или функции внутрь.
Стандарт языка C++ запрещает обход инициализации переменной с помощью goto.
Теорема о структурном программировании
Основная статья: Теорема Бёма — Якопини
Теорему сформулировали и доказали итальянские математики Коррадо Бём (Corrado Böhm) и Джузеппе Якопини (Giuseppe Jacopini). Они опубликовали её в 1965 году на итальянском языке и в 1966 году на английском.
Наряду с теоремой, в статье Бёма и Якопини описывались методы преобразования неструктурных алгоритмов в структурные на примере созданного Бёмом языка программирования P′′. Язык P′′ — первый полный по Тьюрингу язык программирования без оператора goto.
Теорема Бёма-Якопини написана сложным языком и в непривычных обозначениях. Если использовать современную терминологию и обозначения, она примет вид:
Любая программа, заданная в виде блок-схемы, может быть представлена с помощью трех управляющих структур:
- последовательность — обозначается: f THEN g,
- ветвление — обозначается: IF p THEN f ELSE g,
- цикл — обозначается: WHILE p DO f,
где f, g — блок-схемы с одним входом и одним выходом,
- р — условие,
- THEN, IF, ELSE, WHILE, DO — ключевые слова.
Пояснение. Формула f THEN g означает следующее: сначала выполняется программа f, затем выполняется программа g.
Как отмечает Харлан Миллс (Harlan Mills), данная теорема резко контрастирует с обычной (в 1960 – 1970 годы) практикой программирования, когда наблюдалось массовое использование операторов перехода goto.
Бём и Якопини не употребляли термин «структурное программирование». Тем не менее, доказанную ими теорему (и её последующие вариации у разных авторов) впоследствии стали называть «Теоремой о структурном программировании», «Структурной теоремой» (Structure theorem), «Теоремой о структурировании».
Принципы структурного программирования
Становление и развитие структурного программирования связано с именем Эдсгера Дейкстры.
Принцип 1. Следует отказаться от использования оператора безусловного перехода goto.
Принцип 2. Любая программа строится из трёх базовых управляющих конструкций: последовательность, ветвление, цикл.
- Последовательность — однократное выполнение операций в том порядке, в котором они записаны в тексте программы.
- Бертран Мейер поясняет: «Последовательное соединение: используйте выход одного элемента как вход к другому, подобно тому, как электрики соединяют выход сопротивления со входом конденсатора»
- Ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения заданного условия.
- Цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется заданное условие (условие продолжения цикла).
Принцип 3. В программе базовые управляющие конструкции могут быть вложены друг в друга произвольным образом. Никаких других средств управления последовательностью выполнения операций не предусматривается.
Принцип 4. Повторяющиеся фрагменты программы можно оформить в виде подпрограмм (процедур и функций). Таким же образом (в виде подпрограмм) можно оформить логически целостные фрагменты программы, даже если они не повторяются.
- В этом случае в тексте основной программы, вместо помещённого в подпрограмму фрагмента, вставляется инструкция «Вызов подпрограммы». При выполнении такой инструкции работает вызванная подпрограмма. После этого продолжается исполнение основной программы, начиная с инструкции, следующей за командой «Вызов подпрограммы».
- Бертран Мейер поясняет: «Преобразуйте элемент, возможно, с внутренними элементами, в подпрограмму, характеризуемую одним входом и одним выходом в потоке управления».
Принцип 5. Каждую логически законченную группу инструкций следует оформить как блок (block). Блоки являются основой структурного программирования.
- Блок — это логически сгруппированная часть исходного кода, например, набор инструкций, записанных подряд в исходном коде программы. Понятие блок означает, что к блоку инструкций следует обращаться как к единой инструкции. Блоки служат для ограничения области видимости переменных и функций. Блоки могут быть пустыми или вложенными один в другой. Границы блока строго определены. Например, в if-инструкции блок ограничен кодом BEGIN..END (в языке Паскаль) или фигурными скобками {…} (в языке C) или отступами (в языке Питон).
Принцип 6. Все перечисленные конструкции должны иметь один вход и один выход.
- Произвольные управляющие конструкции (такие, как в блюде спагетти) могут иметь произвольное число входов и выходов. Ограничив себя управляющими конструкциями с одним входом и одним выходом, мы получаем возможность построения произвольных алгоритмов любой сложности с помощью простых и надежных механизмов.
Принцип 7. Разработка программы ведётся пошагово, методом «сверху вниз» (top–down method).
Метод «сверху вниз»
Сначала пишется текст основной программы, в котором, вместо каждого связного логического фрагмента текста, вставляется вызов подпрограммы, которая будет выполнять этот фрагмент.
Вместо настоящих, работающих подпрограмм, в программу вставляются фиктивные части — заглушки, которые, говоря упрощенно, ничего не делают.
Если говорить точнее, заглушка удовлетворяет требованиям интерфейса заменяемого фрагмента (модуля), но не выполняет его функций или выполняет их частично.
Затем заглушки заменяются или дорабатываются до настоящих полнофункциональных фрагментов (модулей) в соответствии с планом программирования.
На каждой стадии процесса реализации уже созданная программа должна правильно работать по отношению к более низкому уровню. Полученная программа проверяется и отлаживается.
После того, как программист убедится, что подпрограммы вызываются в правильной последовательности (то есть общая структура программы верна), подпрограммы-заглушки последовательно заменяются на реально работающие, причём разработка каждой подпрограммы ведётся тем же методом, что и основной программы.
Разработка заканчивается тогда, когда не останется ни одной заглушки.
Такая последовательность гарантирует, что на каждом этапе разработки программист одновременно имеет дело с обозримым и понятным ему множеством фрагментов, и может быть уверен, что общая структура всех более высоких уровней программы верна.
При сопровождении и внесении изменений в программу выясняется, в какие именно процедуры нужно внести изменения.Они вносятся, не затрагивая части программы, непосредственно не связанные с ними.
Это позволяет гарантировать, что при внесении изменений и исправлении ошибок не выйдет из строя какая-то часть программы, находящаяся в данный момент вне зоны внимания программиста.
Следует также учесть, что в «Предисловии» к книге «Структурное программирование» Тони Хоар (Tony Hoare) отмечает, что принципы структурного программирования в равной степени могут применяться при разработке программ как «сверху вниз», так и «снизу вверх».
Подпрограмма
Подпрограмма является важным элементом структурного программирования.
Изначально подпрограммы появились как средство оптимизации программ по объёму занимаемой памяти — они позволили не повторять в программе идентичные блоки кода, а описывать их однократно и вызывать по мере необходимости.
К настоящему времени данная функция подпрограмм стала вспомогательной, главное их назначение — структуризация программы с целью удобства её понимания и сопровождения.
Выделение набора действий в подпрограмму и вызов её по мере необходимости позволяет логически выделить целостную подзадачу, имеющую типовое решение. Такое действие имеет ещё одно (помимо экономии памяти) преимущество перед повторением однотипных действий.
Любое изменение (исправление ошибки, оптимизация, расширение функциональности), сделанное в подпрограмме, автоматически отражается на всех её вызовах, в то время как при дублировании каждое изменение необходимо вносить в каждое вхождение изменяемого кода.
Даже в тех случаях, когда в подпрограмму выделяется однократно производимый набор действий, это оправдано, так как позволяет сократить размеры целостных блоков кода, составляющих программу, то есть сделать программу более понятной и обозримой.
Достоинства структурного программирования
Следование принципам структурного программирования сделало тексты программ, даже довольно крупных, нормально читаемыми.
Серьёзно облегчилось понимание программ, появилась возможность разработки программ в нормальном промышленном режиме, когда программу может без особых затруднений понять не только её автор, но и другие программисты.
Это позволило разрабатывать достаточно крупные для того времени программные комплексы силами коллективов разработчиков, и сопровождать эти комплексы в течение многих лет, даже в условиях неизбежных изменений в составе персонала.
- Структурное программирование позволяет значительно сократить число вариантов построения программы по одной и той же спецификации, что значительно снижает сложность программы и, что ещё важнее, облегчает понимание её другими разработчиками.
- В структурированных программах логически связанные операторы находятся визуально ближе, а слабо связанные — дальше, что позволяет обходиться без блок-схем и других графических форм изображения алгоритмов (по сути, сама программа является собственной блок-схемой).
- Сильно упрощается процесс тестирования и отладки структурированных программ.
Ясность и удобочитаемость программ
Структурное программирование значительно повышает ясность и удобочитаемость (readability) программ. Эдвард Йордан (Edward Yourdon) поясняет:
Поведение многих неструктурных программ часто ближе к броуновскому движению, чем к сколько-нибудь организованному процессу.
Всякая попытка прочесть листинг приводит человека в отчаяние тем, что в такой программе обычно исполняются несколько операторов, после чего управление передается в точку несколькими страницами ниже.
Там исполняются ещё несколько операторов и управление снова передается в какую-то случайную точку. Тут исполняются ещё какие-то операторы и т. д. После нескольких таких передач читатель забывает, с чего всё началось. И теряет ход мысли.
Структурным программам, напротив, свойственна тенденция к последовательным организации и исполнению.
Улучшение читабельности структурных программ объясняется тем, что отсутствие оператора goto позволяет читать программу сверху донизу без разрывов, вызванных передачами управления.
В итоге можно сразу (одним взглядом) обнаружить условия, необходимые для модификации того или иного фрагмента программы.
Двумерное структурное программирование
Основная статья: ДРАКОН# Двумерное структурное программирование
Р-технология производства программ или «технология двумерного программирования» была создана в Институте кибернетики имени В. М. Глушкова. Графическая система Р-технологии программирования закреплена в стандартах ГОСТ 19.005-85, ГОСТ Р ИСО/МЭК 8631—94 и международном стандарте ISО 8631Н.
Автор Р-технологии программирования доктор физико-математических наук профессор Игорь Вельбицкий предложил пересмотреть само понятие «структура программы».
По его мнению,
«структура — понятие многомерное.
Поэтому отображение этого понятия с помощью линейных текстов (последовательности операторов) сводит практически на нет преимущества структурного подхода.
Огромные ассоциативные возможности зрительного аппарата и аппарата мышления человека используются практически вхолостую — для распознавания структурных образов в виде единообразной последовательности символов».
Методология двумерного структурного программирования существенно отличается от классического одномерного (текстового) структурного программирования.
Идеи структурного программирования разрабатывались, когда компьютерная графика фактически ещё не существовала и основным инструментом алгоритмиста и программиста был одномерный (линейный или ступенчатый) текст.
До появления компьютерной графики методология классического структурного программирования была наилучшим решением.
С появлением компьютерной графики ситуация изменилась.
Используя выразительные средства графики, появилась возможность видоизменить, развить и дополнить три типа базовых (текстовых) управляющих структурных конструкций, а также полностью отказаться от ключевых слов if, then, else, case, switch, break, while, do, repeat, until, for, foreach, continue, loop, exit, when, last и т. д. и заменить их на управляющую графику, то есть использовать двумерное структурное программирование.
Важной проблемой является сложность современного программирования и поиск путей её преодоления.
По мнению кандидата технических наук, доцента Евгения Пышкина, изучение структурного программирования исключительно как инструмента разработки текстов программ, построенных на базе основной «структурной триады» (линейная последовательность, ветвление и цикл), является недостаточным и, по сути дела, сводит на нет анализ преимуществ структурного подхода.
В процессе преодоления существенной сложности программного обеспечения важнейшим инструментом является визуализация проектирования и программирования.
Приглашаю всех высказываться в Комментариях. Критику и обмен опытом одобряю и приветствую. В хороших комментариях сохраняю ссылку на сайт автора!
И не забывайте, пожалуйста, нажимать на кнопки социальных сетей, которые расположены под текстом каждой страницы сайта.
Продолжение тут…
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«МОРДОВСКИЙ ГОСУДАРСТВЕННЫЙ
ПЕДАГОГИЧЕСКИЙ УНИВЕРСИТЕТ ИМЕНИ М. Е. ЕВСЕВЬЕВА»
Факультет физико–математический
Кафедра математики и методики обучения математике
РЕФЕПАТ
СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ
Автор работы: _________________________________________ О.С. Орлова
Направление: 44.03.05 Педагогическое образование (с двумя профилями подготовки)
Профиль Информатика. Математика
Руководитель работы
канд. пед. наук, доцент _______________________________ Т.В. Кормилицна
Оценка ___________
Саранск 2022
Содержание
Введение 3
-
Понятие структурного программирования 4
-
История структурного программирования и проектирования программы 5
-
Основы структурного программирования 7
-
Принципы структурного программирования 10
-
Методика разработки программ 12
Заключение 14
Список литературы 15
Введение
Структурное программирование является первым направлением, которое оформилось в виде парадигмы. Предпосылкой этого был тот факт, что Э. Дейкстра выявил обратную зависимость между числом неограниченных операторов перехода go to и качеством программы. Качество программы в данном случае определялось двумя показателями – скоростью отладки и степенью надежности. Так появилась парадигма структурного программирования, которое многие имеют просто как «программирование без go to».
В основе данной технологии лежит простой факт, гласящий о том, что любая структура управления может быть функционально эквивалентно выражена суперпозицией последовательного выполнения, ветвления по условию и цикла с предусловием.
Подобный стиль программирования предполагает проведение тестовых испытаний всех завершенных модулей в случае добавления или редактирования любого модуля. Это требует дополнительных трудозатрат, однако оказывает чрезвычайно благотворное психологическое воздействие на разработчика, и еще более благотворное воздействие такой стиль программирования оказывает на заказчика.
Важно отметить, что свойство структурности программы не предопределяется системой программирования – оно вносится самим программистом. Любая программа в любой системе программирования может быть написано структурно, а может и не структурно (например, с использованием оператора безусловного перехода go to).
-
Понятие структурного программирования
Структурное программирование — это определенные общие принципы и правила проектирования, разработки и оформления программ с целью облегчения процессов их создания и тестирования, повышения производительности труда программистов и улучшения читабельности результирующей программы. Структура программы и алгоритм решения задачи должны быть легкими для понимания, простыми для доказательства правильности и удобными для модификации. По своей сути структурный подход есть отказ от беспорядочного стиля в алгоритмизации и программировании (в частности, отказ от оператора goto) и определение ограниченного числа стандартных приемов построения легко читаемых алгоритмов и программ с ясно выраженной структурой, что особенно важно при разработке больших программных систем.
Опыт применения методов структурного программирования при разработке, например, ряда сложных операционных систем показывает, что правильность логической структуры системы в этом случае легко поддается доказательству, а сама система допускает достаточно полное тестирование. Уменьшение трудностей отладки и тестирования программ приводит к увеличению производительности труда программистов, поскольку на тестирование программы тратится от трети до половины времени ее разработки. Производительность труда программиста обычно измеряется числом отлаженных операторов, которые он может написать за день. Приближенные оценки показывают, что применение методов структурного программирования позволяет увеличить это число в 5—6 раз. Также нужно сказать, что структурное программирование предполагает определенную организацию самого процесса программирования и определенную технологию проектирования программ, что также положительно влияет на производительность труда программистов.
-
История структурного программирования и проектирования программ
Методология структурного программирования и проектирования программ появилась как следствие возрастания сложности решаемых на компьютерах задач, и соответственного усложнения программного обеспечения. В 70-е годы XX века объёмы и сложность программ достигли такого уровня, что надежность, качество неструктурированной разработки программ, которая была нормой в более раннее время, перестала удовлетворять потребностям практики. Программы становились слишком сложными и содержащими большое число ошибок, чтобы их можно было читать, понимать, исправлять и сопровождать, поэтому потребовалась систематизация процесса разработки структуры сложных программ. Наиболее сильной критике со стороны разработчиков структурного подхода к программирования подвергся оператор GOTO (оператор безусловного перехода), имевшийся тогда почти во всех языках программирования. Неправильное и необдуманное использование произвольных переходов в тексте программы приводит к получению запутанных, плохо структурированных программ (т.н. спагетти-кода), которые сложно читать, исправлять и практически невозможно понять порядок исполнения. взаимозависимость фрагментов и конечных результатов работы программ. Следование принципам структурного программирования и проектирования сделало тексты программ, даже довольно крупных, нормально читаемыми и легко сопровождаемыми. Серьёзно облегчилось понимание программ и исправление ошибок, появилась возможность разработки программ в нормальном промышленном режиме, когда программу может без особых затруднений понять не только её автор, но и другие программисты. Это позволило разрабатывать достаточно крупные для того времени программные комплексы силами коллективов разработчиков, и сопровождать эти комплексы в течение многих лет, даже в условиях неизбежных изменений в составе персонала. Методология структурного проектирования и разработки программного обеспечения была признана «самой сильной формализацией 70-х годов». Одним из наиболее успешных проектов применения методов структурного проектирования был проект разработки бортового программного обеспечения для космического корабля Буран, для автоматического управления которым впервые использовался бортовой компьютер. Для документирования программ в проекте «Буран» было предложено использовать структурированный псевдокод В.А.Каймина с записью алгоритмов на русском языке, которые легко читать, понять, исправлять, инспектировать и сопровождать инженерам, техникам и руководителям проектов. Те же самые принципы описания программ были внесены в школьные учебники В.А.каймина и А.П.Ершова для обучения основам алгоритмизации и программирования учащихся и преподавателей средних школ. После этого слово «структурный» стало модным в отрасли, и структурное программирование начали начали включать в учебники и учебную литературу по информатике и программированию. (В.А.Каймин. Структурные методы разработки программ на языках высокого уровня. М.МИЭМ, 1985) Появились работы по «структурному проектированию», «структурному тестированию», «структурному дизайну» и так далее. В общем, произошло примерно то же самое, что происходило в 90-х годах и происходит в настоящее время с терминами «объектный», «объектно-ориентированный» и «электронный». |
-
Основы структурного программирования
Теоретическим фундаментом структурного программирования является теорема о структурировании, из которой следует, что алгоритм (программа) решения любой практически вычислимой задачи может быть представлен с использованием трех элементарных базисных управляющих структур: структуры следования (последовательности); структуры ветвления, структуры цикла, изображенных на рис. 6.5—6.7 соответственно, где Р — условие, S — оператор.
Структура следования представляет собой естественный ход выполнения алгоритма — любую последовательность операторов, выполняющихся друг за другом (см. рис. 1). В языке программирования это соответствует последовательности операторов ввода, вывода и операторов присваивания.
Структура ветвления представляет фактор принятия решения, включает проверку некоторого логического условия Р и, в зависимости от результатов этой проверки, выполнение оператора S1 либо оператора S2. В языках программирования (например, Pascal) реализуется оператором if Р then SI else S2 (см. рис. 2).
Структура цикла (цикла с предусловием) представляет фактор повторяемости вычислений, обеспечивает многократное повторение выполнения оператора S, пока выполняется (истинно) логическое условие Р. В языках программирования (например, Pascal) реализуется оператором while Р do S.
Рис. 1. Структура следования
Рис. 2. Структура ветвления
Базисный набор управляющих структур является функционально полным, т.е. с его помощью можно создать любой сколь угодно сложный алгоритм, однако с целью создания более компактных и наглядных алгоритмов и программ используются дополнительные управляющие структуры: структура сокращенного ветвления; структура варианта или многоальтернативного выбора; структура цикла с параметром; структура цикла с постусловием. В разных языках программирования реализация базовых управляющих структур может быть различной, например в языке Pascal реализованы все предлагаемые структуры.
Любая программа может быть построена посредством композиции базисных структур: либо путем их последовательного соединения — образования последовательных конструкций, либо путем их вложения друг в друга — образования вложенных конструкций.
Каждая из структур может рассматриваться как один функциональный блок с одним входом и одним выходом. Блоки S, SI, S2, входящие в состав базисных управляющих структур, сами могут быть одной из них, поэтому возможны вложенные конструкции. Однако, какова бы ни была степень и глубина «вложенности», важно, что любая конструкция в конечном итоге имеет один вход и один выход. Следовательно, любую сложную структуру можно рассматривать как «черный ящик» с одним входом и одним выходом. Таким образом, можно ввести преобразование любой структуры в функциональный блок. Тогда всякий алгоритм, составленный из стандартных структур, поддается последовательному преобразованию к единственному функциональному блоку, и эта последовательность преобразований может быть использована как средство понимания алгоритма и доказательства его правильности. Обратная последовательность преобразований может быть использована в процессе проектирования алгоритма с постепенным раскрытием единственного функционального блока в сложную структуру основных элементов.
Для структурирования и понимания больших по объему программ используются также дополнительные структурные средства, которые поддерживают модульный принцип разработки ПС: это подпрограммы и модули. Использование аппарата подпрограмм (процедур и функций) — это возможность выделять в самостоятельные программные единицы со своими входными и выходными данными отдельные (часто повторяющиеся) участки кода для последующего многократного вызова их из различных точек программы и других подпрограмм. Модуль представляет собой автономно компилируемую библиотеку описаний типов, данных, процедур и функций, что позволяет группировать описания данных и подпрограмм по их функциям и назначению согласно одному из основных принципов структурного программирования — разбиения больших задач на подзадачи.
-
Принципы структурного программирования
Становление и развитие структурного программирования связано с именем Эдсгера Дейкстры [10].
Принцип 1. Следует отказаться от использования оператора безусловного перехода GoTo.
Принцип 2. Любая программа строится из трёх базовых управляющих конструкций: последовательность, ветвление, цикл.
• Последовательность — однократное выполнение операций в том порядке, в котором они записаны в тексте программы. Бертран Мейер поясняет: «Последовательное соединение: используйте выход одного элемента как вход к другому, подобно тому, как электрики соединяют выход сопротивления со входом конденсатора» [17].
• Ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения заданного условия.
• Цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется заданное условие (условие продолжения цикла).
Принцип 3. В программе базовые управляющие конструкции могут быть вложены друг в друга произвольным образом. Никаких других средств управления последовательностью выполнения операций не предусматривается.
Принцип 4. Повторяющиеся фрагменты программы можно оформить в виде подпрограмм (процедур и функций). Таким же образом (в виде подпрограмм) можно оформить логически целостные фрагменты программы, даже если они не повторяются.
В этом случае в тексте основной программы, вместо помещённого в подпрограмму фрагмента, вставляется инструкция «Вызов подпрограммы». При выполнении такой инструкции работает вызванная подпрограмма. После этого продолжается исполнение основной программы, начиная с инструкции, следующей за командой «Вызов подпрограммы».
Бертран Мейер поясняет: «Преобразуйте элемент, возможно, с внутренними элементами, в подпрограмму, характеризуемую одним входом и одним выходом в потоке управления».
Принцип 5. Каждую логически законченную группу инструкций следует оформить как блок (block). Блоки являются основой структурного программирования.
Блок — это логически сгруппированная часть исходного кода, например, набор инструкций, записанных подряд в исходном коде программы. Понятие блок означает, что к блоку инструкций следует обращаться как к единой инструкции. Блоки служат для ограничения области видимости переменных и функций. Блоки могут быть пустыми или вложенными один в другой. Границы блока строго определены. Например, в if-инструкции блок ограничен кодом BEGIN..END (в языке Паскаль) или фигурными скобками {…} (в языке C) или отступами (в языке Питон).
Принцип 6. Все перечисленные конструкции должны иметь один вход и один выход.
Произвольные управляющие конструкции (такие, как в блюде спагетти) могут иметь произвольное число входов и выходов. Ограничив себя управляющими конструкциями с одним входом и одним выходом, мы получаем возможность построения произвольных алгоритмов любой сложности с помощью простых и надежных механизмов.
Принцип 7. Разработка программы ведётся пошагово, методом «сверху вниз» (top-down method) [5].
-
Методика разработки программ
Распространены две методики (стратегии) разработки программ, относящиеся к структурному программированию: программирование «сверху вниз»; программирование «снизу вверх».
Программирование «сверху вниз», или нисходящее проектирование программ, — это методика разработки программ, при которой разработка начинается с определения целей решения проблемы, после чего идет последовательная детализация, заканчивающаяся детальной программой. Сначала выделяется несколько самых глобальных задач, решение которых может быть представлено в общей структуре функционально независимыми блоками. Разработку логической структуры каждого такого блока и ее модификацию можно осуществлять независимо от остальных блоков. На этом первом этапе проекта раскрываются наиболее важные и существенные связи, определяется функциональное назначение каждого блока, его входные и выходные данные. На последующих этапах проектирования уточняется (детализируется) логическая структура отдельных функциональных блоков общей схемы, что также может осуществляться в несколько этапов детализации вплоть до простейших инструкций. На каждом этапе проекта выполняются многократные проверки и исправления.
Подобный подход является достаточно рациональным, позволяет значительно ускорить процесс разработки сложных программных проектов и в значительной мере избежать ошибочных решений. Кроме того, появляется возможность некоторые подпрограммы (модули) не реализовывать сразу, а временно отложить их разработку, пока не будут закончены другие части. Например, если имеется необходимость вычисления сложной математической функции, то выделяется отдельная подпрограмма такого вычисления, реализуется временно одним оператором, который просто присваивает нужное значение. Когда все приложение будет написано и отлажено, можно приступить к реализации этой сложной функции.
Программирование «снизу вверх», или восходящее проектирование программ, — это методика разработки программ, начинающаяся с разработки подпрограмм (процедур, функций), в то время когда проработка общей схемы не закончилась. Такая методика является менее предпочтительной по сравнению с нисходящим проектированием, так как часто приводит к нежелательным результатам, переписыванию кода и увеличению времени разработки. Ее использование может быть целесообразным, когда новый проект использует известные частные решения.
Заключение
Использование технологии структурного программирования при разработке серьезных программных проектов основано на следующих принципах:
-
программирование должно осуществляться «сверху вниз»;
-
весь проект должен быть разбит на модули/подпрограммы с одним входом и одним выходом;
-
любая подпрограмма должна допускать только три основные структуры: последовательное выполнение операторов, ветвление и цикл;
-
недопустим оператор безусловной передачи управления goto;
-
документация должна создаваться одновременно с программированием, частично в виде комментариев к программе. Применение принципов и методов структурного программирования позволяет повысить надежность программ (благодаря хорошему структурированию при проектировании программа легко поддается тестированию и отладке) и их эффективность (структурирование программы позволяет легко находить и корректировать ошибки, а отдельные подпрограммы можно переделывать/модифицировать независимо от других), уменьшить время и стоимость программной разработки, улучшить читабельность программ.
Список литературы
-
Берг О.Ю. Метрики оценки качества программного обеспечения // Труды международного симпозиума надежность и качество. — Пенза: Пензенский государственный университет, 2005. — Т.1. — С. 321-322.
-
Благодатских В.А. Стандартизация разработки программных средств / Благодатских В.А., Волнин В.А., Поскакалов К.Ф. — М.: Финансы и статистика, 2005. — 288 с.
-
Валова О.В. Программная инженерия. — Чита: Читинский гос. ун-т, 2009. — 175 с.
-
Захарова А.А. Информатика и программирование: программные средства реализации информационных процессов / А.А. Захарова, Е.В. Молнина, Т.Ю. Черныева. – Томск: Изд-во ТПУ, 2013. – 318 с.
-
Звездин С.В. Проблемы измерения качества программного кода // Вестник Южно-Уральского государственного университета. Серия: Компьютерные технологии, управление, радиоэлектроника. — 2010. — № 2. — С. 62-66.
-
Иванова Г.С. Технология программирования. – М.: Изд-во МГТУ им. Н.Э. Баумана, 2014. – 56 с.
-
Кознов Д.В. Введение в программную инженерию. — М.: Национальный открытый университет «Интуит», 2016. — 307 с.
-
Константайн Л., Локвуд Л. Разработка программного обеспечения. — СПб: Питер, 2004. — 592 с.
-
Липаев В.В. Качество программных средств. — М.: Янус-К, 2002. — 400 с.
-
Макарова Н.В. Основы программирования. — М.: КНОРУС, 2016. — 454 с.
-
Мухортов В.В. Объектно-ориентированное программирование, анализ и дизайн / В.В. Мухортов, В.Ю. Рылов. – Новосибирск: Изд-во ООО «Новософт», 2012. – 108 с.
-
Назаров С.В., Белоусова С.Н., Бессонова И.А., Гиляревский Р.С., Гудыно Л.П. Введение в программные системы и их разработку. — М.: Интернет-Университет Информационных Технологий (ИНТУИТ), 2012. — 456 с.
-
Назаров С.В. Архитектуры и проектирование программных систем. — М.: ИНФРА-М, 2013. — 413 с.
-
Новиков Ф.А. Технологические подходы к разработке программного обеспечения. – СПб.: Изд-во ИТМО, 2014. -137 с.
-
Соловьев С.В. Технология разработки прикладного программного обеспечения / С.В. Соловьев, Л.С. Гринкруг, Р.И. Цой. – М.: БИНОМ, 2012. – 321 с.
-
Степович-Цветкова Г.С. Стандарты качества компьютерных программ // Наука сегодня. Сборник научных трудов по материалам VII международной научно-практической конференции: в 4 частях. Научный центр «Диспут». — Вологда: ООО «Маркер», 2015. — С. 96-97.
Содержание
- 2. Структурное программирование. Понятия и принципы.
- Принципы структурного программирования
- РАЗДЕЛ 3. СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ
- 3.1. Теория структурного программирования
2. Структурное программирование. Понятия и принципы.
Структурное программирование — методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. Предложена в 1970-х годах Э. Дейкстрой и др.
В соответствии с данной методологией любая программа строится без использования оператора goto из трёх базовых управляющих структур: последовательность, ветвление, цикл; кроме того, используются подпрограммы. При этом разработка программы ведётся пошагово, методом «сверху вниз».
Методология структурного программирования появилась как следствие возрастания сложности решаемых на компьютерах задач, и соответственно, усложнения программного обеспечения. В 1970-е годы объёмы и сложность программ достигли такого уровня, что традиционная (неструктурированная) разработка программ перестала удовлетворять потребностям практики. Программы становились слишком сложными, чтобы их можно было нормально сопровождать. Поэтому потребовалась систематизация процесса разработки и структуры программ.
Цель структурного программирования — повысить производительность труда программистов, в том числе при разработке больших и сложных программных комплексов, сократить число ошибок, упростить отладку, модификацию и сопровождение программного обеспечения.
Такая цель была поставлена в связи с ростом сложности программ и неспособностью разработчиков и руководителей крупных программных проектов справиться с проблемами, возникшими в 1960 – 1970 годы в связи с развитием программных средств.
Принципы структурного программирования
Становление и развитие структурного программирования связано с именем Эдсгера Дейкстры. Принцип 1. Следует отказаться от использования оператора безусловного перехода goto. Принцип 2. Любая программа строится из трёх базовых управляющих конструкций: последовательность, ветвление, цикл.
- Последовательность — однократное выполнение операций в том порядке, в котором они записаны в тексте программы.
- Бертран Мейер поясняет: «Последовательное соединение: используйте выход одного элемента как вход к другому, подобно тому, как электрики соединяют выход сопротивления со входом конденсатора».
- Ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения заданного условия.
- Цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется заданное условие (условие продолжения цикла).
Принцип 3. В программе базовые управляющие конструкции могут быть вложены друг в друга произвольным образом. Никаких других средств управления последовательностью выполнения операций не предусматривается.
Принцип 4. Повторяющиеся фрагменты программы можно оформить в виде подпрограмм (процедур и функций). Таким же образом (в виде подпрограмм) можно оформить логически целостные фрагменты программы, даже если они не повторяются.
- В этом случае в тексте основной программы, вместо помещённого в подпрограмму фрагмента, вставляется инструкция «Вызов подпрограммы». При выполнении такой инструкции работает вызванная подпрограмма. После этого продолжается исполнение основной программы, начиная с инструкции, следующей за командой «Вызов подпрограммы».
- Бертран Мейер поясняет: «Преобразуйте элемент, возможно, с внутренними элементами, в подпрограмму, характеризуемую одним входом и одним выходом в потоке управления».
Принцип 5. Каждую логически законченную группу инструкций следует оформить как блок (block). Блоки являются основой структурного программирования. Блок — это логически сгруппированная часть исходного кода, например, набор инструкций, записанных подряд в исходном коде программы. Понятие блок означает, что к блоку инструкций следует обращаться как к единой инструкции. Блоки служат для ограничения области видимости переменных и функций. Блоки могут быть пустыми или вложенными один в другой. Границы блока строго определены. Например, в if-инструкции блок ограничен кодом BEGIN..END (в языке Паскаль) или фигурными скобками <. >(в языке C) или отступами (в языке Питон). Принцип 6. Все перечисленные конструкции должны иметь один вход и один выход. Произвольные управляющие конструкции (такие, как в блюде спагетти) могут иметь произвольное число входов и выходов. Ограничив себя управляющими конструкциями с одним входом и одним выходом, мы получаем возможность построения произвольных алгоритмов любой сложности с помощью простых и надежных механизмов.
Принцип 7. Разработка программы ведётся пошагово, методом «сверху вниз» (top–down method)
Источник
РАЗДЕЛ 3. СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ
В 1970-х годах с появлением ЭВМ третьего поколения возникает новый подход к разработке алгоритмов и программ, который получает название структурного проектирования программ . Одним из первых инициаторов структурного программирования был профессор Э.Дейкстра. В 1965 он высказал предположение, что оператор GoTo (оператор безусловного перехода) вообще может быть исключён из языков программирования. По мнению Дейкстры «квалификация программиста обратно пропорциональна числу операторов GoTo в его программах». Достоинства структурного программирования по сравнению с интуитивным неструктурным программированием: 1) Уменьшение трудностей тестирования программ. 2) Более высокая производительность программистов. 3) Ясность и читаемость программ, что упрощает их сопровождение. 4) Эффективность программ.
3.1. Теория структурного программирования
К концепциям структурного программирования относится отказ от использования оператора безусловного перехода ( GoTo ), замена его рядом других структурированных операторов и использование идей нисходящего проектирования программ. Основное назначение нисходящего проектирования – служить средством разбиения большой задачи на меньшие подзадачи так, чтобы каждую подзадачу можно было рассматривать независимо. В предыдущем разделе кратко была описана суть метода нисходящего проектирования. Напомним, что при его использовании вначале проектируется общая структура алгоритма, без детальной проработки его отдельных частей. Затем разрабатываются блоки алгоритма, не детализированные на предыдущем шаге. В результате на каждом шаге разработки детализируется фрагмент алгоритма, то есть решается более простая задача. В основу структурного программирования положено требование , чтобы каждый модуль алгоритма (программы) проектировался с единственным входом и единственным выходом. Программа представляется в виде множества вложенных модулей, каждый из которых имеет один вход и один выход. 46
Базой для реализации структурированных программ является принцип Бома и Джакопини , в соответствии с которым всякая реальная программа может быть построена с использованием лишь двух управляющих конструкций . По Бому и Джакопини логическая структура программы может быть выражена комбинациями трех базовых структур : 1) Функциональный блок; 2) Конструкция принятия двоичного (дихотомического) решения. 3) Конструкции обобщенного цикла. Функциональный блок – это отдельный вычислительный оператор или любая другая реальная последовательность вычислений с единственным входом и единственным выходом. Изображается с помощью символа «Процесс» (рисунок 3.1). Вычисления Рисунок 3.1 – Графическое представление функционального блока Конструкция принятия двоичного (дихотомического) решения обычно называется элементом If-Then-Else (если-то-иначе), разветвлением или ветвлением – структура, обеспечивающая выбор между двумя альтернативными путями вычислительного процесса в зависимости от выполнения некоторого условия. Изображается с помощью символов «Решение» и «Процесс» (рисунок 3.2). Конструкция обобщенного цикла – в качестве базовой конструкции структурного программирования используется цикл с предусловием, называемый циклом «Пока» ( Do-While ). Изображается с помощью символов «Решение» и «Процесс» (рисунок 3.3). Рисунок 3.2 – рисунок 3.3 показывают, что логические конструкции (конструкция принятия двоичного решения и конструкция обобщенного цикла) имеют только один вход и один выход. Поэтому они могут рассматриваться как функциональные блоки. C учётом этого вводится преобразование логических блоков в функциональный блок. 47
да | Условие | нет |
Первая | Вторая | |
подзадача | подзадача | |
Рисунок 3.2 – Графическое представление конструкции принятия | ||
двоичного решения |
нет ? да Тело цикла Рисунок 3.3 – Графическое представление конструкции обобщенного цикла Кроме того, всякая последовательность функциональных элементов, называемая конструкцией следования (рисунок 3.4), также может быть приведена к одному функциональному блоку. Данные преобразования называются преобразованиями БомаДжакопини . Их основу составляет принцип “чёрного ящика” (что-то с одним входом и одним выходом). 48
Рисунок 3.4 – Графическое представление конструкции следования Таким образом, всякая программа (или алгоритм), состоящая из функциональных блоков, конструкций цикла и элементов If-Then-Else, поддаётся последовательному преобразованию к единственному функциональному блоку. Эта последовательность преобразований может быть использована как средство понимания программы, доказательство ее правильности и структурированности. Обратная последовательность преобразований может быть использована в процессе проектирования алгоритма (программы) по методу нисходящего проектирования – алгоритм (программа) разрабатывается, исходя из единственного функционального блока, который постепенно раскрывается в сложную структуру основных элементов. 49
Источник