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

Быстрая навигация:
1.31 Списки - массивы. Первое знакомство. 1.30 Функции которые возвращают результат - return 1.29 Подпрограммы: функции и процедуры в Питоне 1.28 Преобразование типов данных - int() 1.27 Ввод данных с клавиатуры - input() 1.26 Типы и размеры данных 1.25 Цикл с предусловием - while. Числа Фибоначчи 1.24 Измерение длины строки, списки 1.23 Срезы строк - вывод определенного количества символов из имеющегося текста 1.22 Строки и управляющие символы 1.21 Системные ошибки в процессе отладки программы 1.20 Оператор ветвления - if, комментарии 1.19 Вывод на печать - print(), быстрый ввод данных, округление, комментарии 1.18 Типы программирования. Часть 2. Объектно-ориентированное программирование 1.17 Типы программирования. Часть 1. Структурное программирование. Циклы 1.16 Представление символьной информации - ASCII 1.15 Деление двоичных чисел 1.14 Математические операции с двоичными числами 1.13 Как хранится и записывается информация. Биты и байты 1.12 Перевод целых чисел десятичной системы счисления в другую систему 1.11 Перевод целых чисел из шестнадцатеричной системы счисления в десятичную 1.10 Перевод целого двоичного числа в шестнадцатеричное 1.9 Перевод целого двоичного числа в другую систему счисления 1.8 Системы счисления 1.7 Булевая алгебра. Логические выражения 1.6 Базовые понятия. Часть 3 - Числа, выражения, операнды, знаки операций 1.5 Базовые понятия. Часть 2 - Программа, данные 1.4 Базовые понятия. Часть 1 - Задача и алгоритм 1.3 Среда разработки СИ 1.2 История языков программирования 1.1 Введение

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

Языки программирования – формальные языки, предназначенные для описания .

Формальные языки характерны тем, что имеют четкие синтаксические правила.
Например запись 2x2=4 является синтаксически правильной математической записью, а 2=+4 – нет.

Когда вы читаете предложение на русском языке или выражение на формальном языке, вы определяете его структуру, часто неосознанно. Этот процесс называется синтаксическим анализом или синтаксическим разбором. Эквивалентный англоязычный термин – parsing (парсинг)

Отсюда мы подходим к тому, что называется парадигмой программирования.

Парадигма программирования - это некий набор правил, который определяет стиль написания программ.

Существует несколько таких правил, которые можно распределить по специфике методологии программирования:
- структурное программирование
- объектно-ориентированное программирование
- логическое программирование и прочие...

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

Вот интересная вводная лекция
по парадигмам программирования
на русском языке:



Перевод осуществлён Kovalev Filipp

Это обзорная лекция профессора Джери Кейн с факультета Computer Sciense университета Стэнфорд.
Парадигмы программирования представляют несколько языков, включая C, Ассемблер, C++, Параллельное программирование, Sheme и Python.
Цели данного курса - научить слушателей как писать код на каждом из этих языков и понимать парадигмы программирования, представляемые этими языками.

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

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

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

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

Также создавались функциональные (аппликативные) языки (Lisp) и логические языки (Prolog)

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

Объектно-ориентированное программирование (ООП)

При использовании структур данных в программе вырабатываются и соответствующие им функции для работы с ними. Это привело к мысли их объединить и использовать совместно, так появились классы.

Класс - это структура данных, содержащая в себе не только переменные, но и функции, которые работают с этими переменными.



Теперь программирование можно было разбить на классы и тестировать не всю программу, состоящую из 10 000 строк кода, а разбить программу на 100 классов, и тестировать каждый класс. Это существенно облегчило написание программного продукта.

В итоге в конце 1970-х и начале 1980-х были разработаны принципы объектно-ориентированного программирования.

Первым объектно-ориентированным языком программирования является Симула-67, в котором впервые появились классы. Концепции ООП получили дальнейшее развитие в языке Smalltalk, в котором также были заложены основы систем с оконным управлением. Более поздними примерами объектно-ориентированных языков являются Object Pascal, C++, Java, C# и др.

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

Билет 2.

Векторный язык программирования/прототипирования MatLab

MATLAB (Matrix Laboratory ) - пакет прикладных программ для решения задач технических вычислений и одноимённый язык программирования, используемый в этом пакете.

Язык MATLAB был создан в конце 1970-ых годов; он предназначался для работы с библиотеками численных методов, написанными на Fortran, не зная самого языка. Язык быстро обрел популярность среди людей, занимающихся прикладной математикой.

MATLAB используют более 1 000 000 инженерных и научных работников, он работает на большинстве современных операционных системах, включая Linux, Mac OS, Solaris и Microsoft Windows.

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

Программы, написанные на MATLAB, бывают двух типов - функции и скрипты. Функции имеют входные и выходные аргументы, а также собственное рабочее пространство для хранения промежуточных результатов вычислений и переменных. Скрипты же используют общее рабочее пространство. Как скрипты, так и функции не компилируются в машинный код и сохраняются в виде текстовых файлов. Существует также возможность сохранять так называемые pre-parsed программы - функции и скрипты, обработанные в вид, удобный для машинного исполнения. В общем случае такие программы выполняются быстрее обычных, особенно если функция содержит команды построения графиков.

