Гид компьютерного мира - Информационный портал
  • Главная
  • Ошибки
  • Структурный подход к программированию. Структурное программирование

Структурный подход к программированию. Структурное программирование

Программирование - процесс составления программ (перевода алгоритма на язык программирования).

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

В настоящее время “язык программирования” и “алгоритмический язык” часто выступают как синонимы.

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

Нисходящее пошаговое проектирование;

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

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

Сквозной структурный контроль.

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

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

Каждая структура должна иметь один вход и один выход. На каждом шаге нисходящего проектирования следует составлять алгоритм одного из трех указанных видов (рис. 7.2).

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

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

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

а). Линейная: б). Разветвление: в). Ветвление с

вырожденной ветвью:

С предусловием: - с постусловием: - с известным числом повторов:

Рис. 7.2. Виды управляющих структур

Языки программирования

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

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

Недостатки программирования на машинном языке:

Большие трудозатраты при записи программы;

Сложность процесса отладки программ;

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

Язык связан с конкретным типом ЭВМ.

Преимущества:

Высокая эффективность программ;

Возможность использования всех ресурсов аппаратуры ЭВМ.

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

Преимущества Ассемблера:

Символическая адресация;

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

Наличие средств контроля ошибок;

Достаточно высокая эффективность программ;

Использование всех возможностей ЭВМ.

Недостатки:

Излишняя детализация записи программ;

Отсутствие контроля за обращением к элементам памяти.

Языки высокого уровня не содержат машинно-зависимых операторов. Языки этого типа: Фортран, Алгол, Бейсик, Фокал, Пл/1, Паскаль, Кобол и др.

Достоинства программирования на этих языках:

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

Простота эксплуатации программ;

Возможность переноса программ с одной машины на другую (т.е. универсальность).

Недостатки:

Пониженная по сравнению с языками низкого уровня эффективность программ;

Не всегда оптимальное и полное использование ресурсов ЭВМ;

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

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

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

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

1.2. Основные свойства алгоритма.

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

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

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

  5. Результативность и конечность алгоритма.
  6. Свойство алгоритма, означающее, что алгоритм должен всегда приводить к результату через конечное число шагов.

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

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

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

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

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

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

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

Можно сформулировать общие правила построения алгоритма задачи:

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

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

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

1. Обеспечить проверку выполнения всех операций алгоритма;
2. Свести количество вычислений к минимуму.

2.1 Нисходящее пошаговое проектирование

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

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

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

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

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

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

· нисходящее программирование – способ разработки программ, при котором программи­рование ведется методом «сверху-вниз», от общего к деталям;

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

· использование при программировании трех структур управления (следование, выбор, повторение). Структура следование предполагает естественную последовательность выполнения операторов. Структура выбор задается схемой «если – то – иначе» (условный оператор if). Структуре повторения сопоставлен оператор цикла;

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

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

Следование– это линейная последовательность действий (рис. 2.6):

Рис. 2.6. Следование

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

Ветвление алгоритмическая альтернатива. Управление передается одному из двух блоков в зависимости от истинности или ложности условия. Затем происходит выход на общее продолжение (рис. 2.7):

Рис. 2.7. Ветвление

Цикл повторение некоторой группы действий по условию. Различаются два типа цикла. Первый цикл с предусловием (рис. 2.8):

Рис. 2.8. Цикл с предусловием

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

Второй тип циклической структуры цикл с постусловием (рис. 2.9):

Рис. 2.9. Цикл с постусловием

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

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

Иногда в литературе структурное программирование называют программированием без goto. Действительно, при таком подходе нет места безусловному переходу. Неоправданное использование в программах оператора goto лишает ее структурности, а значит, всех связанных с этим положи­тельных свойств: прозрачности и надежности алгоритма. Хотя во всех процедурных языках программирования этот оператор присутствует, однако, придерживаясь структурного подхода, его употребления следует избегать.

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

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

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

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

Конструкции одного уровня вложенности записываются на одном вертикальном уровне (начинаются с одной позиции в строке);

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

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

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

«сверху вниз»: сначала строится основной алгоритм, затем вспомогательные алгоритмы;

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

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

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

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

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

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

Лекция 1. Объектно-ориентированное программирование.

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

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

Другими факторами, влияющими на эволюцию методов проектиро­вания и создания ПП, являются:

Изменение архитектур вычислительных средств (ВС) в интересах повышения
производительности, надежности;

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

Выделяют 5-ть источников сложности программирования:

Решаемая задача;

