Letysite.ru

IT Новости с интернет пространства
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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

СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Используя язык высокого уровня (такой как Фортран) программисты могли писать программы до несколько тысяч строк длиной. Однако язык программирования, легко понимаемый в коротких программах, когда дело касается больших программ, становится нечитабельным (и неуправляемым). Избавление от таких неструктурированных программ пришло после создания в 1960 году языков структурного программирования. К ним относятся языки Алгол, Паскаль и С.

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

Структурное программирование тесно связано такими понятиями как «нисходящее проектирование» и «модульное программирование».

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

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

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

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

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

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

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

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

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

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

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

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

· циклической (цикл, или повторение).

Эта теорема была сформулирована в 1966 г. Боймом и Якопини (Corrado Bohm, Guiseppe Jacopini). Главная идея теоремы – преобразовать каждую часть программы в одну из трех основных структур или их комбинацию так, чтобы неструктурированная часть программы уменьшилась. После достаточного числа таких преобразований оставшаяся неструктурированной часть либо исчезнет, либо становится ненужной. В теореме доказывается, что в результате получится программа, эквивалентная исходной и использующая лишь упоминавшиеся основные структуры.

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

В алгоритмическом языке С (С++) для реализации структурного кодирования используются следующие операторы:

· объявление (только в С++).

Структура «следование»(рис. 5.1, а) реализуется составным оператором, оператором-выражение, asm-оператором и др.

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

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

Компилятор языка C++ выполняет операторы-выражения, вычисляя выражения. Все побочные эффекты от этого вычисления завершаются до начала выполнения следующего оператора. Большинство операторов-выражений представляют собой операторы присваивания или вызовы функций (например, printf(), scanf() ). Особым случаем является пустой оператор, состоящий из одной точки с запятой (;). Пустой оператор не выполняет никаких действий. Однако он полезен в тех случаях, когда синтаксис C++ ожидает наличия некоторого оператора, но по программе он не требуется (например, бесконечный цикл for ).

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

Структура «развилка» (рис. 5.1, б, в) реализуется операторами выбора. Операторы выбора, или операторы управления потоком, выполняют выбор одной из альтернативных ветвей программы, проверяя для этого определенные значения. Существует два типа операторов выбора: if. else и switch.

Базовый оператор if(рис. 5.1, б) имеет следующий формат:


