Безусловный оператор
По установленному принципу все операторы выполняются в той последовательности, в какой они записаны в программе. Однако возникают ситуации, когда эту последовательность приходиться нарушать, то есть «перескакивать» через несколько операторов вперед или возвращаться назад к уже выполненному оператору. Для этой цели в С++ предусмотрен специальный оператор безусловного перехода. Его синтаксис имеет вид:
|
goto – это ключевое слово. Метка – это адрес того оператора, который должен выполняться следующим. В качестве метки может использоваться любой идентификатор, который должен помещаться перед оператором и отделяться от него двоеточием. Например:
а1: оператор1;
Здесь а1 – идентификатор, играющий роль метки. Оператор безусловного перехода всегда используется при каком–то условии и размещается в ветви оператора условия. Пример записи:
if (a > b) goto c5;
else k ++;
Оператор безусловного перехода нарушает простой и установленный порядок последовательного выполнения команд программы. Если таких переходов в пределах программы будет несколько, то понимание программы заметно усложняется. Поэтому рекомендуется всячески избегать применения этих операторов и использовать их в крайних случаях. Возможности для этого в языке С++ есть. Но здесь выходит на первый план вопрос того, что проще – использовать оператор безусловного перехода или другие средства, исключающие его применение.
Применение вложенных операторов условия с количеством вложений более трех становится неудобным. В таких случаях целесообразно использовать другой оператор множественного выбора. Синтаксис этого оператора следующий:
switch (n)
{
case x1: оператор1; break;
case x2: оператор2; break;
............
case xm: оператор m; break;
default: оператор;
}
Здесь switch, case, break, default – ключевые слова. n – целое число, символ или выражение, значение которого является целое число. x1, x2,..., xm – коды. В качестве кода может использоваться целое число или символ, или выражение из целых чисел.
Сущность работы оператора множественного выбора состоит в совпадении значения n с каким – либо из кодов (x1, x2,..., xm). При таком совпадении выполняется оператор, помеченный этим кодом, и затем осуществляется выход из оператора switch и переход на выполнение следующего за ним оператора. Если же значение переменной n не совпадет ни с каким–либо кодом, то будет выполняться оператор, записанный после слова default. Если после выполняемого оператора не будет записано ключевое слово break, а это допускается, то выход из оператора switch не произойдет, и будут выполняться все, последующие операторы, до тех пор, пока не встретится оператор со словом break. Только после этого совершится выход из оператора множественного выбора.
Оператор switch еще называют переключателем. Он аналогичен оператору условия. Вся запись до слова default аналогична основной, а запись после этого слова – альтернативной ветви. Допускается отсутствие альтернативной ветви default. Пример, поясняющий работу переключателя:
n = 5;
switch (n)
{
case 3: опреатор1; break;
case 5: оператор2; break;
case 2*3: оператор3; break;
case 9: оператор4; break;
default: оператор5;
}
В этом примере будет выполняться оператор2 так, как его код совпал со значением переменной n. После его выполнения происходит выход из переключателя switch, так как оператор имел после себя слово break.
Пример 2.
n = 3;
switch (n)
{
case 3: опреатор1;
case 5: оператор2;
case 2*3: оператор3;
case 9: оператор4; break;
default: оператор5;
}
В этом примере будет выполняться опреатор1 и все последующие, вплоть до оператора 4. После выполнения оператора 4 произойдет выход из переключателя switch.
Примером практического применения оператора множественного выбора является следующая задача.
Составить программу для вычисления любой из функций y = sin(x), y = cos(x), y = tg(x) или y = ex по выбору.
На рис.11.5 приведена блок – схема алгоритма решения задачи. Алгоритм предусматривает установление кода каждой из этих функций и кроме того кода нормального завершения программы. Все коды операций выводятся на экран. На правильный набор кода дается m попыток. Количество использованных попыток фиксируется счетчиком k. Если количество неправильных попыток превышает установленный лимит m, то программа завершает свою работу выводом на экран cообщения о причине завершения.
Из блок – схемы видно, что алгоритм предусматривает пять вложенных условий. Если этот алгоритм описать с помощью вложенного оператора условия, то понять логику вычислений будет достаточно сложно. В этом случае существенно выигрывает оператор множественного выбора. Он делает программу наглядной и простой в восприятии. Здесь коды 1,2,3,4 обеспечивают вычисления функций соответственно y = sin(x), y = cos(x), y = tg(x) и y = ex. По коду 5 производится нормальное завершение программы. Для введенного значения аргумента х можно вычислять различные функции из представленной группы, вводя код соответствующей функции. По этой блок – схеме составлена программа, которая приводится ниже.
Количество попыток
Коды операций
Ввод х
Счетчик
попыток
–
+ –
+ –
+ –
+
_
+
+
_
Рис. 11.5. Блок–схема решения задачи
# include <iostream.h>
# include <math.h>
# include <conio.h>
# include <iomanip.h>
void main()
{
const short M = 3;
short n, k = 0;
float x,y;
clrscr();
cout << setw(20) << ” “ << ” Коды операций “ << endl;
cout << setw(20) << ” “ << ” 1... y = sin(x) “ << endl
<< setw(20) << ” “ << ” 2... y = cos(x) “ << endl
<< setw(20) << ” “ << ” 3... y = tg(x) “ << endl
<< setw(20) << ” “ << ” 4... y=ex “ << endl
<< setw(20) << ” “ << ” 5... Завершение программы“ << endl;
сout << setw(20) << ” “ << ” Введите значение х “ << endl;
cin >> x;
a5: cout << setw(20) << ” “ << ” Введите код операции “ << endl;
cin >> n;
switch (n)
{
case 1: y = sin(x); break;
case 2: y = cos(x); break;
case 3: y = tg(x); break;
case 4: y = exp(x); break;
case 5:
{
cout << setw(20) << ” “ << ” Завершение программы “ << endl;
goto a10;
}
default:
{
k ++;
if (k<m)
{
cout << setw(15) << ” “ << ” Неправильный код. Повторите ввод “
<< endl;
goto a5;
}
else
{
cout << setw(15) << ” “ << ” Все попытки неправильные.”
<<” Прекращение работы.” << endl;
goto a10;
}
}
}
cout << setw(20) << “ “ << “ x = “ << setw(5) << setprecision(2) << x <<” “
<<“ y = “ << setw(10) << setprecision(4) << y << endl;
goto a5;
a10: getch();
}