Рассмотрим задачу: написать программу, которая будет делить введенное пользователем положительное число на 3(нацело) и выводить результаты деления до тех пор, пока результат не станет меньше трех. Очевидно, что тут необходимо использовать цикл. Также очевидно, что цикл со счетчиком тут не подойдет: мы не знаем, что за число введет пользователь, а, следовательно, количество шагов нам неизвестно. Что же делать? На помощь придет цикл с условием.

Цикл с условием

Цикл с условием используется в тех случаях, когда мы не знаем, какое количество повторений нам необходимо сделать, зато знаем, при каких условиях мы должны закончить повторения. В языке Basic существует 2 вида цикла с условием:
  1. Цикл с условием While
  2. Цикл с условием Until
Небольшая сложность понимания различий между этими циклами заключается в том, что на русский язык оба эти слова переводятся одинаково: "пока", или "до тех пор, пока". В чем же разница между ними?
Цикл While выполняется до тех пор, пока указанное в нем условие истинно. Когда указанное условие становится ложным - цикл завершается.
Цикл Until выполняется до тех пор, пока указанное в нем условие ложно. Когда указанное условие становится истинным - цикл завершается.
Примечание: можно сказать иначе: В цикле while мы указываем условие работы цикла, а в цикле until - условие завершения работы цикла.
В свою очередь каждый из этих циклов может быть записан в двух формах: цикл с предусловием и цикл с послеусловием. Разница между этими двумя формами записи заключается в следующем: цикл с послеусловием ВСЕГДА выполнится хотя бы один раз, вне зависимости от истинности или ложности условия. Цикл с предусловием может не выполниться ни разу, если условие ложно (в случае while) или истинно (until).

Циклы с предусловием

Форма записи обоих циклов не сильно отличается:

Цикл While

Do while условие
Тело цикла
Loop

Цикл Until

Do until условие
Тело цикла
Loop
Разберем более подробно:
Первая строка определяет условие выполнения цикла. В случае с циклом while условие должно быть истинно, чтобы цикл выполнялся, в случае с циклом until - ложно. Например:
Do while x>3
Этот цикл будет выполняться до тех пор, пока переменная х будет больше 3. Если она станет меньше или равна трем, то цикл завершится.
Do until x<=3
Этот цикл также будет выполняться до тех пор, пока переменная х будет больше 3. Т.е. эти циклы работают абсолютно одинаково.
Вторая строка - тело цикла. Тело цикла - одна или несколько команд, которые будут повторяться ровно столько раз, сколько будет определено первой строкой.
Третья строка - конец цикла. Дословно это выглядит примерно как "мы выполнили что просили, пора проверить соответствие условию еще раз".

Пример

