Глава 8. Начинаем управлять

В этой главе учебника по программированию для начинающих мы рассмотрим операторы выбора (или как их еще называют, условные операторы). Давайте попробуем разобраться с назначением этих самых условных операторов. Представим себе такую ситуацию, что наша программа выполняет различные операции: складывает числа, запоминает результаты, выводит какую-нибудь информацию на экран, и все это выполняется последовательно, строчка за строчкой (последовательность построчного выполнения кода программы заложена изначально в программирование). Что же у нас получится? А получится у нас то, что наша программа не будет иметь гибкости - она не сможет принимать никаких решений в зависимости от ситуации. Это, как вы понимаете, неправильно и толка с такой программы мало. На помощь приходят условные операторы, которые способны в зависимости от ситуации принимать различные решения. Как же именно это происходит у компьютера мы сейчас с вами будем рассматривать на простых примерах. В дальнейшем эти знания вы уже будете использовать в своих более сложных программах на практике.

Рассмотрим на примере простейший вариант применения оператора выбора, составим программу: наша программа будет запрашивать у пользователя число и, если это число положительное, то программа выводит сообщение о том, что число положительное, в противном случае - ничего не выводит. Смотрим код ниже:

//Используем условный оператор if

#include <iostream>

using namespace std;

int main()
{

    int value;

    cout << "Enter number: " << endl;
    cin >> value;

    if (value > 0)
        cout << "Number positive" << endl;

    return 0;

}

Как видите, здесь мы используем условный оператор if, который в себе содержит условие и, если это условие выполнится, то будет выполнена строчка кода, относящаяся к этому оператору (т.е. следующая строчка кода). Если нужно, чтобы выполнялось несколько строчек кода, при выполнении условия, то их нужно обязательно заключать в фигурные скобки, иначе будет выполнена только одна, первая, строчка кода. Также не забывайте в своих программах использовать табуляцию для лучшей видимости. В данном случае строчка кода, принадлежащая к оператору if смещена вправо, что создает хорошую видимость принадлежности.

Синтаксис условного оператора выглядит так:

if (условие)
    оператор;

либо так, в случае нескольких операторов

if (условие)
{

    оператор 1;
    оператор 2;
    .......
    оператор n;

}

Давайте теперь запишем данную программу на языке, приближенном к человеческому (на, так называемом, псевдокоде). Вот что у нас получится:

  • Выделяем память для переменной целого типа;
  • Выводим сообщение, в котором пользователю предлагаем ввести целое число;
  • Считываем это число и запоминаем в переменной;
  • Если (введенное число больше нуля), то
  • Выводим на экран сообщение о том, что число положительное;

Как видите, ничего сложного!

Ниже привожу пример, в котором при выполнении условия в операторе if, выполняется более одной строчек кода (в нашем случае их две):

//Используем условный оператор if

#include <iostream>

using namespace std;

int main()
{

    int value;

    cout << "Enter number: " << endl;
    cin >> value;

    if (value > 0)
    {

        cout << "Number positive" << endl;
        cout << "You have entered number: " << value << endl;

    }

    return 0;

}

Откомпилируем и запустим программу. В появившемся окне консоли программа выводит сообщение и ждет ввода пользователя. Попробуйте поэксперементировать с различными числами. Вы увидите, что наша программа уже стала способной принимать решения в зависимости от условия (нашим условием является введенное число). Если мы вводим положительное число, то программа выводит строки о том, что число положительное и печатает нам его. Иначе, когда число отрицательное, либо ноль, программа ничего не выводит, а просто завершается.

Иногда нужно, чтобы программа и в противном случае (если не выполнилось условие после if) выполняла какие-либо строчки кода. Для этого в языке С++ предусмотрена, так называемая, расширенная версия условного оператора if, в которую добавлено ключевое слово else (иначе). Рассмотим пример использования, модифицировав предыдущую программу:

//Используем условный оператор if - else

#include <iostream>

using namespace std;

