(C++) Вложенный условный оператор. Сложные условия


Вложенный условный оператор

Что делать, если нам необходимо проверить несколько условий и если они выполняются, то выполнить определенные действия?
В этом случае мы можем использовать вложенный условный оператор.
 
Вложенный условный оператор - это условный оператор, которых находится внутри блока «if» или блока «else». При этом оператор else всегда относится к ближайшему предыдущему блоку if.
 
Задача
По имеющейся сумме денег (в условных единицах) необходимо вывести на экран фразу:
  1. если сумма больше 10 усл. ед., то вывести  "У вас достаточно денег.";
  2. если сумма больше 100 усл. ед., то вывести "У вас очень много денег.";
  3. если сумма не больше 10 усл. ед., то вывести "У вас маловато денег.".
Из условия задачи можно заметить, что если у тебя больше 10 усл. ед. денег, то необходимо еще проверить условие, больше ли 100 усл. ед. и если больше, то вывести фразу "У вас очень много денег." Если же денег больше 10, но меньше или равно 100, то фраза должна быть "У вас достаточно денег.". Получается, что прежде, чем вывести эту фразу, необходимо проверить еще одно условие. Пример реализации программы с вложенным условным оператором описан ниже
 
Программа
#include <iostream>
using namespace std;
int main()
{
    int money;
    cin >> money;
    if ( money > 10 ) # если денег больше 10
    {
         # Вложенный условный оператор
        if ( money > 100 ) # и при этом денег больше 100
        {
            cout << "У вас очень много денег." << endl;   # выводим фразу 1
        }
        else
        {
            cout << "У вас достаточно денег." << endl;  # если денег больше 10, 
                                                # но не больше 100,
                                                # то выводим фразу 2
        }
    }
    else
    {
        cout << "У вас маловато денег." << endl;    # если денег не больше 10,
                                      # то выводим фразу 3.
    }
    return 0;
}

В этой программе
  • Мы принимаем от пользователя целое число в качестве входных данных и сохраняем его в переменной money.
  • Затем мы используем оператор if...else, чтобы проверить, больше ли значение money 10.
    • Если это так, то выполняется внутренний оператор if...else.
    • Если false, то выполняется код во внешнем блоке else, который выводит фразу  "У вас маловато денег.".
  • Внутренний оператор if...else проверяет, является ли значение money больше 100.
    • Если true, то выводится фраза "У вас очень много денег.".
    • Если false, то выводится фраза "У вас достаточно денег.".

Не забывайте оформлять программу лесенкой, для улучшения читаемости и лучшего ее понимания!

Сложные условия

Часто условия, которые необходимо проверять перед выполнением действий сложно сформулировать в простом виде. 
 
Пример 
Проверить, находится ли число n в диапазоне [a, b]. Для проверки необходимо выполнения двух условий n >= a и n <= b.

Можно написать программу, использующую вложенный условный оператор
#include <iostream>
using namespace std;
int main() {
    int n, a, b;
    cin >> n >> a >> b;
    if (n >= a)
    {
        if (n <= b)
        {
            cout << "YES" << endl;
        }
        else
        {
            cout << "NO" << endl;
        }
    }
    else
    {
        cout << "NO" << endl;
    }
    return 0;
}

Программа в этом случае становится достаточно громоздкой. И, как можно заметить, нам пришлось дважды писать строку cout << "NO" << endl;.

Чтобы упростить программу необходимо использовать сложные условия.
 
Сложное условие - состоит из двух или нескольких простых условий, которые объединяются с помощью логических операций (логических связок).
 

Логические операции на языке С++

Операция Пример Значение
&&
или and
выражение1 && выражение2
или
выражение1 and выражение2
Логическое И
True только если все выражения True
если выражение1 ложно, то выражение2 проверяться не будет.
||
или or
выражение1 || выражение2
или
выражение1 or выражение2
Логическое ИЛИ
True, если хотя бы одно выражение True
выражение1 истинно, то выражение2 проверяться не будет.
!
или not
!выражение
или
not выражение
Логическое НЕ
True только если веражение False

Выражение представляет из себя логическое условие (может быть простым или сложным)
 
Приоритет выполнения логических операций и отношений
1. Операции в скобках.
2. Операция НЕ.
3. Логические отношений >, <, >=, <=, ==, !=.
4. Операция И.
5. Операция ИЛИ.
Для изменения порядка действий используются круглые скобки.
 

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

Во многих языках программирования есть возможность использовать переменные, которые хранят логические значения ("истина"/"ложь"). В С++ такие переменные могут принимать значения true (истина) или false (ложь). Например, фрагмент программы: 
bool a, b;
a = true;
b = false;
cout << a || b;
Выведет на экран 1 (что соответствует значению true, значению false соответствует 0).

Логические переменные относятся к типу bool, названной в честь английского математика Джорджа Буля - создателя алгебры логики.

Вложенный условный оператор: когда развилок больше двух

Условный оператор в форме  if...else используется когда необходимо реализовать две развилки. Что делать, если развилок больше, чем две? В этом случае можно использовать условный оператор в форме if...else if...else. В этом случае, новое условие будет проверяться, если не выполняется первое. 

Общая форма выглядит следующим образом
if (условие1)
{
    // блок кода 1
}
else if (условие2)
{
    // блок кода 2
}
else
{
    // блок кода 3
}

Это будет работать следующим образом:
  • Если условие1 истинно (true), то выполняется блок кода 1.
  • Если условие1 ложно (false), то проверяется условие2 из блока else if
  • Если условие2 истинно, выполняется блок кода 2.
  • Если условие2 ложно, выполняется блок кода 3 в ветке else
В программе может быть более одного блока else if, но только один блок if и один блок else. Условия всегда проверяются последовательно, если условие1 не выполняется проверяется следующее условие в следующем блоке else if (если он есть). Если ни одно условие не выполняется, то выполняется блок кода в else.