§ 3. Основные алгоритмические конструкции

3.3. Составные условия

 

Для логических переменных в С++ определены логические операции !, &&, ||, соответствующие операциям НЕ, И, ИЛИ, выполняемым над высказываниями.

Логические выражения, в которых наряду с простыми условиями (сравнениями) используются логические операции, называют составными условиями.

Приведем таблицу истинности для  логических операций.

Логическая переменная

Результат операции

A B !(A) A && B A || B
true true false true true
false true true false true
true false false false true
false false true false false

В логических выражениях могут встречаться как арифметические, так и логические операции. Порядок выполнения операций определяется их приоритетом [1]:

1. !;

2. *, /, %;

3/ +, –;

4. <, >, <=, >=

5. ==, !=;

6. &&;

7. ||.

Операции с одинаковым приоритетом выполняются по порядку, слева направо. Для изменения порядка выполнения операций применяют скобки (примеры 3.3 и 3.4).

При составлении программ часто нужно строить отрицания сложным логическим выражениям. Для этого полезно использовать тождества, известные из алгебры логики (пример 3.5) и следующую таблицу:

Условие

Противоположное условие (отрицание условия)

a < b

a >= b

a > b

a <= b

a == b

a != b

Пример 3.6. Написать программу, которая выдаст на экран значение true или false в зависимости от того, находится ли число B между числами A и C.

Этапы выполнения задания

I. Исходные данные: переменные a, b, c (вводимые числа).

II. Результат: rez (true или false).

III. Алгоритм решения задачи.

1. Ввод исходных данных.
2. 
Вычисление значения логической переменной. Рассмотрим два случая:

2.1. Верно неравенство: а < b < c. Этому неравенству соответствует логическое выражение: а < b && b < с. Присвоим переменной r1 значение этого выражения.
2.2. Верно неравенство: а > b > c. Этому неравенству соответствует логическое выражение: а > b && b > с. Присвоим переменной r2 значение этого выражения.
2.3. Ответом на задачу будет значение логического выражения r1 or r2.

3. Вывод результата.

IV. Описание переменных: a, b, c – int, r1, r2, rez – bool.


[1] Обратите внимание, что приоритет операций отличается от того, который принят в Pascal (http://informatika8.adu.by/#fif2-2).

Пример 3.3. Определение порядка действий для выражения:

    || c < b && d    

Первым выполняется сравнение c и b, затем логическая операция &&, потом — ||.

Пример 3.4. Рассмотрим выражение:

    (< b) && (< d)    

Здесь скобки определяют приоритет выполнения операций: т. е. сначала должны выполниться сравнения, а затем —логическая операция &&. Однако в С++ операции сравнения обладают более высоким приоритетом, чем логические операции (в отличие от Pascal), поэтому приведенная выше запись эквивалентна:

    < b && c < d    

Пример 3.5. Построение отрицаний:

!!Û a;

!(&& b) Û !|| !b;

!(|| b) Û !&& !b.

Рассмотрим выражение  !a >  с переменными а и b типа int. Здесь операция ! относится к переменной a. Поскольку целые могут рассматриваться как логические, то отрицанием любого числа, кроме нуля, будет 0, отрицанием нуля будет 1. Затем полученный результат (0 или 1) сравнится с числом b. Для отрицания сравнения выражение нужно записать так:  !(a > b).

В языке С++ используются значки «&» и «|». Этими значками обозначаются битовые операции над целыми числами. Значок «&» соответствует операции and (И), проводимой над двоичными разрядами числа, а значок «|» — операции or (ИЛИ). Кроме этих операций, над битами числа можно выполнять операции «~» not (инверсия) и «^» xor (исключающее ИЛИ, сложение по модулю 2).

Пример 3.6.

V. Программа:

#include <iostream>

 

using namespace std;

 

int main()

{

  int a, b, c;

  cout << "vvedi 3 chisla" << endl;

  cin >> a >> b >> c;

  bool r1 = a < b && b < c;

  bool r2 = a > b && b > c;

  bool rez = r1 || r2;

  cout << boolalpha;

  cout << "b mezdu a i c - ";

  cout << rez << endl;

  return 0;

}

VI. Тестирование.

Запустить программу и ввести значения а = 5, b = 0, c = –5. Результат:

Запустить программу и ввести значения a = –2, b = –7, с = 5. Результат:

VII. Анализ результатов. Для полного тестирования программы нужно проверить все 6 возможных случаев взаимного расположения a, b, c.

В программировании на С++ могут использоваться диграфы (англ. digraphs) — последовательности из двух или более символов, которые компилятор воспринимает как один (или более символов). Они созданы и используются для ввода символов, отсутствующих на клавиатуре или в кодировке. К диграфам относят слова and и or, которые эквивалентны && и ||.