Основной конструкцией ветвления в языке С++ является оператор if (условный оператор), имеющий следующий синтаксис:
if (<логическое_выражение>)
<оператор1>;
Else
<оператор2>;
Вначале вычисляется логическое выражение, указанное в круглых скобках, если оно окажется истинными (true), то выполняется <оператор1>, а затем управление передается оператору, следующему за конструкцией if (при этом <оператор2> не выполняется). Если же выражение окажется ложным (false), то выполняется <оператор2>, а затем управление передается оператору, следующему за конструкцией if.
Конструкция if изображается следующим образом с помощью блок-схем:
Пример программы вычисляющей максимум двух целых чисел, введенных с клавиатуры:
#include <iostream>
using namespace std;
int main()
{
int a, b, max;
//Вводим значения переменных a и b с клавиатуры
cin >> a >> b;
//Если a больше b, то
if (a > b)
max = a; //переменной max присвоить значение переменной a
else //иначе (a меньше или равно b)
max = b; //переменной max присвоить значение переменной b
//Выводим найденный максимум чисел a и b
cout << max << endl;
return 0;
}
Часть оператора if, относящуюся к ветке «иначе» (еlse), можно опускать, если она в программе не нужна. В этом случае оператор if будет выглядеть так:
if (<логическое_выражение>)
<оператор1>;
Пример программы, вычисляющей максимум двух целых чисел, введенных с клавиатуры, без использования части «иначе» (else):
#include <iostream>
using namespace std;
int main()
{
int a, b, max;
//Вводим значения переменных a и b с клавиатуры
cin >> a >> b;
//В начале полагаем, что максимум равен значению переменной b
max = b;
//Если a больше max, то
if (a > max)
max = a; //переменной max присвоить значение a
//Выводим найденный максимум чисел a и b
cout << max << endl;
return 0;
}
Если при истинности или ложности логического выражения нужно выполнить не один оператор, а несколько, то в этом случае применяется составной оператор. Составной оператор – последовательность операторов, заключенных в фигурные скобки {}.
Так <оператор1> и <оператор2> исходной конструкции if могут быть составными, т.е. состоять из нескольких простых операторов, объединенных фигурными скобками {}:
if (<логическое_выражение>)
{
<оператор1_1>;
<оператор1_2>;
...
<оператор1_n>;
}
Else
{
<оператор2_1>;
<оператор2_2>;
...
<оператор2_m>;
}
Пример фрагмента программы, использующего составной оператор:
if (x >= y)
{
f = x * y;
y++;
}
else
{
f = x + y;
y--;
}
Для формирования условия, указываемого в круглых скобках оператора if, используются операции отношения и логические операции.
Операции отношения: <, >, <= (меньше или равно), >= (больше или равно), == (равно), != (не равно).
Пусть a, b – некоторые логические выражения, тогда дадим формальные определения данных операций:
!a – истинно ó a – ложно;
a && b – истинно ó оба выражения a и b истинны;
a || b – истинно ó хотя бы одно из выражений a или b является истинным.
Приоритетность выполнения логических операций: ! – имеет наибольший приоритет, && - средний и || - наименьший.
Логические операции используются для формирования сложных составных условий, используемых в операторе ветвления if.
Примеры:
1.0 <= x && x <= 2.0 – определяет, принадлежит ли x отрезку [1.0, 2.0]
x < 1.0 || x >= 2.0 – определяет, принадлежит ли x объединению (-¥, 1.0)È[2.0, +¥)
x <= 3.0 && y <= 5.0 || x + y >= 1.5
!(a <= 7) && (a > 3 || a * 2 < a + 10)
Пример фрагмента программы, определяющей принадлежит ли точка с координатами (x, y) прямоугольнику ABCD, имеющему следующие координаты вершин: A(0, 0), B(0, b), C(a, b), D(a, 0):
double x, y, a, b;
cin >> x >> y;
cin >> a >> b;
if (0.0 <= x && x <= a && 0.0 <= y && y <= b)
cout << "Point belongs to rectangle." << endl; //Принадлежит
else
cout << "Point is out of rectangle." << endl; //Не принадлежит
Также операторы if могут быть вложены друг в друга.
Пример фрагмента программы, определяющей принадлежность точки прямоугольнику с помощью вложенных операторов if:
double x, y, a, b;
cin >> x >> y;
cin >> a >> b;
if (0.0 <= x && x <= a)
if (0.0 <= y && y <= b)
cout << "Point belongs to rectangle." << endl; //Принадлежит
else
cout << "Point is out of rectangle." << endl; //Не принадлежит
else
cout << "Point is out of rectangle." << endl; //Не принадлежит
Дополнительной конструкцией ветвления в языке С++ является оператор выбора switch. Он имеет следующий синтаксис:
switch (<выражение>)
{
case <конст1>:
<оператор1_1>;
<оператор1_2>;
…
<оператор1_n1>;
case <конст2>:
<оператор2_1>;
<оператор2_2>;
…
<оператор2_n2>;
…
default:
<оператор1>;
<оператор2>;
…
<операторm>;
}
Оператор выбора выполняется следующим образом:
1. Вычисляется значение выражения в круглых скобках.
2. Последовательно сравнивается значение выражения с константами <конст1>, <конст2>…
3. При совпадении значения с одной из констант осуществляет переход на первый оператор из набора операторов, соответствующих этой константе.
4. Если в списке операторов встретился break, то осуществляется переход на следующий оператор за конструкций switch, иначе – выполняются операторы из нижележащих наборов операторов (относящихся к другим константам) до тех пор, пока не встретится break или не закончится switch.
5. Если значение выражения не совпало ни с одной из констант, то выполняются операторы секции default (по умолчанию). Если данная секция отсутствует, то управление передается первому оператору, следующему за конструкцией switch.
Пример программы, которая в зависимости от значения переменной n использует различные формулы для вычисления функции f:
#include <iostream>
using namespace std;
int main()
{
double x, y, f;
int n;
//Читаем значение переменных n, x, y
cout << "n = ";
cin >> n;
cout << "x = ";
cin >> x;
cout << "y = ";
cin >> y;
//Конструкция выбора
switch (n)
{
case 1: //Если n равно 1
f = x + y; //вычисляем f по первой формуле
break; //выход из конструкции switch
//(переход к оператору печати значения f)
case 2: //Если n равно 2
f = 2.0 * x * y; //вычисляем f по второй формуле
break; //выход из конструкции switch
case 3: //Если n равно 3
f = x - 3.0 * y + 1.0; //вычисляем f по третьей формуле
break; //выход из конструкции switch
case 4: //Если n равно 4
f = y; //вычисляем f по четвертой формуле
break; //выход из конструкции switch
}
//Выводим на экран вычисленное значение f
cout << "f = " << f << endl;
return 0;
}
Обратите внимание! В конце каждого набора операторов следует ставить оператор break, иначе начнут выполняться операторы, соответствующие следующей константе. Например, если исключить break из набора операторов, соответствующих case 1, то после выполнение оператора “f = x + y;” начнет выполняться оператор “f = 2.0 * x * y;”.
Если двум константам, идущим последовательно в конструкции switch, соответствует один и тот же набор операторов, то их можно объединить, сделав пустым набор операторов у первой константы.
Пример программы, вычисляющей по номеру месяца время года, ему соответствующее.
#include <iostream>
using namespace std;
int main()
{
int month; //Переменная для хранения номера месяца
//Вводим номер месяца
cout << "Enter month no. : ";
cin >> month;
//Используем конструкцию выбора для определения времени
//года
switch (month)
{
//Если значение month равно 1, 2 или 12
case 1:
case 2:
case 12:
cout << "Winter" << endl; //выводим на экран "Зима"
break;
//Если значение month равно 3, 4 или 5
case 3:
case 4:
case 5:
cout << "Spring" << endl; //весна
break;
//Если значение month равно 6, 7 или 8
case 6:
case 7:
case 8:
cout << "Summer" << endl; //лето
break;
//Если значение month равно 9, 10 или 11
case 9:
case 10:
case 11:
cout << "Autumn" << endl; //осень
break;
//Если другое значение
default:
cout << "Error!!!" << endl; //выводим ошибку
}
return 0;
}
В данной программе константам 12, 1, 2 соответствует один и тот же набор из двух операторов: вывод на экран строки “Winter” и break. Поэтому просто друг за другом записываются три данные константы, после чего указывается общий набор операторов:
case 1:
case 2:
case 12:
cout << "Winter" << endl;
break;
Аналогичным образом обрабатываются номера месяцев, относящихся к весне, лету и осени.