10. Логически операции. Закони на де Морган. Булеви променливи.
Булева алгебра  - проверка на верността на твърдения
 * Логически константи:
  - истина, да, true,  1, вярно, изпълнено
  - лъжа,    не, false, 0, невярно, неизпълнено
 * Основни логически операции:
  - и,      конюнкция, and
  - или, дизюнкция,  or
  - не,   отрицание,    not
 
 A  B  A and B
 false  false  false
 false  true  false
 true  false  false
 true  true  true
 
 A  B  A or B
 false  false  false
 false  true  true
 true  false  true
 true  true  true
 
 A  not A
 false  true
 true  false
 
Закони на де Морган  [Аугуст де Морган (1806-1871)]
* отрицание на конюнкция
   not (A and B)
                 дава същия резултат както
   (not A) or (not B)
* отрицание на дизюнкция
   not (A or B)
                дава същия резултат както
  (not A) and (not B)

Логически операции
* Да изразим условието, че даден адрес е  извън континенталната част на САЩ, т.е. друга държава или щатите Аляска и Хавай.

not (country == "USA" and state != "AK" and state != "HI")

state != "AK" and state != "HI"
not (state == "AK") and not (state == "HI")
not (state == "AK" or state == "HI")

not (country == "USA" and not (state == "AK" or state == "HI"))
not (country == "USA") or (state == "AK" or state == "HI")
     country != "USA" or state == "AK" or state == "HI"

* Проверка дали сме пропуснали даден момент от време - фиксиран час и минути.

#include <iostream>
using namespace std;
#include "ccc_time.cpp"

int main()
{
   cout << "Enter the time that the homework is due"
   cout << " (hours minutes): ";
   int hours;
   int minutes;
   cin >> hours >> minutes;
   Time homework_due(hours, minutes, 0);
   Time now;

   if (now.get_hours() < homework_due.get_hours() or
      (now.get_hours() == homework_due.get_hours()
   and now.get_minutes() <= homework_due.get_minutes()))
      cout << "Still time to finish the homework.\n";
   else
      cout << "The homework is already past due.\n";
   return 0;
}
* Отложени пресмятания
 - За оператора end - ако първият аргумент е false
 - За оператора or   - ако първият аргумент е true
double area;
cin >> area;
if (cin.fail() or area < 0) cout << "Input error";

Булеви променливи
bool ship_by_air = false;
if (country != "USA") ship_by_air = true;
else if (state == "AK" or state == "HI")
                      ship_by_air = true;

if (ship_by_air) shipping_charge = 20;
else shipping_charge = 10;
Стойност на булева променлива може да бъде една от двете стойности (константи) true или false.