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


· Значения всех переменных, входящих в выражение, должны быть определены до выполнения оператора while. Для этого их можно ввести (переменная to), задать в виде константы (RES), вычислить с помощью выражения, обращения к функции или задать другими способами. В противном случае переменная принимает случайное значение и результат непредсказуем. В нашем примере такая ошибка будет иметь место, если, например, забыть ввести переменную to или не записать RES=1.

· Выражение вычисляется и анализируется в начале перед выполнением тела цикла. Поэтому тело цикла может ни разу не выполнится, если в самом начале на первом шаге выражение ложно. Например, это произойдёт в нашем примере, если ввести в качестве переменной to отрицательное число.

· Одна или несколько переменных выражения должны меняться в операторах тела цикла. При этом изменение должно быть таким, чтобы на некотором шаге выражение стало ложным. В противном случае эта часть программы зациклится, то есть будет повторяться бесконечное количество раз. Прекратить выполнение программы (в том числе и в случае зацикливания) можно с помощью клавиш Ctrl+F2. Такая ситуация будет иметь место, например, если записать

RES=1;

while (RES< to)

R*=mult;

и ввести в качестве переменной to значение, большее 1. Здесь ни RES, ни to не меняются.

· Как и в случае с if, в выражении после while можно использовать операцию присваивания. Эта особенность делает программу компактнее, “красивее”, но в то же время усложняет её. Поэтому для начинающих эту возможность можно не использовать и программировать в более простом стиле. Например:

int main()

{ cout<<" h SUM ";

// профессиональный стиль

float h=3, SUM=0;

while ((h –= 0.5)>0)

{ SUM+=h;

printf("\n %5.1f %6.2f",h,SUM);

}

// или более простой вариант в стиле Pascal

h=3; h –= 0.5; // или h=2.5

SUM=0;

cout<<"\n----Pascal---";

while (h>0)

{ SUM+=h;

printf("\n %5.1f %6.2f",h,SUM);

h –= 0.5;

}

getch(); return 0;

}

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

· В теле цикла может не быть никаких операторов. Например,

char ch; while ((ch=getchar()) != ‘.’);

вводит с клавиатуры символы, пока не введём символ “.” (точку). Внутренние скобки нужны, так как операция присваивания имеет меньший приоритет, чем сравнение.

П р и м е р. Ввести координаты последовательности точек плоскости, то есть последовательность пар чисел x,y, каждая из которых определяет точку плоскости. Ввод и обработка прекращается, если введём x=0 и y=0. Найти K1 — количество точек первой четверти и K2 — количество точек 3-й четверти.

1–й вариант программы:

float x,y; int K1=0, K3=0;

cin>>x>>y; // Ввод координат первой точки вне цикла

while (!(x==0 && y==0))

{ if (x>=0 && y>=0) K1++;

else if (x<=0 && y<=0) K3++;

cin>>x>>y; // Ввод координат точек внутри цикла

}

cout<<"K1="<<K1<<" K3="<<K3;

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

K1=0, K3=0;

while (1)

{ cin>>x>>y;

if(x==0 && y==0)

break; // Выход из цикла,

// то есть управление передаётся на cout

if (x>=0 && y>=0) K1++;

else if (x<=0 && y<=0) K3++;

}

cout<<"K1="<<K1<<" K3="<<K3;

 

5.2. Оператор цикла do … while c постусловием

Ту же программу напишем с помощью другого оператора цикла:

RES=1;

do

RES*=mult; // или RES=RES*mult;

while (RES< to);

cout<<"\nResult= "<<RES;

Его общий вид такой:

do

{ оператор1;

оператор2;

операторN;

}

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

Работает оператор следующим образом. Сначала выполняется тело цикла, а затем вычисляется и проверяется значение выражения. Если оно, как и в первом операторе, истинно (не равно нулю), то операторы повторяются. В противном случае цикл прекращается.

