Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга C++.doc
Скачиваний:
24
Добавлен:
10.11.2019
Размер:
2.48 Mб
Скачать

Структура программы

Давайте решим следующую задачу. На плоскости нарисовано кольцо с центром в точке (x0,y0). И радиусами границ r1<r2. Кроме того, на этой же плоскости дана точка с координатами (x, y).

Необходимо определить, принадлежит ли эта точка кольцу. Пусть вас не смущает "математическая окраска" задачи. Решение ее весьма тривиально: мы должны вычислить расстояние от центра кольца до точки, и сравнить его с радиусами. Если логическое выражение r1<L<r2 верно, то точка принадлежит кольцу. Если же хотя бы одно из этих условий не выполнено, то точка не принадлежит кольцу. Программа, реализующая это решение, приведена ниже:

// Точка и кольцо

#include <iostream.h>

#include <math.h>

void main() {

// Объявление переменных

int x0, y0, r1, r2, x, y;

float L;

// Пусть пользователь введет данные

cout<<"Input coordinates of circle’s center (X0, Y0): ";

cin>>x0>>y0;

cout<<"Input circle radiuses R1 and R2: ";

cin>>r1>>r2;

cout<<"Input point coordinates (X, Y): ";

cin>>x>>y;

L = sqrt(pow(x - x0, 2) + pow(y - y0, 2));

if ((r1 < L) && (L < r2 )) {

cout<<"This point is situated inside the circle.\n";

} else {

cout<<"This point is not situated inside the circle.\n";

}

}

В этой программе появилось несколько новых элементов. Во-первых, это функция sqrt(), которая вычисляет квадратный корень и входит в состав библиотеки math.h.

Логические операции

Пока мы рассматривали только простые условия, которые выражали в терминах операций отношения

>

<

>=

<=

и операций проверки на равенство

==

!=

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

if или if/else.

Например,

#include < iostream.h >

// Необходимо определить принадлежит ли число, введенное пользователем, интервалу (1, 10).

void main()

{

int i;

cout << "Input i: " << "\n";

cin >> i;

// Здесь мы используем вложенный оператор if

if ( i > 1 )

if (i < 10 )

cout << " i принадлежит интервалу (1, 10)"<< "\n";

else

cout << " i не принадлежит интервалу (1, 10)" << "\n";

}

Чтобы избежать подобных вложений, С++ предоставляет нам логические операции, которые могут использоваться для формирования сложных условий путем комбинирования простых.

Логическими операциями являются

&&

-

(логическое И),

||

-

(логическое ИЛИ) и

!

-

(логическое НЕ, называемое также логическое отрицание).

Рассмотрим примеры каждой из них.

Предположим, мы хотим обеспечить в некоторой точке программы, чтобы определенный путь расчета выбирался только в случае, когда два условия одновременно истинны. Тогда мы можем применить логическую операцию && (логическое И), например:

if (gender == 1 && age >= 65) ++seniorFemales;

Этот оператор if содержит два простых условия. Условие gender == 1 может проверяться, например, чтобы определить, является ли данное лицо женщиной.

Условие age >= 65 проверяется, чтобы определить, является ли человек пожилым гражданином. Проверка этих двух простых условий выполняется первой, поскольку приоритет обеих операций == и >= выше, чем приоритет операции & &. Затем оператор if рассматривает комбинацию этих условий

(gender ==1) && (age >= 65)

и если она истинна, то выполняется оператор ++seniorFemales;

Таблица ниже поясняет действие операции && . Эта таблица показывает все четыре возможных сочетания комбинаций ложного (false , нулевого) и истинного (true, ненулевого) значений первого и второго выражений. Подобные таблицы часто называются таблицами истинности. C++ воспринимает как 0 или как 1 все выражения, содержащие операции отношения, проверки на равенство или логические операции. Хотя C++ возвращает 1, если результат равен true, он воспринимает как true любое ненулевое значение.

Таблица истинности для &&

выражение 1

выражение 2

выражение 1 & & выражение 2

true

true

true

true

false

false

false

true

false

false

false

false

Таким образом,

результат операции логического И ( & &) будет истинна, тогда и только тогда, когда оба условия истинны!

Теперь давайте посмотрим, как использование логического И ( & &) упростит наш пример.

#include < iostream.h >

// Необходимо определить принадлежит ли число, введенное пользователем, интервалу (1, 10).

void main()

{

int i;

cout << "Input i: " << "\n";

cin >> i;

if ( i > 1 && i < 10 )

cout << " i принадлежит интервалу (1, 10)"<< "\n";

else

cout << " i не принадлежит интервалу (1, 10)" << "\n";

}

Логическая операция || (логическое ИЛИ). Предположим, мы хотим обеспечить в некоторой точке программы, чтобы определенный путь расчета выбирался только в случае, когда хотя бы одно из двух условий истинно. В этом случае мы можем применить логическую операцию ||. Например,

if (semesterAverage >= 90 || finalExam >= 90) cout << "Оценка студента - A \n";

Этот оператор также содержит два простых условия. Условие semesterAverage >= 90 проверяется, чтобы определить, заслужил ли студент оценки "А" за курс в результате постоянной работы в течение семестра. Условие finalExam >== 90 проверяется, чтобы определить, заслужил ли студент оценки "А" за курс вследствие выдающихся результатов на заключительном экзамене. Затем оператор if рассматривает комбинацию этих условий

(semesterAverage >= 90) || (finalExam >= 90)

и присуждает студенту оценку "А", если любое из этих условий или оба они истины. Отметим, что сообщение "Оценка студента - А" не печатается только, если оба простых условия ложны (если их значения равны 0). Ниже приводится таблица истинности для логической операции ИЛИ (||).

Таблица истинности для ||

выражение 1

выражение 2

выражение 1 || выражение 2

true

true

true

true

false

true

false

true

true

false

false

false

Таким образом, результат операции логического ИЛИ (||) будет истинна, когда хотя бы одно из двух условий истинна!

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

gender ==1 && age >= 65

будет немедленно остановлен, если значение gender не равно 1 (т.е. условие в целом заведомо ложно), и продолжится, если значение gender равно 1 (т.е. в целом может оказаться истинным, если будет истинным условие age >= 65).

C++содержит логическую операцию ! (логическое отрицание), чтобы программист мог изменить значение условия на "противоположное". В отличие от операций && и ||, которые комбинируют два условия (и, следовательно, являются бинарными операциями), операция отрицания имеет в качестве операнда только одно условие (и, следовательно, является унарной операцией). Операция логического отрицания помещается перед соответствующим условием, когда мы хотим выбрать некоторый вариант расчета в случае, если первоначально (без учета операции логического отрицания) это условие ложно. Приведем пример фрагмента программы:

if ( !(grade == sentineValue) ) cout << "Следующая оценка - " << grade <<"\n ";

Скобки, в которые помещено условие grade == sentineValue необходимы, так как операция логического отрицания имеет более высокий приоритет, чем операция проверки равенства. Ниже приводится таблица истинности операции логического отрицания.

Таблица истинности для !

выражение

! выражение

true

false

false

true

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

if ( grade != sentineValue ) cout << "Следующая оценка - " << grade << "\n ";

Подобная гибкость часто может помочь программисту выразить условие в наиболее естественном и удобном виде.