Типичное использование MATLAB - это:

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

· создание алгоритмов

· моделирование

· анализ данных, исследования и визуализация

· научная и инженерная графика

· разработка приложений, включая создание графического интерфейса

Система MATLAB состоит из пяти основных частей.

· Язык MATLAB. Это язык матриц и массивов высокого уровня с управлением потоками, функциями, структурами данных, вводом-выводом и особенностями объектно-ориентированного программирования.

· Среда MATLAB. Это набор инструментов и приспособлений, с которыми работает пользователь или программист MATLAB. Она включает в себя средства для управления переменными в рабочем пространстве MATLAB, вводом и выводом данных, а также создания, контроля и отладки М-файлов и приложений MATLAB.

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

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

· Программный интерфейс. Это библиотека, которая позволяет писать программы на Си и Фортране, которые взаимодействуют с MATLAB. Она включает средства для вызова программ из MATLAB (динамическая связь), вызывая MATLAB как вычислительный инструмент и для чтения-записи МАТ-файлов.

Оболочка Matlab состоит из командной строки, текстового редактора со встроенным отладчиком и окнами со списком файлов, списком видимых переменных и с историей введенных команд.

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

Билет 3.

Графический язык программирования «G» LabView

LabVIEW (англ. Lab oratory V irtual I nstrumentation E ngineering W orkbench) - это среда разработки и платформа для выполнения программ, созданных на графическом языке программирования «G» фирмы National Instruments. LabVIEW используется в системах сбора и обработки данных, а также для управления техническими объектами и технологическими процессами.

Компания National Instruments была создана в 1976 году тремя основателями - Джеффом Кодоски, Джеймсом Тручардом и Биллом Новлиным.

Первая версия LabVIEW была выпущена в 1986 году для Apple Macintosh, в настоящее время существуют версии для UNIX, Linux, Mac OS и пр., а наиболее развитыми и популярными являются версии для Microsoft Windows.

LabVIEW по своим возможностям приближается к системам программирования общего назначения, например к Delphi. Тем не менее, между ними существует ряд важных различий:

1. Система LabVIEW основана на принципах графического программирования.

2. Система LabVIEW основана на принципах объектно-ориентированного программирования

3. Система LabVIEW является проблемно-ориентированной;

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

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

2. Вторая часть – «блок-схема» (блочная диаграмма) описывает алгоритм работы виртуального прибора.

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

Важными элементами блок-схемы являются функциональные узлы – встроенные субВП, являющиеся частью LabVIEW и выполняющие предопределенные операции над данными. Также компонентами «блок-схемы» являются терминалы («задние контакты» объектов лицевой панели) и управляющие структуры (являющиеся аналогами таких элементов текстовых языков программирования, как условный оператор «IF», операторы цикла «FOR» и «WHILE» и т. п.).

Данные от терминалов к функциональным узлам и между различными функциональными узлами передаются при помощи связей.

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

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

Билет 4.

Основы стандартизации на примере С++. Венгерская нотация.

C++ - компилируемый, статически типизированный язык программирования общего назначения.

В 1985 году вышло первое издание «Языка программирования С++», обеспечивающее первое описание этого языка, что было чрезвычайно важно из-за отсутствия официального стандарта.

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

Общие требования:

1) На одной строке должно находиться не более одного оператора С++

2) Если вызов функции, операции, занимает более одной строки, то перенос должен следовать сразу после запятой.

3) Если выражение занимает несколько строк – переход на новую – после бинарной операции.

Документация к коду:

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

2) Каждый файл исходного кода программы должен иметь вводную часть содержащую форме комментария информацию об авторе программы, имени файла и его содержание

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

Имена:

1) Имена – имя должно соответствовать свойству или процессу, которые отображает. Имена осмысленны, понятны, на основе английских слов.

2) Имена констант следует задавать только заглавными буквами. Не должны совпадать, не зависимо от того, каким способом вы задали константы. Константы можно следующими операторами: const, enum, #define.

3) Стоит избегать использования имен переменных и функций, составленных целиком из больших букв.

Длина строк: Максимальная длина строк не должна превышать 70 символов. Хотя большие мониторы могут отображать и более длинные строки, печатающие устройства более ограничены в своих возможностях.

Стратегические и тактические комментарии:

1) Тактический комментариях одной строкой описывает операцию на следующей строке.

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

3) Слишком много тактических комментариев делает код программы нечитаемым, поэтому рекомендуется применять стратегическое комментирование.

Имя класса : Должно соответствовать тому объекту, который описывает данный класс.

Использование табуляции :

1) Для организации отступов использовать табуляцию вместо пробелов

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

3) Комментарии должны находиться на уровне того оператора, которому они соответствуют

4) Комментарии справа от операторов должны быть выровнены с помощью пробелов, а не табуляции

Исходные файлы

