Телевизоры. Приставки. Проекторы и аксессуары. Технологии. Цифровое ТВ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



Похожие публикации