Среда, 15.08.2018, 06:36
Discovery
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
Меню сайта
Форма входа
Категории раздела
PHP [1]
Уроки по PHP для начинающих
C++ [18]
Статьи посвященные С++
XML [2]
Статьи по XML
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
     Каталог статей
    -->
    Главная » Статьи » Программирование » C++

    Инструкции управления. Тип данных - bool. Логические операторы.

    Инструкции управления. Тип данных - bool. Логические операторы.

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

    Итак, приступим. Первое что нам нужно изучить это инструкцию if( ).

    if( )
    {
        // здесь мы пишем код, который должен
        // выполняться если условие истинно.
     }
     

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

    А что делать, если условие окажется ложным? Тогда достаточно после инструкций, которые мы выполняем написать слово else и после него те инструкции, которые необходимо выполнить.

    if( )
    {
        // здесь мы пишем код, который должен
        // выполняться если условие истинно.
    }
    else
    {
        // здесь мы пишем код, который должен
        // выполняться если условие ложно.
    }

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

    #include <iostream>
    #include <windows.h>
    using namespace std;

    int main()
    {
        double num1, num2, total;

        cout << "Введите первое число: \n\n";
        cin >> num1;
        cout << "Введите второе число: \n\n";
        cin >> num2;

        if(num2 == 0)
        {
            cout << "На ноль делить нельзя!\n\n";
            // то, что будет выполняться, если утверждение истинно.
        }
        else
        {
            total = num1 / num2;
            cout << "Результат: " << total << "\n\n";
            // то, что будет выполняться, если утверждение ложно.
        }
        system("PAUSE");
        return 0;
    }

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

    Теперь давайте разберем все операторы отношений. Оператор сравнения == является одним из них. Вот все операторы соотношения: > , >= , < , <= , == , != . Первый оператор мы хорошо знаем из математики: если первое значения больше второго, второй оператор, когда первое значение больше или равно второму, третий оператор пригодиться когда мы хотим убедиться, что первое значение меньше второго, четвертый когда первое значение меньше или равно второму, пятый когда первое значения равно второму, и наконец шестое когда оба значения не равны.

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

    #include <iostream>
    #include <windows.h>
    using namespace std;

    int main()
    {
        double num1, num2;

        cout << "Введите первое число: \n\n";
        cin >> num1;
        cout << "Введите второе число: \n\n";
        cin >> num2;
     
        if(num1 > num2)
        {
            cout << "Первое число больше второго.\n\n";
        }
        else if(num1 == num2)
        {
            cout << "Первое число равно второму.\n\n";
        }
        else
        {
            cout << "Первое число меньше второго\n\n";
        }
        system("PAUSE");
        return 0;
    }

    Можно ставить конструкций else if между if и else можно столько, сколько вам необходимо. Теперь давайте перейдем к более сложным примерам. Что делать, когда нам нужно, чтобы значение переменной находилось в диапазоне от 10 до 20. Или наоборот, чтобы ее значение не находилось в этом диапазоне. Другая очень распространенная задача в программировании, выполнение определенных инструкций, когда значения двух или трех переменных содержат, определенны значения. Например: х = 0, или y = 0, или z = 0.  Конечно, никто не может вам запретить вставить одну инструкцию в другую. Так часто поступают в программировании. Но в данном случае, это только запутает код, и приведет к тому, что вы будет вынуждены писать повторяющийся код, чего программисты очень не любят делать. Для этого существуют логические операторы. В С++ их всего три: && , || , ! Первый оператор называется логическое и, второй называется логическим или, а третий логическим не. Вот как будет выглядеть программа, которая определяет, входит введенное нами значение в диапазон от 10 до 20, или нет.

    #include <iostream>
    #include <windows.h>
    using namespace std;

    int main()
    {
        double num;

        cout << "Введите число: \n\n";
        cin >> num;

        if(num >= 10 && num <= 20)
        {
            cout << "Введенное вами число входит в диапозон от 10 до 20.\n\n";
        }
        else
        {
            cout << "Введенное вами число не входит в диапозон от 10 до 20.\n\n";
        }
        system("PAUSE");
        return 0;
    }

    Прежде чем продолжить, я хочу сделать одно замечание, относительно логического оператора &&. Он дает истинное значение, только если оба выражения являются истинными. Ели бы мы поставили бы вместо оператора && оператор || , то программа сообщила бы нам, что двадцать один тоже принадлежит этому диапазону. Так что будьте внимательны с логическими операторами. Теперь попробуем изменить программу, чтобы она определяла, что введенное пользователем число не лежит в диапазоне от 10 до 20. Конечно, самый простой вариант это заменить выражения (num >= 10 && num <= 20) на (num <= 10 && num >= 20) если хотите вы может сами переделать программу, чтобы убедиться в этом. Я сделаю это немного по другому, чтобы показать на примере, как можно использовать логическое отрицание, а за одно объяснить некоторые нюансы употребления операторов в С++. Вот как будет выглядеть мой вариант:

    #include <iostream>
    #include <windows.h>
    using namespace std;

    int main()
    {
        double num;

        cout << "Введите число: \n\n";
        cin >> num;

        if(!(num >= 10 && num <= 20))
        {
            cout << "Введенное вами число не входит в диапозон от 10 до 20.\n\n";
        }
        else
        {
            cout << "Введенное вами число входит в диапозон от 10 до 20.\n\n";
        }
        system("PAUSE");
        return 0;
    }

    Хочу особое внимание обратить на то, что выражение num >= 10 && num <= 20 я заключил в скобки, и уже перед ними поставил знак логического отрицания. Если этих скобок не поставить, тогда любое число, которое вы введете, программа определит как число, входящее в диапазон от 10 до 20. Почему это происходит? Дело в том, что все операторы, которые есть в С++ имеют разный приоритет. То же самое происходит в математике, когда сначала выполняется умножение и деление, а потом сложение и вычитание. В таких случаях говорят, что умножение и деление имеют более высокий приоритет, чем сложение и вычитание. В тоже  время умножение и деление имеют равный приоритет и поэтому выполняются слева на право. Чтобы оператор, имеющий более низкий приоритет, заставить выполнятся раньше оператора с более высоким приоритетом, используют скобки. Точно также происходит с логическими операторами и операторами отношений. Кстати, арифметические операторы имеют более высокий приоритет, чем логические операторы или операторы отношений. И так вот приоритет логических и операторов отношений, начиная с операторов с наивысшим приоритетом и заканчивая операторами с низшим приоритетом. Итак:

    1. Логическое отрицание: ! .
    2. Больше, больше или равно, меньше, меньше или равно: > , >= , < , < = имеют одинаковый приоритет
    3. Равно и не равно: == , != тоже имеют одинаковый приоритет.
    4. Логическое И: && .
    5. Логическое ИЛИ: || .

    Если забыть о приоритете, то в результате можно получить логическую ошибку, которую трудно потом обнаружить. То есть такая ошибка, при которой программа успешно скомпилируется и даже создаст исполняемый файл, но результат будет совершенно не тот, который мы ожидаем.

    Напишем программу, которая будет запрашивать у пользователя три числа. Например, x, y, z, причем наш код будет выполняться только в том случаи, если x не будет равно y и z будет больше y, а y будет равно z. Если нас попросят прямо сейчас придумать такие значения, то на это у нас уйдет некоторое время, для компьютера при условии, что мы правильно написали программу. Вот она:

    #include <iostream>
    #include <windows.h>
    using namespace std;

    int main()
    {
        double x, y, z;

        cout << "Введите значение x: \n\n";
        cin >> x;
        cout << "Введите значение y: \n\n";
        cin >> y;
        cout << "Введите значение z: \n\n";
        cin >> z;

        if(((x != y && x != z) && (y == z)) && x > y)
        {
            cout << "Это сообщение вы видите, потому-что x не равно\n"
                   << "y, не равно z, y равен z, а x больше y\n\n";
        }
        else
        {
        cout << "Это сообщение вы видите, потому-что либо x равно\n"
               << "y, либо равно z, y не равен z, а x меньше или\n"
               << "равно y\n\n";
        }
        system("PAUSE");
        return 0;
    }

    Для того чтобы проверить нашу программу, введем следующие значения: x = 3, y = 3 и z = 9. Они полностью соответствуют нашему условию. Теперь нам ничего не стоит написать программу, которая выполняет код в том случае, когда x, либо y, либо z  равны нулю.

    #include <iostream>
    #include <windows.h>
    using namespace std;

    int main()
    {
        double x, y, z;

        cout << "Введите значение x: \n\n";
        cin >> x;
        cout << "Введите значение y: \n\n";
        cin >> y;
        cout << "Введите значение z: \n\n";
        cin >> z;

        if(x == 0 || y == 0 || z==0)
        {
            cout << "Вы видите это сообщение, потомучто либо x,\n"
                   << "либо y, либо z равны нулю.";
        }
        else
        {
        cout << "Вы видите это сообщение потомучто ни x,\n"
               << "ни y, ни z не равны нулю.";
        }
        system("PAUSE");
        return 0;
    }

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

    #include <iostream>
    #include <windows.h>
    using namespace std;

    int main()
    {
        int choice;
        double miles, kilometers, Celsius, Fahrenheit;

        cout << "Данный конвертор переводит американские мили\n"
               << "в километры, километры в американские мили,\n"
               << "температуру по шкале Фаренгейта в температуру\n"
               << "по шкале Цельсия и температуру по шкале Цельсия\n"
               << "в температуру по шкале Фаренгейта.\n\n\n";

        cout << "Для того чтобы перевести американские мили в ки-\n"
               << "лометры нажмите 1.\n\n";

        cout << "Для того чтобы перевести километры в американские\n"
               << "мили нажмите 2.\n\n";

        cout << "Для того чтобы перевести температуру по шкале Фа-\n"
               << "ренгейта в температуру по шклале Цельсия нажмите 3.\n\n";

        cout << "Для того чтобы перевести температуру по шкале Цель-\n"
               << "сия в температуру по шкале Фаренгейта нажмите 4.\n\n";

        cin >> choice;

        if(choice == 1)
        {
            cout << "Введите количество миль: ";
            cin >> miles;
            kilometers = miles * 1.609;
            cout << "Это будет " << kilometers << "km\n\n";
        }
        else if(choice == 2)
        {
            cout << "Введите количество километров: ";
            cin >> kilometers;
            miles = kilometers / 1.609;
            cout << "Это будет " << miles << "\n\n";
        }
        else if(choice == 3)
        {
            cout << "Введите температуру по шкале Фаренгейту:\n\n";
            cin >> Fahrenheit;
            Celsius = (Fahrenheit - 32) * 100 / (212 - 32);
            cout << "\n" << Fahrenheit << " град. по Фаренгейту будет "
                   << Celsius << " град. по Цельсию.\n\n";
        }
        else if(choice == 4)
        {
            cout << "Введите температуру по шкале Цельсия:\n\n";
            cin >> Celsius;
            Fahrenheit = Celsius  *  (212 - 32) / 100 + 32;
            cout << "\n" << Celsius << " град. по Цельсию будет "
                   << Fahrenheit << " град. по Фаренгейту.\n\n";
        }
        else
        {
            cout << "Вы не выбрали ни один из возможных вариантов, поэтому\n"
                   << "программа завершает свою работу. Если вы захотите пере-\n"
                   << "вести одни единицы в другие, закройте программу и снова\n"
                   << "ее запустите.\n\n";
        }
        system("PAUSE");
        return 0;
    }

    Есть еще одна инструкция в С++, делает тоже самое, но выглядит немного по другому. Называется эта инструкция switch (переключение, коммуникатор, если перевести с английского языка на русский). Работает все это по следующему принципу: Сначала мы пишем switch и в скобках имя переменной, которую мы будем сравнивать. Например, так: switch(choice). Затем идут фигурные скобки и в них case после которого идет значение переменной и ставиться двоеточие. Дальше идет код, который нужно выполнить, если значение переменной совпало с записанным в case. После чего обязательно должна идти инструкция break, иначе программа будет выполнять все инструкции case стоящие после нее. И, наконец, если ни одно из них не совпало, выполнятся значение по умолчанию – default. Тип переменной может быть лишь int и char. Вот как будет выглядеть наш конвертор. В новый вариант я лишь внес небольшое изменение. Теперь вместо цифры нужно ввести букву.

    #include <iostream>
    #include <windows.h>
    using namespace std;

    int main()
    {
        char choice;
        double miles, kilometers, Celsius, Fahrenheit;

        cout << "Данный конвертор переводит американские мили\n"
               << "в километры, километры в американские мили,\n"
               << "температуру по шкале Фаренгейта в температуру\n"
               << "по шкале Цельсия и температуру по шкале Цельсия\n"
               << "в температуру по шкале Фаренгейта.\n\n\n";

        cout << "Для того чтобы перевести американские мили в ки-\n"
               << "лометры нажмите m.\n\n";

        cout << "Для того чтобы перевести километры в американские\n"
               << "мили нажмите k.\n\n";

        cout << "Для того чтобы перевести температуру по шкале Фа-\n"
               << "ренгейта в температуру по шкале Цельсия нажмите f.\n\n";

        cout << "Для того чтобы перевести температуру по шкале Цель-\n"
               << "сия в температуру по шкале Фаренгейта нажмите c.\n\n";

        cin >> choice;

        switch(choice)
        {
            case 'm':
            {
                cout << "Введите количество миль: ";
                cin >> miles;
                kilometers = miles * 1.609;
                cout << "Это будет " << kilometers << "km\n\n";
                break;
            }
            case 'k':
            {
                cout << "Введите количество километров: ";
                cin >> kilometers;
                miles = kilometers / 1.609;
                cout << "Это будет " << miles << " \n\n";
                break;
            }
            case 'f':
            {
                cout << "Введите температуру по шкале Фаренгейту:\n\n";
                cin >> Fahrenheit;
                Celsius = (Fahrenheit - 32) * 100 / (212 - 32);
                cout << "\n" << Fahrenheit << " град. по Фаренгейту будет "
                << Celsius << " град. по Цельсию.\n\n";
                break;
            }
            case 'c':
            {
                cout << "Введите температуру по шкале Цельсия:\n\n";
                cin >> Celsius;
                Fahrenheit = Celsius  *  (212 - 32) / 100 + 32;
                cout << "\n" << Celsius << " град. по Цельсию будет "
                       << Fahrenheit << " град. по Фаренгейту.\n\n";
                break;
                   }
            default:
            {
                cout << "Вы не выбрали ни один из возможных вариантов, поэтому\n"
                       << "программа завершает свою работу. Если вы захотите пере-\n"
                       << "вести одни единицы в другие, закройте программу и снова\n"
                       << "ее запустите.\n\n";
            }
        }
        system("PAUSE");
        return 0;
    }

    Обратите  внимание, что букву в инструкции case мы взяли в одинарные кавычки. Если этого не сделать, то компилятор выдаст сообщение об ошибке. Когда тип нашей переменной int этого делать не нужно. И еще одно небольшое замечание. В качестве значения case может использоваться только одно значение. Если нужно чтобы код выполнялся при определенном диапазоне значении, то нужно использовать инструкцию if – else if – else.

    Теперь представим, что вы пишете игру. В ней главному герою нужно решить, стоит ли ему идти куда-нибудь или нет. И решение нужно принять исходя из двух событий: первое – идет ли сейчас дождь, и второе – есть ли у него зонт. Как быть в этом случае? Для этого новый тип данных - bool. У него всего два значения: 1 и 0. Единица соответствует истине, а ноль соответствует лжи. Вот как будет выглядеть наша программа:


    #include <iostream>
    #include <windows.h>
    using namespace std;

    int main()
    {
        bool umbrella, rain;

        rain = 1;
        umbrella = 0;

        if(rain)
        {
            if(umbrella)
            {
            cout << "Если дождь не сильный, то я пойду в гости к своим друзьям.\n\n";
            }
            else
            {
                cout << "Я не пойду в гости, так как на улице идет дождь, а у меня нет зонта!\n\n";
            }
        }
        else
        {
            cout << "Сегодня хорошая погода, так что можно сходить в гости к друзьям!\n\n";
        }
        system("PAUSE");
        return 0;
    }

    Для чего же нужен тип bool в С++? Он может нам пригодиться, когда мы захотим проверить правильно ли ввел значение пользователь и если он случайно ошибся вывести сообщение об этом на экран. В С++ есть специальные функции, которые проверяют, является ли значение переменной типа char цифрой, буквой или знаком препинания. Например, если мы просим ввести пользователя номер телефона, то мы проверяем, чтоб введенное значение не содержало знаков препинания и букв. Если мы просим ввести пользователя свое имя, то в нем не должно быть цифр. Все эти функции в зависимости от результата будут возвращать либо ненулевое значение, либо нуль. А так как любое ненулевое значение в переменной типа bool автоматически преобразуется в истинy, а нулевое в ложь, то можно написать код, который будет проверять правильность введенного значения. Вы сами можете в этом  убедиться, если напишите и выполните следующую программу:

    #include <iostream>
    #include <windows.h>
    using namespace std;

    int main( )
    {
        float variable;

        cout << "Введите значение переменой variable: ";

        cin >> variable;

        cout << "\n";

        if(variable)
        {
        cout << "Значение переменной variable \n"
               << "не нулевое, поэтому выполняется \n"
               << "код, если условие истинно.\n\n";
        }
        else
        {
        cout << "Значение переменной variable \n"
               << "равно нулю, поэтому выполняется \n"
               << "код, если условие ложно.\n\n";
        }

               system("PAUSE");
        return 0;
    }
     

    Вот как можно изменить наш первый вариант программы про зонт и дождь:

    #include <iostream>
    #include <cstring>
    #include <windows.h>
    using namespace std;

    int main()
    {
        bool umbrella, rain;
        char choice_rain[1], choice_umbrella[1];

         cout << "Прежде чем запустить программу, вы должны установить\n"
                << "начальные данные. Для этого ответьте на несколько\n"
                << "вопросов:\n\nДолжен ли идти дождь? (y/n)";
        cin >> choice_rain;
        cout << "\n";
        cout << "Должен ли быть у этого человека зонт? (y/n)";
        cin >> choice_umbrella;
        cout << "\n\n";

        if((!strcmp(choice_rain, "y")) || (!strcmp(choice_rain, "Y")))
        {
            rain = 1;
        }
        else if(!strcmp(choice_rain, "n") || !strcmp(choice_rain, "N"))
        {
            rain = 0;
        }

        if(!strcmp(choice_umbrella, "y") || !strcmp(choice_umbrella, "Y"))
        {
            umbrella = 1;
        }
        else if(!strcmp(choice_umbrella, "n") || !strcmp(choice_umbrella, "N"))
        {
            umbrella = 0;
        }

        if(rain)
        {
            if(umbrella)
            {
                cout << "Если дождь не сильный, то я пойду в гости к своим друзьям.\n\n";
            }
            else
            {
                cout << "Я не пойду в гости, так как на улице идет дождь, а у меня нет зонта!\n\n";
            }
        }
        else
        {
            cout << "Сегодня хорошая погода, так что можно сходить в гости к друзьям!\n\n";
        }
        system("PAUSE");
        return 0;
    }

    "В новом варианте программы с помощью функции strcmp( ) мы проверяем, какое значение ввел пользователь. Функция возвращает ноль, если введенное значение совпадает с тем значением, с которым мы сравниваем. Затем мы с помощью логического отрицания превращаем ложь в истину. В самом начале урока мы писали программу, которая выдает предупреждение при попытке деления на ноль. Вот как ее можно написать по-другому:

    #include <iostream>
    #include <windows.h>
    using namespace std;

    int main()
    {
        double num1, num2, total;

        cout << "Введите первое число: \n\n";
        cin >> num1;
        cout << "Введите второе число: \n\n";
        cin >> num2;

        if(num2)
        {
            total = num1 / num2;
            cout << "Результат: " << total << "\n\n";
            // то, что будет выполняться, если утверждение истинно.
        }
        else
        {
            cout << "На ноль делить нельзя!\n\n";
            // то, что будет выполняться, если утверждение ложно.
        }
        system("PAUSE");
        return 0;
    }

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

    Категория: C++ | Добавил: stranger140569 (17.09.2012)
    Просмотров: 2377 | Рейтинг: 3.7/3
    Всего комментариев: 0
    Имя *:
    Email *:
    Код *:
    Copyright MyCorp © 2018
    Конструктор сайтов - uCoz