Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по Программированию на С++.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
795.65 Кб
Скачать

Проблемы соответствия if и else во вложенных ветвлениях

Программируя вложенные ветвления, часто можно перепутать, к какому из операторов if относится блок else. Существует правило: else связан с последним (ближним) из операторов if, который не имеет своего собственного блока else. Если необходимо связать else с тем if, который расположен раньше, нужно использовать фигурные скобки. Пример:

if (…)

if (…)

оператор;

else оператор;

if (…) {

if (…)

оператор;

}

else оператор;

Условная операция

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

if (b>a)

max = b;

else

max = a;

max = (b>a) ? b : a;

Оператор switch

Оператор switch (переключатель) предназначен для разветвления процесса вычислений на несколько направлений. Если в программе будет большое дерево ветвлений и все ветвления зависят от значения какой-либо одной переменной, то вместо ступенчатой последовательности конструкций if…else целесообразно применять оператор switch. Таким образом, оператор switch предпочтительнее применять в тех случаях, когда в программе требуется разветвить вычисления на количество направлений, большее двух, и выражение, по значению которого производится переход на ту или иную ветвь, является целочисленным. Синтаксис этой конструкции следующий:

switch (n) { // n – целочисленная или символьная переменная

case константа_1:

оператор;

оператор;

break;

case константа_i:

оператор;

оператор;

break;

default: //в случае синтаксической ошибки в слове default сообщение об ошибке не выдаётся

оператор;

оператор;

}

За ключевым словом switch следуют скобки, содержащие имя переменной (или выражение), от значений которой зависит дальнейшее выполнение программы. Тип констант, употребляемых в операторах case, должен совпадать с типом переменной, стоящей в скобках оператора switch (). Все константы должны иметь разные значения, но быть одного и того же типа.

В конце последовательности операторов каждой из case-секций помещён оператор break, который завершает выполнение ветвления switch. Управление в этом случае передаётся первому оператору, следующему за конструкцией switch. При отсутствии оператора break управление будет передано операторам, относящимся к другим веткам switch. Ко всему прочему, оператор break также используется для принудительного выхода из любых типов циклов.

Если значение переменной в операторе switch не совпадёт ни с одним из значений констант, указанных внутри ветвления, то управление будет передано операторам, расположенным после слова default (а при его отсутствии управление передаётся следующему за switch оператору).

Рассмотрим пример программы, реализующей простейший калькулятор на 4 действия:

int main() {

float a, b, res;

char op; // знак операции

cout << "Vvedite cherez probel 1 operand, znak operacii, 2 operand: ";

cin >> a >> op >> b;

switch (op) {

case '+': res = a + b;

break;

case '-': res = a - b;

break;

case '*': res = a * b;

break;

case '/': res = a / b;

break;

default : cout << "\nBudte vnimatelnee! Neizvestnaya operaciya.";

res = 0;

}

cout << "\n Rezultat: " << res;

getch(); return 0;

}

Данная программа никак не застрахована от фатальной ошибки, связанной с делением на ноль. Сделаем следующие исправления:

int main() {

float a, b, res;

char op, answer; // op - знак операции

do {

cout << "Vvedite cherez probel 1 operand, znak operacii, 2 operand: ";

cin >> a >> op >> b;

switch (op) {

case '+': res = a + b;

break;

case '-': res = a - b;

break;

case '*': res = a * b;

break;

case '/': if (b == 0) {

cout << "Error: delitel = 0 !" << endl;

continue; // или просто res = 0;

}

else res = a / b;

break;

default : cout << "\nBudte vnimatelnee! Neizvestnaya operaciya.";

res = 0;

}

cout << "\n Rezultat: " << res;

cout << "\nProdolgite vychisleniya?(y/n): "; cin >> answer;

} while(answer == 'y');

return 0;

}

В данной версии программы, мы применили оператор перехода continue. Применение этого оператора очень полезно, когда необходимо при определённом условии не выходить из цикла, а досрочно возвращаться в его начало.