Добавлен: 03.04.2023
Просмотров: 862
Скачиваний: 3
Рисунок 4
Глава 3. Циклы
Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы.
Цикл — многократное прохождение по одному и тому же коду программы. Циклы необходимы программисту для многократного выполнения одного и того же кода, пока истинно какое-то условие. Если условие всегда истинно, то такой цикл называется бесконечным, у такого цикла нет точки выхода.
В языке программирования С++ существуют такие циклы:
- цикл for;
- цикл while;
- цикл do while.
Тело цикла будет выполняться до тех пор, пока условие будет истинно.
Цикл for
Форма записи оператора цикла for:
for(/*выражение1*/; /*выражение2*/; /*выражение3*/)
{
/*один оператор или блок операторов*/;
}
Если в теле цикла for должен выполниться один оператор, то фигурные скобки можно опустить [37]:
for(/*выражение1*/; /*выражение2*/; /*выражение3*/)
/*один оператор*/;
Рассмотрим подробно три выражения, записанные в круглых скобках цикла for.
Выражение 1 — объявление (и) или инициализация ранее объявленной переменной-счетчика, которая будет отвечать за истинность условия в цикле for. Переменная-счетчик всегда должна иметь целочисленный тип данных. Если переменная была объявлена в цикле (все равно в каком), по завершении цикла эта переменная будет уничтожена.
Выражение 2 — это условие продолжения цикла for, оно проверяется на истинность.
Выражение 3 изменяет значение переменной-счетчика. Без выражения 3 цикл считается бесконечным, так как изменение содержимого переменной count выполняться не будет, и если изначально условие было истинным, то цикл будет бесконечным, иначе программа даже не войдет в цикл.
Выражения 1, 2, 3 отделяются друг от друга обязательными разделителями, точкой с запятой. Тело цикла обрамляется фигурными скобками. Если тело цикла состоит из одного оператора, то фигурные скобки не нужны. Под изменением значения переменной подразумевается уменьшение или приращение значения, например:
for(int counter=0; counter<15; counter++)
выполняется приращение переменной counter с шагом 1 от 0 до 14
- ++ операция инкремента, увеличение значения переменной на единицу;
- -- операция декремента, уменьшение значения переменной на единицу.
Очень часто неправильно интерпретируется запись пределов в цикле for, в приведенном ранее приращение переменной counter выполняется с шагом 1 от 0 до 15. Особое внимание следует обратить на конечный предел. [38] [39] В условии продолжения цикла стоит знак отношения строго меньше, а значит, когда значение в переменной counter будет равно 14, выполнится выход из цикла. Ниже показан пример работы программы (см. Листинг 6).
- #include <iostream>
- using namespace std;
- int main(int argc, char* argv[])
- {
- for (int counter=0; counter<15; counter++)
- cout<<counter<<" ";
- cout<<endl;
- system("pause");
- return 0;
- }
Листинг 6
В строках 8 и 9 записан цикл for без фигурных скобок. Если фигурные скобки отсутствуют, значит, телом цикла является следующий оператор после заголовка цикла, в данном случае это оператор вывода. Заголовком цикла for является строка 8.
Рисунок 5
Ниже показан результат работы программы с использованием декремента, для уменьшения значения переменной-счетчика (см. Листинг 7).
- #include <iostream>
- using namespace std;
- int main(int argc, char* argv[])
- {
- for(int count=14; count>=0; count--)
- cout << " " << count;
- cout << endl;
- system("pause");
- return 0;
- }
Листинг 7
В заголовке цикла for в условии продолжения цикла использован нестрогий знак отношения >=, чтобы последним значением переменной-счётчика был 0.
Рисунок 6
Шаг в цикле for может быть отличным от единицы, а точнее, любым целым числом.
for(int i=0; i<=20; i+=5)
приращение переменной i от 0 до 20 включительно с шагом 5
В этом случае переменная counter будет равняться 5, 10, 15, и 20, после чего выполнится выход из цикла for.
for ( int i=20; i>= 0; i-=5)
изменение переменной i от 20 до 0 включительно с шагом 5
Далее показан код программы, которая подсчитывает количество чётных чисел в интервале от 0 до 50 включительно (см. Листинг 8).
- #include <iostream>
- using namespace std;
- int main(int argc, char* argv[])
- {
- int counter = 0;
- for (int i=2; i<=50; i+=2)
- counter_even ++;
- cout<<"Четных чисел: "<<counter<<endl;
- system("pause");
- return 0;
- }
Листинг 8
В строке 9 объявлена и инициализирована нулём переменная для хранения количества чётных чисел. В заголовке цикла for в строке 10 переменная counter инициализирована двойкой, так как двойка — первое чётное число, начиная с 0. Шаг цикла равен двум, таким образом, следующее чётное число это 4. В строке 11 переменная counter_even инкрементируется на каждом этапе цикла for. Результат работы программы показан ниже (см. Рисунок 7).
Рисунок 7
Цикл while
Оператор цикла while или цикл while — цикл, повторяющий одно и то же действие, пока условие продолжения цикла while остаётся истинным. [40]
while(/*условие продолжения цикла while*/)
{
/*блок операторов*/;
}
Условие продолжения цикла должно быть истинно (true), как только условие стало ложным, выполняется выход из цикла. [41] Также как и в условных операторах выбора, фигурные скобки могут опускаться в том случае, если тело цикла — это один оператор. [42] Но, как правило, в цикле выполняется несколько операторов, так как кроме выполнения полезного действия необходимо делать условие цикла while ложным, иначе цикл будет бесконечным, что в свою очередь, приведет к зависанию программы. [43] [44]
Рассмотрим применение цикла while на примере движения автомобиля. Истинным условием цикла, в данном случае, является скорость автомобиля меньше 60 км/ч, а ложным — скорость автомобиля больше или равно 60 км/ч. Повторение цикла будет продолжаться, до тех пор пока скорость автомобиля не станет больше или равна 60 км/ч, после наступления этого момента условие цикла станет ложным, и программа выйдет из цикла. Рассмотрим фрагмент кода на C++ с циклом while, решающим поставленную задачу.
int speed = 5; // начальная скорость автомобиля
while ( speed < 60 ) // заголовок цикла while
speed += 10; // тело цикла
Для начала в строке 1 была объявлена и инициализирована переменная speed. В строке 2 программа проверяет условие цикла while, 5 < 60 = true. Программа входит в цикл и выполняет оператор в строке 3. Теперь уже speed = 15. Опять выполняется проверка 15 < 60 = true. Условие истинно, значение в переменной изменяется, speed = 25. Таким образом, выполняются последовательные повторения цикла, переменная speed принимает следующие значения: 35, 45, 55, 65. Последнее изменение переменной speed приводит к тому, что условие в цикле while становится ложным 65 < 60 = false, и производится выход из цикла while. Таким образом, выполнилось 6 повторений, при этом speed = 65; — с таким значением переменной закончилась работа цикла while. В виде программы данная задача будет выглядеть следующим образом (см. Листинг 9):
- #include <iostream>
- using namespace std;
- int main(int argc, char* argv[])
- {
- int speed = 5, count = 1;
- while (speed<60)
- {
- speed += 10;
- cout<<count<<"-speed="<<speed<<endl;
- count++;
- }
- system("pause");
- return 0;
- }
Листинг 9
В строке 14 добавлена переменная-счётчик для подсчёта прохождений цикла. Тело цикла увеличилось, поэтому пришлось поставить фигурные скобки. Результат работы программы показан на Рисунке 8:
Рисунок 8
Всего 6 повторений цикла, и после выхода из цикла while переменная speed = 65.
Еще одной иллюстрацией работы цикла while может стать игра «Отгадай число». Используя генератор случайных чисел, компьютер загадывает число от 1 до 10, включительно, пока пользователь не отгадает число, выход из цикла не произойдет (см. Листинг 10).
- #include <iostream>
- #include <ctime>
- using namespace std;
- int main(int argc, char* argv[])
- {
- srand( time( 0 ) );
- int a, b;
- a = 1+rand()%10;
- cout << "Введите номер [1:10] : ";
- cin >> b;
- while (a!=b)
- {
- cout<<"Введите номер [1:10] : ";
- cin>>b;
- }
- cout<<"Угадал!!!"<<endl;
- system("pause");
- return 0;
- }
Листинг 10
Чтобы войти в цикл, необходимо инициализировать переменную enter_number, тогда цикл while начнёт корректную проверку условия. Именно для этого перед циклом while запрашиваем ввод числа. После того как пользователь ввёл число, начинает работать цикл while, выйти из которого получится только в случае угадывания числа. Результат работы программы можно увидеть на Рисунке 9:
Рисунок 9
Цикл do while
Цикл do while отличается от цикла while тем, что в do while сначала выполняется тело цикла, а затем проверяется условие продолжения цикла. [45] Из-за такой особенности do while называют циклом с постусловием. Таким образом, если условие do while заведомо ложное, то хотя бы один раз блок операторов в теле цикла do while выполнится. [46] Цикл do while отличается от цикла while структурой. В цикле while сначала выполняется проверка условия продолжения цикла, и если условие истинно, то только тогда выполняется тело цикла. Цикл do while работает противоположным образом: сначала выполняется тело цикла, а потом проверяется условие, вот почему тело цикла do while, хотя бы раз, выполнится. [47]
do
{
/*блок операторов*/;
}while(/*условие выполнения цикла*/);
В начале цикла do while пишется зарезервированное слово do, после идут фигурные скобки, которые можно опускать в случае использования одного оператора в теле цикла do while. После закрывающей фигурной скобки, обозначающей конец тела цикла do while, стоит условие цикла do while, после которого обязательно нужно ставить точку с запятой. Рассмотрим программу с циклом do while, которая выполняет некоторые транзакции с денежным счётом в банке (см. Листинг 11).
- #include <iostream>
- #include <ctime>
- using namespace std;
- int main(int argc, char* argv[])
- {
- srand(time(0));
- int balance = 8;
- do
- {
- cout<<"Баланс: "<<balance<<endl;
- int removal = rand()%3;
- cout<<"Вычтено: "<<removal<<endl;
- balance -= removal;
- }while(balance>0);
- system("pause");
- return 0;
- }
Листинг 11
В строке 11 объявлена переменная balance, она отвечает за остаток денежных средств на счету. С 10-й по 16-ю строки записан цикл do while. В цикле do while выполняются все транзакции со счётом balance, а именно — перевод денежных средств на какой-то другой счёт, строка 19. Строка 12 показывает остаток денежных средств на счету balance. В строке 13 объявлена переменная, в которой хранится вычитаемое значение, причём это значение генерируется случайно в интервале [0;2]. Переменная removal один раз объявляется в теле цикла do while, и каждый раз при повторении цикла эта переменная не переопределяется. А вот её значение меняется, в зависимости от того, какое число сгенерировалось. В строке 16 записано условие цикла do while, как только условие станет ложным, программа передаст управление следующему оператору, после цикла do while, строка 17. Результат работы программы приведен ниже (см. Рисунок 10).
Рисунок 10
Сначала показан остаток, а затем снятие суммы, после чего опять идёт остаток и так до тех пор, пока на счету не окажется денег. Последней выводимой строкой оказалась строка со снимаемой суммой, а потом цикл завершил свою работу. Хотя и не видно последнего остатка на счету, можно и так сказать, что он равен 0.
Если вспомнить один из предыдущих примеров, игру «Угадай число», то было бы правильнее использовать цикл do while, это позволило бы уменьшить код на 2 строки (см. Листинг 12).
- #include <iostream>
- #include <ctime>
- using namespace std;
- int main(int argc, char* argv[])
- {
- srand(time(0));
- int a = 1+rand()%10;
- int b;
- do
- {
- cout<<"Введите число [1:10]: ";
- cin>>b;
- }while(b!=a);
- cout<<"Вы угадали"<<endl;
- system("pause");
- return 0;
- }