Структурное программирование – это метод, предполагающий создание улучшенных программ. Он служит для организации проектирования и кодирования программ таким образом, чтобы предотвратить большинство логических ошибок и обнаружить те, которые допущены.
Используя язык высокого уровня (такой как Фортран) программисты могли писать программы до несколько тысяч строк длиной. Однако язык программирования, легко понимаемый в коротких программах, когда дело касается больших программ, становится нечитабельным (и неуправляемым). Избавление от таких неструктурированных программ пришло после создания в 1960 году языков структурного программирования. К ним относятся языки Алгол, Паскаль и С.
Структурное программирование подразумевает точно обозначенные управляющие структуры, программные блоки, отсутствие инструкций GOTO, автономные подпрограммы, в которых поддерживается рекурсия и локальные переменные. Главным в структурном программировании является возможность разбиения программы на составляющие ее элементы. Используя структурное программирование, средний программист может создавать и поддерживать программы свыше 50000 строк длиной.
Структурное программирование
Структурное программирование тесно связано такими понятиями как «нисходящее проектирование» и «модульное программирование».
Метод нисходящего проектирования предполагает последовательное разложение функции обработки данных на простые функциональные элементы («сверху-вниз»).
В результате строится иерархическая схема, отражающая состав и взаимоподчиненость отдельных функций, которая носит название функциональная структура алгоритма (ФСА) приложения.
Функциональная структура алгоритма приложения разрабатыается в следующей последовательности:
1) определяются цели автоматизации предметной области и их иерархия;
2) устанавливается состав приложений (задач обработки), обеспечивающих реализацию поставленных целей;
3) уточняется характер взаимосвязи приложений и их основные характеристики (информация для решения задач, время и периодичность решения и др.);
4) определяются необходимые для решения задач функции обработки данных;
5) выполняется декомпозиция функций обработки до необходимой структурной сложности, реализуемой предполагаемым инструментарием.
Подобная структура приложения отражает наиболее важное – состав и взаимосвязь функций обработки информации для реализации приложений, хотя и не раскрывает логику выполнения каждой отдельной функции, условия или периодичность их вызовов.
Разложение должно носить строго функциональный характер, т.е. отдельный элемент ФСА должен описывать законченную содержательную функцию обработки информации, которая предполагает определенный способ реализации на программном уровне.
Модульное программирование основано на понятии модуля – логически взаимосвязанной совокупности функциональных элементов, оформленных в виде отдельных программных модулей. Модульное программирование рассматривается в разд 7.
Структурное программирование состоит в получении правильной программы из некоторых простых логических структур. Оно базируется на строго доказанной теореме о структурировании, которая утверждает, что любую правильную программу (с одним входом, одним выходом, без зацикливания и недостижимых команд) можно написать с использованием только следующих основных логических структур:
Основы программирования #4 Структурное программирование
· циклической (цикл, или повторение).
Эта теорема была сформулирована в 1966 г. Боймом и Якопини (Corrado Bohm, Guiseppe Jacopini). Главная идея теоремы – преобразовать каждую часть программы в одну из трех основных структур или их комбинацию так, чтобы неструктурированная часть программы уменьшилась. После достаточного числа таких преобразований оставшаяся неструктурированной часть либо исчезнет, либо становится ненужной. В теореме доказывается, что в результате получится программа, эквивалентная исходной и использующая лишь упоминавшиеся основные структуры.
Комбинации правильных программ, полученные с использованием этих трех основных структур, также являются правильными программами. Применяя итерацию и вложение основных структур, можно получить программу любого размера и сложности. При использовании только указанных структур отпадает необходимость в безусловных переходах и метках. Поэтому иногда структурное кодирование понимают в узком смысле как программирование без «GOTO».
В алгоритмическом языке С (С++) для реализации структурного кодирования используются следующие операторы:
· объявление (только в С++).
Структура «следование» (рис. 5.1, а) реализуется составным оператором, оператором-выражение, asm-оператором и др.
Составной оператор, или блок, представляет собой список (возможно, пустой) операторов, заключенных в фигурные скобки . Синтаксически блок рассматривается как единый оператор, но он влияет на контекст идентификаторов, объявленных в нем. Блоки могут иметь любую глубину вложенности.
Оператор-выражение представляет собой выражение, за которым следует точка с запятой. Его формат следующий:
Компилятор языка C++ выполняет операторы-выражения, вычисляя выражения. Все побочные эффекты от этого вычисления завершаются до начала выполнения следующего оператора. Большинство операторов-выражений представляют собой операторы присваивания или вызовы функций (например, printf(), scanf() ). Особым случаем является пустой оператор, состоящий из одной точки с запятой (;). Пустой оператор не выполняет никаких действий. Однако он полезен в тех случаях, когда синтаксис C++ ожидает наличия некоторого оператора, но по программе он не требуется (например, бесконечный цикл for ).
Asm-операторы обеспечивают программирование на уровне ассемблера (использование указателей, побитовые операции, операции сдвига и т.д.). Используя ассемблерный язык для обработки подпрограмм критических ситуаций, многократно повторяющихся операций, можно повысить скорость оптимизации без какого-либо усовершенствования языка высокого уровня.
Структура «развилка» (рис. 5.1, б, в) реализуется операторами выбора. Операторы выбора, или операторы управления потоком, выполняют выбор одной из альтернативных ветвей программы, проверяя для этого определенные значения. Существует два типа операторов выбора: if…else и switch.
Базовый оператор if (рис. 5.1, б) имеет следующий формат:
Рис. 5.1. Структуры, используемые при разработке программ:
а – «следование»; б – «развилка» на две ветви; в – «развилка» на n ветвей; г – «повторение»
Язык C++ в отличие от, например, языка Паскаль не имеет специального булевого типа данных. В условных проверках роль такого типа может играть целочисленная переменная или указатель на тип. Условное_выражение должно быть записано в круглых скобках. Это выражение вычисляется. Если оно является нулевым (или пустым в случае типа указателя), мы говорим, что условное_выражение ложно (false); в противном случае оно истинно (true).
Если предложение else отсутствует, а условное_выражение дает значение «истина», то выполняется оператор_если_»истина»; в противном случае он игнорируется.
Если задано предложение оператор_если_»ложь», а условное_выражение дает значение «истина», то выполняется оператор_если_»истина»; в противном случае выполняется оператор_если»ложь».
Преобразования указателей выполняются таким образом, что значение указателя всегда может быть корректно сравнено с выражением типа константы, дающим 0. Таким образом, сравнение для пустых указателей может быть сделано в виде:
if (!ptr)… или if (ptr = = 0)….
Оператор_если_»ложь» и оператор_если_»истина» сами могут являться операторами if, что позволяет организовывать любую глубину вложенности условных проверок. При использовании вложенных конструкций if…else следует быть внимательным и обеспечивать правильный выбор выполняемых операторов. Любая неоднозначность конструкции «else» разрешается сопоставлением else с последним найденным на уровне данного блока if без else.
if (x == 1)
if (y == 1) puts(«x=1 и y=1»);
else puts(«x != 1»);
дает неверное решение, так как else, независимо от стиля записи, сопоставляется не с первым, а со вторым if. Поэтому правильная запись последней строчки должна быть такой:
else puts(«x=1 и y!=1»);
Однако с помощью фигурных скобок можно реализовать и первую конструкцию:
if (y = = 1) puts(«x = и y=1»);
else puts(«x != 1»); // правильное решение
Оператор switch (см. рис. 5.1, в) использует следующий базовый формат:
switch (переключающее_выражение) case_оператор;
Он позволяет передавать управление одному из нескольких операторов с меткой case в зависимости от значения переключающего_выражения. Любой оператор в case_операторе (включая пустой оператор) может быть помечен одной (или более) меткой варианта:
case константное_выражение_i : case_оператор_i;
где каждое константное_выражение_i должно иметь уникальное целочисленное значение (преобразуемое к типу переключающего_выражения) в пределах объемлющего оператора switch.
Допускается иметь в одном операторе switch повторяющиеся константы case.
Оператор может иметь также не более одной метки default:
После вычисления переключающего_выражения выполняется сопоставление результата с одним из константных_выражений_i.
Если найдено соответствие, то управление передается case_оператору_i с меткой, для которой найдено соответствие. Если соответствия не найдено и имеется метка default, то управление передается оператору_умолчания. Если соответствие не найдено, а метка default отсутствует, то никакие операторы не выполняются. Для того чтобы остановить выполнение группы операторов для конкретного варианта, следует использовать оператор break.
void main(void)
case red: puts(«Stop! Color is red»); break;
case yellow: puts(«Warning! Color is yellow»); break;
case green: puts(«Go! Color is green»); break;
default: puts(«No working»); break;
Структура «повторение» (см. рис. 5.1, г) реализуется операторами итерации. Операторы итерации позволяют организовывать циклическое выполнение набора операторов программы. Язык C++ имеет три формы операторов итерации: циклы while, do и for. Общий формат оператора while следующий:
while (условное_выражение) оператор_пока_»истина»;
Оператор_пока_»истина» будет циклически повторяться до тех пор, пока вычисление условного_выражения не даст значения ноль (ложь). Условное_выражение вычисляется и проверяется первым. Если это значение ненулевое (истина), то выполняется оператор_пока_»истина». Если не встречен оператор перехода, выполняющий выход из цикла, то условное_выражение вычисляется снова. Цикл повторяется до тех пор, пока условное_выражение не даст значения 0.
Как и в случае оператора if, выражения типа указателя могут сравниваться с пустым указателем, так что while (ptr) … эквивалентно while (ptr != NULL)…
Цикл while представляет собой удобный способ сканирования строк и других заканчивающихся пустым символом структур данных. Например:
char str[10]=»Borland»;
while (*ptr++) // цикл до конца строки
count++;
При отсутствии операторов перехода оператор_пока_»истина» должен некоторым способом воздействовать на значение условного_выражения, либо последнее должно изменяться во время его вычисления, чтобы предотвратить зацикливание.
Общий формат оператора do while следующий:
do выполняемый_оператор while (условное_выражение);
Выполняемый_оператор циклически повторяется до тех пор, пока вычисление условного_выражения не даст 0 (ложь). Главное отличие этого оператора от оператора while состоит в том, что условное_выражение здесь проверяется не до, а после первого выполнения тела цикла. Гарантировано как минимум одно его выполнение.
Формат оператора for в языке С следующий:
В языке С++ может быть как выражением, так и объявлением.
Последовательность действий при выполнении данного оператора следующая:
1) выполняется вычисление выражения_инициализации, если таковое задано. Как следует из его названия, это выражение обычно инициализирует один или несколько счетчиков цикла, но его синтаксис в действительности позволяет любую степень сложности (включая объявления в случае языка С++);
2) выражение_проверки вычисляется по правилам, приводимым для циклов while. Если выражение_проверки ненулевое (истина), то оператор тела цикла выполняется. Пустое выражение трактуется в данном случае как while(1), то есть, как если бы условие проверки выполнялось всегда. Если выражение_проверки дает значение ноль (ложь), то цикл for прекращается;
3) выражение_инкремента выполняет приращения одного или нескольких цикловых счетчиков;
4) выражение «оператор» (возможно, пустое) вычисляется, после чего управление возвращается на шаг 2.
Если какие-либо из опциональных элементов опущены, то вместо них должны быть заданы соответствующие точки с запятой, например:
// то же, что и for (;1;) – вечный цикл
Правила для операторов for в языке С применимы и в языке С++. Однако выражение_инициализации в языке С++ может также включать в себя и объявление. Контекст объявленного идентификатора продолжается до конца данного оператора, не далее. Например:
for (int i = 1; i j; ++i)
if (i …) … // здесь обращаться к значению i можно
if (i …) // а здесь нельзя : i вне контекста
Использование операторов итерации рассмотрим позже.
При изменении порядка выполнения операторов используются операторы перехода, реализуемые в структурах «развилка» и «повторение». Существует четыре таких оператора: break, continue, goto и return.
Синтаксис оператора break следующий:
Его можно использовать только внутри операторов итерации (while, do и for – циклы) или с оператором switch. Он прекращает выполнение итерации или оператора switch. Поскольку операторы итерации и оператор switch могут комбинироваться и иметь любую глубину вложенности, следует обращать особое внимание на то, чтобы оператр break выполнял выход именно из нужного цикла или оператора switch. Сущеествует правило, которое состоит в том, что оператор break заканчивает выполнение ближайшего к нему объемлющего цикла итерации или оператора switch.
Синтаксис оператора continue следующий:
Он может быть использован только внутри оператора итерации и передает управление на проверку условия циклов while и do, либо на выражение инкремента цикла for. При вложенности циклов итерации оператор continue считается принадлежащим ближайшей объемлющей итерации.
Синтаксис оператора goto следующий:
Оператор goto передает управление оператору, имеющему указанную «метку», которая должна находиться в пределах той же функции.
Оператор с меткой имеет имя (метку), поэтому к нему можно обращаться с помощью оператора безусловного перехода goto. Формат оператора с меткой:
Идентификатор_метки : оператор;
Идентификатор метки используется оператором goto безусловного перехода. Идентификаторы меток имеют свое собственное пространство имен в контексте функции. Язык С++ дает возможность устанавливать метки любому oператору. Например, бесконечный цикл
printf(«nУкажите значение N (меньше 32766) > «);
можно записать с использованием метки следующим образом:
met: printf(«nУкажите значение N (меньше 32766) > «);
if(N>32766) goto met;
В языке С++ допустимо обойти объявление с явным или неявным инициализатором, если это объявление не находится во внутреннем блоке, который также обходится.
Если тип возврата функции не равен void, то тело функции должно содержать как минимум один оператор return следующего формата:
return выражение_возврата;
где выражение_возврата должно быть типа type или типа, преобразуемого при присвоении к типу, заданному type. Значение выражения возврата и есть значение, возвращаемое данной функцией.
Выполнение вызова функции заканчивается, когда встретился оператор return; если оператор return отсутствует, то выполнение «проваливается» к последней закрыващей фигурной скобке тела функции.
Если тип возврата void, то оператор return можно записать без выражения_возврата, либо оператор return вообще может быть опущен, например:
Наконец, в языке С++ можно использовать объявления объектов внутри блоков, что дает возможность более рационально расходовать оперативную память ЭВМ.
Найти все натуральные числа, не превосходящие заданного N и равные сумме кубов его цифр.
При разработке алгоритма программы перечислим объекты, необходимые для решения данной задачи:
· N – заданное пользователем число. Ограничим его значением, максимально-допустимым форматом int, т.е. значением 32766. Однако чтобы выполнить проверку на ограничение, объявим его как unsigned int;
· u – текущее натуральное число, не превосходящее N. Из этого числа выделим цифры, каждую из которых возведем в куб и найдем сумму кубов;
· mas[5] – создадим массив из пяти элементов (максимальное число 32766 имеет пять разрядов) для хранения каждой цифры числа u. Объявим его как int;
· b – текущий номер цифры числа u при их выделении. Нумерация начинается с нуля, количество цифр числа u равно: b – 1. Объявим ее как int;
· sum – переменная, где ведется расчет суммы кубов цифр mas[i]. При обращении к ней необходимо её инициализировать нулем. Примем тип переменной – int;
· i – индексная переменная, изменяемая от 0 до b. Имеет тип int.
Алгоритм решения этой задачи следующий:
1) запрашивается значение числа N и проверяется его диапазон. Если N больше допустимого, то запрос повторяется;
2) организуется цикл переменной u от 1 до N;
3) расписываются цифры числа u в обратном порядке в массив mas ( в mas[0] – младший разряд, mas[b] – старший);
4) подсчитывается сумма кубов всех цифр, записанных в mas[0]-mas[b] в поле sum;
5) выполняется сравнение (u==sum). Если переменные равны, то выводятся результаты на печать, в противном случае меняется число u (u=u+1).
Программа для нашего примера на языке С будет иметь вид:
// Пример 2: Циклы for, while, структурное программирование
void main(void)
unsigned int N;
int u,b,sum,i,mas[5];
printf(«nУкажите значение N (меньше 32766) > «);
Источник: libraryno.ru
Лекция №1. Структурный подход к программированию
Программирование — сравнительно молодая и быстро развивающаяся отрасль науки и техники. Опыт ведения реальных разработок и совершенствования имеющихся программных и технических средств постоянно переосмысливается, в результате чего появляются новые методы, методологии и технологии, которые, в свою очередь, служат основой более современных средств разработки программного обеспечения. Исследовать процессы создания новых технологий и определять их основные тенденции целесообразно, сопоставляя эти технологии с уровнем развития программирования и особенностями имеющихся в распоряжении программистов программных и аппаратных средств.
Технологией программирования называют совокупность методов и средств, используемых в процессе разработки программного обеспечения. Как любая другая технология, технология программирования представляет собой набор технологических инструкций, включающих:
- указание последовательности выполнения технологических операций;
- перечисление условий, при которых выполняется та или иная операция;
- описания самих операций, где для каждой операции определены исходные данные, результаты, а также инструкции, нормативы, стандарты, критерии и методы оценки и т. п.
Кроме набора операций и их последовательности, технология также определяет способ описания проектируемой системы, точнее модели, используемой на конкретном этапе разработки.
Объектно-ориентированное программирование (ООП) определяется как технология создания сложного программного обеспечения, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного типа (класса), а классы образуют иерархию с наследованием свойств. Взаимодействие программных объектов в такой системе осуществляется путем передачи сообщений.
Основным достоинством объектно-ориентированного программирования по сравнению с модульным программированием является «более естественная» декомпозиция программного обеспечения, которая существенно облегчает его разработку. Это приводит к более полной локализации данных и интегрированию их с подпрограммами обработки, что позволяет вести практически независимую разработку отдельных частей (объектов) программы. Кроме этого, объектный подход предлагает новые способы организации программ, основанные на механизмах наследования, полиморфизма, композиции, наполнения. Эти механизмы позволяют конструировать сложные объекты из сравнительно простых. В результате существенно увеличивается показатель повторного использования кодов и появляется возможность создания библиотек классов для различных применений.
Бурное развитие технологий программирования, основанных на объектном подходе, позволило решить многие проблемы. Так были созданы среды, поддерживающие визуальное программирование, например, Delphi, C++ Builder, Visual C++ и т. д. При использовании визуальной среды у программиста появляется возможность проектировать некоторую часть, например, интерфейсы будущего продукта, с применением визуальных средств добавления и настройки специальных библиотечных компонентов. Результатом визуального проектирования является заготовка будущей программы, в которую уже внесены соответствующие коды.
Можно дать обобщающее определение: объект ООП — это совокупность переменных состояния и связанных с ними методов (операций). Упомянутые методы определяют, как объект взаимодействует с окружающим миром.
Под методами объекта понимают процедуры и функции, объявление которых включено в описание объекта и которые выполняют действия. Возможность управлять состояниями объекта посредством вызова методов в итоге и определяет поведение объекта. Эту совокупность методов часто называют интерфейсом объекта.
Структурное программирование (СП) возникло как вариант решения проблемы уменьшения СЛОЖНОСТИ разработки программного обеспечения.
В начале эры программирования работа программиста ничем не регламентировалась. Решаемые задачи не отличались размахом и масштабностью, использовались в основном машинно-ориентированные языки и близкие к ним язык типа Ассемблера, разрабатываемые программы редко достигали значительных размеров, не ставились жесткие ограничения на время их разработки.
По мере развития программирования появились задачи, для решения которых определялись ограниченные сроки все более сложных задач с привлечением групп программистов. И как следствие, разработчики столкнулись с тем, что методы, пригодные для разработки небольших задач, не могут быть использованы при разработке больших проектов в силу сложности последних.
Таким образом, цель структурного программирования — повышение надежности программ, обеспечение сопровождения и модификации, облегчение и ускорение разработки.
Методология структурного императивного программирования — подход, заключающийся в задании хорошей топологии императивных программ, в том числе отказе от использования глобальных данных и оператора безусловного перехода, разработке модулей с сильной связностью и обеспечении их независимости от других модулей.
Подход базируется на двух основных принципах:
· Последовательная декомпозиция алгоритма решения задачи сверху вниз.
· Использование структурного кодирования.
Напомним, что данная методология является важнейшим развитием императивной методологии.
Происхождение, история и эволюция. Создателем структурного подхода считается Эдсгер Дейкстра. Ему также принадлежит попытка (к сожалению, совершенно неприменимая для массового программирования) соединить структурное программирование с методами доказательства правильности создаваемых программ. В его разработке участвовали такие известные ученые как Х. Милс, Д.Э. Кнут, С. Хоор.
Методы и концепции, лежащие в основе структурного программирования. Их три
Метод алгоритмической декомпозиции сверху вниз — заключается в пошаговой детализации постановки задачи, начиная с наиболее общей задачи. Данный метод обеспечивает хорошую структурированность. Метод поддерживается концепцией алгоритма.
Метод модульной организации частей программы — заключается в разбиении программы на специальные компоненты, называемые модулями. Метод поддерживается концепцией модуля.
Метод структурного кодирования — заключается в использовании при кодировании трех основных управляющих конструкций. Метки и оператор безусловного перехода являются трудно отслеживаемыми связями, без которых мы хотим обойтись. Метод поддерживается концепцией управления
Структурные языки программирования. Основное отличие от классической методологии императивного программирования заключается в отказе (точнее, той или иной степени отказа) от оператора безусловного перехода.
«Важным для программиста свойством синтаксиса является возможность отразить в структуре программы структуру лежащего в ее основе алгоритма. При использовании для построения программы метода, известного под названием структурное программирование, программа конструируется иерархически — сверху вниз (от главной программы к подпрограммам самого нижнего уровня), с употреблением на каждом уровне только ограниченного набора управляющих структур: простых последовательностей инструкций, циклов и некоторых видов условных разветвлений. При последовательном проведении этого метода структуру результирующих алгоритмов легко понимать, отлаживать и модифицировать. В идеале у нас должна появиться возможность перевести построенную таким образом схему программы прямо в соответствующие программные инструкции, отражающие структуру алгоритма.»
Теорема о структурировании (Бёма-Джакопини (Boem-Jacopini)): Всякую правильную программу (т.е. программу с одним входом и одним выходом без зацикливаний и недостижимых веток) можно записать с использованием следующих логических структур — последовательность, выбора и повторение цикла
Следствие 1: Всякую программу можно привести к форме без оператора goto.
Следствие 2: Любой алгоритм можно реализовать в языке, основанном на трех управляющих конструкциях -последовательность, цикл, повторение.
Следствие 3: Сложность структурированных программ ограничена, даже в случае их неограниченного размера.
Структурное программирование- это не самоцель. Его основное назначение- это получение хорошей («правильной») программы, однако даже в самой хорошей программе операторы перехода goto иногда нужны: например — выход из множества вложенных циклов.
Практически на всех языках, поддерживающих императивную методологию, можно разрабатывать программы и по данной методологии. В ряде языков введены специальные заменители оператора goto, позволяющие облегчить управление циклами (например, Break и Continue в языке C).
Класс задач. Класс задач для данной методологии соответствует классу задач для императивной методологии. Заметим, что при этом удается разрабатывать более сложные программы, поскольку их легко воспринимать и анализировать.
Источник: megaobuchalka.ru
Презентация на тему Основы конструирования программ. Лекция 2. Методология структурного программирования
Лекция 2: Методология структурного программирования План лекции: 1.Спагетти-код: использование оператора безусловного перехода goto. 2.Методология структурного программирования: основные принципы. 3.Методология структурного программирования: создание модульной структуры программы. 4.Методология структурного
- Главная
- Информатика
- Основы конструирования программ. Лекция 2. Методология структурного программирования
Слайды и текст этой презентации
Слайд 1
Основы конструирования программ
Белорусский государственный университет информатики и
радиоэлектроники
Кафедра инженерной психологии и эргономики
Преподаватель:
Слайд 2
Лекция 2: Методология структурного программирования
использование оператора безусловного перехода goto.
2.Методология структурного программирования:
основные принципы.
3.Методология структурного программирования: создание модульной структуры программы.
4.Методология структурного программирования: нисходящее проектирование алгоритма.
5.Методология структурного программирования: восходящее проектирование алгоритма.
Слайд 3
Неструктурные языки программирования
Изначально программы создавались так, чтобы
задействовать минимум основной памяти и решить требуемую
задачу за кратчайшее время.
Особенностью таких программ являлось множественное использование оператора безусловного перехода goto (аналог – jump в языках ассемблера).
Подобные программы – слабо структурированные и трудные для понимания – получили название спагетти-код: ход выполнения такой программы похож на миску спагетти, то есть извилистый и запутанный.
Спагетти-код – самый распространённый антипаттерн программирования.
Слайд 4
Пояснение: Паттерны проектирования
Паттернами (шаблонами) проектирования (Design Patterns)
называют решения часто встречающихся проблем в области
разработки программного обеспечения.
Паттерны проектирования не являются готовыми решениями, которые можно трансформировать непосредственно в код, а представляют общее описание решения проблемы, которое можно использовать в различных ситуациях.
Основная польза от использования шаблонов состоит в снижении сложности разработки за счёт готовых абстракций для решения целого класса проблем.
Слайд 5
Пояснение: Оператор безусловного перехода goto
осуществляет переход к определённой точке программы, обозначенной
номером строки либо меткой. Далее исполняются операторы программы, идущие в тексте непосредственно после метки.
Слайд 6
Пояснение: Оператор безусловного перехода goto
Некоторые способы применения
goto могут создавать проблемы с логикой исполнения
Переход в точку программы, расположенную после инициализации какой-либо переменной, приведёт к тому, что для этой переменной будет использовано некоторое случайное значение, которое находилось в памяти.
Слайд 7
Пояснение: Оператор безусловного перехода goto
Некоторые способы применения
goto могут создавать проблемы с логикой исполнения
Передача управления внутрь тела цикла (процедуры или функции) приводит к пропуску кода инициализации цикла (выделение памяти под локальные переменные) и первоначальной проверки условия.
Слайд 8
Пояснение: Оператор безусловного перехода goto
Оператор goto в
языках высокого уровня является объектом критики, поскольку
чрезмерное его применение приводит к созданию нечитаемого «спагетти-кода».
Формально доказано (теорема Бёма — Якопини), что применение goto не является обязательным, то есть не существует такой программы с goto, которую нельзя было бы переписать без него с полным сохранением функциональности (однако, возможно, с потерей эффективности).
Слайд 9
Пояснение: Оператор безусловного перехода goto
Блок кода
for (int j=0; j
Слайд 10
Пояснение: Оператор безусловного перехода goto
flag = false;
// Блок кода
i++) <
for (int j=0; j
Слайд 11
Методология структурного программирования
Спагетти-код может быть отлажен и
работать правильно и с высокой производительностью, но
он крайне сложен в сопровождении и развитии. Доработка спагетти-кода для добавления новой функциональности иногда несет значительный потенциал внесения новых ошибок.
Исходя из проблем, связанных с программами спагетти-кода, программисты 70-х годов Э.Дейкстра и Н.Вирт разработали строгие правила разработки программ, которые получили название “Методология структурного программирования”.
Слайд 12
Принципы структурного программирования
1.Программа (алгоритм) должна разделяться на
независимые части, называемые модулями. Модуль – это
последовательность логически связанных операций, оформленных как отдельная часть программы.
2.Модуль имеет одну входную и одну выходную точку (в отличие от программ с множественным использованием оператора goto).
3.В модуле используются только три базовые управляющие конструкции (следование, ветвление, цикл).
Теорема Бёма — Якопини (1965 год), или «Теорема о структурном программировании»: Любая программа, заданная в виде блок-схемы, может быть представлена с помощью трех управляющих структур: последовательность, ветвление, цикл.
Слайд 13
Принципы структурного программирования
4.В программе базовые управляющие конструкции
могут быть вложены друг в друга произвольным
образом. Никаких других средств управления последовательностью выполнения операций не предусматривается (т.е. от использования оператора безусловного перехода goto следует отказаться).
5.Повторяющиеся фрагменты программы можно оформить в виде подпрограмм (процедур и функций). Таким же образом (в виде подпрограмм) можно оформить логически целостные фрагменты программы, даже если они не повторяются.
6.Разработка программы ведётся пошагово, методом «сверху вниз» (нисходящее проектирование).
Слайд 14
Методология структурного программирования
Использование модулей имеет следующие преимущества:
создания программы несколькими программистами;
простота проектирования и
последующей модификаций программы;
возможность использования готовых библиотек наиболее употребительных модулей.
Слайд 15
Достоинства структурного программирования
повышается надежность программ (благодаря хорошему
структурированию при проектировании программа легко поддается тестированию
и не создает проблем при отладке);
повышается эффективность программ (структурирование программы позволяет легко находить и корректировать ошибки, а отдельные подпрограммы можно переделывать (модифицировать) независимо от других);
уменьшается время и стоимость программной разработки;
улучшается читабельность программ.
Слайд 16
Конструирования ПО в контексте
методологии структурного программирования
ПО =
детальное проектирование + программирование
языков программирования:
Детальное проектирование =
анализ задачи + разработка алгоритма
Конструирование ПО в соответствии с методологией структурного программирования:
анализ задачи → создание модульной структуры ПО,
разработка алгоритма → метод нисходящего проектирования.
Слайд 17
Конструирования ПО в контексте
методологии структурного программирования:
анализ
задачи
Анализ задачи – это исследование объектов или
явлений, путем изучения составляющих его элементов.
Анализ задачи при разработке ПО включает:
установление входных и выходных данных;
разработку основных решений, приводящих от входных к выходным данным;
выделение модулей, необходимых для выполнения задачи (реализация методологии структурного программирования);
определение методов частных решений для выделенных модулей.
Основным результатом анализа задачи является создание модульной структуры ПО.
Слайд 18
Конструирования ПО в контексте
методологии структурного программирования:
разработка
алгоритма
Для построения структурированных блок-схем в рамках методологии
структурного программирования была разработана специальная технология – нисходящее проектирование, которая состоит в пошаговой детализации (декомпозиции, разложении) задачи на подзадачи.
Пошаговая детализация представляет собой процесс дробления задачи на подзадачи, установления логических связей между ними.
После этого переходят к уточнению выделенных подзадач.
Этот процесс детализации продолжается до уровня, позволяющего достаточно легко реализовать подзадачу на выбранном языке программирования.
Слайд 19
Разработка алгоритма: нисходящее проектирование
Слайд 20
Разработка алгоритма: нисходящее проектирование
При пошаговой детализации используется
принцип замещения, который состоит в замене любого
функционального блока (прямоугольника) блок-схемы некоторой базовой структурой (следование, ветвление, повторение).
Слайд 21
Пример. Построить структурированную
блок-схему алгоритма
для вычисления
функции:
Слайд 22
Разработка алгоритма: нисходящее проектирование
Алгоритмы большой сложности обычно
представляются с помощью схем двух видов:
алгоритма — раскрывающей общий принцип функционирования алгоритма и основные логические связи между отдельными модулями на уровне типовых процессов обработки информации (ввод и редактирование данных, вычисления, печать результатов и т.п.);
Слайд 23
Типовая структура программы, разработанной в соответствии со
структурной методологией
Слайд 24
Разработка и отладка программы,
созданной в соответствии
с принципами
структурного программирования
Можно разработать тест основной
программы таким образом, чтобы вместо каждого связного логического фрагмента вставлялся вызов подпрограммы, которая будет выполнять этот фрагмент. Вместо настоящих, работающих подпрограмм, в программу вставляются фиктивные части — заглушки, которые, говоря упрощенно, ничего не делают.
Затем заглушки заменяются или дорабатываются до настоящих полнофункциональных фрагментов (модулей).
Разработка заканчивается тогда, когда не останется ни одной заглушки. Полученная программа проверяется и отлаживается.
Слайд 25
Разработка и отладка программы,
созданной в соответствии
с принципами
структурного программирования
Такой процесс отладки дает
на каждом уровне два важных результата:
возможность отладки уже готовых частей программы;
возможность отладки взаимодействия подзадач, т.е. логики передачи данных между ними.
При этом то, что уже отлажено, далее меняться не должно, и все усилия можно сосредоточить на раскрытии еще не решенных подзадач.
Слайд 26
Разработка алгоритма: восходящее проектирование
Восходящее проектирование – методика
разработки программ, при которой крупные блоки собираются
из ранее созданных мелких блоков.
Случаи восходящего проектирования:
1.Разработчик ясно представляет направление поиска, но не знает заранее, как далеко он сможет продвинуться к цели.
2.Нет возможности предвидеть объем ресурсов для достижения того или иного результата.
3.Разработка не поддается детальному планированию, она ведется методом проб и ошибок.
Источник: thepresentation.ru