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

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

    Циклы в С++. Циклы while и do-while.

    Недавно читая книгу по С++ я нашел интересное выражение: «муки творчества».Наверное, многим из нас знакома, ощущение «вселенского заговора» против нас, когда программа, которую ты так долго писал, не работает. Кто-то начинает думать, может дело в компиляторе, или даже операционной системе или еще в чем-нибудь? Ведь я написал все правильно!

    Со временем я пришел к выводу, что это нормально и даже необходимо. Это называется профессиональный рост. Если с вами это случилось, то значит, вы готовы узнать что-то новое. Внимательней читая статью в вашей любимой книге по С++, статью в интернете вы поймете что-то, что сделает ваши программы более красивыми и сложными, а код профессиональным. Это показатель того уровня, которого вы достигли на данный момент, и поэтому это не должно быть поводом записать себя в неудачники.

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

    Главное отличие циклов while и while-do в том, что мы применяем их в тех случаях, когда не известно заранее, сколько итераций (витков цикла) должен выполнить цикл, прежде чем мы получим нужный нам результат. Цикл while будет выполняться до тех пор, пока условие цикла будет истинным. С другой стороны с помощью цикла while можно имитировать любой цикл for. В прошлом уроке для того, чтобы показать возможности цикла я привел программу, которая выводит числа от 1 до 100. Вот как она будет выглядеть с использованием цикла while…

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

    int main( )
    {
        int i = 0;

        while(i<100)
        {
            i++;
            cout << i << '\n';
        }

        system("PAUSE");
        return 0;
    }

    Как видите, нам пришлось инициализацию переменной i сделать пред циклом, а инкремент поместить внутрь цикла. В остальном различий нет.

    Теперь пример программы, где помочь нам может только цикл while. Как известно кроме цифр, букв и знаков препинания, в консоли есть псевдографика. Проблема лишь в том, что с помощью клавиатуры эти символы набрать нельзя. Для этого используются номер знака в восьмеричной системе. Следующая программа выводит символы на экран, и их номер в десятичном и восьмеричном формате.

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

    int main( )
    {
        unsigned char ch;
        int i = 1;

        ch = 1;

        while(ch)
        {
            cout << dec << i << " - " << ch;
            cout << oct << " - \\" << i << "\n\n";
            ch++;
            i++;
        }

        system("PAUSE");
        return 0;
    }

    Если бы мы попробовали бы применить в этом случае цикл for, то получили бы сообщение об ошибке. Теперь можно написать программу, которая выводит сообщение: «Hello, World!» - в двойной рамке. Код программы внизу…

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

    int main( )
    {
        cout << "\311\315\315\315\315\315\315\315\315"
               << "\315\315\315\315\315\315\315\273\n"
               << "\272 Hello, World! \272\n\310\315"
               << "\315\315\315\315\315\315\315\315"
               << "\315\315\315\315\315\315\274\n\n";

        system("PAUSE");
        return 0;
    }

    У некоторых из вас может возникнуть закономерный вопрос, как получилось, что поместив в условие цикла while переменную типа char, мы получили все символы, которые можно вывести с помощью номера символа в восьмеричном формате. Для того, чтобы в этом разобраться, мы должны иметь четкое представление о том, как работать с булевым типом данных в С++.

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

    Итак давайте вернемся к булевому (в честь Джорджа Буля, математика занимавшегося проблемами математической логики) типу данных в С++. Для обычного человека, все это можно представить с помощью двух слов: «да» и «нет». Когда человек слышит какое-то утверждение, он для себя ищет ответ лишь на один вопрос: «Это правда?». И отвечает на него либо «да», либо «нет».

    Теперь о том, как это выглядит в С++. В С++ истинное значение равно единице, а ложное равно нулю. В этом вы можете убедиться сами, если скомпилируйте и выполните следующий  код:

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

    int main( )
    {
        cout << "Выражение (4==5) является \n"
               << "заведомо ложным. Если вы- \n"
               << "вести результат этого сра- \n"
               << "нения на экран, оно будет \n"
               << "равно: ";
        cout << (4==5) << "\n\n";

        cout << "Выражение (4==4) является \n"
               << "заведомо истинным. Если вы- \n"
               << "вести результат этого сра- \n"
               << "нения на экран, оно будет \n"
               << "равно: ";
        cout << (4==4) << "\n\n";

        system("PAUSE");
        return 0;
    }

    Конечно, никто не запрещает вам инициализировать вам переменные булева типа с помощью ключевых слов «true» и «false», но компилятор все ровно переведет их в ноль или единицу. Следующая программа наглядно демонстрирует это:

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

    int main( )
    {
        bool bool_true, bool_false;

        bool_true = true;
        bool_false = false;

        cout << "Переменная bool_true была инициали-\n"
               << "зирована с помощью ключевого слова \n"
               << "true. bool_true = " <<  bool_true
               << "\n\n";
        cout << "Переменная bool_fasle была инициали-\n"
               << "зирована с помощью ключевого слова \n"
               << "fasle. bool_false = " <<  bool_false
               << "\n\n";

        system("PAUSE");
        return 0;
    }

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

    Теперь давайте разберемся, откуда взялся ноль в условии цикла while. Если посмотреть диапазон  значений для переменных типа char, то он будет равен  от -127 до 127. Если объявить переменную  с помощью модификатора unsingned (без знаковое), то ее диапазон измениться. Он будет от 0 до 255. При выходе за этот диапазон, значение переменной становиться равным нулю. Это демонстрирует следующая программа:

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

    int main( )
    {
        unsigned int test = 4294967295;

        cout << "Значение переменной test = "
               << test + 1 << "\n\n";

        system("PAUSE");
        return 0;
    }

    Как видим вместо того, чтобы вывести на экран число 4294967296, на экран выводиться число 0.

    В С++ есть автоматическое преобразование типов. Согласно этому любое не нулевое значение приводиться к единице, т. е. истине, а любое нулевое к ложному значению. Убедиться в этом можно протестировав следующую программу:

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

    int main( )
    {
        double test;

        cout << "Введите значение переменной test: ";
        cin >> test;
        cout << "\n";

        if(test)
        {
            cout << "Вы ввели не нулевое значение.\n"
                   << "Переменная test = " << test << "\n";
        }
        else
        {
            cout << "Вы ввели нулевое значение.\n"
                   << "Переменная test = " << test << "\n";
        }

        cout << "\n\n";
        system("PAUSE");
        return 0;
    }

    Как только значение переменной ch выходит за допустимый диапазон, условие цикла while становиться ложным и цикл прекращает свою работу. Теперь немного о «dec» и «oct». Они указывают компилятору, в какой системе выводить значение переменной i, «dec» в десятеричной, а «oct» в восьмеричной.

    Теперь давайте разберемся, в чем отличие цикла while от цикла do-while. В отличие от цикла while, цикл do-while выполнит одну итерацию, даже если условие цикла является с самого начала ложным. Вот как он выглядит…

    do
    {
        // Код, который должен быть выполнен.
    }
    while(условие);

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

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

    int main( )
    {
        char password[80];
        bool Enter = 0;

        do
        {
            cout << "Введите пароль: ";
            cin >> password;

            Enter = !(strcmp(password, "password"));

            if(Enter)
            {
                cout << "Вы имеете право работать с этой базой данных.\n";
            }
        }
        while(Enter);

        cout << "\n\n";
        system("PAUSE");
        return 0;
    }

    Если теперь за комментировать строчку system("PAUSE"); поставив перед ней два слэша // , то как только пользователь введет неправильный пароль, программа сразу же завершит свою работу. Если вы хотите дать больше возможности ввести правильный пароль, вам надо использовать цикл for.

    Обратите внимание, что нам пришлось перед строчкой (strcmp(password, "password")) поставить знак восклицания. Дело в том, что это логическое отрицание. Функция strcmp сравнивает значение переменной password со строкой «password». Если они совпадают, то она возвращает значение ноль, который компилятор интерпретирует, как логическое нет. А нам нужно чтоб у нас было логическое да. Для этого мы поставили перед функцией strcmp( ) логическое отрицание, которое превращает логическое да в логическое нет, а логическое нет в логическое да.

    Так же как и циклы for их можно вкладывать один в другой. В них можно использовать ключевые слова break и continue. Ниже вы можете видеть пример программы с использованием ключевого слова break:

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

    int main( )
    {

        int k = -5;

        while(k < 11)
        {
            ++k;

            if(k == 0)
                break;

        cout << k << "\n";

        }

        cout << "\n\n";
        system("PAUSE");
        return 0;
    }

    И с использованием ключевого слова continue:

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

    int main( )
    {
        int k = -5;

        while(k < 11)
        {
            ++k;

            if(k == 0)
                continue;

            cout << k << "\n";

        }

        cout << "\n\n";
        system("PAUSE");
        return 0;
    }

    В следующем уроке мы перейдем к большой и очень важной теме. Мы начнем изучать массивы.

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