#include
using namespace std;
:
int main()
{
JumpToPoint:
int Numl = 0, Num2 = 0;
cout « "Enter two integers: " « endl;
cin >> Numl;
cin » Num2;
1 1 :
|
cout
|
«
|
Numl
|
«
|
" x "
|
«
|
Num2
|
«
|
"
|
=
|
" «
|
Numl *
|
Num2 «
|
endl;
|
12:
|
13:
|
cout
|
«
|
Numl
|
«
|
" + "
|
«
|
Num2
|
«
|
"
|
=
|
" «
|
Numl +
|
Num2 <<
|
endl;
|
14:
|
cout
|
«
|
"Do
|
you wish
|
to perform
|
another
|
operation
|
(y/n)?"
|
|
15:
|
|
endl;
char Repeat = 'y';
Выполнение кода в циклах
|
127
|
cin » Repeat;
1В:
if (Repeat == 'у')
goto JumpToPoint;
cout « "Goodbye!" « endl;
return 0;
Результат
Enter two integers:
56
25
56 x 25 = 1400
56+25=81
Do you wish to perform another operation (y/n)?
У
Enter two integers:
95
-47
95 x -47 = -4465
95+-47=48
Do you wish to perform another operation (y/n)?
n
Goodbye!
Анализ
Обратите внимание на основное различие между кодом листинга 6.7 и листинга 6.1: последнему требуются два запуска, чтобы позволить пользователю ввести новый набор чисел и увидеть результат их сложения или умножения. Код листинга 6.7 делает это при одном запуске, циклически повторяя запрос пользователю, желает ли он выполнить дру гую операцию. Код, фактически обеспечивающий это повторение, находится в строке 20, где вызывается оператор g o to , если пользователь вводит символ ' у '. В результате ис пользования оператора g o to в строке 20 программа переходит к метке Jum pT oP oint, объ явленной в строке 5, что фактически перезапускает программу.
ВНИМАНИЕ!
|
Использование оператора goto не рекомендуется для создания циклов, по
|
|
|
скольку его массовое применение может привести к непредсказуемой после
|
|
довательности выполнения кода, когда выполнение может переходить с одной
|
|
строки на другую без всякого очевидного порядка или последовательности,
|
|
оставляя также переменные в непредсказуемых состояниях.
|
|
Тяжелый случай программы, использующей операторы goto, называется за
|
|
путанная программа (spaghetti code). Объясняемые на следующих страницах
|
|
циклы while, do...while и for вполне позволяют избежать использования
|
|
оператора goto.
|
|
Единственная причина упоминания здесь оператора goto в том, чтобы объ
|
|
яснить код, который его использует.
|
128 ЗАНЯТИЕ в. Ветвление процесса выполнения программ
Цикл while
Ключевое слово w h ile языка C++ позволяет получить то, что оператор g o to делал в листинге 6.7, но правильным способом. Синтаксис таков:
while(выражение)
{
I I Результат выражения = true
БлокОператоров;
}
Выполнение блока операторов повторяется до тех пор, пока выражение возвращ а ет значение t r u e . О чень важно, чтобы в коде бы ла ситуация, где выражение возвра щ ает значение f a l s e , иначе цикл w h ile никогда не заверш ится.
Листинг 6.8 является эквивалентом листинга 6.7, позволяющим пользователю повто рять цикл вычисления, но с использованием цикла w h ile вместо оператора g o to .
ЛИСТИНГ 6.8. Использование цикла while позволяет
пользователю повторно выполнять вычисления______________________________________
#include
using namespace std;
2 :
int main()
{
char UserSelection = 'm'; // Исходное значение
6 :
while (UserSelection != 'x')
8 : {
cout « "Enter the two integers: " « endl;
int Numl = 0, Num2 = 0;
cin » Numl;
cin » Num2;
13:
14: cout « Numl « " x " « Num2 « " = " « Numl * Num2
endl;
15: cout « Numl « " + " « Num2 « " = " « Numl + Num2
endl;
16:
17: cout « "Press x to exit(x) or any other key to recalculate"
endl;
cin » UserSelection;
}
2 0 :
21: cout « "Goodbye!" « endl;
2 2 :
return 0;
}
Результат
Enter the two integers:
56
Выполнение кода в циклах
|
129
|
25
56 х 25 = 1400
56+25=81
Press х to exit(х) or any other key to recalculate r
Enter the two integers:
365
-5
365 x -5 = -1825
365 + -5 = 360
Press x to exit(x) or any other key to recalculate
x
Goodbye!
Анализ
Цикл w h ile в строках 7 -19 содержит больш ую часть логики этой программы . Об-ратите внимание, что цикл w h ile проверяет выражение ( U s e r S e l e c t i o n ! = ' х 1) и продолжает выполнение, только если оно возвращ ает значение t r u e . Для обеспечения первого запуска символьная переменная U s e r S e le c ti o n инициализируется в строке 5 значением ' i '. Это должно было быть любым значением, кроме *х 1 (иначе условие не будет выполняться с самого первого цикла и приложение закончит выполнение, не по зволив пользователю ничего сделать). Первый запуск очень прост — у пользователя в строке 17 спрашивают, не желает ли он выполнить вычисления снова. Строка 18 прини мает сделанный пользователем выбор; здесь вы изменяете значение выражения, которое проверяет цикл w h ile , давая программе шанс продолжить выполнение или завершить его. По завершении первого цикла выполнение возвращается к проверке выражения оператора w h ile в строке 7 и цикл повторяется, если пользователь ввел значение, отличное от ' х '. Если пользователь нажал клавишу <х>, то выражение в строке 7 вернет значение f a l s e и никл w h ile окончится. Приложение после этого также закончит работу, вежливо попро щавшись.
ПРИМЕЧАНИЕ Цикл также называется итерацией (iteration). Выражения, задействовавшие циклы while, do...while и f_or, также называют итерационными выра жениями.
Цикл do...while
Бывают ситуации (как в листинге 6.8), когда определенному сегменту кода, повторяе мому в цикле, необходимо гарантировать выполнение по крайней мере однажды. Для это го используется цикл d o . . . w h ile .
Его синтаксис таков:
do
{
БлокОператоров; // выполняется как минимум раз
} while(у с л о в и е ); // закончить цикл, если условие ложно
5 Зак. 3626
13:
14:
15:
16:
130 ЗАНЯТИЕ 6. Ветвление процесса выполнения программ
Обратите внимание, что строка, содержащая часть w h ile (у с л о в и е ), заканчивается точкой с запятой. Это является отличием от цикла w h ile , в котором точка с запятой фак тически завершила бы цикл в первой строке, приведя к пустому оператору.
ЛИСТИНГ6.9. Использование цикла do...while для повторного выполнения блока кода
#include
using namespace std;
2 :
int main()
{
5: char UserSelection = 'x ’; // Исходное значение
do
{
8: cout « "Enter the two integers: " « endl;
int Numl = 0,Num2 = 0;
cin » Numl;
cin » Num2;
1 2 :
cout « Numl « " x " « Num2 « " = " « Numl * Num2
endl;
cout « Numl « " + " « Num2 « " = " « Numl + Num2
endl;
cout « "Press x to exit(x) or any other key to recalculate"
endl;
cin » UserSelection;
} while (UserSelection != 'x');
20: cout « "Goodbye!" « endl;
2 1 :
return 0;
}
Do'stlaringiz bilan baham: |