1) Каждый исходный файл должен содержать реализацию только одного класса или группы функций, близких по своему назначению

2) Каждый файл должен иметь заголовок

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

Имена классов:

1) Имя класса должно начинаться с буквы «С», что означает «class».

2) Если имя класса состоит из нескольких слов, то каждое слово должно начинаться с заглавной буквы (Н-р: class СConnectionPointForMyOcx)

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

4) Имя класса должно начинаться с заглавной буквы. Если имя класса состоит из нескольких слов, то каждое должно начинаться с заглавной буквы, которая служит разделителем слов.

Венгерская нотация – соглашение об именовании переменных, констант и прочих идентификаторов в коде программ.

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

Примеры:
Префикс s (сокращение от string) обозначает строку.

Префикс a (сокращение от array) обозначает массив.

Префикс T (сокращение от type) обозначает тип.

1) Если встроенного механизма типизации не хватает, венгерская нотация позволяет записывать подтип переменной

2) Удобно при именовании объектов, для которых тип очевиден - например, кнопку «OK» можно назвать btnOk.

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

1) Некоторые программисты считают, что использование префиксов делает имена переменных менее понятными и, таким образом, ухудшает читаемость кода

2) Если неизвестно имя переменной без префиксов, подчас трудно восстановить её префиксы.

3) При изменении типа потребуется изменять имя переменной (не все редакторы кода могут делать это автоматически).

Билет 5.

Жизненные циклы программных средств и их стандартизация

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

В настоящее время можно выделить 5 основных подходов к организации процесса создания и использования ПС:

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

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

В рамках водопадного подхода различают следующие стадии жизненного цикла ПС:

1) разработку ПС,

2) производство программных изделий (ПИ)

3) эксплуатацию ПС.

Рассмотрим каждую стадию более подробно.

Стадии разработки ПС : внешнее описание, конструирования, кодирования, аттестация.

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

Этап конструирования ПС: охватывает следующие процессы: разработку архитектуры ПС, разработку структур программ ПС и их детальную спецификацию.

Этапа кодирования (программирование в узком смысле) ПС: включает процессы создания текстов программ на языках программирование, их отладку с тестированием ПС.

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

Программное изделие (ПИ ) - экземпляр или копия разработанного ПС. Изготовление ПИ - это процесс генерации и/или воспроизведения (снятия копии) программ и программных документов ПС с целью их поставки пользователю для применения по назначению. Производство ПИ - это совокупность работ по обеспечению изготовления требуемого количества ПИ в установленные сроки.

Стадия эксплуатации ПС охватывает процессы хранения, внедрения и сопровождения ПС, а также транспортировки и применения ПИ по своему назначению. Она состоит из двух параллельно проходящих фаз: фазы применения ПС и фазы сопровождения ПС.

Применение (operation) ПС - это использование ПС для решения практических задач на компьютере путем выполнения ее программ.

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

Билет 6

Императивное и декларативное программирование

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

Парадигма программирования – совокупность идей и понятий, определяющая стиль написания программы.

Основными парадигмами программирования являются:
1) императивное программирование
2) декларативное программирование
3) функциональное программирование
4) объектно-ориентированное программирование.

Существуют также и другие модели программирования, но мы рассмотрим только первые две.

Программирование:

1) Императивное

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

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

Языки и технологии программирования

Первые программы заключались в установке ключевых переключателей на передней панели вычислительного устройства. Очевидно, таким способом можно было составить только небольшие программы. С развитием компьютерной техники появился машинный язык, с помощью которого программист мог задавать команды, оперируя с ячейками памяти, полностью используя возможности машины. Однако использование большинства компьютеров на уровне машинного языка затруднительно, особенно это касается ввода-вывода. Поэтому от его использования пришлось отказаться. Например, для организации чтения блока данных с гибкого диска программист может использовать 16 различных команд, каждая из которых требует 13 параметров, таких как номер блока на диске, номер сектора на дорожке и т. п. Когда выполнение операции с диском завершается, контроллер возвращает 23 значения, отражающие наличие и типы ошибок, которые надо анализировать.«Слова» на машинном языке называются инструкции, каждая из которых представляет собой одно элементарное действие для центрального процессора, такое, например, как считывание информации из ячейки памяти. Каждая модель процессора имеет свой собственный набор машинных команд, хотя большинство из них совпадает. Если Процессор А полностью понимает язык Процессора Б, то говорится, что Процессор А совместим с Процессором Б. Процессор Б будет называться не совместимым с Процессором А если А имеет команды, не распознаваемые Процессором Б. В случае, когда нужно иметь эффективную программу, вместо машинных языков используются близкие к ним машинно-ориентированные языки - ассемблеры. Люди используют мнемонические команды взамен машинных команд.

Но даже работа с ассемблером достаточно сложна и требует специальной подготовки.Например, для процессора Zilog Z80 машинная команда 00000101 предписывает процессору уменьшить на единицу свой регистр B. На языке ассемблера это же будет записано как DEC B.

Структурное программирование