int main()
{

    int value;

    cout << "Enter number: " << endl;
    cin >> value;

    if (value > 0)
    {

        cout << "Number positive" << endl;
        cout << "You have entered number: " << value << endl;

    }
    else
    {

        cout << "Number negative or a zero" << endl;
        cout << "You have entered number: " << value << endl;

    }

    return 0;

}

Теперь программа и в случае условия, обратного указанного в скобках после if, будет производить действия, описанные после оператора else (иначе). В нашем случае для выполнения обратного условия наше число должно быть отрицательным, либо ноль - т.е. все оставшиеся варианты. Вот синтаксис:

if (условие)
{

    оператор 1;
    оператор 2;
    .......
    оператор n;

}
else
{

    оператор 1;
    оператор 2;
    .......
    оператор n;

}

Как же быть в случае, если нам нужно предусмотреть три условия:

  1. Когда число положительное
  2. Когда число ни положительное, ни отрицательное, т.е. ноль
  3. Когда число отрицательное

В таком случае у нас имеется гибридный условный оператор. Вот его синтаксис:

if (условие 1)
{

    оператор 1;
    оператор 2;
    .......
    оператор n;

}
else if (условие 2)
{

    оператор 1;
    оператор 2;
    .......
    оператор n;

}
else
{

    оператор 1;
    оператор 2;
    .......
    оператор n;

}

Модифицировав предыдущий листинг, получим следующий код:

//Используем условный оператор if - else if

#include <iostream>

using namespace std;

int main()
{

    int value;

    cout << "Enter number: " << endl;
    cin >> value;

    if (value > 0)
    {

        cout << "Number positive" << endl;
        cout << "You have entered number: " << value << endl;

    }
    else if (value == 0)
    {

        cout << "The number is not neither positive, nor negative" << endl;
        cout << "You have entered number: " << value << endl;

    }
    else
    {

        cout << "Number negative" << endl;
        cout << "You have entered number: " << value << endl;

    }

    return 0;

}

Разберем работу программы подробнее. Как вы уже знаете из предыдущих глав, работа программы начинается с главной функции main(). Код выполняется построчно, если не указано иного. Первая строка объявляет переменную целого типа - value, в котором мы будем хранить введенное пользователем число. Затем выводится на экран запрос числа и программа ожидает ввода пользователя, запоминает число в переменную value. Далее начинает свою работу оператор выбора if: если выполняется условие, указанное в нем,

if (value > 0)

то управление переходит к операторам этого блока,

{

    cout << "Number positive" << endl;
    cout << "You have entered number: " << value << endl;

}

иначе этот блок игнорируется и управление переходит к следующей строке условного оператора,

else if (value == 0)

в которой также проверяется условие и при его выполнении выполняется блок операторов этого if

{

    cout << "The number is not neither positive, nor negative" << endl;
    cout << "You have entered number: " << value << endl;

}

В случае, если не выполняется и это условие, то выполняется блок

{

    cout << "Number negative" << endl;
    cout << "You have entered number: " << value << endl;

}

Если все это записать на языке понятном человеку, то получиться примерно так:

  • Резервируем место в памяти компьютера под целое число;
  • Запрашиваем у пользователя целое число;
  • Сохраняем это число в памяти компьютера;
Если это число больше нуля, то
{

    Выводим сообщение, что число - положительное;
    Выводим это число;

}

Иначе Если это число равно ноль, то
{

    Выводим сообщение, что это число ни положительное, ни отрицательное;
    Выводим это число;

}

Иначе
{

    Выводим сообщение, что это число - отрицательное;
    Выводим это число;

}

Условные операторы могут также быть и вложенными в друг друга. Это тоже очень часто применяется на практике. Для того, чтобы разобраться с вложениями, приведу такой пример, для его реализации мы несколько модифицируем предыдущий листинг. А добавим вот что: наша программа будет не только сообщать нам о том, что число положительное или отрицательное, но и будет сообщать - это число больше 100 или меньше (соответственно и с отрицательным числом). Вот что у нас получится:

//Используем условный оператор if

#include <iostream>

using namespace std;

