Домой / Интернет / Циклы и другие управляющие средства. Структурное программирование. Основные управляющие структуры Управляющие структуры. Общие сведения о циклах

Циклы и другие управляющие средства. Структурное программирование. Основные управляющие структуры Управляющие структуры. Общие сведения о циклах

Управляющими операторами (control statement) называются исполняемые операторы, меняющие последовательность выполнения инструкций программы. Из всех операторов, использующихся в языках программирования, операторы управления вызвали больше всего споров. Основным предметом дискуссий является самый простой оператор управления goto. Он позволяет изменить порядок выполнения программы и перейти к выполнению программы, начиная с определенного места, которое обозначено именем или числом. Следовательно, этот оператор является не чем иным, как непосредственным применением команды перехода машинного языка. Наличие такого оператора в языке высокого уровня позволяет программистам писать такие бессистемные программы1:

goto 40 20 Применить процедуру Evade

goto 70 40 if (KryptoniteLevel < LethalDose) then goto 60

60 Применить процедуру RescueDamsel 70 ...

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

if (KryptoniteLevel < LethalDose)

then (применить процедуру RescueDamsel) else (применить процедуру Evade)

Для того чтобы избежать таких сложностей, современные языки программирования содержат такие операторы управления, которые позволяют записывать ветвящиеся структуры с помощью одного выражения. Некоторые общепринятые ветвящиеся структуры и соответствующие им в разных языках программирования операторы управления изображены на рис. 5.7. Обратите внимание на го, что с первыми двумя структурами мы уже встречались в главе 4. В нашем псевдокоде они представлены операторами if-then-else и while. Третью структуру, которая называется выбором, можно рассматривать как расширение структуры i f-then-el se. Различие между ними состоит в том, что оператор if-then-else позволяет выбирать из двух вариантов, а оператор case - из нескольких.

Другой распространенной структурой является оператор цикла for (рис. 5.8), подобный оператору while нашего псевдокода. Различие между ними заключается в том, что инициализация, модификация и проверка условия завершения цикла объединены в одном операторе. Такой оператор удобно использовать, когда тело цикла нужно выполнить определенное количество раз - один раз для каждого значения переменной-счетчика в заданном интервале. В частности, оператор, изображенный на рис. 5.8, предписывает, чтобы тело цикла было выполнено несколько раз: когда значение переменной Count равно 1, затем когда ее значение равно 2 и последний раз, когда ее значение равно 3.

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


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

Комментарии

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

Visual Basic является объектно-ориентированным языком программирования. Он был разработан компанией Microsoft как инструмент, с помощью которого пользователи операционной системы Microsoft Windows могли бы разрабатывать свой собственный графический пользовательский интерфейс. На самом деле Visual Basic - это больше, чем просто язык программирования. Он представляет собой полный пакет для разработки программного обеспечения, который позволяет программисту создавать пользовательский интерфейс из определенных компонентов (таких как кнопки, флажки, текстовые поля, полосы прокрутки и т. д.) и переделывать эти компоненты согласно своим потребностям, описывая, как они должны реагировать на определенные события. Например, в случае с кнопкой программист может описать, что должно происходить, если щелкнуть на ней мышью. Этот метод создания программного обеспечения из заранее определенных компонентов является современной тенденцией в разработке программного обеспечения.

Благодаря популярности операционной системы Windows и удобству использования пакета Visual Basic, язык Visual Basic стал сегодня одним из самых распространенных языков программирования. С другой стороны, из-за того что Visual Basic совместим только с программными средствами компании Microsoft, он не признается языком программирования общего назначения.

Существует два основных способа отделения комментариев от текста программы. Один из них - заключить комментарий в специальные скобки. Другой способ - обозначить начало комментария, который может занимать оставшуюся часть строки справа от знака. В языках C++, С# и Java возможны оба способа записи комментариев. В них комментарий можно поместить между знаками /* и */ или начать его с //. Таким образом, в C++, С# и Java допустимы обе записи:

/* Это комментарий. */

// Это комментарий.

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

ApproachAngle - SlipAngle - HyperSpacelncine:

добавляют комментарий «Вычесть HyperSpacelncine из SlipAngle и присвоить значение переменной ApproachAngle». Такие комментарии не делают программу более понятной, а только удлиняют ее. Запомните, что цель комментария - пояснить программу, а не повторить ее. В данном примере лучше объяснить, почему вычисляется значение переменной ApproachAngl e (если это не ясно из программы). Например, комментарий: «Переменная ApproachAngle используется позже для вычисления значения переменной ForceFiel dJetti sonVel ocity», намного полезнее, чем предыдущий.

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

Процедурные единицы

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

Процедуры

Процедура (procedure) - это набор команд для выполнения некоторой задачи, который другие программные единицы могут использовать в качестве абстрактного инструмента. Управление передается процедуре (с помощью команды перехода машинного языка), когда ее действия необходимы, а затем, после завершения выполнения процедуры, снова возвращается исходной программной единице (рис. 5.9). Процесс передачи управления процедуре называется вызовом процедуры. Программную единицу, которая запрашивает выполнение процедуры, мы будем называть вызывающей программой или вызывающим модулем (calling unit).

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

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

Однако в отличие от нашего нестрогого псевдокода, в котором мы запрашивали выполнение процедуры с помощью такого выражения, как «Применить процедуру Deacti vateCrypton», большинство современных языков программирования позволяют вызывать процедуру, просто указав ее имя. Например, если GetNames, SortNames и WriteNames являются именами процедур для получения, сортировки и вывода на печать списка имен, то программу, получающую список, сортирующую его и выводящую на печать, можно записать как

Применить процедуру GetNames. Применить процедуру SortNames. Применить процедуру WriteNames.

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

Структурированные операторы - это конструкции, построенные по опреде­ленным правилам из других операторов. К структурированным операторам относятся:

Составной оператор

Условный оператор

Операторы выбора

Операторы цикла

Оператор with

1.Составной оператор

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

Формат составного оператора:

begin <Оператор1>; ... ; <ОператорN>;

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

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

2.Условный оператор

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

Формат условного оператора:

If then <Оператор1> ;

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

Условный оператор может быть записан в сокращенной форме, когда слово else и оператор2 после него отсутствуют.

Для организации разветвлений на три направления и более можно исполь­зовать несколько условных операторов, вложенных друг в друга. При этом каждое else соответствует тому then, которое непосредственно ему предше­ствует. Из-за возможных ошибок следует избегать большой вложенности условных операторов друг в друга.

3.Оператор выбора

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

Формат оператора выбора:

case<Выражение-селектор> of

<Список1> : <Оператор1>;

<СписокN> : <ОператорN>

Выражение-селектор должно быть порядкового типа. Каждый вариант пред­ставляет собой список констант, отделенных двоеточием от относящегося к данному варианту оператора. Список констант выбо­ра состоит из произвольного количества значений и диапазонов, отделен­ных друг от друга запятыми. Границы диапазона записываются двумя кон­стантами через разделитель «..». Тип констант должен соответствовать типу выражения-селектора.

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

1. Вычисляется значение выражения селектора.

2. Производится последовательный просмотр вариантов на предмет совпа­дения значения селектора с константами и значениями из диапазонов соответствующего списка.

3. Если для очередного варианта этот поиск успешный, то выполняется оператор этого варианта. После этого выполнение оператора выбора заканчивается.

4. Если все проверки оказались безуспешными, то выполняется оператор, стоящий после слова else (при его наличии).

Пример. Оператор выбора

caseNumberDay of

1..5: strDay:= "Рабочий день";

6..7: strDay:= "Выходной день"

else strDay:="";

В зависимости от значения целочисленной переменной NumberDay, содер­жащей номер дня недели, строковой переменной strDay присваивается со­ответствующее значение.

>> Управляющие структуры. Общие сведения о циклах

Обучающие курсы:

Управляющие структуры. Общие сведения о циклах

Управляющие структуры

Общие сведения о циклах

Циклы - это повторение операций до тех пор, пока верно некое логическое условие. Например, зададим условием цикла, что некая переменная а меньше 10.

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

Имеется три вида циклов: for, do...while, while. Рассмотрим, например, конструкцию цикла for.

for (Инициализация переменной; Условие; Изменение переменной после каждого выполнения блока операторов цикла)
{
тело цикла
}

Рассмотрим пример использования цикла for (листинг 3.1).

Листинг 3.1.
Пример использования цикла for

Эта программа выведет на экран десять звездочек на одной строке. Необязательно инициализировать переменную-счетчик в цикле (переменной-счетчиком называется такая переменная, от которой зависит количество выполнений тела цикла). Рассмотрим пример программы без объявления переменной-счетчика в цикле (листинг 3.2).

Листинг 3.2.
Пример программы без объявления переменной-счетчика в цикле

Можно использовать не одну переменную-счетчик, а несколько. Рассмотрим пример подобной программы, представленный в листинге 3.3.

Листинг 3.3.
Пример использования нескольких переменных-счетчиков

Рассмотрим цикл while. В этом цикле в качестве параметра указывается какое-либо условие. Условие проверяется перед выполнением цикла. Схема цикла while имеет следующий вид.

while (условие)
{
тело цикла
}

Рассмотрим пример программы, использующей цикл while (листинг 3.4).

Листинг 3.4.
Пример использования цикла while

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

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

Пример ошибочной программы.

Рассмотрим теперь цикл do...while.
Он очень схож с циклом while и отличается только тем, что проверяет условие не до очередного выполнения цикла, а после его выполнения. Схема цикла do...while приведена ниже.

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

Оператор break

Оператор break используется для выхода из оператора while , do , for , switch , непосредственно его содержащего. Управление передается на оператор, следующий за оператором, из которого осуществлен выход. Оператор break имеет форму

while((ch=getchar()) != EOF) /* читается символ ch=getchar(). Если он не совпадает с EOF, выполняется тело оператора while */ { if(ch=="\n") break; putchar(ch); }

Работа цикла полностью прекращается, как только при вводе встречается символ "новая строка".

Оператор continue

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

while((ch=getchar()) != EOF) /* читается символ ch=getchar(). Если он не совпадает с EOF, выполняется тело оператора while */ { if(ch=="\n") continue; putchar(ch); }

В версии с оператором continue просто пропускаются символы "новая строка", а выход из цикла происходит, только когда читается признак EOF .

Оператор goto

Оператор goto предназначен для безусловной передачи управления к оператору с указанной меткой. Он имеет следующую форму:

goto метка;

Керниган и Ритчи считают оператор goto "чрезвычайно плохим" средством и предлагают применять его как можно реже или не применять совсем. Приведем пример записи оператора:

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

part1: printf("точка перехода\n");

Если без операторов goto , break , continue , return никак не обойтись, то при использовании goto переходите вперед по коду, а не назад.

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

Оператор continue нежелательно использовать для модификации логики циклов.

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

Самая простая структура - следование. Ее можно представить так:

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

Структура развилка (если - то - иначе) служит для выбора одного из двух возможных путей выполнения алгоритма. Ее основой служит проверка. Выглядит развилка так:

Структуры ЕСЛИ-ТО-ИНАЧЕ бывают вложены друг в друга, к примеру, таким образом.

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

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

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

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

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

Цикл-до организован по- другому.

Проверка истинности условия цикла производится после выполнения тела цикла, и выход из него осуществляется при истинности условия. Τᴀᴋᴎᴍ ᴏϬᴩᴀᴈᴏᴍ, тело цикла выполняется всœегда один раз в отличие от цикла-пока , который при невыполнении условия цикла не выполняется ни разу.

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

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

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

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

Основные управляющие структуры - понятие и виды. Классификация и особенности категории "Основные управляющие структуры" 2017, 2018.