Следующий шаг был сделан в 1954 году, когда был создан первый язык высокого уровня - Фортран (англ. FORTRAN - FORmula TRANslator ). Языки высокого уровня имитируют естественные языки, используя некоторые слова разговорного языка и общепринятые математические символы. Эти языки более удобны для человека, с помощью них, можно писать программы до нескольких тысяч строк длиной. Однако легко понимаемый в коротких программах, этот язык становился нечитаемым и трудно управляемым, когда дело касалось больших программ. Решение этой проблемы пришло после изобретения языков структурного программирования (англ. structured programming language ), таких как Алгол(1958), Паскаль(1970), Си(1972).

Структурное программирование предполагает точно обозначенные управляющие структуры, программные блоки, отсутствие инструкций безусловного перехода (GOTO), автономные подпрограммы, поддержка рекурсии и локальных переменных. Суть такого подхода заключается в возможности разбиения программы на составляющие элементы. Также создавались функциональные (аппликативные) языки (Пример: Lisp - англ. LISt Processing , 1958) и логические языки (пример: Prolog - англ. PROgramming in LOGic , 1972). Хотя структурное программирование, при его использовании, дало выдающиеся результаты, даже оно оказывалось несостоятельным тогда, когда программа достигала определенной длины. Для того чтобы написать более сложную (и длинную) программу, нужен был новый подход к программированию.

В итоге в конце 1970-х и начале 1980-х были разработаны принципы объектно-ориентированного программирования. ООП сочетает лучшие принципы структурного программирования с новыми мощными концепциями, базовые из которых называются инкапсуляцией, полиморфизмом и наследованием. Примером объектно-ориентированных языков являются: Object Pascal, C++, Java и др. ООП позволяет оптимально организовывать программы, разбивая проблему на составные части, и работая с каждой по отдельности. Программа на объектно-ориентированном языке, решая некоторую задачу, по сути, описывает часть мира, относящуюся к этой задаче.

Парадигмы программирования

Структу́рное программи́рование - методология разработки программного обеспечения , в основе которой лежит представление программы в виде иерархической структуры блоков . Предложена в 1970-х годах Э. Дейкстрой и др.

В соответствии с данной методологией любая программа строится без использования оператора goto из трёх базовых управляющих структур: последовательность, ветвление, цикл; кроме того, используются подпрограммы . При этом разработка программы ведётся пошагово, методом «сверху вниз».

Методология структурного программирования появилась как следствие возрастания сложности решаемых на компьютерах задач, и соответственно, усложнения программного обеспечения. В 1970-е годы объёмы и сложность программ достигли такого уровня, что традиционная (неструктурированная) разработка программ перестала удовлетворять потребностям практики. Программы становились слишком сложными, чтобы их можно было нормально сопровождать. Поэтому потребовалась систематизация процесса разработки и структуры программ.

Методология структурной разработки программного обеспечения была признана «самой сильной формализацией 70-х годов».

По мнению Бертрана Мейера, «Революция во взглядах на программирование, начатая Дейкстрой, привела к движению, известному как структурное программирование, которое предложило систематический, рациональный подход к конструированию программ. Структурное программирование стало основой всего, что сделано в методологии программирования, включая и объектное программирование» .

Энциклопедичный YouTube

    1 / 5

    ✪ Структурное программирование. Базовые принципы

    ✪ Паскаль с нуля [ч1]. Первая программа.

    ✪ Урок 7. Операторы вывода write/writeln. Простая программа. Программирование на Pascal / Паскаль

    ✪ Основы Программирования - #5 - Арифметические и логические выражения

    ✪ 003. Логические алгоритмы классификации - К.В. Воронцов

    Субтитры

История

Первоначально идея структурного программирования появилась на свет в связи с оператором goto и сомнениями в целесообразности его применения. Впервые подобные сомнения высказал Хайнц Земанек (Heinz Zemanek) на совещании по языку Алгол в начале 1959 года в Копенгагене. Однако это выступление не привлекло к себе внимания и не имело последствий. Эдсгер Дейкстра (Edsger Dijkstra) вспоминает: «До некоторой степени я виню себя за то, что в то время не смог оценить значимость этой идеи» .

Ситуация коренным образом изменилась через десять лет, когда в марте 1968 года Дейкстра опубликовал своё знаменитое письмо «Оператор Go To считается вредным» (Go To Statement Considered Harmful). Это поистине исторический документ, оказавший заметное влияние на дальнейшее развитие программирования.

Судьба самого документа очень интересна. Дело в том, что Дейкстра дал статье совсем другое название: «Доводы против оператора GO TO» (A Case against the GO TO Statement).

Однако в момент публикации произошло нечто непонятное - статья почему-то загадочным образом превратилась в «Письмо к редактору», причем прежнее название столь же загадочно исчезло. Что произошло на самом деле? Дейкстра объяснил таинственное превращение статьи в письмо лишь много лет спустя, в 2001 году, за год до смерти.

Цель

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

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

Спагетти-код

