Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
42
Добавлен:
16.02.2016
Размер:
123.39 Кб
Скачать

Глава 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 приняла ненулевое значение, выполнить блочный оператор {...}. Обычно в подобных случаях компилятор выдает предупреждение о вероятно ошибочном использовании оператора присвоения вместо сравнения.

Соседние файлы в папке ЯзыкС++Глушаков