Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга_2013_1_часть+.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
813.57 Кб
Скачать

§ 2. Оператор break

Оператор break используется, во-первых, для прерывания работы оператора switch и, во-вторых, для выхода из любого из трёх циклов.

Во втором варианте геометрической задачи (см. пример 4) используется так называемый вечный цикл. В этом случае в качестве выражения после while используется единица, которая всегда соответствует истине. Поэтому чтобы программа не зациклилась, выход из такого цикла осуществляется с помощью специального оператора break. Заметим, что вместо единицы можно записать true или любую ненулевую константу.

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

while (1) { cin>>x>>y; if(x==0 && y==0) break;

/* Вышли из цикла, управление передали на оператор cout, записанный после тела цикла, то есть после закрывающей фигурной скобки while */

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

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

§ 3. Оператор do … while

Ту же программу (см. пример 1) для сравнения напишем с помощью другого оператора цикла:

int mult, to, RES=1;

cout<<"Mult="; cin>>mult;

cout<<"To="; cin>>to;

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

while (RES< to);

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

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

do { оператор1;

оператор2; …

операторN;

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

Сначала выполняется тело цикла, а затем вычисляется и проверяется значение выражения. Если оно, как и в первом операторе, истинно (не равно нулю), то операторы, записанные между ключевыми словами do и while, повторяются. В противном случае цикл прекращается. Заметим, что аналогичный оператор языка Pascal repeatuntil работает по-другому; если выражение после until истинно, цикл прекращается.

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

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

§ 4. Оператор for

Такой оператор есть практически во всех языках программирования, но в C++ он имеет больше возможностей.

Пример 5. Вывести кубы целых чисел от 1 до 100. В каждой строке экрана выводить по 10 пар число и его куб. Первый вариант с помощью while:

int k=1; while (k<=100)

{ cout<< k <<” “<< k*k*k;

if (k%10==0) cout<<endl; k++; }

Этот цикл можно записать по–другому, используя оператор цикла for:

int k; for (k=1; k<=100; k++)

{ cout<< k <<” “<< k*k*k;

if (k%10==0) cout<<endl; }

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

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

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

{ оператор1; оператор2; …

операторK; }

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

int k=1; for (; k<=100; k++)

{ cout<< k <<” “<< k*k*k;

if (k%10==0) cout<<endl; }

Наоборот, в первом выражении может быть несколько присваиваний, разделённых “запятой”. Примеры будут приведены позже.

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

int k; for (k=1; ; k++)

{ if (k>100) break; cout<< k <<” “<< k*k*k;

if (k%10==0) cout<<endl; }

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

int k; for (k=1; k<=100; )

{ cout<< k <<” “<< k*k*k;

if (k%10==0) cout<<endl; k++; }

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

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

Могут отсутствовать все три выражения заголовка цикла for (см. пример 1 следующей главы, вариант 5). Например, ввод символов с клавиатуры до символа “.” (см. пример 3) можно записать так:

for ( ; ; ) { ch=getchar(); if (ch==’.’) break; }

Наоборот, может отсутствовать тело цикла. Его можно записать в третьей части заголовка ( см. пример 1 следующей главы, варианты 3, 4). И только в этом случае после заголовка оператора for записывается символ “;”. Это можно использовать, например, для создания задержки при выполнении программы: for (t=0; t<10000; t++);

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

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

Упражнения и тесты

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

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

do { r*=b; cout<<r<<" "; } while (r<a);

getch(); return 0; }

а) что будет выведено?

b) как будет работать программа, если вместо r<a записать r>=a?;

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

do { cout<<r<<" "; r *= b; } while (r<a);

2. Что будет выведено, если введём 4 9 6 11 -1?

main() { int m;

do { cin>>m; if (m==-1) break;

switch (m) {

case 1: case 2: case 3: cout<< 2;

case 4: case 5: cout<< 3; break;

case 6: case 7: case 8: cout<< 4;

case 9: case 10: cout<< 5; break;

default: cout<< "Error"; }

} while (1);

return 0; }

