Программирование циклов, цикл 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 предназначен для организации цикла-для. 2 Next x End Sub

Пример 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

Пример 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. Подготовить данные в электронной таблице

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. Построить график с помощью мастера диаграмм, выбрав точечную диаграмму.

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

A=2
B=1

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

VBA Excel. Цикл Do While… Loop

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

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

Синтаксис цикла 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 с условием до исполняемых операторов:

1

2

3

4

5

6

7

Sub test1()

Dim a As Byte

  Do While a < 10

    a = a + 1

  Loop

MsgBox a

End Sub

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

1

2

3

4

5

6

7

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 деньБелка 1156
1 деньБелка 2127
2 деньБелка 1148
2 деньБелка 2167
3 деньБелка 1209
3 деньБелка 2146
4 деньБелка 12610
4 деньБелка 2135
5 деньБелка 1174
5 деньБелка 2217

Исходя из этих данных необходимо узнать, сколько шишек осталось у Белки 1 в дупле.

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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

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

1

2

3

4

5

6

7

8

9

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 не отвечает»

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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 из этого примера.


Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

while do (Справочное руководство Guile)

while do (Справочное руководство Guile)

Далее: Подсказки, Предыдущий: Условная оценка последовательности выражений, Вверх: Управление потоком выполнения программы   [Содержание][Указатель]


6.11.4 Механизмы итерации

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

синтаксис: do ((переменная инициализация [шаг]) …) (тестовое выражение …) тело …

Свяжите переменную s и оцените тело до тех пор, пока тест не станет истинным. Возвращаемое значение — это последнее expr после test , если оно задано. А простой пример иллюстрирует основную форму,

 (сделать ((я 1 (1+ я)))
    ((> я 4))
  (показать я))
-| 1234
 