Структурное программирование призвано, в частности, устранить беспорядок и ошибки в программах, вызванные трудностями чтения кода, несистематизированным, неудобным для восприятия и анализа исходным текстом программы. Такой текст нередко характеризуют как «спагетти-код ».

Спагетти-код может быть отлажен и работать правильно и с высокой производительностью, но он крайне сложен в сопровождении и развитии . Доработка спагетти-кода для добавления новой функциональности иногда несет значительный потенциал внесения новых ошибок. По этой причине становится практически неизбежным рефакторинг (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.

Бём и Якопини не употребляли термин «структурное программирование». Тем не менее, доказанную ими теорему (и её последующие вариации у разных авторов) впоследствии стали называть «Теоремой о структурном программировании », «Структурной теоремой» (Structure theorem ), «Теоремой о структурировании» .

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

Становление и развитие структурного программирования связано с именем Эдсгера Дейкстры .

Принцип 1. Следует отказаться от использования оператора безусловного перехода goto.

Принцип 2. Любая программа строится из трёх базовых управляющих конструкций: последовательность, ветвление, цикл.

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

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

Принцип 5. Каждую логически законченную группу инструкций следует оформить как блок (block). Блоки являются основой структурного программирования.

Блок - это логически сгруппированная часть исходного кода, например, набор инструкций, записанных подряд в исходном коде программы. Понятие блок означает, что к блоку инструкций следует обращаться как к единой инструкции. Блоки служат для ограничения области видимости переменных и функций. Блоки могут быть пустыми или вложенными один в другой. Границы блока строго определены. Например, в if-инструкции блок ограничен кодом BEGIN..END (в языке Паскаль) или фигурными скобками {...} (в языке C) или отступами (в языке Питон).

Принцип 6. Все перечисленные конструкции должны иметь один вход и один выход.

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

Принцип 7. Разработка программы ведётся пошагово, методом «сверху вниз» (top–down method) .

Метод «сверху вниз»

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

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

Следует также учесть, что в «Предисловии» к книге «Структурное программирование» Тони Хоар (Tony Hoare) отмечает, что принципы структурного программирования в равной степени могут применяться при разработке программ как «сверху вниз», так и «снизу вверх» .

Подпрограмма

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

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

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

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

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

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

Ясность и удобочитаемость программ

Структурное программирование значительно повышает ясность и удобочитаемость (readability) программ . Эдвард Йордан (Edward Yourdon) поясняет:

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

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

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

Двумерное структурное программирование

Р-технология производства программ, или «технология двумерного программирования» была создана в . Графическая система Р-технологии программирования закреплена в стандартах ГОСТ 19.005-85 , ГОСТ Р ИСО/МЭК 8631-94 и международном стандарте ISО 8631Н.

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

Методология двумерного структурного программирования существенно отличается от классического одномерного (текстового) структурного программирования .

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

С появлением компьютерной графики ситуация изменилась. Используя выразительные средства графики, появилась возможность видоизменить, развить и дополнить три типа базовых (текстовых) управляющих структурных конструкций, а также полностью отказаться от ключевых слов , then, else, case , switch, break, while , do, repeat, until, for, foreach, continue, loop, exit, when, last и т. д. и заменить их на управляющую графику, то есть использовать двумерное структурное программирование .

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

См. также

Примечания

  1. Мейер Б. Почувствуй класс. Учимся программировать хорошо с объектами и контрактами. - Пер. с англ. - М.: Национальный открытый университет ИНТУИТ: БИНОМ. Лаборатория знаний, 2011. - 775с. - С. 208. - ISBN 978-5-9963-0573-5
  2. Э. Дейкстра. Оператор goto считается вредным
  3. Dijkstra E. Go To Statement Considered Harmful // Communications of the ACM, Volume 11, No. 3, March 1968, pp. 147-148. - Association for Computing Machinery, Inc.
  4. См. также материалы из Архива Дейкстры. E. W. Dijkstra Archive. The manuscripts of Edsger W. Dijkstra. - Department of Computer Science The University of Texas at Austin
  5. Рукопись EWD1308 из Архива Дейкстры.
  6. Расшифровка рукописи EWD1308 из Архива Дейкстры. What led to «Notes on Structured Programming» - Nuenen, 10 June 2001. - Department of Computer Sciences. The University of Texas at Austin, USA
  7. Лингер Р., Миллс Х., Уитт Б. Теория и практика структурного программирования. - Пер. с англ. - М.: Мир, 1982. - 406с. - С. 7.
  8. John Vlissides, Kyle Brown, Gerard Meszaros AntiPatterns: The Survival Guide. .

ФГБОУ ВО «Мордовский государственный

педагогический институт имени М.Е. евсевьева»

Физико-математический факультет

Кафедра информатики и вычислительной техники

РЕФЕРАТ

«Принципы структурного программирования. Основные алгоритмические структуры и их суперпозиции»

Выполнила: студентка гр. МДМ-212

Багданова Яна

Саранск 2016

Введение

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

Исходя из этих проблем, ведущими программистами 70-х годов (Дейкстра , Вирт , Дал , Xoap , Йордан , Константин , Майерс и др.) были разработаны строгие правила ведения проектов, которые получили название структурной методологии .

Важным этапом в становлении этого подхода стали международные конференции по программированию, проведенные в 1968-69 годах. На второй из них Эдсгер Дейкстра впервые использовал термин « структурное программирование » и предложил принципиально новый способ создания программ. Он рассматривал программу как совокупность иерархических абстрактных уровней, которые позволяли:

    четко структурировать программу, что улучшило ее понимание программистами;

    выполнять доказательства ее корректности и тем самым повышать надежность функционирования программы;

    сокращать сроки разработки программ.

Еще одним толчком к изменению способа программистского мышления стало опубликованное письмо Дейкстры редактору одного из научных издательств, которое было озаглавлено « Оператор GOTO нужно считать вредным ». Это письмо вызвало острую полемику среди программистов того времени, но в итоге победило все-таки структурное мышление, которое, кроме Дейкстры , активно поддерживали профессор Цюрихского технического университета Вирт и профессор Оксфордского университета Xoap . Одним из результатов полемики было доказательство того, что любая программа может быть написана, используя только простую последовательность операторов, итеративную конструкцию типа while ( пока ) и конструкцию выбора case ( выбор ), а оператор goto ( перейти к ) не является необходимой управляющей конструкцией в структурном программировании. К сожалению, споры об операторе goto имели один отрицательный «побочный эффект» - довольно часто программирование без goto стало отождествляться со всем структурным программированием. Однако цели структурного программирования намного глобальнее и серьезнее.

1. ОСНОВЫ ТЕХНОЛОГИИ СТРУКТУРНОГО ПРОГРАММИРОВАНИЯ

Структурное программирование - методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. Предложена в 70-х годах XX в. Э.Дейкстрой, разработана и дополнена Н.Виртом (рис. 1).

Эдсгер Вибе Дейкстра (1930 – 2002) - нидерландский учёный, идеи которого оказали влияние на развитие компьютерной индустрии. Известен как создатель алгоритма поиска кратчайшего пути на графе, один из основателей структурного программирования. В 1972 г. стал лауреатом премии Тьюринга.

Никлаус Вирт (1934) - швейцарский учёный, специалист в области информатики, один из известнейших теоретиков в области разработки языков программирования, профессор компьютерных наук, лауреат премии Тьюринга 1984 г. Ведущий разработчик языков программирования Паскаль, Модула-2, Оберон.

Рис. 1. Пионеры структурного программирования – Э.Дейкстра и Н.Вирт.

Методология структурного программирования появилась как следствие возрастания сложности решаемых на компьютерах задач, и соответственного усложнения программного обеспечения: в 70-е годы XX в. объёмы и сложность программ достигли такого уровня, что «интуитивная» (неструктурированная) разработка программ, которая была нормой в более раннее время, перестала удовлетворять потребностям практики. Программы становились слишком сложными, чтобы их можно было нормально сопровождать, поэтому потребовалась какая-то систематизация процесса разработки и структуры программ.

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

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

Типичными методами структурного программирования являются:

    нисходящее проектирование (проектирование сверху вниз);

    модульное (процедурное) программирование ;

    структурное кодирование .

В соответствии с методологией структурного программирования:

1. Любая программа представляет собой структуру, построенную из трёх типов базовых конструкций:

    последовательное исполнение - однократное выполнение операций в том порядке, в котором они записаны в тексте программы;

    ветвление - однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия;

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

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

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

3. Разработка программы ведётся пошагово, методом «сверху вниз».

Сначала пишется текст основной программы, в котором, вместо каждого связного логического фрагмента текста, вставляется вызов подпрограммы, которая будет выполнять этот фрагмент. Вместо настоящих, работающих подпрограмм, в программу вставляются « заглушки », которые ничего не делают. Полученная программа проверяется и отлаживается. После того, как программист убедится, что подпрограммы вызываются в правильной последовательности (т.е. общая структура программы верна), подпрограммы-заглушки последовательно заменяются на реально работающие, причём разработка каждой подпрограммы ведётся тем же методом, что и основной программы. Разработка заканчивается тогда, когда не останется ни одной «заглушки», которая не была бы удалена. Такая последовательность гарантирует, что на каждом этапе разработки программист одновременно имеет дело с обозримым и понятным ему множеством фрагментов, и может быть уверен, что общая структура всех более высоких уровней программы верна. При сопровождении и внесении изменений в программу выясняется, в какие именно процедуры нужно внести изменения, и они вносятся, не затрагивая части программы, непосредственно не связанные с ними. Это позволяет гарантировать, что при внесении изменений и исправлении ошибок не выйдет из строя какая-то часть программы, находящаяся в данный момент вне зоны внимания программиста.

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

Методология структурной разработки программного обеспечения была признана «самой сильной формализацией 70-х годов». После этого слово «структурный» стало модным в отрасли, и его начали использовать везде, где надо и где не надо. Появились работы по «структурному проектированию», «структурному тестированию», «структурному дизайну» и т.д.

К достоинствам структурного программирования можно отнести следующее:

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

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

3. Сильно упрощается процесс тестирования и отладки структурированных программ.

Рассмотрим более подробно основные методы структурного программирования.

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

Целями структурного программирования являются:

    Обеспечение дисциплины программирования в процессе создания программных комплексов .

    Улучшение читабельность программы . Читабельность улучшается, если придерживаться следующих правил:

    • избегать использования языковых конструкций с неочевидной семантикой;

      стремиться к локализации действия управляющих конструкций и использования структур данных;

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

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

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

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

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

Таблица 1. Принципы структурного программирования

Принцип

Пояснение

Абстракция

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

Формальность

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

«Разделяй и властвуй»

Разделение программы на отдельные фрагменты (модули), которые просты по управлению и допускают независимую отладку и тестирование.

Иерархическое упорядочение

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

1.2. Нисходящее проектирование

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

Спецификация задачи является ее первичным проектом. От неё мы движемся к программе, постепенно уточняя описание.

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

Пример 1. В качестве примера рассмотрим проект одевания ребенка.

Решение:

1. Первичная цель :

Одеть.

2. Конкретизация цели на первом шаге :

Одеть нижнюю половину.

Одеть верхнюю половину.

2.1. Нижнюю половину можно одеть в два этапа:

Надеть брюки.

Надеть носки и ботинки.

2.2. Верхнюю половину можно также одеть в два этапа:

Надеть рубашку.

Надеть куртку.

3. Окончательный проект выглядит так:

Надеть брюки.

Надеть носки.

Надеть ботинки.

Надеть рубашку.

Надеть куртку.

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

Приложение 1

Приложение n

Функция 1

Функция 2

Функция m

Подф-ция 11

Подф-ция 1 k

Подф-ция m 1

Подф-ция m 2

Подф-ция mp

Цель 1

Подцель 11

Подцель 1 s

Цель 2

Подцель 2 1

Подцель 2 q

Рис. 2. Функциональная структура приложения

Последовательность действий по разработке ФСА приложения следующая:

    определяются цели автоматизации предметной области и их иерархия (цель-подцель);

    устанавливается состав приложений (задач обработки), обеспечивающих реализацию поставленных целей;

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

    определяются необходимые для решения задач функции обработки данных ;

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

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

1.3. Модульное программирование

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

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

В программировании под модулем понимается отдельная подпрограмма , а подпрограммы часто называются процедурами или процедурами-функциями . Поэтому модульное программирование еще называется процедурным .

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

Некоторые программные продукты используют модули из готовых библиотек стандартных подпрограмм, процедур, функций, объектов, методов обработки данных.

Среди множества модулей различают:

    головной модуль – управляет запуском программного продукта (существует в единственном числе);

    управляющий модуль – обеспечивает вызов других модулей на обработку;

    рабочие модули – выполняют функции обработки;

    сервисные модули и библиотеки , утилиты – реализуют обслуживающие функции.

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

Каждый модуль может оформляться как самостоятельно хранимый файл; для функционирования программного продукта необходимо наличие программных модулей в полном составе.

Модуль должен обладать следующими свойствами :

    один вход и один выход – на входе программный модуль получает определенный набор исходных данных, выполняет содержательную обработку и возвращает один набор результатных данных, т.е. реализуется стандартный принцип IPO ( Input–Process–Output вход-процесс-выход );

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

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

    слабые информационные связи с другими программными модулями – обмен информацией между модулями должен быть по возможности минимизирован;

    обозримый по размеру и сложности программный код .

Модули содержат:

    определение доступных для обработки данных;

    операции обработки данных;

    схемы взаимосвязи с другими модулями.

Каждый модуль состоит из спецификации и тела . Спецификации определяют правила использования модуля, а тело – способ реализации процесса обработки.

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

При определении набора модулей, реализующих функции конкретного алгоритма, необходимо учитывать следующее:

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

    принятие основных решений в алгоритме выносится на максимально «высокий» по иерархии уровень;

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

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

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

Второй уровень иерархии программы

Первый уровень иерархии программы

Головной модуль

(программа-сервер)

Модуль управления 1

(Управл. прогр. 1)

Модуль управления n

(Управл. прогр. n)

Модуль 1A

(подпрогр. 1А)

Модуль 1В

(подпрогр. 1В)

Модуль 1W

(подпрогр. 1 W )

Модуль 0A

(подпрогр. 0А)

Модуль 0B

(подпрогр. 0B)

Модуль nA

(подпрогр. nА)

Модуль nB

(подпрогр. nB)

Модуль nW

(подпрогр. nW)

Третий уровень иерархии программы

Рис. 3. Функционально-модульная структура алгоритма приложения

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

    точки (момент, условие) начала диалога;

    инициатор диалога – человек или программный продукт;

    параметры и содержание диалога – сообщения, состав и структура меню, экранные формы и т.п.;

    реакция программного продукта на завершение диалога.

Для создания диалоговых процессов и интерфейса конечного пользователя наиболее подходят объектно-ориентированные инструментальные средства разработки программ .

1.4. Структурное кодирование

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

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

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

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

Фундаментом структурного программирования является теорема о структурировании , сформулированная итальянскими математиками К.Бомом и Дж.Якопини в 1966 г.

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

    следования (begin-end начало-конец ),

    ветвления (if - then - else если-то-иначе ),

    циклов с предусловием (while пока ).

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

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

Виды основных управляющих структур алгоритма приведены на рис. 4.

1. Структура типа « следование » (рис. 4, а ) – образуется последовательностью действий, S 1, S 2, …, Sn , следующих одно за другим:

выполнить S 1;

выполнить S 2;

выполнить Sn .

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

    ввод исходных данных;

    вычисление по формулам;

    вывод результата.

В языке Pascal такая структура заключается в операторные скобки Begin ... End :

Begin

S 1;

S 2;

...

Sn ;

End

Рис. 4. Базовые алгоритмические структуры:

а) следование (Begin End ); б) ветвление (If Then Else ); в) цикл с предусловием (While Do )