3. Что будет выведено?

int r=1, a=200, b=2;

while (r<a)

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

}

cout<<endl<<b;

4. Что будет выведено?

int r=1, a=200, b=2;

do { r*=++b; cout<<(r++)<<" " ;

} while (r<a);

cout<<endl<<(++b);

5. Что будет выведено, если ввести 0 2 2 0 2 2 1 -5 1000 2 1000 1000

float x, y; cin>>x>>y;

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

{ r= !(x>1 || y<=0) ? ++x: y--;

cout<<x<<” “<<y<<” “<<r; cin>>x>>y; }

6. Дан код::

float x,y; cin>>x>>y;

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

{ cout<<(y<x*x || y>3? x/y : x%y)<<" "; cin>>x>>y; }

Что будет выведено, если ввести 0 2 2 0 2 2 1 -5 1000 2?

Сравнить два заголовка цикла while двух последних упражнений.

7. Цикл for(I=10; I>0; I– –) cout << I*I<<” “;

записать с помощью a) while; б) dowhile.

8. Сравнить оператор for в С++ и Pascal.

9. Записать номера правильных утверждений:

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

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

3) Пусть в цикле оператора while нет break. Тогда значения всех переменных, используемых в выражении в круглых скобках после ключевого слова while, должны меняться в теле цикла так, чтобы на каком-нибудь этапе выражение стало ложным.

4) Пусть в цикле оператора while нет break. Тогда значения всех переменных, используемых в выражении в круглых скобках после ключевого слова while, должны меняться в теле цикла так, чтобы на каком-нибудь этапе выражение стало истинным.

5) Пусть в цикле оператора while нет break. Тогда значения некоторых переменных, используемых в выражении в круглых скобках после ключевого слова while, должны меняться в теле цикла так, чтобы на каком-нибудь этапе выражение стало ложным.

6) Тело оператора while выполняется всегда, как минимум, один раз.

7) Тело оператора do while выполняется всегда, как минимум, один раз.

Задачи

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

main() { float x, y, res; char c;

/* cОднобайтная переменная символьного типа */

bool er; /* erОднобайтная переменная логического типа со значением true (1) или false (0) */

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(); (см. гл 5) */

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; } // The end of switch

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

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

} // The end of while

return 0; } // The end of main

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

int main()

{ int k=0; float x,y; 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; }

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

// Вариант 1

cout<<'\n'; for ( int i=11; i<=99; i++)

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

// Вариант 2

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

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

// Вариант 3

cout<<endl; 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<<' '; }

4. Последовательно ввести значения вещественного x, пока не введем 1000. Для каждого из них вычислить r= sin(x), если 0 < x < ; r = x3, если – <= x < 0; r = x2, если x < –2* или x > 2*; 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>0 && x<Pi) 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; }

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

main() /* По умолчанию int main() */

{ int p=1, fact=1, 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; }

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

main() { int a, maxdig=0;

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

while (a) { int d= a%10; if (d>maxdig) maxdig = d; a = a/10; }

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

getch(); return 0;}

  1. Вычислить бесконечную сумму ряда с заданной точностью. Считать, что требуемая точность достигнута, если очередное слагаемое по модулю станет меньше, чем заданная точность .

int main() { double x ,y=1., g=1., i, e;

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

for (i=1; fabs(g)>e; i+=2) { g*=(-1)*x*x/(i*(i+1)); y=y+g; }

cout<<”y=”<< y; getch(); return 0; }

Уровень А

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

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

с точностью , используя следующие операторы: a) for; b) while; c) dowhile.

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

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

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

Уровень B

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

  2. Перевести целое число из 10-тичной системы счисления в 16 с.с.

  3. Перевести целое число из десятичной системы счисления в двоичную.

  4. Найти приближенно, с точностью до 0,001, минимум функции на отрезке [u, v ].

  5. Найти ,где = –функция, a, b — отрезок изменения х, целое n задано. Массив x не формировать.

  6. Вычислить y= с заданной погрешностью , используя следующую формулу: Вычисления прекращаем, если .