Do while цикл – Занятие 9.Циклические конструкции.Циклы WHILE и DO-WHILE. Уроки программирования для чайников.Язык Си.

VBA Excel. Цикл Do While... Loop

Цикл Do While... Loop в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла Do While... Loop.

Цикл Do While... Loop в VBA Excel предназначен для повторения блока операторов пока выполняется заданное условие (возвращается значение True). Синтаксис этого цикла аналогичен синтаксису цикла Do Until... Loop, который повторяется до тех пор, пока условие не выполняется (возвращается значение False).

  1. Синтаксис цикла Do While... Loop
  2. Компоненты цикла Do While... Loop
  3. Примеры циклов Do While... Loop

Синтаксис цикла Do While... Loop

Синтаксис цикла Do While... Loop существует в двух вариантах, определяющих, когда проверяется условие.


Условие проверяется до выполнения операторов:


Do While condition
    [ statements ]
    [ Exit Do ]
    [ statements ]
Loop

Условие проверяется после выполнения операторов:


Do
    [ statements ]
    [ Exit Do ]
    [ statements ]
Loop While condition

В квадратных скобках указаны необязательные атрибуты цикла Do While... Loop.

Компоненты цикла Do While... Loop

Компонент Описание
condition Обязательный атрибут. Условие выполнения цикла. Выражение, возвращающее значение типа Boolean.
statements Необязательный* атрибут. Операторы вашего кода.
Exit Do Необязательный атрибут. Оператор выхода** из цикла до его окончания.

*Если не использовать в цикле свой код, смысл применения цикла теряется.

**Очень полезный оператор для цикла Do While... Loop, так как при некоторых обстоятельствах он может стать бесконечным. Если такой риск существует, следует предусмотреть возможность выхода из бесконечного цикла VBA с помощью оператора Exit Do.

Примеры циклов Do While... Loop

Простейшие циклы

Цикл Do While... Loop с условием до исполняемых операторов:


Sub test1()
Dim a As Byte
  Do While a < 10
    a = a + 1
  Loop
MsgBox a
End Sub

Цикл Do While... Loop с условием после исполняемых операторов:


Sub test2()
Dim a As Byte
  Do
    a = a + 1
  Loop While a < 10
MsgBox a
End Sub

В обоих случаях окно MsgBox выведет число 10. Когда значение переменной a будет равно 10, проверяемое условие выдаст значение False, и цикл будет остановлен.

Проход по строкам листа

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

Дни Игрок Брошено Попало в цель
1 день Белка 1 15 6
1 день Белка 2 12 7
2 день Белка 1 14 8
2 день Белка 2 16 7
3 день Белка 1 20 9
3 день Белка 2
14
6
4 день Белка 1 26 10
4 день Белка 2 13 5
5 день Белка 1 17 4
5 день Белка 2 21 7

Исходя из этих данных необходимо узнать, сколько шишек осталось у Белки 1 в дупле. Для этого необходимо вычесть из 100 шишек количество выброшенных Белкой 1 и прибавить шишки, заброшенные в ее дупло Белкой 2. Вычисления начинаем со второй строки (в первой заголовки) и в условии для цикла Do While... Loop указываем «первая ячейка текущей строки не является пустой». Таблица должна начинаться с первой ячейки рабочего листа «A1», и под ней, как минимум, одна строка должна быть пустой, точнее, первая ячейка этой строки.


Sub test3()
Dim i As Long, n As Long
i = 2
n = 100
  Do While Cells(i, 1) <> ""
    If Cells(i, 2) = "Белка 1" Then
      n = n - Cells(i, 3)
    Else
      n = n + Cells(i, 4)
    End If
    i = i + 1
  Loop
MsgBox n
End Sub

Результат, выведенный в информационном сообщении MsgBox, будет равен 40. Вы можете скопировать таблицу на рабочий лист книги Excel и поэкспериментировать с кодом VBA.

Бесконечный цикл и Exit Do

Пример бесконечного цикла:


Sub test4()
Dim a As Byte
  Do While a < 10
  a = a + 1
    If a = 9 Then
      a = 0
    End If
  Loop
End Sub

При запуске этой процедуры цикл Do While... Loop начинает выполняться бесконечно. Мне приходилось останавливать бесконечные циклы VBA в Excel 2000 и Excel 2016. В Excel 2000 помогло сочетание клавиш Ctrl+Break, а в Excel 2016 при закрытии редактора VBA крестиком появляется окно:

