Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования C++ (Практикум, часть 1).doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.28 Mб
Скачать

Практическое занятие 4. Разветвляющиеся алгоритмы

Операторы выбора (разветвляющиеся алгоритмы)

К операторам выбора, называемым операторами ветвления, относят условный оператор (ifelse) бинарного ветвления и оператор-переключатель (switch) m-арного ветвления. Они слу­жат для выбора пути выполнения разветвляющейся программы.

Синтаксис условного оператора:

If (выражение) оператор_1 else оператор_2

выражение должно быть простым (скалярным) и может иметь логический тип, арифметический тип или тип указателя. Если арифметическое выражение не равно нулю (или не есть пустой указатель), то его значение приводится к true, условие считается истинным и выполняется оператор_1. В противном случае, когда выражение равно нулю (false), выполняется оператор_2. В ка­честве операторов нельзя использовать описания и определения. Однако могут быть составные операторы и блоки.

Допустима сокращенная форма условного оператора, в которой отсутствует ветвь else и оператор_2. В этом случае при ложном значении выражения выполняется оператор, следующий за условным оператором.

Операторы оператор_1 и/или оператор_2, в свою очередь, могут быть условными (как полными, так и сокращёнными), что позволяет организовать цепочку проверок условий любой глубины вложенности. Синтаксис языка предполагает, что при вложениях условных операторов каждое else соответствует ближайшему к нему предшествующему if.

Рассмотрим программу, в которой вводятся с клавиатуры два целых числа. Если второе число отлично от нуля, то выполняется целочисленное деление.

// Листинг 4.1

#include <iostream>

using namespace std;

int main() {

int a, b;

cout << "Input 2 digits: ";

cin >> a >> b; // Ввод двух чисел с клавиатуры

// Выполнение целочисленного деления

if (b) cout << "a/b = " << a/b << endl;

else cout << "Error!!!\n";

return 0;

}

Если b равно 0, то выражение в операторе if является ложным, и выполняется ветвь else. В противном случае условие является истинным, и выполняется деление a/b.

Результат выполнения программы:

Input 2 digits: 4 5

a/b = 0

или

Input 2 digits: 10 0

Error!!!

Оператор-переключатель является наиболее удобным средством для организации множественного (мульти-) ветвления. Синтаксис переключателя:

switch (переключающее_выражение)

{

case константное_выражение_1: оператор_1;

case константное_выражение_2: оператор_2;

case константное_выражение_n: оператор_n;

default: операторы;

}

Управляющая конструкция switch передаёт управление тому из помеченных с помощью case операторов, для которого значение константного_выражения совпадает со значением переключающего_выражения. Значение переключающего_вы­ражения должно быть целочисленным или приводиться к целому. Значения константных выражений, помещаемых за словами case, также приводятся к целому типу переключающего выражения. В одном переключателе все константные выражения должны быть одного типа и иметь различные значения.

Оператор каждой ветви case и ветви default может быть как отдельным оператором, так и составным или блоком (в нём могут находиться описания переменных, область видимости которых – этот блок). В конце составного оператора каждой ветви следует использовать оператор break, т.к. в противном случае выполнят­ся все операторы всех ветвей, расположенных после выбранной.

Если значение переключающего выражения не совпадает ни с одним из константных выражений, то выполняется переход к оператору, отмеченному меткой default. В каждом переключате­ле должно быть не больше одной метки default, однако эта метка может отсутствовать. В случае отсутствия метки default при не­совпадении переключающего выражения ни с одним из констант­ных выражений, помещаемых вслед за case, в переключателе не выполняется ни один из операторов. Если не предусмотрены переходы или выходы из переключателя, то в нём последова­тельно выполняются все операторы, начиная с той метки, которой передано управление.

После switch() может находиться любой оператор (не обя­зательно составной), помеченный с использованием служебного слова case. Однако без фигурных скобок такой оператор может быть только один, и смысл переключателя теряется: он пре­вращается в разновидность сокращённого условного оператора.

Рассмотрим программу, в которой выводятся названия нечётных десятичных цифр, не меньших введённой с клавиатуры.

// Листинг 4.2

#include <iostream>

using namespace std;

int main() {

int n;

cout << "Enter decimal digit: ";

cin >> n;

switch(n) {

case 0: case 1: cout << "one, ";

case 2: case 3: cout << "three, ";

case 4: case 5: cout << "five, ";

case 6: case 7: cout << "seven, ";

// Выход из переключателя по оператору break

case 8: case 9: cout << "nine\n"; break;

default: cout <<"Error! It isn't digit!\n";

} // Конец переключателя

return 0;

}

Результат выполнения программы:

Enter decimal digit: 3

three, five, seven, nine

Если необходимо, чтобы выполнялись операторы лишь одной ветви case переключателя, нужно в конце каждой ветви использовать оператор break.