2. Структура типа « ветвление » (ЕСЛИ – ТО – ИНАЧЕ ) (рис. 4, б ) – обеспечивает в зависимости от результата проверки условия Р , принимающего одно из двух логических значении Да (True ) или Нет (False ), выбор одного из альтернативных путей работы алгоритма:

если Р

то выполнить S 1

иначе выполнить S 2 .

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

В языке Pascal

If P

Then S 1

Else S 2;

3. Структура типа « цикл с предусловием » (рис. 4, в ) – обеспечивает многократное выполнение действия S в зависимости от того, какое значение принимает логическое условие Р :

до тех пор пока Р

выполнять S .

Выполнение цикла прекращается, когда условие Р не выполняется.

В языке Pascal такая структура имеет следующий формат:

While P Do

S ;

В расширенный комплект элементарных алгоритмических структур дополнительно входят следующие управляющие конструкции (рис. 5).

4. Структура типа « сокращенное ветвление » (ЕСЛИ – ТО ) (рис. 5, а ) – если результат проверки условия Р принимает значение Да (True ), то выполняется действие S ; в противном случае это действие пропускается и управление передается следующей структуре:

если Р

то выполнить S 1 .

В языке Pascal такая структура имеет следующий формат:

If P

Then S ;

5 . Структура типа « выбор – иначе » (рис. 5, б ) являются расширенным вариантом структуры типа ЕСЛИ – ТО – ИНАЧЕ . Здесь проверяемое условие Р может принимать не два логических значения, а несколько порядковых значений, например, 1, 2, …, n . Если Р = i , то будет выполняться действие Si . Если же значение Р будет выходить из диапазона допустимых значений, то выполняется действие S (в укороченном варианте « выбор » никакого действия не производится и управление передается к следующей структуре. В языке Pascal такая структура имеет следующий формат:

Case P Of

1: S1;

2: S2;

n: Sn

Else S

End;

Рис. 5. Дополнительные элементарные алгоритмические структуры:

а) сокращенное ветвление (If Then ); б) выбор – иначе (Case Of Else );
в) цикл с постусловием (Repeat Until ); г) цикл с параметром (For To ( Downto ) – Do )

