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

Управляющими операторами (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.

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

Оператор ветвления

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

интернет-биржа студенческих работ">

Пример 1

Например, If a > b Then max = a Else max = b.

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

Пример 2

Например, If a > 0 Then b = a + 1: c = a\2.

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

Блочный синтаксис:

Условие – логическое выражение, которое может принимать значение True (истина), False (ложь) или Null , которое приравнивается к False . При выполнении блочного оператора ветвления проверяется условие, и, если оно истинно, выполняется оператор, следующий за Then . Если условие не истинно, проверяется условие2 , идущее за ElseIf . Когда истинное значение найдено, выполняется оператор_при_истинномусловии2, который следует за Then , после чего программа выходит за EndIf (т.е. последующие ElseIf , если они есть, не проверяются). Если истинные условия для ElseIf не найдены, выполняется операторпри_ложном_условии.

Рисунок 3. Пример блочного синтаксиса. Автор24 - интернет-биржа студенческих работ

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

Оператор выбора Case выполняет определенные операторы в зависимости от множества значений проверяемого выражения или переменной. Синтаксис оператора выбора:

Рисунок 4. Синтаксис оператора выбора. Автор24 - интернет-биржа студенческих работ

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

Пример 3

По номеру месяца в году вывести сообщение о том, к какому времени года относится указанный месяц.

^ Программирование операторов условного перехода if-еlsе Программирование операторов выбора switch i»- Программирование операторов цикла while, do-while и for Язык ассемблера - язык машинных команд. Он поддерживает лишь базовые ме- ханизмы организации программ. В нем отсутствуют управляющие конструкции, естественные для языков высокого уровня. Речь идет о поддержке конструкций типа операторов выбора, организации циклов и т. п. В прошлой главе мы положи- ли начало обсуждению этих вопросов, рассмотрев принципы организации циклов в программах на ассемблере. Цель данной главы - разработать шаблоны управля- ющих конструкций на ассемблере, аналогичные типовым операторам языка высо- кого уровня. Поступим просто - откроем любой учебник по языку С или C++, составим спи- сок приведенных в нем управляющих операторов и покажем способы их реализа- ции на ассемблере. Типовой список будет следующим: операторы выбора: ? условный оператор if-else; ? переключатель switch; Ш операторы цикла: П цикл с предусловием while; П цикл с постусловием do-while; П итерационный цикл for; ^ операторы continue и break.

Еще по теме Глава 11 Программирование типовых управляющих структур:

  1. Глава 2 Отрицательное и положительное программирование

Глава 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Оператор присваивания Простой и составной операторы Условный оператор Оператор множественного выбора Оператор цикла с предусловием Оператор цикла с постусловием Оператор цикла с параметром Оператор и процедуры безусловного перехода


2 Гл. 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Оператор присваивания Оператором называется конструкция языка программирования, служащая для задания какого-либо действия или последовательности действий в программе над данными. Совокупность операторов программы реализует заложенный в ней алгоритм. Любой оператор подразумевает некоторое действие. Процесс «засылки» значения в переменную называется присваиванием (первое присваивание называется инициализацией). Присваивание осуществляется с помощью специальной конструкции – оператора присваивания: идентификатор переменной:=:= выражение Var W,H: Integer; Begin W:= 23; H:= 17; W:= W * H; End.


3 Гл. 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Простой и составной операторы Два последовательных оператора должны разделяться точкой с запятой (имеет смысл конца оператора): a:= 11; b:= a * a; Write(a,b); Составной оператор – это последовательность операторов, рассматриваемых как единый. Оформляется с помощью зарезервированных слов begin и end (операторные скобки). Оператор в программе это единое неделимое предложение, выполняющее какое-либо действие. Простой оператор не содержит в себе других операторов (оператор присваивания, вызов процедуры,…). begin a:= 11; b:= a * a; Write(a,b) еnd;


5 then begin X:= X + 5; Y:= 1 еnd else Y:= -1; Условный оператор используется для программирования ветвлений, т.е. ситуаций, когда возникает необходимость при определенных условиях выполнять " title="4 Гл. 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Условный оператор if K > 5 then begin X:= X + 5; Y:= 1 еnd else Y:= -1; Условный оператор используется для программирования ветвлений, т.е. ситуаций, когда возникает необходимость при определенных условиях выполнять " class="link_thumb"> 4 4 Гл. 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Условный оператор if K > 5 then begin X:= X + 5; Y:= 1 еnd else Y:= -1; Условный оператор используется для программирования ветвлений, т.е. ситуаций, когда возникает необходимость при определенных условиях выполнять различные действия. Условный оператор имеет структуру: if логическое выражение then оператор else оператор В каждой ветви допускается запись только одного оператора. 5 then begin X:= X + 5; Y:= 1 еnd else Y:= -1; Условный оператор используется для программирования ветвлений, т.е. ситуаций, когда возникает необходимость при определенных условиях выполнять "> 5 then begin X:= X + 5; Y:= 1 еnd else Y:= -1; Условный оператор используется для программирования ветвлений, т.е. ситуаций, когда возникает необходимость при определенных условиях выполнять различные действия. Условный оператор имеет структуру: if логическое выражение then оператор else оператор В каждой ветви допускается запись только одного оператора."> 5 then begin X:= X + 5; Y:= 1 еnd else Y:= -1; Условный оператор используется для программирования ветвлений, т.е. ситуаций, когда возникает необходимость при определенных условиях выполнять " title="4 Гл. 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Условный оператор if K > 5 then begin X:= X + 5; Y:= 1 еnd else Y:= -1; Условный оператор используется для программирования ветвлений, т.е. ситуаций, когда возникает необходимость при определенных условиях выполнять "> title="4 Гл. 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Условный оператор if K > 5 then begin X:= X + 5; Y:= 1 еnd else Y:= -1; Условный оператор используется для программирования ветвлений, т.е. ситуаций, когда возникает необходимость при определенных условиях выполнять ">




6 Гл. 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Оператор множественного выбора Оператор выбора используется для реализации нескольких альтернативных вариантов действий, каждый из которых соответствует своим значениям некоторого параметра. case выражение of константа/ диапазон else операторы: оператор end ; Значение, а также должны относиться к одному из порядковых типов (кроме LongInt). В зависимости от значения выбирается тот оператор, которому предшествует константа выбора, равная вычисленному значению (альтернатива - операторы после else). Значения констант должны быть уникальными в каждом наборе, т.е. они могут появиться только в одном варианте.


7 Гл. 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ case I of {I: Word} 1: X:= X +1; 2,3: X:= X +2; 4..9: begin Write(X); X:= X + 3 {м.б. ";"} end {м.б. ";"} else X:= X * X; Writeln(X) {м.б. ";"} end;


8 Гл. 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Оператор цикла "Пока" (с предусловием) while условное выражение do оператор (тело цикла), стоящий после служебного слова do, будет выполняться циклически до тех пор, пока выполняется логическое условие, т.е. пока значение равно True. Чтобы цикл имел шанс когда-либо завершиться, содержимое его тела должно влиять на условие цикла. Условие должно состоять из корректных выражений и значений, определенных еще до первого выполнения тела цикла. VarF,N: LongInt;{вычисление 10!} Begin F:= 1; N:= 1; while N


9 Гл. 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Оператор цикла "До" (с постусловием) Операторы между словами repeat и until образуют тело цикла. Если имеет значение True, то цикл завершается. Цикл "Пока" - "пока условие истинно, выполнять операторы тела". Цикл "До" - "выполнять тело цикла до тех пор, пока не станет истинным условие"; repeat until False; repea t оператор until условное выражение;


10 Гл. 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Оператор цикла c параметром (цикл по счетчику) – переменная порядкового типа, к этому же типу должны относиться значения и. Значение меняется в возрастающем (при использовании зарезервированного слова to) или убывающем (downto) порядке от значения до значения с постоянным шагом, равным интервалу между двумя ближайшими значениями в типе, к которому относится (для целочисленных типов - это 1, для символьного - от одного символа к другому при увеличении кода на 1, и т.д.). Циклы for допускают вложенность, если никакой из вложенный циклов не использует и не модифицирует переменные - параметры внешних циклов. Используется для организации "строгих" циклов, которые должны быть проделаны заданное число раз. fo r параметр цикла:= выражение 1 to выражение 2 do оператор downto


12 Гл. 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Оператор безусловного перехода Метка может стоять в программе в любом месте между операторами и отделяется от второго оператора двоеточием ":". Область действия операторов безусловного перехода строго локализована. Запрещены переходы по оператору goto между процедурами, а также между основным блоком и процедурой. Оператор безусловного перехода передает управление выполнением в указанное c помощью метки место программы (является "лишним" с точки зрения теории структурного программирования). goto метка Label целое без знака; идентификатор метки, Синтаксические диаграммы и: LabelL1, L2; Begin... goto L1;... L1: goto L2;... L2: End.


13 Гл. 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Процедуры безусловного перехода Процедуры неструктурной передачи управления при работе с циклическими структурами: Break – реализует выход из цикла любого типа; Continue – осуществляет переход на следующую итерацию цикла, игнорируя оставшиеся до конца тела цикла операторы. Процедуры Exit и Halt специально предназначены для выхода из программных блоков (процедур, функций, основного программного блока). Halt () осуществляет выход из программы, возвращая операционной системе заданный код завершения. Exit осуществляет безусловный выход из подпрограммы. Если процедура использована в основном блоке, то она выполняется аналогично Halt.

mob_info