int main()
{

    int value;

    cout << "Enter number: " << endl;
    cin >> value;

    if (value > 0)
    {

        cout << "Number positive" << endl;
        cout << "You have entered number: " << value << endl;

        if (value >= 100)

            cout << "This number is more or equally 100" << endl;

        else

            cout << "This number is less 100" << endl;

    }
    else if (value == 0)
    {

        cout << "The number is not neither positive, nor negative" << endl;
        cout << "You have entered number: " << value << endl;

    }
    else
    {

        cout << "Number negative" << endl;
        cout << "You have entered number: " << value << endl;

        if (value >= -100)

            cout << "This number is more or equally -100" << endl;

        else

            cout << "This number is less -100" << endl;

    }

    return 0;

}

Синтаксис таков (это лишь пример, вы можете подстраивать вложенность под свои требования):

if (условие)
{

    if (условие)
    {

        оператор 1;
        оператор 2;
        .......
        оператор n;

    }
    else
    {

        оператор 1;
        оператор 2;
        .......
        оператор n;

    }

}
else
{

    оператор 1;
    оператор 2;
    .......
    оператор n;

    if (условие)
    {

        оператор 1;
        оператор 2;
        .......
        оператор n;

    }

}

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

И наконец у нас подошла очередь ко второму оператору выбора в языке С++ и называется он switch. Синтаксис его таков:

switch (выражение)
{

    case константное_выражение:

        оператор 1;
        оператор 2;
        .......
        оператор n;
        break;

    case константное_выражение:

        оператор 1;
        оператор 2;
        .......
        оператор n;
        break;

    default:

        оператор 1;
        оператор 2;
        .......
        оператор n;
        break;

}

Рассмотрим применение данного условного оператора на примере: пользователь вводит число, а программа идентифицирует его (если 0, то программа сообщает, что введен ноль и т.д.). Если число не идентифицировано, то выводится соответствующее сообщение.

//Используем оператор выбор case

#include 

using namespace std;

int main()
{

    int value;

    cout << "Enter number: " << endl;
    cin >> value;

    switch (value)
    {

        case 0:

            cout << "You have entered number 0" << endl;
            break;

        case 5:

            cout << "You have entered number 5 " << endl;
            break;

        case 21:

            cout << "You have entered number 21 " << endl;
            break;

        default:

            cout << "The number is not identified" << endl;
            break;

    }

    return 0;

}

Запомнить:

Теперь давайте подведем итог. Мы разобрали с вами условные операторы, без которых практически не обходится ни одна программа. Условные операторы позволяют программе на конкретных этапах выполнения делать выбор и принимать решения, в зависимости от каких-либо обстоятельств, что несоизмеримо важно для любой серьезной программы. Были рассмотрены пять конструкций:

  1. if (условие)
    {
    
        оператор 1;
        оператор 2;
        .......
        оператор n;
    
    }
            
    
  2. if (условие)
    {
    
        оператор 1;
        оператор 2;
        .......
        оператор n;
    
    }
    else
    {
    
        оператор 1;
        оператор 2;
        .......
        оператор n;
    
    }
            
    
  3. if (условие 1)
    {
    
        оператор 1;
        оператор 2;
        .......
        оператор n;
    
    }
    else if (условие 2)
    {
    
        оператор 1;
        оператор 2;
        .......
        оператор n;
    
    }
    else
    {
    
        оператор 1;
        оператор 2;
        .......
        оператор n;
    
    }
            
    
  4. if (условие)
    {
    
        if (условие)
        {
    
            оператор 1;
            оператор 2;
            .......
            оператор n;
    
        }
        else
        {
    
            оператор 1;
            оператор 2;
            .......
            оператор n;
    
        }
    
    }
    else
    {
    
        оператор 1;
        оператор 2;
        .......
        оператор n;
    
        if (условие)
        {
    
            оператор 1;
            оператор 2;
            .......
            оператор n;
    
        }
    
    }
            
    
  5. switch (выражение)
    {
    
        case константное_выражение:
    
            оператор 1;
            оператор 2;
            .......
            оператор n;
            break;
    
        case константное_выражение:
    
            оператор 1;
            оператор 2;
            .......
            оператор n;
            break;
    
        default:
    
            оператор 1;
            оператор 2;
            .......
            оператор n;
            break;
    
    }