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

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


Поделитесь работой в социальных сетях

Если эта работа Вам не подошла внизу страницы есть список похожих работ. Так же Вы можете воспользоваться кнопкой поиск


Тема 2 Управляющие операторы

2.1 Базовые конструкции структурного программирования

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

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

Ветвление задает выполнение либо одного, либо другого оператора в зависимости от выполнения какого-либо условия.

Цикл задает многократное выполнение оператора.

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

Рисунок 2.1 – Базовые конструкции структурного программирования

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

Любое выражение, завершающееся точкой с запятой, рассматривается как оператор, выполнение которого заключается в вычислении выражения.

2.2 Операции отношения и логические операции

Операции отношения (<, <=, >, >=, ==, !=) сравнивают первый операнд со вторым. Операнды могут быть арифметического типа или указателями. Результатом операции является значение true или false . Операции сравнения на равенство и неравенство имеют меньший приоритет, чем остальные операции сравнения. Например: x >=0, y != 10, z == 0.

ВНИМАНИЕ! Обратите внимание на разницу между операцией проверки на равенство (== ), результатом которой является true или false , и операцией присваивания (= ), результатом которой является значение, присвоенное левому операнду.

Логические операции (&& , || , ^ ). Операнды логических операций И (&& ), ИЛИ (|| ), ИСКЛЮЧАЮЩЕЕ ИЛИ (^ ) должны иметь тип, допускающий преобразование к типу bool , при этом операнды в одной операции могут быть различных типов. Результатом операции является true или false .

Результат операции логическое И имеет значение true только если оба операнда имеют значение true . Результат операции логическое ИЛИ имеет значение true , если хотя бы один из операндов имеет значение true . Результат операции логическое ИСКЛЮЧАЮЩЕЕ ИЛИ имеет значение true , если один из операндов имеет значение true , а второй – false . Логическое отрицание (!) дает в результате значение false , если операнд есть true , и значение true , если операнд равен false . Операнд может быть арифметического типа. В этом случае выполняется неявное преобразование в тип bool . Логические операции выполняются слева направо. Если значения первого операнда достаточно, чтобы определить результат операции, второй операнд не вычисляется.

Таблица результатов операций И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ, НЕ

(A и B – операнды)

A && B

A || B

A ^ B

Примеры выражений с логическими операциями:

x > 0 && y <=10

(a < -1 && b > 0) || c != 100

Условная операция (? :). Эта единственная в С++ тернарная операция (имеет три операнда), ее формат:

операнд_1 ? операнд_2: операнд_3

Операнды вычисляются слева направо. Результат вычисления первого операнда должен быть типа, который можно преобразовать к типу bool . Если результат равен true , то результатом выполнения всей условной операции будет значение второго операнда, иначе – третьего операнда. Их типы могут быть различными.

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

i = (i < n) ? i + 1: 1;


2.3 Операторы ветвления. Условный оператор if

Условный оператор if используется для разветвления процесса вычислений на два направления. Схема алгоритма оператора приведена на рисунке 2.1. Формат оператора:

if (выражение) оператор_1; [ else оператор_2;]

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

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

Примеры :

if (a < 0) b = 1;

if (a < b && (a >d || a == 0))

B++;

else

{ b *= a; a = 0;}

if (a < b)

if (a < c )

M = a;

else

M = c;

else

If (b < c )

M = b;

else

m = c ;

В примере 1 отсутствует ветвь else . Подобная конструкция называется "пропуск оператора", поскольку присваивание либо выполняется, либо пропускается в зависимости от выполнения условия.

Если требуется проверить несколько условий, их объединяют знаками логических операций . Например, выражение в примере 2 будет истинно в том случае, если выполнится одновременно условие a < b и одно из условий в скобках. Если опустить внутренние скобки, будет выполнено сначала логическое И, а потом – ИЛИ.

Оператор в примере 3 вычисляет наименьшее значение из трех переменных.

По синтаксису оператора if в его ветвях должно быть не более одного оператора. Если же их больше, то они должны быть объединены в блок с помощью фигурных скобок или с помощью операции «запятая» (,).

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

Рисунок 3.2 – Мишень

#include

int main()

float x, y;

int kol;

Printf ("\ n Введите координаты выстрела ");

Scanf ("%f", &x);

Scanf ("%f", &y);

If (x * x + y * y < 1)

Kol = 2;

Else

If (x*x + y*y < 4)

kol = 1;

else

kol = 0;

printf ("\n Очков : %d", kol);

2.4 Операторы ветвления. Оператор множественного выбора switch

Оператор switch (переключатель) предназначен для разветвления процесса вычислений на несколько направлений. Формат оператора:

switch (выражение)

Case константное_выражение_1: операторы 1;

Case константное_выражение_2: операторы 2;

...