Или с двумя переменными и окончательным возвращаемым значением,

 (делать ((я 1 (1+ я))
     (3 р (*3 р)))
    ((> я 4)
     п)
  (формат #t "3**~s равен ~s\n" i p))
-|
3**1 равно 3
3**2 равно 9
3**3 равно 27
3**4 это 81
⇒
243
 

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

Выражение test является условием завершения. Циклические остановки когда тест верен. Он оценивается перед запуском тело каждый раз, значит если правда первый раз то тело вообще не запускается.

Дополнительные expr s после теста оцениваются в конце цикла, с окончательными переменными привязками. last expr дает возвращаемое значение, или если нет выражение с возвращаемое значение не указано.

Каждая итерация устанавливает привязки к новым местоположениям для переменная s, как новый пусть для каждой итерации. Это сделано для переменной с без шагов выражений тоже. следующее иллюстрирует это, показывая, как новый i захватывается лямбда на каждой итерации (см. Концепция закрытия).

 (определить lst '())
(сделать ((я 1 (1+ я)))
    ((> я 4))
  (set!lst(cons(лямбда()i)lst)))
(карта (лямбда (proc) (proc)) lst)
⇒
(4 3 2 1)
 
синтаксис: в то время как состояние тела …

Запустить цикл, выполняющий тело форм, пока условие истинно. cond проверяется в начале каждой итерации, поэтому, если #f первый раз потом тело вообще не выполняется.

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

Процедура схемы: break break-arg …

Вырваться из формы , в то время как .

Процедура схемы: продолжить

Отменить текущую итерацию, вернуться к началу и протестировать , снова и т. д.

Если цикл завершается нормально, то по cond оценивается как #f , тогда выражение while в целом оценивается как . Если он завершается вызовом , сломайте с некоторым номером аргументов, эти аргументы возвращаются из , а выражение, как несколько значений. В противном случае, если он завершается вызовом прерывает без аргументов, тогда возвращаемое значение равно #t .

 (пока #f (ошибка "не достигнут")) ⇒ #f
(в то время как #t (перерыв)) ⇒ #t
(в то время как #t (перерыв 1 2 3)) ⇒ 1 2 3
 

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

 (пока (тест1)
  (пусть ((внешний разрыв разрыв))
    (пока (тест2)
      (если что-то)
        (внешний разрыв #f))
      ...)))
 

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

Другим очень распространенным способом выражения итерации в программах Scheme является использование так называемого по имени пусть .

Именованный let — это вариант let , который создает процедуру и вызывает это за один шаг. Из-за вновь созданной процедуры с именем let мощнее, чем сделать – его можно использовать для итерации, но и для произвольной рекурсии.

синтаксис: let тело привязки переменных

Для определения привязок см. документацию о пусть (см. Связывание локальных переменных).

Именованный пусть работает следующим образом:

  • Новая процедура, которая принимает столько аргументов, сколько имеется в привязках создается и привязывается локально (используя let ) к переменной . Имена формальных аргументов новой процедуры — это имя переменных .
  • body выражений вставляются во вновь созданную процедуру.
  • Процедура вызывается с init выражениями в качестве формального аргументы.

В следующем примере реализован цикл, который повторяет (по рекурсии) 1000 раз.

 (пусть lp ((x 1000))
  (если (положительно? х)
      (лп (- х 1))
      Икс))
⇒
0
 

Next: Подсказки, Previous: Условная оценка последовательности выражений, Up: Управление потоком выполнения программы   [Contents][Index]

Visual Basic (VB) Цикл Do-While

В c# цикл Do-While полезен для выполнения блока операторов до тех пор, пока определенное условие не вернет true .

 

В Visual Basic цикл do-while аналогичен циклу while, но единственное отличие состоит в том, что цикл while будет выполнять операторы только тогда, когда определенное условие возвращает true,   цикл do-while выполнит операторы хотя бы один раз, потому что сначала он выполнит блок операторов, а затем проверит условие.

Синтаксис цикла Do-While в Visual Basic

Как правило, в Visual Basic Do и ключевые слова While полезны для создания цикла do. ..while . Ниже приведен синтаксис определения цикла do-while на языке программирования Visual Basic для выполнения блока операторов до тех пор, пока определенное условие не будет оценено как false .

 

Выполнить
// Операторы для выполнения
Цикл, в то время как логическое_выражение

Если вы соблюдаете приведенный выше синтаксис, Цикл Do-While начинается с ключевого слова Do , за которым следует блок операторов и параметр While с именем boolean_expression .

 

Здесь операторы цикла Do-While будут выполняться первыми; после этого будет оцениваться boolean_expression . Если boolean_expression возвращает true , операторы внутри цикла Do-While будут выполняться снова.

 

Если логическое_выражение равно false , цикл Do-While остановит выполнение операторов, и выполнение программы выйдет из цикла.

Блок-схема цикла Do-While в Visual Basic

Ниже приведено графическое представление потока процесса цикла Do-While на языке программирования Visual Basic.

 

 

Теперь мы увидим, как использовать цикл Do-While в языке программирования Visual Basic с примерами.

Пример цикла Do-While в Visual Basic

Ниже приведен пример использования цикла Do-While в языке программирования Visual Basic для выполнения блока операторов на основе наших требований.

 

Модуль Module1
  Sub Main()
    Dim i As Integer = 1
    Do
      Console.WriteLine(«i value: {0}», i)
      i += 1
    Зациклить, пока i <= 4
    Консоль .WriteLine(«Нажмите клавишу Enter для выхода…»)
    Console.ReadLine()
  End Sub
End Module

Если вы наблюдаете приведенный выше пример, сначала мы выполняем операторы в цикле Do-While и увеличиваем значение переменной i ( i++ ) до 1  с помощью оператора приращения.

 

После этого условие ( i <= 4 ) будет оценено, и снова будет выполнен блок операторов, если определенное условие возвращает true , в противном случае цикл завершится.

 

Когда мы выполним приведенную выше программу Visual Basic, мы получим результат, как показано ниже.

 

 

Если вы наблюдаете приведенный выше результат, цикл Do-While выполняется до тех пор, пока не будет соответствовать заданному условию ( i <= 4 ). Выполнение программы выходило из цикла всякий раз, когда определенное условие возвращало false .

Visual Basic Вложенный цикл Do-While

В Visual Basic мы можем использовать один цикл Do-While внутри другого цикла Do-While для реализации приложения в соответствии с нашими требованиями.

 

Ниже приведен пример реализации вложенного цикла Do-While на языке программирования Visual Basic.

 

Модуль Module1
  Sub Main()
    Dim i As Integer = 1
    Do
      Console. WriteLine(«i value: {0}», i)
      i += 1
      Dim j As Integer = 1
      Do
        Console.WriteLine(«j value: {0}», j)
        j += 1
      Цикл, пока j < 2
    Цикл, пока i < 4
    Console.WriteLine(«Нажмите клавишу Enter для выхода..»)
    Console.ReadLine()
  End Sub
End Module

Если вы наблюдаете приведенный выше пример, мы использовали один цикл Do-While внутри другого цикла Do-While для реализации вложенной функциональности цикла do-while нашего приложения на основе наши требования.

 

Когда мы выполним приведенную выше программу Visual Basic, мы получим результат, как показано ниже.

 

 

Если вы наблюдаете приведенный выше результат, оба цикла do-while были выполнены и возвращены в соответствии с нашими требованиями.

Цикл Do-While в Visual Basic с оператором выхода

В Visual Basic мы можем немедленно выйти или прекратить выполнение цикла Do-While , используя ключевое слово Exit .