Язык программирования;

Среда выполнения программы;

Технологический процесс коллективной разработки и создания ПП;

Стремление к универсальности и эффективности алгоритмов и типов данных.

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

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

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


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

Теоретическое оформление структурный подход получил в нача­ле 70-х годов в работах теоретиков и практиков программирования(А.П.Ершова, Э. Йодана, Н.Вирта). Следует отметить появле­ние структурного программирования, в котором нашла определенное отражение идея упорядочивания структуры программы. Структурное программирование ориентирует на составление программ, структура которых близка к «дереву» опе­раторов или блоков. Использование структуры типа «дерево» в качестве своеоб­разного эталона объясняется тем, что это простая для анализа и реализации структура.

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

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

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

Развитие языков в направлении повышения эффективности составления приклад­ных программ привело к разделению языков по следующим уровням:

Низкий уровень (машинно-ориентированные языки - языки ассемблера),

Высокий уровень (процедурно-ориентированные языки: FORTRAN, ALGOL,

Уровень решаемой задачи (проблемно-ориентированные языки - SQL).

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

Результатом обобщения понятия «тип данных» являются классы объектов (C++), которые могут содержать в качестве эле­ментов не только данные определенного типа, но и методы их обработки (функ­ции).

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

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

Язык программирования позволяет описать свойства моделируемых объектов и порядок манипуляции с объектами или порядок их взаимодействия, сообразуясь с условиями решаемой задачи. Первые языки программирования ориентировались на математические объекты, на определенную модель вычислителя. Поэтому они содержали такие конструкции как переменная, константа, функция, формальные и факти­ческие параметры. Программисты представляли свои программы в виде взаимодей­ствующих функций и модулей. Характер програм­мирования был процедурно-ориентированным, поскольку первостепенное внимание уделялось последовательностям действий с данными. Соответственно такие языки программирования, как FORTRAN, PL-1, С называют процедурно-ориентированными.

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

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

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

Объектный подход начал развиваться в программировании с 70-х годов (Smalltalk, CLOS, Ada). Эти языки называются объектными . Иерархическая классификация объектов инаследование свойств являются отправными идеями появившегося в 80-х годах объектно-ориентированного подхода. Одной из причин сравнительно медленного становления объектно-ориентированного стиля программирования яв­ляется его существенное отличие от процедурно-ориентирован­ного стиля.

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

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

Основы структурного программирования. Теоретическим фундаментом структурного программирования является теорема о структурировании , из которой следует, что алгоритм (программа) решения любой практически вычислимой задачи может быть представлен с использованием трех элементарных базисных управляющих структур: структуры следования (последовательности); структуры ветвления, структуры цикла, изображенных на рис. 6.5-6.7 соответственно, где Р - условие, S - оператор.

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

Представляет фактор принятия решения, включает проверку некоторого логического условия Р и, в зависимости от результатов этой проверки, выполнение оператора S1 либо оператора S2. В языках программирования (например, Pascal) реализуется оператором if Р then SI else S2 (см. рис. 6.6).

Структура цикла (цикла с предусловием) представляет фактор повторяемости вычислений, обеспечивает многократное повторение выполнения оператора S, пока выполняется (истинно) логическое

Рис. 6.5. Структура следования

Рис. 6.6.

условие Р. В языках программирования (например, Pascal) реализуется оператором while Р do S (см. рис. 6.7).

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

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

Каждая из структур может рассматриваться как один функциональный блок с одним входом и одним выходом. Блоки S, SI, S2, входящие в состав базисных управляющих структур, сами могут быть одной из них, поэтому возможны вложенные конструкции. Однако, какова бы ни была степень и глубина «вложенности», важно, что любая конструкция в конечном итоге имеет один вход и один выход. Следовательно, любую сложную структуру можно рассматривать как «черный ящик» с одним входом и одним выходом. Таким образом, можно ввести преобразование любой структуры в функциональный блок. Тогда всякий алгоритм, составленный из стандартных структур, поддается последовательному преобразованию к единственному функциональному блоку, и эта последовательность преобразований может быть использована как средство понимания алгоритма и доказательства его правильности. Обратная последовательность преобразований может быть использована в процессе проектирования алгоритма с постепенным раскрытием единственного функционального блока в сложную структуру основных элементов.

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

Методика разработки программ. Распространены две методики (стратегии) разработки программ, относящиеся к структурному программированию: программирование «сверху вниз»; программирование «снизу вверх».

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

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

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

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

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

Лучшие статьи по теме