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

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

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

2018-01-04 263
Правила использования и особенности оператора while 0.00 из 5.00 0 оценок
Заказать работу

· Значения всех переменных, входящих в выражение, должны быть определены до выполнения оператора 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.

Операторы continue и break

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

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

float Sum=0; int K=0;

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

{ if (a[i]<=0) continue;

Sum+=a[i];

K++;

}

найдёт сумму и количество положительных чисел массива a.

Второй вариант цикла без continue

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

if (a[i]>0)

{ Sum+=a[i];

K++;

}

позволяет записать противоположное выражение в if. Здесь существенной разницы нет, но иногда один из вариантов проще (см. 6.3). В обоих вариантах обратите внимание на расстановку фигурных скобок!

Оператор break используется, во-первых, для прерывания работы оператора switch (§ 4) и, во-вторых, для выхода из любого из трёх циклов (см. 5.1, вечный цикл).

Пример использования break в операторе for. Определить, есть ли в одномерном массиве число 0. Если есть, вывести “Да” и номер первого нуля, в противном случае вывести “Нет”.

N0=-1;

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

if (a[i] ==0)

{ N0=i; break;

}

if (N0 == -1)

/* В массиве нет нуля, вышли из цикла после того, когда просмотрели все элементы, то есть когда i<n стало ложным */

cout<<”Нет”;

else

// В массиве был нуль и вышли из цикла с помощью break.

cout<<”Да, номер первого нуля ”<< N0;

Задачи и упражнения

1. Сравнить оператор for c аналогичным оператором языка Pascal.

2. Как будет работать оператор в следующих вариантах:

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

cout<<”\nVariant6 “<<Sum;

/*7*/ for (Sum=0, i=-1; i<4; Sum+=a[++i]);

cout<<”\nVariant7 “<<Sum;

3. Сравнить несколько вариантов, отличающихся наличием скобок и их расстановкой:

a) for (int I=0; I<n; I++)

if (a[I]>0)

K++;

cout<<”K=”<<K;

b) for (int I=0; I<n; I++)

{ if (a[I]>0)

K++;

}

cout<<”K=”<<K;

c) for (int I=0; I<n; I++)

{ if (a[I]>0)

K++;

cout<<”K=”<<K;

}

d) for (int I=0; I<n; I++)

if (a[I]>0)

{ K++;

cout<<”K=”<<K;

}

e) for (int I=0; I<n; I++)

if (a[I]>0)

K++;

else cout<<”K=”<<K;

4. Запрограммировать простой калькулятор на четыре арифметических действия: сложение, вычитание, умножение, деление.

main()

{ float x, y, res; char c; bool er;

clrscr(); cout<<"For EXIT --- the first number=1000 \n";

while (1)

{ er=false; cout<<"\nThe first number: "; cin>>x;

if (x == 1000) break;

cout<<"Operation: "; cin>>c;

// или c=getchar(); или c=getch(); или c=getche();

cout<<" The second number:"; cin>>y;

switch (c)

{ case '+': res=x+y; break;

case '*':

case '.': res=x*y; break;

case '–':

case '_': res=x-y; break;

case '/': if (y!=0) res=x/y;

else er=true; break;

default: er=true;

} // e nd of switch

if(er) cout<<" ERROR\n";

else cout<<x<<c<<y<<"="<<res<<endl;

} // end of while

return 0;

}

5. Ввести координаты точек плоскости до тех пор, пока не введем точку с координатами (1000, 1000). Массивы не использовать. Найти количество точек, принадлежащих области из 1-й или 3-й четверти, ограниченной окружностями радиуса 2 и 1 c центром в начале координат.

int main()

{ int k=0; float x,y;

clrscr(); cout<<"x=1000, y=1000 --- exit\n";

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

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

{ if ((x*x+y*y <= 4 && x*x+y*y >= 1) &&

(x>0 && y>0 || x<0 && y<0)) k++;

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

}

cout<<k; getch();

return 0;

}

6. Вывести квадраты чисел от 11 до 99 по 10 чисел в строке.

