Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
61
Добавлен:
26.03.2015
Размер:
194.57 Кб
Скачать

Главная

ЦИКЛИЧЕСКИЕ КОНСТРУКЦИИ И ОПЕРАТОРЫ ПЕРЕХОДОВ

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

Для организации циклов в С++ используются следующие операторы: for, while,

do while.

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

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

for ( выражение 1 ; выражение 2 ; выражение 3 ) тело

Выражение 1 обычно используется для установления начального значения переменных, управляющих циклом. Выражение 2 – это выражение, определяющее условие, при котором тело цикла будет выполняться. Выражение 3 определяет изменение переменных, управляющих циклом после каждого выполнения тела цикла.

Схема выполнения оператора for: вычисляется выражение 1; вычисляется выражение 2; если значения выражения 2 отлично от нуля (истина), выполняется тело цикла, вычисляется выражение 3 и осуществляется переход к пункту 2; если выражение 2 равно нулю (ложь), то управление передается на оператор, следующий за оператором for. Блок-схема выполнения цикла приведена на рис. 1.

1

выражение 1

 

 

 

выражение 2

да

тело

выражение 3

 

нет

 

 

 

 

Рис. 1. Блок-схема цикла for

 

Проверка условия всегда выполняется в начале цикла. Это значит, что тело цикла может ни разу не выполниться, если условие выполнения сразу будет ложным. Например:

int i, b;

for (i = 1; i < 10; i++) b = i * i;

//вычисление квадратов чисел от 1 до 9 for (i = 1; i > 10; i++) b = i * i;

//тело цикла не выполниться

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

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

int top, bot;

char string[100], temp;

// для управления циклом используются //две переменные top и bot

for (top = 0, bot = 100; top < bot; top++, bot--)

{

temp = string[top]; string[bot] = temp;

}

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

2

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

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

for (;;)

{...

... break;

...

}

Так как согласно синтаксису языка оператор может быть пустым, тело оператора for также может быть пустым. Такая форма оператора может быть использована для организации поиска:

for (int i = 0; t[i] < 10; i++) ;

//i – номер первого элемента массива t, //значение которого больше 10

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

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

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

Оператор цикла while называется циклом с предусловием и имеет следующий формат:

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

В качестве выражения допускается использовать любое выражение языка С/C++, в качестве тела – любой оператор, в том числе пустой или составной.

Схема выполнения оператора while следующая: вычисляется выражение; если выражение ложно, то выполнение оператора while заканчивается и выполняется следующий по порядку оператор; если выражение истинно, то выполняется тело оператора while; процесс повторяется сначала. Блок-схема приведена на рис. 2.

3

выражение

да

тело

 

нет

Рис. 2. Блок-схема выполнения оператора while

Рассмотрим пример:

double value = 0.0;

//

для ввода значений

double sum = 0.0;

//

сумма значений

int i = 0;

//

счетчик значений

char indicator = 'y';

//

индикатор продолжения

while(indicator == 'y')

// повторять цикл пока 'y'

{

 

 

cout << endl

 

 

<< "Введите значение: ";

cin >> value;

// ввести значение

++i;

// увеличить счетчик

sum += value;

// добавить значение к сумме

cout << endl

 

 

<< " Хотите ввести еще

значение ? ";

cin >> indicator;

//

ввести индикатор

}

Внутри операторов for и while можно использовать локальные переменные, которые должны быть объявлены с определением соответствующих типов.

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

Оператор цикла do while

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

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

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

4

оператор; если выражение истинно, то выполнение оператора продолжается сначала. Блок-схема приведена на рис. 3.

тело

 

выражение

да

 

нет

Рис. 3. Блок-схема выполнения оператора do while

Чтобы прервать выполнение цикла до того, как условие станет ложным, можно использовать оператор break.

Операторы while, for и do while могут быть вложенными:

do

{

cout << endl

<< "Введите цело число: "; cin >> value;

factorial = 1;

for(int i = 2; i <= value; i++) factorial *= i;

cout

<< "Факторила " << value <<

" равен " << factorial;

 

cout <<

endl

 

 

<<

"Хотите ввести еще

значение (y или n)? ";

 

cin >> indicator;

 

}

while((indicator == 'y') ||

(indicator == 'Y'));

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

Оператор перехода break

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

5

имя-метки

середине цикла:

//ищет сумму чисел до тех пор, //пока не будет введено 100 чисел или 0 for(s = 0, i = 1; i < 100; i++)

{

cin >> x;

if( x == 0) break;

// если ввели 0, то суммирование заканчивается s += x;

}

Оператор перехода continue

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

continue;

Пример:

int a,b;

for (a = 1,b = 0; a < 100; b += a,a++)

{

if (b % 2) continue;

//передача управление на очередную итерацию цикла for //не выполняя операторы обработки четных сумм

...//обработка четных сумм

}

Оператор continue, как и оператор break, прерывает самый внутренний из вложенных циклов.

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

Использование оператора безусловного перехода goto в практике программирования С/C++ настоятельно не рекомендуется, так как он затрудняет понимание программы и возможность ее модификации. Формат оператора следующий:

goto имя-метки;

...

имя-метки: оператор;

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

6

использовано для разных операторов программы. Приведем пример организации цикла, используя только goto и if:

int i = 0, sum = 0; const int max = 10; i=1;

loop:

sum += i; //накопление суммы целых чисел от 1 до 10 if (++i <= max)

goto loop;

Любой оператор в составном операторе может иметь свою метку. Используя оператор goto, можно передавать управление внутрь составного оператора.

Любая программа может быть написана без goto. Однако существуют ситуации (их немного), когда goto рекомендуется использовать. Например, выход из многократно вложенных циклов (поскольку оператор break осуществляет выход только из того цикла, где он использован).

В остальных случаях использовать goto не следует.

Оператор return

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

return [выражение];

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

Например:

int sum (int a, int b)

{

renurn (a+b);

}

7

Соседние файлы в папке Теория