В отличие от while повторяющаяся часть обязательно выполнится хотя бы один раз. В нашем примере, даже если введём, например, отрицательное значение to, а mult=2, цикл выполнится один раз, то есть RES станет равным 2, и выйдем из цикла.

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

Оператор for

Такой оператор есть практически во всех языках программирования, но в C++ он имеет больше возможностей. Например, рассмотрим следующий фрагмент программы для вывода квадратов и кубов чисел от a до b с шагом h:

float a,b,h,x; … x=a;

while (x<b)

{ printf ( “%4.1f %7.2f %10.3f \n”, x, x*x, x*x*x);

x+=h;

}

Его можно записать по–другому:

for (x=a; x<b; x+=h)

printf ( “%4.1f %7.2f %10.3f \n”, x, x*x, x*x*x);

Этот вариант работает аналогично предыдущему с оператором while.

Общий вид оператора цикла for следующий:

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

{ оператор1;

оператор2;

операторK;

}

В первомвыражениизаписываются одна или несколько разделённых запятой операций присваивания для установки начальных значений некоторым переменным (в примере — переменной x). Эта часть выполняется один раз вне данного цикла, то есть в цикле не повторяется. Начальные значения можно определить до оператора for, и тогда выражение1 может отсутствовать, но символ “;” обязательно записывается. Наш цикл можно записать так:

x=a;

for ( ; x<b; x+=h )

Второе выражение, как правило, является логическим, но не обязательно, (2.4) и определяет условие, при истинности которого цикл продолжается. Если условий несколько, они соединяются логическими операциями &&, ||, !. Вычисление и проверка этого выражения, в отличие от первого, повторяется каждый раз перед выполнением тела цикла. Поэтому если в самом начале оно ложно, код цикла может вообще не выполняться. Это выражение также может отсутствовать. Cимвол “точка с запятой” в таком случае записывается обязательно. Тогда условие выхода из цикла можно записать внутри тела цикла, а выход осуществляется с помощью break. Для нашего примера это может выглядеть таким образом:

for (x=a; ; x+=h)

{ if (x>=b) break;

printf ( “%4.1f %7.2f %10.3f \n”, x, x*x, x*x*x);

}

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

for ( x=a; x<b; )

{ printf ( “%4.1f %7.2f %10.3f \n”, x, x*x, x*x*x);

x+=h;

}

Отметим другие особенности оператора for.

· Могут отсутствовать все три выражения заголовка цикла. Например, ввод символов с клавиатуры до символа “.” (cм. 5.1) можно записать так:

for ( ; ; )

{ ch=getchar();

if (ch==’.’) break;

}

· Наоборот, может отсутствовать тело цикла. И только в этом случае после заголовка оператора for записывается символ “;”. Это можно использовать, например, для создания задержки:

for (t=0; t<10000; t++);

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

П р и м е р. Суммирование элементов одномерного массива можно выполнить одним из следующих способов:

int a[5]={1, 22, -3, -4, 5}; // объявление и инициализация массива.

/*1 */ int Sum=0; for ( int i=0; i<5; i++ )

Sum=Sum+a[i];

/*2 */ int i, Sum; for ( Sum=0,i=0; i<5; i++ )

Sum+=a[i];

/*3 Здесь отсутствует тело цикла, и только в этом случае в конце заголовка записывается “;”. Важен порядок операторов третьей части. Почему? */

int i, Sum; for ( Sum=0, i=0; i<5; Sum+=a[i] , i++);

/*4 */ int i, Sum; for ( Sum= i=0; i<5; Sum+=a[i++] );

// 5 Отсутствуют все три части заголовка оператора цикла

int Sum=0, i=0;

for (; ; ) { if ( i>=5) break;

Sum+=a[i];

i++;

}

Из приведенных вариантов наиболее простым для понимания и естественным, записанным в стиле языка Pascal, является 1-й вариант, а компактным, профессиональным — вариант 4.

Замечание. Подробно о массивах см. в § 6.



Дата добавления: 2016-07-18; просмотров: 2513;


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

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

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

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