Информационное окно «Microsoft Excel не отвечает»Информационное окно «Microsoft Excel не отвечает»

Ожидать отклика программы нет смысла, поэтому нажимаем «Перезапустить программу» или «Закрыть программу».

Совет: перед запуском процедуры с циклом Do While... Loop, который может стать бесконечным, обязательно сохраните книгу, иначе, при принудительном закрытии редактора VBA ваши изменения будут утеряны. Кроме того, при принудительном закрытии редактора VBA, Excel может отключить макросы. Включите их в окне «Центр управления безопасностью», открыть которое можно по ссылке «Безопасность макросов» на ленте в разделе «Разработчик». Подробнее о включении макросов в разных версиях Excel читайте в статье: Как разрешить выполнение макросов в Excel?.

Пример использования оператора Exit Do:


Sub test5()
Dim a As Byte, n As Long
  Do While a < 10
  a = a + 1
  n = n + 1
    If a = 9 Then
      a = 0
    End If
    If n = 1000 Then
      Exit Do
    End If
  Loop
MsgBox n
End Sub

Когда число итераций цикла дойдет до 1000, он будет завершен, и информационное сообщение MsgBox выведет на экран число повторений цикла Do While... Loop из этого примера.

Цикл do while в C++. Урок 9.

Мы уже изучили с вами цикл while. Но бывают случаи, когда применять его не совсем удобно. Например, мы желаем сделать проверку ввода данных, и если данные не введены, нам не надо обращаться к условию. И использовать циклы с предусловием нам будет неудобно. Для этого и существует цикл do while. Таким образом мы точно знаем, что цикл точно выполнится хотя бы один раз.

Как выглядит цикл с предусловием?

Как вы можете видеть, вначале мы выполняем действие, а только затем обращаемся к условию. И если условие true, то мы продолжаем работать с циклом, а как только условие выдаст false, мы выйдем из цикла.

Алгоритм действий цикла do while

  1. Выполняем действие;
  2. Проверяем условие;
  3. Если условие верно, повторяем первый пункт.

Синтаксис цикла do while

Синтаксис цикла do while мало отличается от других операций языка C++. И первое, что нам надо запомнить:

  1. Если в теле цикла несколько действий, мы берем их в фигурные скобки;
  2. Если действие одно, фигурные скобки не обязательны.

Пример использования цикла do while

Давайте рассмотрим на примере:

Нам необходимо выводить все введенные числа последовательности до тех пор, пока не введем 0.

Мы вводим число, и тут же его выводим. А только после этого проверяем условие. И даже если мы ввели 0, то цикл обязательно сработает хотя бы один раз.

Обратите внимание, в условии мы пишем нашу переменную value и больше ничего. Она равносильна вот этому выражению value != 0.

Защита от некорректных данных

Мы будем заставлять пользователя вводить числа до тех пор, пока он не введет корректный день недели с понедельника по воскресенье. Предполагается, что понедельник равен 1, а воскресенье 7.

Прерывание цикла

Очень важно, когда мы знакомились с оператором switch, мы использовали оператор принудительного выхода break. В циклах while, do while и for, мы его так же можем использовать. Однако, делать это не рекомендуется.

Помимо оператора break, существует оператор continue. Он отличается тем, что заставляет принудительно выйти из текущей итерации цикла. Точно так же как и break, continue использовать не рекомендуется.

Посмотрите на изображение выше. На нем представлены схемы действия этих двух операторов. И последствия их использования внутри цикла.

Все дело в том, что мы используем циклы для определенных задач, а применение break либо continue, нарушает наши планы. И мы не сможем предсказать логику действия нашего цикла.

Решение задач

Количество чисел последовательности

Дана последовательность целых чисел, оканчивающаяся нулём. Необходимо найти количество чисел в этой последовательности. Ноль числом последовательности не считается.

Формат входных данных
Вводится не более, чем 215 целых чисел, каждое из которых не превосходит по модулю (215−1). После последнего числа вводится 0.
Формат выходных данных
Требуется вывести одно число — количество чисел в последовательности.
Примеры
входные данные
1 2 3 4 5 0
6 13 42 0
выходные данные
5
3

Средний рост

В классе учится n учеников. Известен рост каждого из них в сантиметрах. Рост мальчиков по условию задан отрицательными числами. Определите средний рост мальчиков и средний рост девочек.