cout<<'\n'; // Вариант 1

for (int i=11; i<=99; i++)

cout<<i*i<< (i% 10 == 0? '\n': ' ');

cout<<endl; // Вариант 2

for (int i=11; i<=99; i++)

printf("%6d%c", i*i, i%10 ==0? '\n':' ');

cout<<endl; // Вариант 3

for (int i=11; i<=99; i++)

{ printf("%6d",i*i);

// if (i%10 = = 0) cout<< '\n'; else cout<<' '); или

if (!(i%10)) cout<< '\n'; else cout<<' ';

}

7. Последовательно ввести значения x, пока не введем 1000. Для каждого из них вычислить r = sin(x), если 0 < x < p; r = x 3, если –p <= x < 0; r = x 2, если x < –2*p или x > 2*p; r = 0 — в остальных случаях.

#define Pi 3.1459

int main()

{ float x=0,r; cout<<"1000 -- exit"<<endl;

cout<<" x y\n";

while (x!=1000)

{ gotoxy(2, wherey()); cin>>x;

if (x<Pi && x>0) r=sin(x);

else if (x<0 && x>=–Pi) r=x*x*x;

else if (x<–2*Pi || x>2*Pi) r=x*x;

else r=0;

gotoxy(20, wherey()-1); cout<<r<<endl;

} return 0; }

8. Для заданного n в одном цикле вычислить n! и 2 n.

main()

{ clrscr();

long int p=1, fact=1; int n, b=2;

cout<<"n<17 n= "; cin>>n;

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

{ p=p*b; fact=fact*i;

}

cout<<b<< " ^ "<<n<<" = "<<p<< endl;

cout<<n<<"! = "<<fact<<endl;

getch(); return 0;

}

9. Найти наибольшую цифру целого десятичного числа:

main()

{ long int a; int e_exit; int maxdig=0;

clrscr(); cout<<"\na="; cin>>a; a=abs(a);

while (a)

{ int d; d = a%10;

if (d>maxdig) maxdig = d;

a = a/10;

}

cout<<"The max digit: "<<maxdig;

getch(); return 0;

}

10. Вычислить бесконечную сумму ряда с заданной точностью:

Считать, что требуемая точность достигнута, если очередное слагаемое по модулю станет меньше, чем заданная точность e.

int main()

{ clrscr(); double x,y, g, i, e;

cout<<"x="; cin>>x;

cout<<"Epsilon="; cin>>e;

g=y=1.0 / 2.0 * x;

for(i=4; fabs(g)>e; i+=2)

{ g=g*(-1)*x/i; y=y+g;

}

y++; cout<<y;

getch(); return 0;

}

11. Дана программа:

main()

{ clrscr(); long int r=1, a=200, b=2;

do { r*=b; cout<<r<<" ";

} while (r<a);

getch(); return 0; }

а) определить результат работы этой программы;

б) что изменится, если после оператора do удалить фигурные скобки?;

в) проанализировать результат, если изменить порядок операторов

r *= b и cout<<r<<" ";

12. Цикл for(I=10; I>0; I– –) cout << I*I<<” “ записать с помощью следующих операторов: a) while; б) do…while.

13. Для заданного n вычислить

.

14. Вычислить приближенно значение бесконечной суммы

с точностью e, используя следующие операторы: a) for; б) while; в) do … while.

15. Вывести таблицу значений функции y = при изменении x от u до v с шагом h = (vu)/(n – 1), если u, v, n заданы.

16. Для натурального числа найти первую цифру и сумму его цифр.

17. Определить, является ли целое число симметричным, т. е. таким числом, которое одинаково читается слева направо и справа налево (палиндром, перевертыш). Например, числа 123321, 202, 9889, 5555, 8 — палиндромы.

18. Определить, является ли целое число простым.

19. Перевести целое число из десятичной системы счисления в двоичную систему счисления, используя алгоритм деления на 2.

20. Перевести целое число из десятичной системы счисления в шестнадцатеричную, используя алгоритм деления на 16.


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

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.133 с.