Глава 3 управление выполнением программ Условные операторы
Все рассмотренные ранее примеры программ исполнялись в порядке следования операторов, выполняющихся исключительно по одному разу. Однако на практике возможности подобных программ весьма ограничены. Слишком малое число проблем может быть решено подобным способом - большинство задач требует от программы принятия решения в зависимости от различных ситуаций. Язык C++ обладает исчерпывающим набором конструкций, позволяющим управлять порядком выполнения отдельно взятых ветвей программы. Например, вы можете передать управление в ту или иную часть программы в зависимости от результата проверки некоторого условия. Для осуществления ветвления используются так называемые условные операторы.
Операторы if
Оператор if производит ветвление программы в зависимости от результата проверки некоторого условия на истинность:
if(проверяемое_условие)
оператор1; оператор2;
Проверяемое условие может быть любым выражением, но чаще всего оно содержит операторы сравнения.
Если проверяемое_условие принимает истинное значение (true), выполняется оператор1. В противном случае (false) выполнение программы переходит к оператору2.
В конструкциях языка C++ операторы могут быть блочными. Это означает, что в зависимости от принятого решения выполняется не один, а целый блок операторов.
Блок начинается с открывающейся фигурной скобки ({) и заканчивается закрывающейся фигурной скобкой (}). Все содержимое блока рассматривается компилятором как единый оператор.
Следующий пример иллюстрирует использование оператора if.
#include <iostream.h>
int main О {
int b;
if(b > 0)
{
// Если условие b > 0 выполнено
cout « "b - положительное" ;
}
if(b < 0)
cout « "b - отрицательное";
return 0;
}
В приведенном фрагменте объявляется целочисленная переменная b, а затем следует сравнение ее значения с нулем. Если величина b больше нуля, выводится сообщение "b -положительное", а если b меньше нуля - сообщение "b -отрицательное".
Одной из типичных ошибок при использовании оператора if является пропуск фигурных скобок для обозначения блока выполняемых операторов:
#include <iostream.h>
int main() {
int x = 0;
int у = 8;
int z = 0;
if(x != 0)
z++;
у /= x; // Ошибка! Деление на 0
cout « "x = ";
return 0;
}
В этом примере следует проверка значения переменной х на неравенство нулю. Если значение х отлично от нуля, производится увеличение на единицу значения переменной z. Однако далее осуществляется действие вида у = у / х, независимо от того, какое значение имеет переменная х.
Если правильно определить блок исполняемых операторов, как показано ниже, вычисления выполнятся корректно:
if(х != 0) {
z++;
y /= х;
cout « "х = "; }
В данном варианте вычисление выражения у = у / х будет производиться только для х, значение которого отлично от нуля.
Операторы if-else
Оператор if с ключевым словом else имеет следующий вид:
if(проверяемое_условие)
предложение1; else
предложение2; предложение3;
Если проверяемое_условие выполняется, осуществляется переход к предложению1 с последующим переходом к предложению3. В случае, когда проверяемое_условие принимает ложное значение, программа выполнит ветвь, содержащую предложение2, а затем перейдет к предложению3.
Следует отметить, что комбинация if-else позволяет значительно упростить код программы.
В качестве примера решим квадратное уравнение вида х2 + 2х - 3 = 0. Для решения поставленной задачи воспользуемся методом вычисления детерминанта вида
D = (b2 - 4 * а * с) с последующим сравнением полученного результата с нулем.
#include <iostream.h>
#include <math.h>
int main()
{
int a = 1;
int b = 2;
int с = -3;
float D;
float xl, x2;
D = b*b-4*a*c;
if(D < 0)
{
cout « "Уравнение не имеет корней";
return 0;
}
if(D = 0)
{
xl = x2 = -b / (2 * a);
cout « "Уравнение имеет 1 корень:";
cout « " х = " « xl;
return 0;
}
else
{
xl = (-b + sqrt(D)) / (2 * a);
xl = (-b - sqrt(D)) / (2 * a);
cout « "Уравнение имеет 2 корня:";
cout « "\nxl = " « xl;
cout « "\nx2 = " « x2;
}
return 0;
}
Типичной ошибкой программистов, переходящих на С и C++ является использование в условных конструкциях оператора присваивания вместо оператора сравнения (= вместо ==). Хотя язык С и позволяет производить присвоения в условных операторах, здесь следует быть особенно внимательным — в больших проектах подобные ошибки локализуются с трудом.
Еще одно замечание: часто проверяемое условие представляет собой проверку значения некоторой целочисленной переменной. Тогда если эта переменная принимает ненулевое значение, то результатом вычисления условного выражения будет true, и произойдет переход на выполнение предложения, указанного за оператором if. Поэтому на практике часто встречаются записи вида:
if(!x)
{
// если х == 0
}
if Ос)
}
// если х!= 0
...
}
Например, можно было бы написать:
if(!D = b*b-4*а*с)
{
...
}
что означало бы: присвоить переменной D вычисленное значение (bг-4ас), и если переменная D приняла ненулевое значение, выполнить блочный оператор {...}. Обычно в подобных случаях компилятор выдает предупреждение о вероятно ошибочном использовании оператора присвоения вместо сравнения.