Case константное_выражение_n: операторы n;

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

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

Если в какой-то из case -меток отсутствует оператор break , то выполнятся также операторы в следующей case -метке и так далее до тех пор, пока где-то не встретится оператор break .

Пример (программа реализует простейший калькулятор на 4 действия):

#include

int main()

int a, b, res;

char op;

printf ("\ n Введите 1-й операнд: ");

scanf ("% d ", & a );

printf ("\ n Введите знак операции: ");

scanf ("% c ", & op );

printf ("\ n Введите 2-й операнд: ");

scanf ("% d ", & b );

bool f = true ;

Switch (op)

Case "+": res = a + b; break;

Case "-": res = a - b; break;

Case "*": res = a * b; break;

Case "/": res = a / b; break;

default : printf ("\n Неизвестная операция"); f = false;

if (f )

printf ("\ n Результат: % d ", res );

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

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

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

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

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

Рисунок 3.3 – Два вида циклов

Один проход цикла называется итерацией . Целочисленные параметры цикла, изменяющиеся на целое число на каждой итерации , называются счетчиками цикла .

Нельзя передавать управление извне внутрь цикла. Выход из цикла возможен как при выполнении условия выхода, так и по операторам break , return или безусловного перехода goto .

2.6 Цикл с предусловием (while)

Цикл с предусловием реализует схему алгоритма

while (выражение) оператор;

Например:

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

значений функции y=x 2 +1 во введенном диапазоне):

#include

int main()

float Xn, Xk, Dx;

float X = Xn; //начальные установки цикла

While (X <= Xk) //проверка условия выхода

Printf ("\n %5.2f %5.2f", X, X*X + 1); // тело

X += Dx; //модификация

2.7 Цикл с постусловием (do while)

Цикл с постусловием реализует схему алгоритма , приведенную ниже, и имеет вид:

do оператор while выражение;

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

Пример (программа осуществляет проверку ввода):

#include

int main()

char answer;

printf ("\ n Купи слоника!");

scanf ("% c " , &answer) ;

while (answer != "y");

2.8 Цикл for

Цикл for реализует схему алгоритма, приведенную ниже, и имеет вид:

for (блок инициализации; блок проверки условия; блок модификации)

Тело цикла;

Пример :

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

Блок проверки условия определяет условие выполнения цикла: если оно не равно 0 (истинно), цикл выполняется.

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

Простой или составной оператор представляет собой тело цикла . Любая из частей оператора for может быть опущена (но точки с запятой надо оставить на своих местах!). В любой части можно использовать операцию "запятая" (последовательное вычисление), например:

for (int i = 1, s = 0; i <= 100; i++)

S += i; // сумма чисел от 1 до 100

Пример (программа печатает таблицу значений функции y=x 2 +1 во введенном диапазоне):

#include

int main()

float Xn, Xk, Dx;

printf ("Введите диапазон и шаг изменения аргумента: ");

scanf ("%f%f%f", &Xn, &Xk, &Dx);

For (float X = Xn; X <= Xk; X += Dx)

Printf ("\n %5.2f %5.2f", X, X*X + 1);

2.9 Вложенные циклы

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

Ниже приведён пример вложенных циклов for

Этот фрагмент программы работает следующим образом. Для одного значения параметра внешнего цикла i (например, i = 1 ) параметр внутреннего цикла j изменяется в диапазоне от минимального до максимального значения (от 1 до M ). Только после этого параметр i увеличивается на единицу. Таким образом, тело цикла выполнится N * M раз.

Другие варианты вложенных циклов работают аналогично: параметр внешнего цикла меняется медленно, а внутреннего быстро. Их рекомендуется освоить самостоятельно. Для этого схему алгоритма внутреннего цикла необходимо вставить целиком вместо блока тело цикла.

2.10 Операторы передачи управления

В С++ есть пять операторов, изменяющих естественный порядок выполнения вычислений:

  • оператор выхода из цикла и переключателя break ;
  • оператор перехода к следующей итерации цикла continue ;
  • оператор возврата из функции return ;
  • оператор безусловного перехода goto ;
  • оператор генерации исключения throw .

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

Рассмотрим его использование на примере открытого итеративного цикла for . На примере вычисления суммы чисел от 1 до 100.

int i = 1, sum = 0;

for (; ;)

If(i > 100) break;

sum += i ;

i ++;

Оператор перехода к следующей итерации цикла continue пропускает все операторы, оставшиеся до конца тела цикла , и передает управление на модификацию параметров цикла (в случае цикла for ) и начало следующей итерации .

Рассмотрим его использование на примере вычисления суммы 1 / x , если x изменяется в диапазоне [-5, 5].

#include

int main()

float X, Sum = 0;

for (X = -5; X <= 5; X++)

If(X == 0)

Continue;

