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

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

Основная цель структурного программирования – повышение производительности программистов. Другими целями являются:

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

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

Структурное программирование (или метод пошаговой детализации) включает:

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

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

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

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



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

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

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


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

Функциональный блок алгоритма относится к простому типу блоков.

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

1) выполняется каждый блок;

2) каждый блок выполняется не более одного раза.

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

Поток управления, в котором выполняются оба указанных свойства, называется линейным.


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

2. Ветвящийся поток управления. В этом типе выполняется свойство (2), а свойство (1) не выполняется.

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

3. Циклический поток управления. Он организует многократное повторение функционального блока, пока логическое условие его выполнения остается истинным.

В данном типе потока управления выполняется свойство (1), но не выполняется свойство (2).


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

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

1. понятность и простота восприятия алгоритма;

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

3. модифицируемость.

Структурная теорема : любой алгоритм может быть сведен к структурному алгоритму.

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

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

1. Описание общего замысла алгоритма;

2. Формализация задачи;

3. Разработка обобщенной схемы алгоритма;

4. Разработка отдельных блоков алгоритма;

5. Стыковка блоков;

6. Определение возможности использования стандартных блоков;

7. Разработка блоков логического контроля;

8. Оптимизация схемы алгоритма;

9. Уточнение параметров;

10. Оценка машинного ресурса.

К концу 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) Императивное

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

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

Введение

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

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

История

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

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

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

Предпосылки и назначение структурного программирования .

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

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

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

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

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

Однако представление о структурном программировании, как о программировании без использования оператора GOTO, является ошибочным.

Например, Хоор определяет структурное программирование как "систематическое использование абстракции для управления массой деталей и способ документирования, который помогает проектировать программу".

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

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

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

Структурное программирование улучшает ясность и читабельность программ.

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

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

Наконец, структурное программирование призвано улучшить эффективность программ.

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

Основные критерии оценки качества программы для ЭВМ.

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

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

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

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

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

2. Минимальное время, затрачиваемое на тестирование и отладку программы. Тестирование и отладка программы – необходимый этап в процессе решения задачи на ЭВМ. Он занимает от трети до половины всего времени разработки программы, поэтому очень важно уменьшить время, затрачиваемое на тестирование и отладку.

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

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

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

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

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

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

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

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

6. Простота и эффективность. Программа должна быть просто организована.

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

Эффективность программы считается одной из главных ее характеристик.

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

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

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

Простой последовательности;

Условий или альтернатив;

Повторений, то есть циклов и итераций.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Begin S 1; S 2; ... Sn ; End

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

В языке Pascal

If P Then S 1 Else S 2;

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

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

While P Do S ;


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

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

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

If P Then S ;

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

Case P Of

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

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

Until P ;

7. Структура типа «цикл с параметром » (рис. 1.4г) – обеспечивает заранее определенное многократное выполнение действия 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 ;

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

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

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

Структурированность программы может нарушаться операторами безусловного перехода GoTo . Бессистемное употребление этих операторов является источником многих ошибок, а также затрудняет восприятие и тестирование программы. В свое время даже возник термин «программирование без goto ». Однако умеренное использование переходов в виде процедур break , continue и exit языка Pascal обычно упрощает программу.


Выводы

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

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

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

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


Похожая информация.