Вернемся к нашей задаче: написать программу, которая будет делить введенное пользователем положительное число на 3(нацело) и выводить результаты деления до тех пор, пока результат не станет меньше трех. Очевидно, что тут необходимо использовать цикл. Также очевидно, что цикл со счетчиком тут не подойдет: мы не знаем, что за число введет пользователь, а, следовательно, количество шагов нам неизвестно. Что же делать? На помощь придет цикл с условием. Составим эту программу с помощью цикла while:
dim a as long
Объявим переменную, которую будет вводить пользователь. Эта переменная может принимать целочисленные значения, согласно условию задачи.
input a
Призовем архангела справедливости Тираэля (Вы действительно думали, что я буду пояснять значение этой команды в 100001й раз?)
do while a>3
Формируем условие цикла. Согласно условию задачи, программа должна выполняться, пока введенное число больше 3.
print a
Согласно условию задачи, программа должна выводить все результаты, пока они больше 3.
a=a\3
С помощью целочисленного деления (Напоминаю: "/" - обычное деление, "\" - целочисленное) и операции переприсваивания поделим число на 3.
Loop
Конец цикла.

Ту же самую программу можно составить и с помощью цикла until:
dim a as long
Объявим переменную, которую будет вводить пользователь. Эта переменная может принимать целочисленные значения, согласно условию задачи.
input a
Еще один призыв архангела
do until a<=3
Формируем условие цикла. Согласно условию задачи, программа должна выполняться, пока введенное число больше 3, следовательно - когда введенное число станет меньше или равно 3 - цикл завершится.
print a
Согласно условию задачи, программа должна выводить все результаты, пока они больше 3.
a=a\3
С помощью целочисленного деления (Напоминаю: "/" - обычное деление, "\" - целочисленное) и операции переприсваивания поделим число на 3.
Loop
Конец цикла.

Это интересно:

В некоторых версиях языка Basic существует альтернативный способ записи цикла с предусловием while:
while условие
Тело цикла
wend

В этом случае наша программа будет выглядеть следующим образом:
dim a as long
Объявим переменную, которую будет вводить пользователь. Эта переменная может принимать целочисленные значения, согласно условию задачи.
input a
Призовем архангела справедливости Тираэля (Вы действительно думали, что я буду пояснять значение этой команды в 100001й раз?)
while a>3
Формируем условие цикла. Согласно условию задачи, программа должна выполняться, пока введенное число больше 3.
print a
Согласно условию задачи, программа должна выводить все результаты, пока они больше 3.
a=a\3
С помощью целочисленного деления (Напоминаю: "/" - обычное деление, "\" - целочисленное) и операции переприсваивания поделим число на 3.
wend
Конец цикла.

Циклы с послеусловием

Цикл с послеусловием отличается от цикла с предусловием тем, что цикл сначала выполняется, а затем проверяет соответствие условию. Таким образом, цикл с послеусловием всегда выполнится хотя бы один раз. Форма записи циклов while и until также похожа:

Цикл While

Do
Тело цикла
Loop while условие

Цикл Until

Do
Тело цикла
Loop until условие
Как мы можем видеть, проверка на соответствие условию происходит после выполнения

Пример 2

Написать программу, которая будет делить введенное пользователем целое положительное число на 3(нацело) и выводить результаты деления до тех пор, пока результат не станет меньше трех. Дополнительное условие: число, введенное пользователем всегда больше 3. Поскольку в условии прямо указано, что пользователь должен вводить число, большее 3, можно с уверенностью утверждать, что как минимум 1 раз делить придется. Следовательно, можно использовать цикл с послеусловием while:
dim a as long
Объявим переменную, которую будет вводить пользователь. Эта переменная может принимать целочисленные значения, согласно условию задачи.
input a
Призовем архангела справедливости Тираэля (Вы действительно думали, что я буду пояснять значение этой команды в 100001й раз?)
do
Нам не нужно проверять истинность условия сейчас, т.к. пользователь не мог ввести число, меньшее 3.
print a
Согласно условию задачи, программа должна выводить все результаты, пока они больше 3.
a=a\3
С помощью целочисленного деления (Напоминаю: "/" - обычное деление, "\" - целочисленное) и операции переприсваивания поделим число на 3.
Loop while a>3
Делай снова пока а>3. Если же это условие не выполнится - цикл завершит свою работу.

Ту же самую программу можно составить и с помощью цикла until:
dim a as long
Объявим переменную, которую будет вводить пользователь. Эта переменная может принимать целочисленные значения, согласно условию задачи.
input a
Еще один призыв архангела
do
Нам не нужно проверять истинность условия сейчас, т.к. пользователь не мог ввести число, меньшее 3.
print a
Согласно условию задачи, программа должна выводить все результаты, пока они больше 3.
a=a\3
С помощью целочисленного деления (Напоминаю: "/" - обычное деление, "\" - целочисленное) и операции переприсваивания поделим число на 3.
Loop until a<=3
Заверши, если а<=3. Иначе - продолжай.

Принудительный выход из цикла

Для принудительного выхода из цикла можно использовать команду Exit Do, например:
Do while x<>50 if x=25000000 then exit Do
Loop

Задание 1. Определить, какое количество повторений совершит цикл:

x=1749375
do while x>0
x=x\10
loop
Рассмотрим работу цикла пошагово. Изначально переменная х равна 1749375, т.е. больше нуля. Следовательно, цикл будет выполнятся.
После первого шага переменная х будет равна 1749375\10, т.е. x=174937. Это число больше нуля, значит - цикл запустится во второй раз.
После второго шага переменная х будет равна 174937\10, т.е. x=17493. Это число больше нуля, значит - цикл запустится в третий раз.
После третьего шага переменная х будет равна 17493\10, т.е. x=1749. Это число больше нуля, значит - цикл запустится в четвертый раз.
После четвертогого шага переменная х будет равна 1749\10, т.е. x=174. Это число больше нуля, значит - цикл запустится в пятый раз.
После пятого шага переменная х будет равна 174\10, т.е. x=17. Это число больше нуля, значит - цикл запустится в шестой раз.
После шестогого шага переменная х будет равна 17\10, т.е. x=1. Это число больше нуля, значит - цикл запустится в седьмой раз.
После седьмого шага переменная х будет равна 1\10, т.е. x=0(да-да, если разделить 1 на 10 нацело, то получим 0 целых и 1 в остатке). Это число не больше нуля, значит - цикл больше не запустится.
Ответ: цикл выполнится 7 раз

Задание 2. Изменить представленную программу таким образом, чтобы в ней использовался цикл until:

x=1749375
do while x>0
x=x\10
loop
x=1749375
do until x<=0
Примечание: Согласно условию задачи, программа работает пока х>0. Следовательно, она завершит работу когда х станет меньше или равно 0.
x=x\10
loop

Задание 3. Изменить представленную программу таким образом, чтобы в ней использовался другой способ записи цикла while (while...wend):

x=1749375
do while x>0
x=x\10
loop
x=1749375
while x>0
x=x\10
wend

Задание 4. Написать программу, используя цикл while:

Программа загадала число 17. Пользователь пытается угадать это число, вводя предположения. Программа получает число от пользователя, а затем сообщает, "число больше задуманного" или "число меньше задуманного". В случае, если пользователь назвал правильное число, программа выводит сообщение "правильно" и завершает работу. Примечание: Пользователь знает, что загадано целое число.
Dim y as long
Объявляем переменную.
y=0
Изначально присвоим ей значение 0. Вообще, нет никакой разницы, какое значение ей присваивать, главное, чтобы не 17, иначе цикл не запустится
do while y<>17
Перевод: делай пока икс не равен 17.
input y
Опять эта страшная команда...
if y>17 then print "Введенное число больше задуманного"
Если пользователь ввел число, большее, чем задуманное, то...
if y<17 then print "Введенное число меньше задуманного"
Если пользователь ввел число, меньшее, чем задуманное, то...
Loop
Конец цикла
print "Вы угадали, возьмите с полки пирожок."
очередной призыв ангела

Задание 5. Написать программу, используя цикл until:

Программа загадала число 17. Пользователь пытается угадать это число, вводя предположения. Программа получает число от пользователя, а затем сообщает, "число больше задуманного" или "число меньше задуманного". В случае, если пользователь назвал правильное число, программа выводит сообщение "правильно" и завершает работу. Примечание: Пользователь знает, что загадано целое число.
Dim y as long
Объявляем переменную.
y=0
Изначально присвоим ей значение 0. Вообще, нет никакой разницы, какое значение ей присваивать, главное, чтобы не 17, иначе цикл не запустится
do until y=17
Перевод: делай пока икс не равен 17.
input y
Опять эта страшная команда...
if y>17 then print "Введенное число больше задуманного"
Если пользователь ввел число, большее, чем задуманное, то...
if y<17 then print "Введенное число меньше задуманного"
Если пользователь ввел число, меньшее, чем задуманное, то...
Loop
Конец цикла
print "Вы угадали, возьмите с полки пирожок."
очередной призыв ангела

Задание 6. Вася пытался написать программу из задания 4, но совершил ошибку. Найдите эту ошибку:

Dim y as long
y=0
do while y<>17
input y
if y>17 then print "Введенное число больше задуманного"
else
print "Введенное число меньше задуманного"
End if
Loop
print "Вы угадали, возьмите с полки пирожок."
Согласно программе, фраза "введенное число меньше задуманное" выполняется в случае, если условие, написанное в конструкции if...then ложно. Условие звучит как y>17. Следовательно, серия команд после слова else выполнится, когда y не будет больше 17. Иными словами, y будет меньше или равно 17. Таким образом, когда пользователь введет правильное число, эта ветвь также сработает, т.к. 17 не больше 17. В результате чего, при вводе правильного числа пользователь будет получать сразу два сообщения: Сначала - "число меньше задуманного", затем - "вы угадали".