Sum = Sum + 1 / X;

Printf ("\n Sum = %f", Sum);

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

Оператор безусловного перехода goto имеет формат:

goto метка;

В теле той же функции должна присутствовать ровно одна конструкция вида:

метка: оператор;

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

Использование оператора безусловного перехода оправдано в двух случаях:

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

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

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

Другие похожие работы, которые могут вас заинтересовать.вшм>

2784. Операторы условия и выбора 16 KB
Оператор условия If. Поэтому Вы уже можете записать следующие операторы присваивания: Koren:=Sqrtxy; Modul:=bsxy. Для реализации таких условных переходов в языке Паскаль используют операторы If и Else а также оператор безусловного перехода Goto. Рассмотрим оператор If.
2750. Операторы Write и WriteLn 12.34 KB
Write англ. Оператор WriteLn выполняет то же самое действие но так как у него есть еще окончание Ln line англ. Общий вид: Write список выражений WriteLn список выражений Процедуры Write и WriteLn используются не только для вывода результата но и для вывода различных сообщений или запросов.
6706. Структурированный язык запросов – SQL: история, стандарты, основные операторы языка 12.1 KB
Структурированный язык запросов SQL основан на реляционном исчислении с переменными кортежами. Язык SQL предназначен для выполнения операций над таблицами создание удаление изменение структуры и над данными таблиц выборка изменение добавление и удаление а также некоторых сопутствующих операций. SQL является непроцедурным языком и не содержит операторов управления организации подпрограмм ввода вывода и т.

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

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

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

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

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

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

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

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

    условный оператор – if else – реализует алгоритмические структуры АЛЬТЕРНАТИВА и ВЫБОР (см. Приложение 1);

    оператор выбора – switch – частично реализует алгоритмическую структуру ВЫБОР (см. Приложение 1);

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

      • цикл с предусловием – while – реализует алгоритмическую структуру ЦИКЛ С ПРЕДУСЛОВИЕМ (см. Приложение 1);

        цикл с постусловием – do while – реализует алгоритмическую структуру ЦИКЛ С ПОСТУСЛОВИЕМ (см. Приложение 1);

        цикл с параметром – for – реализует алгоритмическую структуру ПАРАМЕТРИЧЕСКИЙ ЦИКЛ (см. Приложение 1).

Условный оператор (if else )

Условный оператор if используется для разветвления процесса вычислений на два направления, соответственно он реализует алгоритмическую структуру АЛЬТЕРНАТИВА, блок-схема которой выглядит следующим образом:

Если <Условие> истинно, то выполняется <Оператор 1>, иначе выполняется <Оператор 2>.

Пример использования условного оператора для разветвления процесса вычислений на два направления:

// Вычисление модуля y= |x|

if(x < 0) { y= -x; }

Оператор if также используется для реализации алгоритмической структуры ВЫБОР (см. блок-схему ниже), когда невозможно использовать оператор выбора switch (об этом далее).

Использование уловного оператора для реализации алгоритмической структуры ВЫБОР:

Пример использования условного оператора для реализации алгоритмической структуры ВЫБОР:

// Вычисление y= sign(x) – более простой способ реализации

if(x < 0) { y= -1; }

if(x == 0) { y= 0; }

if(x > 0) { y= 1; }

// Вычисление y= sign(x) – более эффективный способ реализации

if (x < 0) { y= -1; }

else if(x == 0) { y= 0; }

else if(x > 0) { y= 1; }

Оператор выбора (switch ) + оператор прерывания (break )

Оператор switch (выбор) предназначен для разветвления процесса вычислений на несколько направлений. Данный оператор реализует алгоритмическую структуру ВЫБОР. Однако он имеет ограниченное применение, т.к. в нем нельзя задавать произвольные условия. Условия в операторе switch имеют следующую структуру <Выражение> == <Константа>.

Формат оператора:

switch(<Выражение>)

case <Константа 1>:

<Оператор 1>

case <Константа 2>:

<Оператор 2>

case <Константа M>:

<Оператор M>

<Оператор M+1>

Если <Выражение> принимает значение равное <Константа 1>, то выполняется <Оператор 1>; если <Выражение> принимает значение равное <Константа 2>, то выполняется <Оператор 2> и т.д. Если <Выражение> принимает значение отличное от указанных констант, то выполняется <Оператор M+1>.

Пример использования оператора выбора:

// Анализ ответа пользователя

scanf(“%с”, &Answer);

printf(“\nВы нажали 1”);

printf(“\nВы нажали 2”);

Оператор break прерывает выполнение оператора switch. Если бы его не было, то все операторы внутри switch выполнялись бы последовательно друг за другом. Например, так:

// Анализ ответа пользователя

scanf(“%с”, &Answer);

printf(“\nВы нажали 1”);