Формат входных данных
Вводятся целое число n (2 Формат выходных данных
Требуется вывести два целых числа через пробел — средний рост мальчиков и средний рост девочек. Оба числа требуется округлить вниз до целого числа сантиметров.

Примеры
входные данные
10
156
-172
189
168
-187
162
-190
165
-186
-179
выходные данные
182 168

Видео по теме урока

Цикл while в C++ | Уроки С++

  Обновл. 30 Дек 2019  | 

В этом уроке мы детально рассмотрим цикл while, его конструкцию, особенности и использование.

Цикл while

Цикл while является самым простым из четырёх циклов, которые есть в C++, и очень похож на ветвление if/else:

while (условие)
    тело цикла;

Цикл while объявляется с использованием ключевого слова while. В начале цикла обрабатывается условие. Если его значением является true (любое ненулевое значение), то тогда выполняется тело цикла.

Однако, в отличие от оператора if, после завершения выполнения

тела цикла, управление возвращается обратно к while и процесс проверки условия повторяется. Если условие опять является true, то тогда тело цикла выполняется ещё раз.

Например, следующая программа выводит все числа от 0 до 9:

#include <iostream> int main() { int count = 0; while (count < 10) { std::cout << count << " "; ++count; } std::cout << "done!"; return 0; }

#include <iostream>

int main()

{

    int count = 0;

    while (count < 10)

        {

        std::cout << count << " ";

        ++count;

        }

    std::cout << "done!";

    return 0;

}

Результат выполнения программы выше:

0 1 2 3 4 5 6 7 8 9 done!

Рассмотрим детальнее эту программу. Во-первых, инициализируется переменная: int count = 0;. Условие 0 < 10

имеет значение true, поэтому выполняется тело цикла. В первом стейтменте мы выводим 0, а во втором выполняем инкремент переменной count. Затем управление возвращается к началу цикла while для повторной проверки условия. Условие 1 < 10 имеет значение true, поэтому тело цикла выполняется ещё раз. Тело цикла будет повторно выполняться до тех пор, пока переменная count не будет равна 10, только в том случае, когда результат условия 10 < 10 будет false, цикл завершится.

Цикл while может и вообще не выполняться. Например:

#include <iostream> int main() { int count = 15; while (count < 10) { std::cout << count << " "; ++count; } std::cout << "done!"; return 0; }

#include <iostream>

int main()

{

    int count = 15;

    while (count < 10)

        {

        std::cout << count << " ";

        ++count;

        }

    std::cout << "done!";

    return 0;

}

Условие 15 < 10 сразу принимает значение false, и тело цикла пропускается. Единственное, что выведет эта программа:

done!

Бесконечные циклы

С другой стороны, если условие цикла всегда принимает значение true, то и сам цикл будет выполняться бесконечно. Это называется бесконечным циклом. Например:

#include <iostream> int main() { int count = 0; while (count < 10) // это условие никогда не будет false std::cout << count << " "; // поэтому эта строка будет выполняться постоянно return 0; // а эта строка никогда не выполнится }

#include <iostream>

int main()

{

    int count = 0;

    while (count < 10) // это условие никогда не будет false

        std::cout << count << " "; // поэтому эта строка будет выполняться постоянно

    return 0; // а эта строка никогда не выполнится

}

Поскольку переменная count не увеличивается на единицу в этой программе, то условие count < 10 всегда будет true. Следовательно, цикл никогда не будет завершён, и программа будет постоянно выводить 0 0 0 0 0 ... .

Мы можем преднамеренно объявить бесконечный цикл следующим образом:

while (1) // или while (true) { // Этот цикл будет выполняться бесконечно }

while (1) // или while (true)

{

  // Этот цикл будет выполняться бесконечно

}

Единственный способ выйти из бесконечного цикла — использовать операторы return, break, exit, goto или выбросить исключение.

Программы, которые работают до тех пор, пока пользователь не решит остановить их, иногда преднамеренно используют бесконечные циклы вместе с операторами return, break или exit для завершения цикла. Распространена такая практика в серверных веб-приложениях, которые работают непрерывно и постоянно обслуживают веб-запросы.

Счётчик цикла while

Часто нам нужно будет, чтобы цикл выполнялся определённое количество раз. Для этого обычно используется переменная в виде счётчика цикла. Счётчик цикла — это целочисленная переменная, которая объявляется с единственной целью: считать, сколько раз выполнился цикл. В примерах выше переменная count является счётчиком цикла.

Счётчикам цикла часто дают простые имена, такие как i, j или k. Однако, в этих именах есть одна серьёзная проблема. Если вы захотите узнать, где в вашей программе используется счётчик цикла и воспользуетесь функцией поиска i, j или k, то в результате получите половину своей программы, так как i, j или k используются во многих именах. Следовательно, лучше использовать iii, jjj или kkk в качестве имён для счётчиков. Они более уникальны, их значительно проще найти, и они выделяются в коде. А ещё лучше использовать «реальные» имена для переменных, например, count или любое другое имя, которое предоставляет контекст использования этой переменной.

Также для счётчиков цикла лучше использовать тип signed int. Использование unsigned int может привести к неожиданным результатам. Например:

#include <iostream> int main() { unsigned int count = 10; // Считаем от 10 к 0 while (count >= 0) { if (count == 0) std::cout << "blastoff!"; else std::cout << count << " "; --count; } return 0; }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#include <iostream>

int main()

{

    unsigned int count = 10;

    // Считаем от 10 к 0

    while (count >= 0)

    {

        if (count == 0)

            std::cout << "blastoff!";

        else

            std::cout << count << " ";

        --count;

    }

    return 0;

}

Взгляните на программу выше ещё раз и постарайтесь обнаружить ошибку.

Оказывается, эта программа представляет собой бесконечный цикл. Она начинается с вывода 10 9 8 7 6 5 4 3 2 1 blastoff! как и предполагалось, но затем уходит с рельсов и начинает отсчёт с 4294967295. Почему? Потому что условие цикла count >= 0 никогда не будет ложным! Когда count = 0, то и условие 0 >= 0 имеет значение true, выводится blastoff, а затем выполняется декремент переменной count, происходит переполнение и значением переменной становится 4294967295. И так как условие 4294967295 >= 0 является истинным, то программа продолжает своё выполнение. А поскольку счётчик цикла является типа unsigned, то он никогда не сможет быть отрицательным, и поскольку он никогда не сможет быть отрицательным, то цикл никогда не завершится.

Правило: Всегда используйте тип signed int для счётчиков цикла.

Итерации

Каждое выполнение цикла называется итерацией (или ещё «повтором»).

Поскольку тело цикла обычно является блоком, и поскольку этот блок выполняется по новой с каждым повтором, то любые переменные, объявленные внутри тела цикла, создаются, а затем и уничтожаются по новой. В следующем примере переменная z создаётся и уничтожается 6 раз:

#include <iostream> int main() { int count = 1; int result = 0; // переменная result определена здесь, поскольку она нам понадобится позже (вне тела цикла) while (count <= 6) // итераций будет 6 { int z; // z создаётся здесь по новой с каждой итерацией std::cout << "Enter integer #" << count << ':'; std::cin >> z; result += z; // Увеличиваем значение счётчика цикла на единицу ++count; } // z уничтожается здесь по новой с каждой итерацией std::cout << "The sum of all numbers entered is: " << result; return 0; }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#include <iostream>

int main()

{

    int count = 1;

    int result = 0; // переменная result определена здесь, поскольку она нам понадобится позже (вне тела цикла)

    while (count <= 6) // итераций будет 6

    {

        int z; // z создаётся здесь по новой с каждой итерацией

        std::cout << "Enter integer #" << count << ':';

        std::cin >> z;

        result += z;

        // Увеличиваем значение счётчика цикла на единицу

        ++count;

    } // z уничтожается здесь по новой с каждой итерацией

    std::cout << "The sum of all numbers entered is: " << result;

    return 0;

}

Для фундаментальных типов переменных это нормально. Для не фундаментальных типов переменных (таких как структуры или классы) это может сказаться на производительности. Следовательно, не фундаментальные типы переменных лучше определять перед циклом.

Обратите внимание, переменная count объявлена вне тела цикла. Это важно и необходимо, поскольку нам нужно, чтобы значение переменной сохранялось на протяжении всех итераций (не уничтожалось по новой с каждым повтором цикла).

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

#include <iostream> int main() { int count = 1; while (count <= 50) { // Выводим числа до 10 (добавляем к каждому числу 0) if (count < 10) std::cout << "0" << count << " "; else std::cout << count << " "; // выводим остальные числа // Если счётчик цикла делится на 10 без остатка, то тогда вставляем символ новой строки if (count % 10 == 0) std::cout << "\n"; // Увеличиваем значение счётчика цикла на единицу ++count; } return 0; }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

#include <iostream>

int main()

{

    int count = 1;

    while (count <= 50)

    {

        // Выводим числа до 10 (добавляем к каждому числу 0)

        if (count < 10)

            std::cout << "0" << count << " ";

        else

            std::cout << count << " ";   // выводим остальные числа

        // Если счётчик цикла делится на 10 без остатка, то тогда вставляем символ новой строки

        if (count % 10 == 0)

            std::cout << "\n";

        // Увеличиваем значение счётчика цикла на единицу

        ++count;

    }

    return 0;

}

Результат выполнения программы выше:

01 02 03 04 05 06 07 08 09 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50

Вложенные циклы while

Также одни циклы while могут быть вложены внутри других циклов while. В следующем примере внутренний и внешний циклы имеют свои собственные счётчики. Однако, обратите внимание, условие внутреннего цикла использует счётчик внешнего цикла!

#include <iostream> int main() { int outer = 1; while (outer <= 5) { int inner = 1; while (inner <= outer) std::cout << inner++ << " "; // Вставляем символ новой строки в конце каждого рядка std::cout << "\n"; ++outer; } return 0; }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#include <iostream>

int main()

{

    int outer = 1;

    while (outer <= 5)

    {

        int inner = 1;

        while (inner <= outer)

            std::cout << inner++ << " ";

        // Вставляем символ новой строки в конце каждого рядка

        std::cout << "\n";

        ++outer;

    }

    return 0;

}

Результат выполнения программы выше:

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

Тест


Задание №1

Почему в программе выше переменная inner объявлена внутри блока while, а не сразу после объявления переменной outer (вне блока while)?

Ответ №1

Переменная inner объявлена внутри блока while так, чтобы она была восстановлена (и повторно инициализирована до 1) каждый раз, когда выполняется внешний цикл. Если бы переменная inner была объявлена вне цикла while, то её значение никогда не было бы сброшено до 1, или нам бы пришлось это сделать самостоятельно с помощью операции присваивания. Кроме того, поскольку переменная inner используется только внутри внешнего цикла while, то имеет смысл объявить её именно там. Помните, что переменные нужно объявлять максимально близко к их первому использованию!

Задание №2

Напишите программу, которая выводит буквы английского алфавита от a до z вместе с кодами из таблицы ASCII.

Подсказка: Чтобы выводить символы как целые числа — используйте оператор static_cast.

Ответ №2

#include <iostream> int main() { char mychar = 'a'; while (mychar <= 'z') { std::cout << mychar << " " << static_cast<int>(mychar) << "\n"; ++mychar; } return 0; }

#include <iostream>

int main()

{

    char mychar = 'a';

    while (mychar <= 'z')

    {

        std::cout << mychar  << " " << static_cast<int>(mychar) << "\n";

        ++mychar;

    }

    return 0;

}

Задание №3

Инвертируйте программу с последнего подзаголовка «Вложенные циклы» так, чтобы она выводила следующее:

5 4 3 2 1
4 3 2 1
3 2 1
2 1
1

Ответ №3

#include <iostream> int main() { int outer = 5; while (outer >= 1) { int inner = outer; while (inner >= 1) std::cout << inner-- << " "; // Вставляем символ новой строки в конце каждого рядка std::cout << "\n"; --outer; } return 0; }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#include <iostream>

int main()

{

    int outer = 5;

    while (outer >= 1)

    {

        int inner = outer;

        while (inner >= 1)

            std::cout << inner-- << " ";

        // Вставляем символ новой строки в конце каждого рядка

        std::cout << "\n";

        --outer;

        }

    return 0;

}

Задание №4

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

        1
      2 1
    3 2 1
  4 3 2 1
5 4 3 2 1

Подсказка: Разберитесь сначала, как вывести числа следующим образом:

X X X X 1
X X X 2 1
X X 3 2 1
X 4 3 2 1
5 4 3 2 1

Ответ №4

#include <iostream> int main() { // Цикл с 1 до 5 int outer = 1; while (outer <= 5) { // Числа в рядах появляются в порядке убывания, поэтому цикл начинаем с 5 и до 1 int inner = 5; while (inner >= 1) { // Первое число в любом ряде совпадает с номером этого ряда // Поэтому числа должны выводиться только если <= номера ряда, в противном случае, выводится пробел if (inner <= outer) std::cout << inner << " "; else std::cout << " "; // вставляем дополнительные пробелы --inner; } // Этот ряд вывели, переходим к следующему std::cout << "\n"; ++outer; } }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

#include <iostream>

int main()

{

// Цикл с 1 до 5

int outer = 1;

while (outer <= 5)

{

// Числа в рядах появляются в порядке убывания, поэтому цикл начинаем с 5 и до 1

int inner = 5;

while (inner >= 1)

{

// Первое число в любом ряде совпадает с номером этого ряда

// Поэтому числа должны выводиться только если <= номера ряда, в противном случае, выводится пробел

if (inner <= outer)

std::cout << inner << " ";

else

std::cout << "  "; // вставляем дополнительные пробелы

--inner;

}

// Этот ряд вывели, переходим к следующему

std::cout << "\n";

++outer;

}

}

Оценить статью:

Загрузка...

Поделиться в социальных сетях:

Программирование циклов, цикл do while

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

Оператор While

Общий вид оператора While:

While выражение
[инструкции]
Wend

Оператор While предназначен для организации цикла-пока.

Инструкции будут выполняться пока выражение будет истинно.

Пример. Вычислить сумму чисел от 0 до 100.

Решение.

Sub сумма1()
Dim x, s As Double
 
x = 0
s = 0
While x <= 100
s = s + x
x = x + 1
Wend
MsgBox ("s=" + Str(s))
 
End Sub

Пояснение решения.

В переменной s накапливается значение суммы.

Оператор Do While

Общий вид оператора Do While:

Do [While выражение]
[инструкции]
[Exit Do]
[инструкции1]
Loop

Оператор Do While предназначен для организации цикла-пока.

Инструкции будут выполняться пока выражение будет истинно. Конструкция Exit Do предназначена для преждевременного выхода из цикла.

Пример. Вычислить сумму чисел от 0 до 100.

Решение.

Sub сумма2()
Dim x, s As Double
 
x = 0
s = 0
 
Do While x <= 100
s = s + x
x = x + 1
Loop
 
MsgBox ("s=" + Str(s))
 
End Sub

Оператор Do Loop Until

Общий вид оператора Do Loop Until:

Do
[инструкции]
[Exit Do]
[инструкции1]
Loop [Until выражение]

Оператор Do Loop Until предназначен для организации цикла-до.

Инструкции будут выполняться до момента, когда выражение станет истинным. Конструкция Exit Do предназначена для преждевременного выхода из цикла.

Пример. Вычислить сумму чисел от 0 до 100.

Решение.

Sub сумма3()
Dim x, s As Double
x = 0
s = 0
 
Do
s = s + x
x = x + 1
Loop Until x > 100
 
MsgBox ("s=" + Str(s))
 
End Sub

Оператор For

Общий вид оператора For:

For счетчик = начальное_знач To конечное_знач [Step шаг]
[инструкции]
[Exit For]
[инструкции1]
Next [счетчик]

Оператор For предназначен для организации цикла-для.

Инструкции будут выполняться определенное количество раз, задаваемое в счетчик, начиная с начального значение (начальное_знач) до конечного значения (конечное_знач) с некоторым шагом (шаг). Конструкция Exit For предназначена для преждевременного выхода из цикла.

Пример. Вычислить сумму чисел от 0 до 100.

Решение.

Sub сумма4()
Dim x, s As Integer
 
s = 0
For x = 0 To 100
s = s + x
Next x
 
MsgBox ("s=" + Str(s))
 
End Sub

Примеры решения задач

Пример 1. Представить таблицу квадратов чисел от 2 до 10.

Решение.

Для отображения результатов воспользуемся Excel и для доступа к ячейкам функцией Cells (номер_строки, номер_колонки).

Sub квадраты()
Dim x
 
Cells(2, 1).Value = "x"
Cells(3, 1).Value = "x^2"
 
For x = 2 To 10
Cells(2, x).Value = x
Cells(3, x).Value = x ^ 2
Next x
End Sub

Статья 5 - Картинка 1

Пример 2

Пример 2. Составить программу определения наибольшего общего делителя (НОД) двух натуральных чисел.

Решение.

Наибольший общий делитель двух натуральных чисел — это самое большое натуральное число, на которое они делятся. Например, у чисел 12 и 18 наибольшие делители: 2, 3, 6. наибольшим общим делителем является число 6. Это записывается так:

НОД(12, 18) = 6.

Идея алгоритма Евклида для нахождения НОД основана на том свойстве, что если M>N, то

НОД(M, N) = НОД(M-N, N).

Иначе говоря, НОД двух натуральных чисел равен НОД их положительной разности и меньшего числа.

Sub Евклид()
Dim M, N, NOD
 
M = Cells(1, 2)
N = Cells(2, 2)
 
While M <> N
 
If M > N Then
M = M - N
Else
N = N - M
End If
Wend
 
NOD = M
Cells(3, 2).Value = NOD
 
End Sub

Статья 5 - Картинка 2

Пример 3

Пример 3. Построить график функции: улитку Паскаля.

Улитка Паскаля задается следующим образом:

x=A*cos(t)+B*cos(t)
y=A*cos(t)sin(t)+B*sin(t), A>B, B>0, 0<=t<2*Pi

Решение.

1. Подготовить данные в электронной таблице

Статья 5 - Картинка 3

2. Ввести код программы.

Sub улитка_паскаля()
 
Dim a, b, Pi, t As Double
Dim i As Integer
 
a = Cells(1, 2)
b = Cells(2, 2)
Pi = 3.14
i = 2
t = 0
 
While t <= 2 * Pi
x = a * Cos(t) + b * Cos(t)
y = a * Cos(t) * Sin(t) + b * Sin(t)
 
Cells(3, i).Value = x
Cells(4, i).Value = y
t = t + 0.1
i = i + 1
Wend
 
End Sub

3. Построить график с помощью мастера диаграмм, выбрав точечную диаграмму.

Статья 5 - Картинка 4

4. Изменить данные a и b.

A=2
B=1

5. Перезапустить макрос.

Статья 5 - Картинка 5

Цикл Do while

Цикл Do whileназывают также циклом по условию; условие записывается в заголовке цикла. Оператор обеспечивает повторение тела цикла до тех пор, пока условие верно. Имя здесь не обязательно, но может пригодиться для индикации вложенных циклов, операторовCycle илиExit.

Общее представление оператора:

[имя:]Do while(логическое выражение)

Тело цикла

End do [имя]

Изображение цикла Do whileна блок-схеме:

Важные замечания:

Пример

Do while (k==k+1) ! условие никогда не выполняется

Тело цикла

End do

  • Если переменная, проверяемая в условии в заголовке цикла, не изменяется в теле цикла, или изменяется, но не обращает условие в «ложь», то это приводит к зацикливанию, т.е. цикл будет выполняться, пока вы не закроете программу.

Пример

k = 0

do while (k>=0)

Тело цикла

K = k + 1

End do

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

В качестве примера реализуем подробную блок-схему цикла по переменной с помощью оператора do while:

Пример 1

x=xn

k=Max(0,Int((xk-xn)/step))+1

Do while (k>0) ! (1)

Тело цикла ! (2)

x=x+step ! (3)

k=k-1

Enddo

. . . ! (4)

! продолжение программы

Пример 2

Вывести на экран значения xиsin x, еслиxизменяется от 1 до 3 с шагом 0,1. Выполнить это задание с использованием цикла по переменной и циклаDo while.

Цикл по переменной

Do x= 1, 3, 0.1

Write(*,*)’x=’, x, &

‘ Sin x =’, sin(x)

Enddo

Цикл по условию

x = 1

Do while (x<=3)

Write(*,*)’x=’, x, &

‘ Sin x =’, sin(x)

x = x + 0.1

Enddo

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

Цикл по переменной

Цикл по условию

1

Заданы диапазон и шаг изменения переменной цикла

Перед началом цикла следует установитьначальное значение переменной цикла.

2

Фиксированное количество повторений цикла.

Количество повторений цикла заранее неизвестно и может быть различным при работе с разными данными.

3

Переменная цикла автоматически изменяется по закону арифметической прогрессии.

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

4

Переменную цикла изменять в теле цикла запрещено.

Изменение переменной цикла возможно тольков теле цикла, и делать этонеобходимо.

5

Использование цикла по переменной не приводит к зацикливанию.

Ошибки в работе с переменной цикла могут привести к зацикливанию. Одна из таких ошибок – переменная цикла не изменяется в теле цикла.

6

Только одна переменная цикла.

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

Отправить ответ

avatar
  Подписаться  
Уведомление о