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

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

    Циклы. Циклы for. Инструкции continue, break.
    Циклы. Циклы for. Инструкции continue, break.  

    Циклы. Циклы for. Инструкции continue, break.

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

    И так... Наводим курсор на заголовок окна и щелкаем по нему правой кнопкой мыши. В открывшемся контекстном меню выбираем самый последний пункт меню: свойства. И переходим на вкладку: Расположение. Изменяем в блоке «Размер буфера экрана» значение ширины и высоты и нажимаем кнопку «OK». Появится сообщение: изменение свойств. Выбираем пункт: Сохранить свойство для других окон с тем же именем, и нажимаем кнопку «ОК». Если из моих объяснений вам что-то будет непонятно, внизу вы можете посмотреть все это заснятое на видео.

     

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

     for(int i=0; i<21; i++)
    {
        // Здесь мы размещаем наш код.
    }
     

    Чтоб понять, насколько важен цикл for, давайте  представим жизнь без него. Давайте попробуем написать простую программу без цикла for, которая выводит на экран в столбик числа от 1 до 100. И так наша программа без цикла for:

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

    int main( )
    {
        cout << 1 << '\n';
        cout << 2 << '\n';
        cout << 3 << '\n';
        cout << 4 << '\n';
        cout << 5 << '\n';
        cout << 6 << '\n';
        cout << 7 << '\n';
        cout << 8 << '\n';
        cout << 9 << '\n';
        cout << 10 << '\n';
        // Дальше я писать не стал.
        // Кому не жаль себя могут продолжить...

        system("PAUSE");
        return 0;
    }
     

    Теперь та же программа с использованием цикла for:

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

    int main()
    {
        for(int i=1; i<101; i++)
        {
            cout << i << '\n';
        }

        system("PAUSE");
        return 0;
    }
     

    Я думаю, этих двух программ достаточно, чтоб убедиться в преимуществах цикла for. Язык C расширением которого стал С++ был написан профессиональными программистами для программистов. Он до сих пор считается языком профессиональных программистов. А кому, как не профессиональным программистам известно, насколько утомляет занятие бессмысленным «копипастом» (Это слово происходит от двух английских слов: copy – копировать и paste – вставить).

    Кроме цикла for существуют и другие циклы, поэтому он всегда должен начинаться с ключевого цикла for. Чтобы цикл выполнил код нужное количество раз, мы должны указать, с какого значения должен начаться цикл for, до какого значения он должен продолжаться и насколько должно увеличиваться значение при выполнении цикла. Программисты называют их: инициализацией, выражением и инкрементом.

    Нам будет намного проще понять, как управлять циклом for, если мы представим его в виде обычного счетчика. Для начала мы должны решить, с какого значения мы должны начать наш счет. Обычно когда мы начинаем считать, мы начинаем с одного. Один, два, три, четыре и т. д. В программировании можно начать с любого числа, даже с отрицательного. Единственное условие оно должно быть целым  (тип данных int). Это будет выглядеть так: for(i=0; ; ). Чаще всего программисты переменную для управления называют i, но вы можете назвать так как вам угодно. Никаких правил на этот счет нет. Как  и все переменные в C++ ее нужно объявить. Т. е. указать ее имя и тип данных, которые могут в ней содержаться. Сделать это можно в любом мест программы, но обязательно до ее первого использования. Можно сделать это прямо в цикле. Вот так: for(int i=0; ;). После того как мы присвоили переменной i первоначальное значение, мы обязательно должны поставить точку с запятой, иначе компилятор не сможет разобраться где кончается инициализация и начинается выражение. После точки с запятой мы должны записать выражение, при котором будет выполняться наш цикл. В нашем случае это будет выглядеть так: for(int i=0; i<101; ). Теперь перед тем как выполнить инструкции записанные в цикле будет проверяться выполняется выражение или нет, т. е. меньше ли 101 переменная i. И как только оно перестанет выполняться, (т. е. переменная i будет равна 100) цикл завершит свою работу. Будьте осторожны. Можно написать в цикле такое выражение, которое не разу не выполниться. Например так: for(int i=0; i>2; ). Этот цикл не разу не выполниться (Один шаг цикла называется итерацией, поэтому программист сказал бы цикл не совершит ни одной итерации). После выражения, мы снова должны поставить точку с запятой. Не пугайтесь странной переменной с двумя плюсами после нее. Это всего лишь короткая запись i = i + 1. Так как программисты заметили, что чаще всего им приходиться увеличивать значение переменной на единицу, то и придумали для этого сокращенную запись. i++. Его называют оператором инкремента. Есть еще один, который вычитает из переменной единицу. i-- (короткая запись i = i - 1). Называется он оператором декремента. В результате мы получаем следующую запись: for(int i=1; i<101; i++).

    И так что происходит за кулисами, когда выполняется цикл for:

    1. Сначала устанавливается начальное значение.
    2. Затем проверяется выражение.
    3. Если оно выполняется, увеличивается значение.
    4. Затем все повторяется, пока не перестанет выполняться выражение.
     

    Теперь несколько вариаций на тему цикла for. Программу, которая выводит числа от одного до ста, я привел выше. Теперь программа, которая выводи их в обратном порядке.

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

    int main()
    {
        for(int i=100; i>0; i--)
        {
            cout << i << '\n';
        }

        system("PAUSE");
        return 0;
    }
     

    Можно написать цикл, который будет выводить на экран числа кратные двум, трем, четырем из определенного диапазона чисел. Вот пример программы, которая выводит все четные числа от 1 до 100:

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

    int main()
    {
        for(int i=2; i<101; i=i+2)
        {
            cout << i << '\n';
        }

        system("PAUSE");
        return 0;
    }
     

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

    Следующая программа является своеобразным тренажером циклов for( ):

    // Программа предназначена для изучения цикла for,
    // скомпилируйте ее и запустите.
    #include <iostream>
    #include <windows.h>
    using namespace std;

    int main()
    {
        int i,  j, start, decrement;
        bool choice = 1;

        cout <<"Эта программа предназначена для изучения "
               <<"цикла for\n\n"
               <<"Инициализация\n\n"
               <<"C начала мы должны установить начальное \n"
               <<"значение для нашего цикла. Т. е. с какого \n"
               <<"числа мы начинаем выводить числа. Оно может \n"
               <<"быть как положительным, так и отрицательным, \n"
               <<"но обязательно целым числом.\n\n";
        cout <<"Введите i: ";
        cin >> start;

        cout <<"\n";
        cout <<"Условие\n\n"
               <<"В условии мы записываем, при каком условии \n"
               <<"цикл прекращает свою работу. Т. е по дости- \n"
               <<"жении какого числа цикл должен прекратить свою \n"
               <<"работу. Это может  быть любое число, как \n"
               <<"положительное, так и отрицательное, но обя- \n"
               <<"зательно целое.\n\n";
        cout << "Введите j: ";
        cin >> j;

           cout<<"\n";
        cout <<"Инкремент или декремент\n\n";
        cout <<"Здесь мы должны решить, в каком порядке должны \n"
               <<"выводиться числа. По возрастанию или по убыванию \n"
               <<"Если вы хотите, чтобы они выводились по возрас- \n"
               <<"танию, то введите 1, если по убыванию введите 0.\n\n";
        cout <<"Введите choice: ";
        cin >> choice;
        cout <<"\n";

        cout <<"Величина инкремента или декремента\n\n";
        cout <<"Здесь мы задаем, насколько мы увеличиваем или умень- \n"
               <<"шаем значение при каждом витке нашего цикла. \n\n";
        cout <<"Введите decrement: ";
        cin >>decrement;
        cout << "\n";

        if(choice)
        {
            if(decrement == 1)
            {
                cout << "Код:\n\n";
                cout << "for( int i = " << start << "; i <= " << j << ";";
                cout << " i++)\n";
                cout << "{\n";
                cout << "    cout << i << \"\\n\";" << "\n";
                cout << "}\n";
                cout << "\n\n";
                cout << "Результат выполнения программы:\n\n";
            }
            else
            {
                cout << "Код:\n\n";
                cout << "for(int i = " << start << "; i <= " <<   j << ";";
                cout << " i = i + " << decrement << ")\n";
                cout << "{\n";
                cout << "    cout << i << \"\\n\";" << "\n";
                cout << "}\n";
                cout << "\n\n";
                cout << "Результат выполнения программы:\n\n";
            }

            for(int i = start; i <= j; i = i + decrement)
                cout << i << "\n";
        }
        else
        {
            if(decrement == 1)
            {
                cout << "Код:\n\n";
                cout << "for(int i = " << start << "; i => " << j << ";";
                cout << " i--)\n";
                cout << "{\n";
                cout << "    cout << i << \"\\n\";" << "\n";
                cout << "}\n";
                cout << "\n\n";
                cout << "Результат выполнения программы:\n\n";
            }
            else
            {
                cout << "Код:\n\n";
                cout << "for(int i = " << start << "; i => " << j << ";";
                cout << " i = i - " << decrement << ")\n";
                cout << "{\n";
                cout << "    cout << i << \"\\n\";" << "\n";
                cout << "}\n";
                cout << "\n\n";
                cout << "Результат выполнения программы:\n\n";
            }

            for(int i = start; i >= j; i = i - decrement)
                cout << i << "\n";
        }

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

    Особое внимание я хочу обратить внимание на следующую строчку: «cout << "    cout << i << \"\\n\";" << "\n";». Дело в том что слеш, как и кавычки используются языком С++,  и если мы хотим чтоб они просто вывелись на экран, то мы должны поставить перед ними слеш, который на экран не выводиться.

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

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

    int main()
    {
        int exit;

        for(exit=0; exit != 5; )
        {
            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";

            cout << "Для выхода из программы нажмите клавишу 5. \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 if(choice == 5)
            {
                exit = choice;
            }
        }
        return 0;
    }
     

    Как видим, достаточно было убрать из условия цикла инкремент, чтоб превратить его в бесконечный цикл, пока пользователь не введет цифру 5.

    А что делать, если по каким либо причинам нужно пропустить несколько итераций цикла, или выйти из него? Для этого можно использовать два ключевых слова: break, и continue. Для того чтобы понять, как работает инструкция continue, напишем программу, которая с помощью цикла единицу на -10, потом на -9 и т. д., пока  не дойдет 10. При написании этой программы встает лишь одна проблема, как избежать деления на ноль. Ее можно решить при помощи инструкции continue. Вот как будет выглядеть наша программа:

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

    int main()
    {

        for(int i=-10; i<11; i++)
        {
            double result;

            if(i==0)
            {
                cout << "На ноль делить нельзя!\n";
                continue;
            }

            result = 1 / (double)i;
            cout << result << "\n";
        }
        system("PAUSE");
        return 0;
    }

    Здесь я хочу обратить на строку: result = 1/ (double)i; . Переменная result имеет тип double, а переменная i имеет тип int. Если в выражении участвуют переменные разных типов, то компилятор приведет их к одному типу. В нашем случае к типу int. В результате, мы увидим лишь целую часть от деления, т. е. 0. Поставив перед переменной i в скобках слова double, мы тем самым явно показали, что результат должен быть типа double. Особое внимание хочу обратить на следующий код:

        if(i==0)
        {
            cout << "На ноль делить нельзя!\n";
            continue;
        }
     

    Здесь мы проверяем переменную i на то, равна она нулю или нет, и если да то пропускаем весь код идущий после инструкции continue.

    Если нам нужно выйти полностью из цикла, то нужно использовать инструкцию break. Вот пример программы с использование инструкции break.

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

    int main()
    {

        for(int i=-10; i<11; i++)
        
            double result;

            if(i==0)
            {
                cout << "На ноль делить нельзя!\n";
                break;
            }

            result = 1 / (double)i;
            cout << result << "\n";
        }
        cout << "Эти инструкции в коде программы идут сразу \n"
               << "после цикла for/n";
        system("PAUSE");
        return 0;
    }
     

    Как видим отличие инструкции break от continue в том, что происходит выход из цикла и передача управления инструкциям написанным после цикла for.

       

    Циклы можно вкладывать один в другой. Вот пример таблицы умножения выведенный на экран с помощью двух циклов for( );

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

    int main()
    {
        for(int i = 1; i <= 9; i++)
        {
            for(int j =1; j <= 9; j++)
                cout << j << " * " << i << " = " << (j*i) << "\n";

            cout << "\n\n";
        }

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

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

    #include <iostream>
    #include <windows.h>
    using namespace std;
    int main()
    {
        for(int i = 0, j = 0; i <= 9, j <= 9; i++, j++)
            cout << "i = " << i << ", j = " << j << "\n";

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

    Ну вот и все, что я хотел рассказать вам в этом уроке. Следующий урок будет посвящен циклам while и do while.

     
    Категория: C++ | Добавил: stranger140569 (27.10.2012)
    Просмотров: 4278 | Комментарии: 1 | Рейтинг: 5.0/2
    Всего комментариев: 1
    1  
    У вас ошибка.
    Цитирую: "В нашем случае это будет выглядеть так: for(int i=0; i<100; ). Теперь перед тем как выполнить инструкции записанные в цикле будет проверяться выполняется выражение или нет, т. е. меньше ли 100 переменная i."
    Там в скобках должно быть не 100, а 101. Дальше я не смотрел мне лень было =)

    Имя *:
    Email *:
    Код *:
    Copyright MyCorp © 2018
    Конструктор сайтов - uCoz