printf(“\nВы нажали 2”);

printf(“\nВы нажали что-то не то”);

При вводе пользователем символа ‘2’ на экране появятся два сообщения:

“Вы нажали 2”

“Вы нажали что-то не то”

Оператор цикла с предусловием (while )

Оператор используется для организации многократно повторяющихся вычислений, которые могут не выполниться ни разу. Оператор while реализует алгоритмическую структуру ЦИКЛ С ПРЕДУСЛОВИЕМ, блок-схема которой приведена ниже. Данная алгоритмическая структура используется, когда заранее неизвестно количество итераций (повторений), и возможно отсутствие повторений.

Формат оператора:

while(<Условие>)

<Оператор>

Сначала проверяется <Условие>. Если <Условие> истинно, то выполняется <Оператор> до тех пор, пока <Условие> не станет ложным. Если <Условие> стало ложным, то управление передается оператору, следующему за циклом. <Условие> – это условие продолжения цикла, <Оператор> – это тело цикла (повторяющееся действие + действие для выхода из цикла).

Замечание. <Оператор> может не выполниться ни разу, если <Условие> изначально ложно.

Пример использования оператора с предусловием:

char String= “Это пример”;

Count = 0; // подготовка

while(String !=‘\0’) // условие продолжения

{ Count++; } // тело цикла (повторяющееся действие +

В данном примере цикл не выполнится ни разу, если строка String будет пустой.

Рассмотрим еще один пример, в котором используется оператор while, но правильнее использовать оператор do while:

// Ввод русской буквы

char RussianLetter;

scanf(“%c”, &RussianLetter); // подготовка

while((RussianLetter < ‘A’) ||

(RussianLetter > ‘я’)) // условие продолжения

{ scanf(“%c”, &RussianLetter); } // тело цикла (повторяющееся действие + // действие для выхода из цикла)

Оператор цикла с постусловием (do while )

Оператор используется для организации многократно повторяющихся вычислений, которые выполняются хотя бы один раз. Оператор do while реализует алгоритмическую структуру ЦИКЛ С ПОСТУСЛОВИЕМ, блок-схема которой приведена ниже. Данная алгоритмическая структура используется, когда заранее неизвестно количество итераций, но хотя бы одна итерация выполняется всегда (например, если в цикле производится ввод данных).

Формат оператора:

<Оператор>

while(<Условие>);

Сначала выполняется <Оператор>, затем проверяется <Условие>. Если <Условие> истинно, то снова выполняется <Оператор>. Это продолжается до тех пор, пока <Условие> не станет ложным.

Замечание. <Оператор> всегда выполняется хотя бы один раз.

Пример использования цикла с постусловием:

// Запрашиваем у пользователя число от 0 до 10

// подготовка отсутствует

{ scanf(“%d”, &Number); } // тело цикла (повторяющееся действие +

// действие для выхода из цикла)

while((Number < 0)||(Number > 10)); // условие продолжения

В примере используется цикл do while, т.к. число сначала вводится, а затем осуществляется его проверка.

Обратите внимание, что после оператора while ставится точка с запятой;.

Оператор цикла с параметром (for )

Оператор используется для организации многократно повторяющихся вычислений и по своей сути аналогичен циклу while, но имеет более компактную запись. Оператор for реализует алгоритмическую структуру ПАРАМЕТРИЧЕСКИЙ ЦИКЛ, блок-схемы которой приведены ниже. Данная алгоритмическая структура используется, когда заранее известно количество итераций.

Формат оператора:

for(<Оператор инициализации>; <Условие>; <Оператор модификации>)

<Оператор>

Сначала выполняется <Оператор инициализации> и проверяется <Условие>. Если <Условие> истинно, то выполняется <Оператор>. Затем выполняется <Оператор модификации> и снова проверяется <Условие>. Если <Условие> истинно, то выполняется <Оператор> и т.д. Цикл завершается, когда <Условие> становится ложным.

Замечание. Цикл for как и цикл while может не выполниться ни разу.

Пример использования цикла с параметром:

y = 1; // подготовка

for(i= 1; i <= n; i++) // оператор инициал.; условие; оператор модификации

{ y= y*i; } // тело цикла (повторяющееся действие)

В данном примере еще до выполнения цикла известно, что переменная i должна изменяться в диапазоне от 1 до n.

А теперь рассмотрим, как та же задача решается с использованием цикла while:

// Вычисление факториала y = n!

y = 1; // подготовка

i= 1; // подготовка (оператор инициализации)

while(i <= n) // условие продолжения

y= y*i; // повторяющееся действие

i++; // действие для выхода из цикла (оператор модификации)

Данный пример показывает, что использование цикла while усложняет код программы, а потому предпочтительнее использовать цикл for, когда заранее известно количество выполняемых итераций.

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