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

Глава 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.

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

Управляющие структуры и основные конструкции языков программирования

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

Состоянием некоторых ячеек памяти, понимаемых нами как переменные;

Активной точкой программы, то есть той командой программы, которая выполняется данный момент.

Следовательно, можно выделить и два основных класса действий, которые может выполнять вычислительная система:

Действия, выделяющие область памяти под переменные программы (описания).

Действия, меняющие точку выполнения программы (операторы, инструкции, конструкции).

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

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

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

Исследование Бома и Якопини показало, что программирование возможно и при полном отсутствии операторов goto. Смена стиля программирования на «программирование без goto» стала для программистов эпохальным девизом. Но только в 70-е годы широкие круги профессиональных программистов начали принимать структурное программирование всерьез. Результаты оказались впечатляющими, поскольку группы разработки программного обеспечения сообщали об уменьшении времени разработки, более частой поставке систем в срок и завершении проектов в рамках бюджета. Ключом к успеху является попросту то, что программы, созданные на основе методов структурного программирования, более понятны, их проще отлаживать и модифицировать и, самое главное, более вероятно, что они написаны без ошибок.
Работа Бома и Якопини в 1966 году показала, что все программы могут быть написаны с использованием всего трех управляющих структур, а именно: последовательной структуры, структуры выбора и структуры повторения. Этот результат установлен Бомом и Якопини в 1966 г. путем доказательства того, что любую программу можно преобразовать в эквивалентную, состоящую только из этих структур и их комбинаций. При этом последовательная структура, по существу, является встроенной в язык С. Если не указано иначе, компьютер автоматически выполняет операторы С один за другим в порядке их записи.

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

К управляющим структурам относятся:

· структура следования;

· структура ветвления;

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

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

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

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

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

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

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

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

Оператор 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 присваивается со­ответствующее значение.

операторы 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 в конце тела функции.