ЛИСТИНГ 6.12. Использование оператора continue для перезапуска
оператора break для выхода из бесконечного цикла for______________________________
#include
using namespace std;
:
int main ()
{
for(;;) // бесконечный цикл
:{
cout « "Enter two integers: " « endl;
int Numl = 0, Num2 = 0;
cin » Numl;
1 0 : cin » Num2;
1 1 :
cout « "Do you wish to correct the numbers? (y/n): ";
char ChangeNumbers = '\0 *;
cin » ChangeNumbers;
15:
if (ChangeNumbers == 'y ’)
continue; // перезапуск цикла!
19:
|
cout
|
«
|
Numl
|
«
|
" x
|
" «
|
Num2
|
«
|
" =
|
" «
|
Numl
|
* Num2
|
2 0 :
|
cout
|
«
|
endl;
|
«
|
" +
|
" «
|
Num2
|
«
|
" =
|
" «
|
Numl
|
+ Num2
|
«
|
Numl
|
2 1 :
|
|
«
|
endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cout « "Press x to exit or any other key to recalculate"
endl;
char UserSelection = *\0';
cin » UserSelection;
25:
if (UserSelection == ’x')
break; // выход из бесконечного цикла
}
29:
cout « "Goodbye!" « endl;
return 0;
}
Изменение поведения цикла с использованием операторов continue и break
|
137
|
Результат
Enter two integers:
560
25
Do you wish to correct the numbers? (y/n): у
Enter two integers:
56
25
Do you wish to correct the numbers? (y/n): n
56 x 25 = 1400
56+25=81
Press x to exit or any other key to recalculate
r
Enter two integers:
95
-1
Do you wish to correct the numbers? (y/n): n
95 x -1 = -95
95+-1=94
Press x to exit or any other key to recalculate
x
Goodbye!
Анализ
Цикл f o r в строке 5 отличается от такового в листинге 6.11 тем, что он бесконечный,
цикле отсутствует условие выхода, проверяемое на каждой итерации. Другими словами, без исполнения оператора b r e a k этот цикл (а следовательно, это приложение) никогда не завершится. Обратите внимание на вывод, который отличается от представленного до сих пор, — он позволяет пользователю поправить введенные числа, прежде чем программа перейдет к вычислению суммы и произведения. Эта логика реализуется в строках 16 и 17
использованием оператора c o n tin u e , выполняемого при определенном условии. Когда пользователь нажимает клавишу <у> в ответ на запрос, хочет ли он исправить числа, усло вие в строке 16 возвращает значение t r u e , а следовательно, выполняется оператор c o n tin u e . Оператор c o n tin u e возвращает выполнение к началу цикла, и пользователя снова спрашивают, не желает ли он ввести два целых числа. Аналогично в конце цикла, когда
ответ на предложение выйти из программы пользователь вводит символ ' х ', условие в строке 26 выполняется и выполняется следующий далее оператор b _ re a k , заканчиваю щий цикл.
Для создания бесконечного цикла в листинге 6.12 использован пустой опера тор for (;;). Вы можете заменить его оператором while (true) или do...
while (true); и получить тот же результат, хотя и будет использован цикл дру гого типа.
138 ЗАНЯТИЕ 6. Ветвление процесса выполнения программ
РЕКОМЕНДУЕТСЯ
Используйте цикл d o . . .w h ile , когда код в цикле должен быть выполнен по крайней мере один раз
Используйте циклы w h ile , d o . . . w h ile и f o r с хорошо продуманным условием выхода
Используйте отступы в блоке кода, содержа щегося в цикле, чтобы улучшить его удобочи таемость
РЕКОМЕНДУЕТСЯ
Не используйте оператор g o to
Не используйте операторы c o n tin u e и b re a k без крайней необходимости
Не используйте бесконечные циклы с операто ром b reak, если этого можно избежать
Программирование вложенных циклов
Как вы уже видели в начале этого занятия, вложенные операторы i f позволяют вло жить один цикл в другой. Предположим, есть два массива целых чисел. Программа поис ка произведения каждого элемента массива A r r a y l и каждого элемента массива А ггау2 будет проще, если использовать вложенный цикл. Первый цикл перебирает элементы мас сива A rr a y l, а второй цикл, внутри первого, перебирает элементы массива А ггау2 .
Листинг 6.13 демонстрирует, как можно вложить один цикл в другой.
ЛИСТИНГ 6.13. Использование вложенных циклов для умножения
каждого элемента одного массива на каждый элемент другого__________________________
#include
using namespace std;
2 :
int main ()
{
const int ARRAY1_LEN = 3;
const int ARRAY2_LEN = 2;
int Mylntsl[ARRAY1_LEN] = {35, -3, 0};
int Mylnts2 [ARRAY2_LEN] = {20, -lb-
1 0 :
cout « "Multiplying each int in Mylntsl by each in Mylnts2:"
« endl;
1 2 :
for(int Arrayllndex = 0; Arrayllndex < ARRAY1_LEN; ++Arrayllndex)
for(int Array2lndex = 0;
Array2lndex < ARRAY2_LEN; ++Array2lndex)
cout « • Mylntsl[Arrayllndex] « " x "
Mylnts2[Array2Index] \
« " = " « Mylntsl[Arrayllndex] * Mylnts2[Array2Index]
endl;
17:
return 0;
}
Программирование вложенных циклов
|
139
|
Результат
Multiplying each int in Mylntsl by each in Mylnts2:
35
|
x
|
20=
|
700
|
35
|
x
|
-1=
|
-35
|
-3
|
x
|
20=
|
-60
|
-3
|
x
|
-1=
|
3
|
0
|
x 20 = 0
|
|
0
|
x -1 = 0
|
|
Анализ
Рассматриваемые вложенные циклы f o r находятся в строках 13 и 14. Первый цикл f o r перебирает массив M y ln ts l, а второй — массив M y ln ts2 . Первый цикл f o r запу скает второй в пределах каждой итерации. Второй цикл f o r перебирает все элементы массива M y ln ts2 , причем при каждой итерации он умножает этот элемент на элемент, проиндексированный переменной A rra y 1 In d e x из первого, внешнего, цикла. Так, для каждого элемента массива M y ln ts l второй цикл переберет все элементы массива Му-In ts 2 , в результате первый элемент массива M y ln ts l (со смещением 0) перемножается со всеми элементами массива M y ln ts2 . Затем второй элемент массива M y ln ts l перемножа ется со всеми элементами массива M y ln ts2 . И наконец, третий элемент массива M y ln ts l перемножается со всеми элементами массива M y ln ts2 .
Для удобства (и чтобы не отвлекаться от циклов) содержимое массивов в ли стинге 6.13 инициализируется. В предыдущих примерах, например в листин ге 6.10, показано, как позволить пользователю ввести числа в целочисленный массив.
Использование вложенных циклов для перебора многомерного массива
На занятии 4 вы узнали о многомерных массивах. В листинге 4.3 происходит обра щение к элементам двумерного массива из трех рядов и трех столбцов. Там обращение
каждому элементу в каждом ряду осущ ествлялось индивидуально, и не было никакой автоматизации. Если бы массив стал большим или его размерностей стало больше, то для доступа к его элементам понадобилось бы много больше кода. Однако использование ци клов может все это изменить, как показано в листинге 6.14.
ЛИСТИНГ 6.14. Использование вложенных циклов для
перебора элементов двумерного массива___________________________________________
#include
using namespace std;
2 :
int main()
{
const int MAX_ROWS = 3;
const int MAX_COLS = 4;
140 ЗАНЯТИЕ 6. Ветвление процесса выполнения программ
Do'stlaringiz bilan baham: |