6. Структура типа « цикл с постусловием » (рис. 5, в ) – обеспечивает многократное выполнение действия S до тех пор, пока не выполняется условие Р .

В языке Pascal такая структура имеет следующий формат:

Repeat

S

Until P ;

7. Структура типа « цикл с параметром » (рис. 5, г ) – обеспечивает заранее определенное многократное выполнение действия S . При этом здесь последовательно выполняются следующие типовые операции:

    задание начального значения используемого параметра цикла (например, если переменной цикла является i , то ей присваивается значение i 1, т.е. i :=i 1);

    выполнение действий S , предусмотренных в теле цикла;

    изменение параметра цикла, который обеспечивает вычисление результата с новыми начальными данными (например, если параметр цикла i изменяется с шагом i 3, i :=i i 3);

    проверка текущего значения параметра цикла с заданным конечным значением (i <=i 2);

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

В языке Pascal такая структура имеет следующий формат:

For Переменная := i 1 To (Downto) i 3 Do

S ;

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

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

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

ВЫВОДЫ

    Структурное программирование - методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. Предложена в 70-х годах XX в. Э.Дейкстрой, разработана и дополнена Н.Виртом. Типичными методами структурного программирования являются: нисходящее проектирование (проектирование сверху вниз); модульное (процедурное) программирование; структурное кодирование.

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

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

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

    Фундаментом структурного программирования является теорема о структурировании, сформулированная итальянскими математиками К.Бомом и Дж.Якопини в 1966 г. Теорема устанавливает, что как бы сложна ни была задача, схему алгоритм ее решения (и, соответственно, программу) всегда можно представить в виде композиции трех типов вложенных блоков: следования (begin-end – начало-конец), ветвления (if-then-else – если-то-иначе), циклов с предусловием (while – пока).

* Э.Дейкстра дал следующее определение: «Структурное программирование – это дисциплина, которую программист навязывает сам себе ».