Операторы организации циклов


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

Фрагмент программы, который многократно повторяет выполнение одного или нескольких операторов, называется циклом, а последовательность операторов, входящая в данный фрагмент – телом цикла.

Повтор цикла (или итерация) – один из важнейших приёмов вычислений в программировании, состоящий в том, что определенная последовательность операторов (тело цикла) повторяется до достижения некоторого условия или заданное число раз.

Язык С++ имеет три оператора для организации цикла – while, do whileиfor.

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

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

while(условие)

тело цикла;

Операторwhileорганизует повторное выполнение одного оператора или нескольких операторов, образующих тело цикла, до тех пор, пока условие истинно. В качестве условия обычно используется условное выражение. Если в теле цикла нужно выполнить несколько операторов, то они заключаются в фигурные скобки ({}), т.е. используется составной оператор.

Оператор while называют оператором цикла с предусловием, так как истинность условия проверяется перед входом в цикл. Следовательно, возможна ситуация, когда тело цикла не выполнится ни разу (если условие сразу ложно).

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

// Пример4.9.Цикл типа while. Вычислить значение f = n!.

#include <iostream>

using namespace std;

int main(){

long int f = 1; int n, i = 1;

cout<<"Vvedi n > 0: " ; cin>>n;

while(i <= n){

f = f * i; i++;

}

cout<<"f = "<<f<<'\n';

}

 

 

// Пример 4.10.Определить количество цифр в заданном целом числе.

#include <iostream>

using namespace std;

int main(){

long num;

cout<<" Enter num: "; cin>>num;

cout<<" num = "<<num<<endl;

int k = 0;

while(num){

k++; num = num / 10;

}

cout<<"k = "<<k<<endl;

}

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

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

do

тело цикла;

while(условие);

Цикл типа do – while очень похож на цикл типа while с той лишь разницей, что проверка истинности условия в операторе do – while происходит после выполнения тела цикла. Поэтому такой цикл выполнится по крайней мере один раз. Повторение тела цикла происходит до тех пор, пока условие не примет значение ложь.

// Пример4.11.Цикл типа do – while. Вычислить значение f = n!.

#include <iostream>

using namespace std;

int main(){

long int f = 1; int n, i = 1;

cout<<"Vvedi n > 0: " ; cin>>n;

do{

f = f * i; i++;

}while(i <= n);

cout<<"f = "<<f<<'\n';

system("pause");

}

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

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

for(Выражение1; Выражение2; Выражение3)

тело цикла;

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

Выражение1 называется инициализирующим выражением, предназначено для установки управляющей переменной цикла, равной начальному значению. Эта переменная является счётчиком цикла (параметром цикла) и предназначена для управления работой цикла. Здесь также можно присваивать начальные значения и другим переменным, используемым в цикле. Инициализация выполняется только один раз перед началом выполнения цикла for.

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

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

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

Если в заголовке цикла отсутствует Выражение2, оно считается истинным.

При использовании цикла for следует избегать изменения управляющей переменной цикла в теле цикла.

// Пример4.12.Цикл типа for. Вычислить значение f = n!.

#include <iostream>

using namespace std;

int main(){

long int f = 1;

int n, i;

cout<<"Vvedi n > 0: " ; cin>>n;

for(i = 1; i <= n; i++)

f = f * i;

cout<<"f = "<<f<<'\n';

system("pause");

}

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

for (int i = 1, j=2; i <= 5; i++, j++) // заголовок цикла

тело цикла

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

for(int i = 1; i < m; i++)

if( i*i == VALUE) i = m;

 

// Пример 4.13.Вычислить сумму вида2+4+6+ +n, где n вводится.

#include <iostream>

using namespace std;

int main(){

int n, sum = 0;

cout<<"Enter n:"; cin>>n;

if(n % 2)n = n - 1;

for(int i = 2; i <= n; i+=2)

sum = sum + i;

cout<<" 2 + 4 + ... + " <<n<<" = "<<sum<<endl;

}

Способы организации бесконечных циклов

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

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

