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

Г л а в а 2 циклы

В этой главе будут рассмотрены циклические алгоритмы и их реализация на языке С++.

§ 1. Оператор while

Пример 1.

int main()

{ int mult, to, RES=1;

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

while (RES< to)

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

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

getch(); return 0; }

Оператор while называется оператором цикла с предусловием и выполняется, как и в других языках, следующим образом. Вне цикла, то есть один раз вводим два целых значения и RES=1. Пусть в качестве mult ввели 2, а to=100. Проверяется условие RES<to, записанное в скобках оператора while, то есть 1<100. Так как условие истинно, выполняется RES*=mult, то есть RES=1*2=2. Без какихлибо дополнительных операторов передаётся управление на повторную проверку условия RES<to. Так как 2<100, выполняется RES*=mult, то есть RES=2*2=4. Снова проверяется 4<100, увеличивается RES и т. д., то есть переменная RES будет принимать последовательно значения 16, 32,…. До каких пор? На некотором шаге RES примет значение 64. Так как 64<100, то RES=64*2=128. Проверяется условие 128<100, и так как оно ложно, выходим из цикла. Это означает, что выполняется оператор, записанный после while, а точнее, после последнего повторяющегося оператора (после тела цикла). У нас повторяется единственный оператор, не считая условия, поэтому выполняется cout<<"\nResult="<<RES и выводится 128.

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

while (выражение) { оператор1;

оператор2; …

операторN;

}

Выражение в отличие от Pascal должно записываться в круглых скобках. В простых случаях, как и в других языках, оно является логическим, то есть содержит логические и (или) операции сравнения. Но, в отличие от других языков, как и в операторе if, это не обязательно. Вместо while (X !=0 ) операторы; можно записать короче: while (X) операторы;

Фигурные скобки (BeginEnd в Pascal) определяют операторы, которые наряду с вычислением и проверкой выражения будут повторяться (тело цикла). Если в теле цикла один оператор, фигурные скобки не обязательны, но не будет ошибки, если их написать. Поэтому если есть сомнения в количестве повторяющихся операторов, то лучше скобки записать. Не будет ошибки, если цикл в первом варианте в начале параграфа записать так:

while (RES< to) { RES*=mult; }

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

while ( RES<to) { RES*=mult; cout<<"\nResult= "<<RES; }

приведёт к тому, что вывод будет выполняться не один раз, как в начальном варианте, а будет повторяться. В этом случае в “столбик” будет выводиться 2, 4, 8, …, 128 каждый раз вместе с одним и тем же текстом "Result= ". так как cout<<"\nResult=”; содержит управляющий символ ‘\n’ для перехода на новую строку.

Упражнение. Как слово Result вывести один раз, а все произведения (2 4 8 и т. д.) вывести в строку?

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

Приведём важные с практической точки зрения правила использования и особенности оператора while.

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

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

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

Упражнение. В каком случае эти два оператора выполняются одинаково?

Одна или несколько переменных выражения должны меняться в операторах тела цикла. При этом изменение должно быть таким, чтобы на некотором шаге выражение стало ложным. В противном случае эта часть программы зациклится, то есть будет повторяться бесконечное количество раз. Прекратить выполнение программы (в том числе и в случае зацикливания) можно с помощью клавиш Ctrl+F2. Такая ситуация будет иметь место, например, если записать RES=1; while (RES< to) R*=mult; и ввести в качестве переменной to значение, большее 1. Здесь ни RES, ни to не меняются.

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

Пример 2.

int main() { cout<<" h SUM ";

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

float SUM=0, h=3;

while ((h –= 0.5)>0)

{ SUM+=h; printf("\n %5.1f %6.2f",h,SUM); }

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

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

SUM=0; h=3; h –= 0.5;

while (h>0)

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

h –= 0.5; }

getch(); return 0; }

Этот вариант помогает понять, как работает цикл.

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

Пример 3.

char ch;

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

Здесь ch — однобайтная переменная для хранения одного символа или числа, его кода. Функция getchar() вводит с клавиатуры один символ с отображением его на экране. Цикл вводит символы, пока не введём символ “.” (точку). Внутренние круглые скобки нужны, так как операция присваивания имеет меньший приоритет, чем сравнение на неравенство.

Пример 4. Ввести координаты точек плоскости, то есть последовательность пар чисел x, y, каждая из которых определяет точку. Ввод и обработка прекращаются, если введём x=0 и y=0. Найти — количество точек первой (K1) и третьей (K3).четверти. Массив координат точек не формировать.

Первый вариант программы:

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;