Язык 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 (x = = 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.

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

«ГЛАВА I. СУТЬ ДЕДУКТИВНОГО МЕТОДА ХОЛМСА.

Шерлок Холмс взял с камина пузырек и вынул

из аккуратного сафьянового несессера…».

От общего к частному

· формулировка целей (результатов) работы программы;

· образное представление процессы ее работы (образная модель);

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

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

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

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

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

4. В образной модели выделяется наиболее существенная часть – «главное звено», для которой подбирается наиболее точная словесная формулировка;

5. Производится определение переменных, необходимых для формального представления данного шага алгоритма и формулируется их «смысл»;

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

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

Здесь мы видим много непривычного:

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

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

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

Как и любая технология, структурное проектирование задает лишь «правила игры», но не гарантирует получение результата. Основная проблема – выбор синтаксической конструкции и замена формулировок — все равно технологией формально не решается. И здесь находится камень преткновения начинающих программистов. «Главное звено» — это не столько особенности реализации алгоритма, которые всегда на виду и составляют его специфику, а действие, которое включает в себя все остальные. То есть все равно программист должен «видеть» в образной модели все элементы, отвечающие за поведение программы, и выделять из них главный, в смысле – самый внешний или объемлющий. Единственный совет: постараться извлечь из образной модели как можно больше фактического материала.

И, наконец, на практике

Заповеди структурного программирования

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

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

2. пошаговое проектирование ;

3. структурное проектирование (программирование без goto );

4. одновременное проектирование алгоритма и данных;

5. модульное проектирование ;

6. модульное, нисходящее, пошаговое тестирование.

Одним словом, структурное программирование — модульное нисходящее пошаговое проектирование и отладка алгоритма и структур данных .

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

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

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

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

· простая последовательности действий (блок);

· конструкция выбора (выбора) (условный оператор);

· конструкция повторения (оператор цикла).

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

Другое достоинство нисходящего проектирования: при обнаружении «тупика», то есть ошибки в логических рассуждениях можно вернуться на несколько уровней вверх и продолжить процесс проектирования в другом направлении.

Одно из трех

Обратим внимание на некоторые особенности процесса, которые остались за пределами «заповедей» и которые касаются содержательной стороны проектирования.

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

Читать еще:  Важнейшие аспекты информационной безопасности

// Запоминание простого числа в виде

// последовательности действий, связанных признаком

if ( pr ==0) A [ i ++]= v ; // Признак не установлен — запоминание

// Неструктурированный вариант – запись внутри цикла

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

· когда в формулировке присутствует слово ЕСЛИ, речь идет о условной конструкции (конструкции выбора);

· если в формулировке присутствуют обороты типа «для каждого… выполнить» или «повторять…пока», речь идет о циклической конструкции.

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

Программирование без goto .

if () goto retry;. // Попытаться сделать все сначала

if () goto fatal; > // Выйти сразу же к концу

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

if (A[i]==0) continue; //goto m1;

if (A[i]==-1) return; //goto m2;

m 2: . продолжение тела функции

Хотя такие конструкции нарушают чистоту подхода, все они имеют простые структурированные эквиваленты c с использованием дополнительных переменных – признаков.

int found; // Эквивалент с признаком обнаружения элемента

for (found=0, i=0; i

if (!found) A else B

При отсутствии в массиве элемента с заданным свойством выполняется A, в противном случае — B. Во втором фрагменте используется специальный признак для имитации оператора break.

Try Objective-с

сайта «Try Objective-c — программирование для начинающих»!

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

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

Сам процесс обучения программированию довольно трудоемок, но если у вас есть цель — то у вас все получится!

Заучивать весь представленный материал нет необходимости. Главное — чтобы вы понимали саму суть здесь изложенного.

  • Просмотров: 21785
  • Автор: Midav
  • Дата: 5-10-2012, 00:57

1.17 Типы программирования. Часть 1. Структурное программирование. Циклы

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

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

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

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

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

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

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

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

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

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

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

Рассмотрим основные моменты касающиеся структурного программирования.

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

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

1
Последовательное исполнение
— однократное выполнение операций в том порядке, в котором они записаны в тексте программы (сначала выполняется инструкция 1, затем инструкция 2, затем следующая. и так далее);

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

Условие — любое выражение
Оператор — любой допустимый оператор или блок операторов
Если условие истинно — оператор будет выполнен.
Если условие ложно — оператор будет пропущен

Условный оператор if может быть усложнен служебным словом else — иначе
Это слово позволяет получить законченность условного оператора if, которое будет выражаться так:

3
Цикл
— многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла — например производить увеличение числа на единицу, пока оно не станет равным, к примеру, 5).

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

— Выражение 1 — инициализация (выполняется только один раз в самом начале цикла)
— Выражение 2 — условие цикла (выполняется на каждом последующем витке цикла)
— Выражение 3 — приращение счетчика (выполняется на каждом последующем витке цикла после выполнения оператора)

циклы с предусловием (while)
сперва выполняется условие (проверяется его истинность или ложность) и только после этого выполняется сам цикл. Данный цикл может не выполниться ни разу если результатом проверки окажется «ложь».

Условие — любое выражение
Оператор — любой допустимый оператор или блок операторов

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

В программе циклы могут быть ВЛОЖЕННЫЕ друг в друга произвольным образом.

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

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

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

Например в программе мы можем какой либо переменной присвоить значение (результат) какой то функции:
x = function(y)
Здесь мы переменной Х присваиваем значение Y, которое вернула функция function
(синтаксис мы будем рассматривать позднее)
В языке СИ например, что процедура, что функция называются одинаково — функция. Независимо от того какую работу они выполняют.

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

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

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

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

— Учитель,- проговорил Сунь У-кун.- Я человек простой и вашего городского языка не понимаю. Что значат подпорки к стене?

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

Читать еще:  Программирование на ассемблере для pic

У Чэн-энь. «Путешествие на Запад», глава 2

Общая характеристика структурного программирования

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

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

Начнем с того, что обратимся к истории.

В теории схем программ было замечено, что некоторые случаи блок-схем легче поддаются анализу [ 16 ] . Поэтому естественно было выделить такой класс блок-схем, что и сделали итальянские ученые С. Бем и К. Джакопини в 1966 г. Они доказали, что любую блок-схему можно привести к структурированному виду, использовав несколько дополнительных булевых переменных. Э. Дейкстра подчеркнул, что программы в таком виде, как правило, являются легче понимаемыми и модифицируемыми, так как каждый блок имеет один вход и один выход .

В качестве методики структурного программирования Э. Дейкстра предложил пользоваться лишь конструкциями цикла и условного оператора, изгоняя go to как концептуально противоречащее этому стилю

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

К несчастью, оператор go to формально совместим с другими конструкциями традиционных (тогда говорили — универсальных) алгоритмических языков. Но реально он плохо взаимодействует с ними. Значит, он плох сам по себе.

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

Средства структурного программирования в первую очередь включаются во все языки программирования традиционного типа и во многие нетрадиционные языки. Они занимают основное место в учебных курсах программирования и в теоретических работах (например, [ 1 ] , [ 4 ] , [ 9 ] ).

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

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

действия и условия локальны.

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

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

Для структурного стиля программирования требуется следующее. Задача разбивается на подзадачи, и таким образом выстраивается дерево вложенности подзадач. Информационное пространство структурируется в точном соответствии с деревом вложенности: для каждой подзадачи оно состоит из ее локальных объектов, определяемых вместе с подзадачей и для нее, и так называемых глобальных объектов, определяемых как информационное пространство непосредственно объемлющей подзадачи. Таким образом, информационное пространство всей задачи (подзадачи самого верхнего уровня) расширяется по мере перехода к подзадачам за счет их локальных объектов. Для различных дочерних подзадач одной подзадачи оно имеет общую часть — информационное пространство родительской подзадачи 3 В этой системе требований без труда распознается так называемая блочная структура языков программирования, появившаяся еще в Algol 60 и ставшая в настоящее время фактическим стандартом. .

К структурным операторам добавляются либо циклы , либо рекурсии .

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

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

Первым обратил внимание на необходимость введения призраков для логического и концептуального анализа программ Г. С. Цейтин в 1971 г. В Америке это «независимо» открыли заново в 1979 г., хотя упомянутая статья Цейтина была опубликована на английском языке в общедоступном издании. Даже название сущностям было дано то же самое. Этому важнейшему и традиционно игнорируемому понятию посвящена отдельная лекция в курсе «Основания программирования» [ 21 ] .

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

Для структурного программирования весьма важно требование:

Все структуры подчиняются структуре информационного пространства.

Это общее требование конкретизируется в следующие.

  1. Необходимо, чтобы структура управления программы была согласована со структурой ее информационного пространства. Каждой структуре управления соответствуют согласующиеся с ней структуры данных и часть информационного пространства. Это условие позволяет человеку легко отслеживать порядок выполнения конструкций в программе.
  2. Подзадачи могут обмениваться данными только посредством обращения к объектам из общей части их информационных пространств (в современных языках чаще всего к глобальным).
  3. Информационные потоки должны протекать согласно иерархии структур управления; мы должны четко видеть для каждого блока программы, что он имеет на входе и что дает на выходе. Таким образом, свойства каждого логически завершенного фрагмента программы должны ясно осознаваться и в идеале четко описываться в самом тексте программы и в сопровождающей ее документации 5 Как видим, программа должна составляться после того, как программист хорошенько подумал, а не до того. .
  4. Описание переменных, представляющих перерабатываемые объекты, а также других, вспомогательных переменных при структурном программировании строго подчиняется разбиению задачи на подзадачи.
  5. Все призраки действуют на своем структурном месте и соответствуют идеальным сущностям, которые, согласно парадоксу изобретателя, должны вводиться для эффективного решения задачи.
  6. Все подпорки строго локализованы в том месте, где их вынуждены ввести. Желательно даже обозначать их по-другому, чем идеальные сущности, например, оставляя мнемонические имена лишь для идеальных сущностей, а подпорки именовать джокерами типа x или i . Необходимо строго следить за тем, чтобы подпорки не искажали идеальную структуру программы.

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

Ссылка на основную публикацию
Adblock
detector