while(1){

тело цикла

}

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

const bool flag = true;

while(flag){

тело цикла

}

Бесконечный цикл можно организовать и с помощью оператора цикла for.

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

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

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

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

// Пример1. Вывод на экран пяти строк с цифрами от 0 до 9.

// Вложенный цикл организован оператором for.

int i, j;

for(i = 0; i < 5; i++) {

for(j = 0; j < 10; j++)

cout<<j<<' ';

cout<<endl;

}

// Пример 2. Ввод десяти значений месяца с проверкой правильности

// ввода. Вложенный цикл организован операторами for и do-while.

int i, den;

for(i = 1; i <= 10; i++){

do

cin>>den;

while(den < 1 || den > 31);

cout<<den;

}…

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

// Пример 4.14.Вычислить для каждого числа, вводимого с клавиатуры,

// его факториала. Построить диалог при вводе чисел.

#include <iostream>

using namespace std;

int main(){

short n;

char flag = 'y';

while(flag == 'y'){

cout << "Enter the number\n"; cin >> n;

if(n <= 0){cout<<" Data error! "<<endl; system("pause");}

long k = 1;

for(short i = 1; i <= n; i++)

k = k * i;

cout<<"Factorial chisla "<<n<<" = "<<k<<endl;

cout<<" Continue? (y/n)\n"; cin>>flag;

}

system("pause");

}

Оператор break

Оператор breakимеет два назначения. Первое – окончание работы оператора switch, второе – принудительное окончание цикла, минуя стандартную проверку условия.

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

заголовок_цикла{

if(условие) break;

}

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

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

while(true){

if (условие) break;

}

// Пример4.15.Длякаждогочисла, вводимого с клавиатуры, получить

// сумму его цифр. Конец вычислений – ввод числа, равного нулю.

#include <iostream>

using namespace std;

int main(){

long num;

for( ; ; ){

cout<<"Enter number: "; cin>>num;

if(!num) break;

int sum = 0;

while(num){

int c=num % 10;

sum = sum + c; num = num / 10;

}

cout<<" summa= "<<sum<<endl;

}

}

Оператор continue

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

заголовок_цикла{

if(условие) continue;

}

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

// Пример1. Вывод на экран чисел кратных десяти, но меньших ста.

// Оператор continue не используется.

for(int a = 0; a < 100; a++)

if(a % 10 !=0);

else cout<<a<<' ';

cout<<endl; …

// Пример2. Вывод на экран чисел кратных десяти, но меньших ста.

// Оператор continue используется.

...

for(int a = 0; a < 100; a++){

if(a % 10 !=0) continue;

cout<<a<<' ';

}

cout<<endl;…

Следует обратить внимание на особенность оператора continue в циклах for, while или do–while. В цикле с использованием оператора for после выполнения оператора continue, управление передаётся на вычисление третьего выражения в скобках, в приведённом примере на a++;затем на проверку условия a <100. При использовании while или do–while часть цикла, располагающаяся после continue не выполняется, а управление сразу передаётся на проверку условия, что может привести к зацикливанию, например:

int a = 0;

while(a < 100){

if(a % 10) continue; // зацикливание при a = 1;

cout<<a<<’ ‘;

a++;

}…

Конечно, зацикливание можно избежать следующим образом:

int a = -1;

while(a++, a < 100){

if(a % 10) continue;

cout<<a<<’ ‘;

}

// Пример4.16.Длякаждогочисла, вводимого с клавиатуры, получить

// сумму его младших цифр, до первой цифры нуль. Конец ввода чисел

// определяется вводом числа, равного нулю.

#include <iostream>

using namespace std;

int main(){

long num;

for( ; ; ){

cout<<"Enter number: "; cin>>num;

cout<<"num = "<<num ;

if(!num) break;

int sum = 0;

while(num){

int c = num % 10;

if(!c){

num = 0; continue;

}

sum = sum + c; num = num / 10;

}

cout<<" sum = "<<sum<<endl;

}



Дата добавления: 2022-05-27; просмотров: 76;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.037 сек.