петли и циклы вложение и выход из них
Участников: 4
Страница 1 из 1
петли и циклы вложение и выход из них
Циклы это контейнер содержащий инструкции, которые могут повторяться.
Их ещё называют петлями.
У каждого цикла есть точка входа и условие выхода.
Возможно сделать петлю без условия выхода, но это приведёт к зависанию и не имеет смысла.
В FreeBasic реализовано несколько различных конструкций, которые удобны для различных ситуаций.
Они подробно рассмотрены в соответствующих главах
петля do ... loop
for ... next
Конечно можно использовать оператор goto но это категорически не рекомендуеться.
Согласно идеологии структурного программирования, разрыв или принудительный выход из петли запрещён. Цикл должен повторяться, пока верно условие.
Условие для петель задаёться ключевым словом while, а для циклов его конечным значением. Что также было разобрано в соответствующих главах.
Вы должны строить ваш код, так чтобы он был нагляден. А разрыв неоговоренный условием может быть неочевидным.
Вложение циклов и петель
Как вы уже поняли, в нутри петли или цикла может быть любой код. Может быть одна строка или несколько. Может быть даже другой цикл или петля. Но в случае со вложенными циклами нужно быть аккуратнее, цикл должен быть именно вложен, как матрёшка один внутри другого.
И так далее.
Когда вы разрываете петлю, с помощью exit do или exit for, то разрываеться именно внутренняя петля, внешняя всё ещё замкнута.
Чтобы разорвать сразу несколько петель можно перечислить их через запятую, ничего не пропуская, в обратном порядке.
Аналогично и с петлями do ... loop.
Стоит заметить, что если вы разрываете петлю находясь в цикле, то цикл будет также разорван.
Программа выведет
Оператор возврата из функции return так же разрывает цикл. Его использование считаеться более корректным чем операторы разрыва цикла exit for или петли exit do
Их ещё называют петлями.
У каждого цикла есть точка входа и условие выхода.
Возможно сделать петлю без условия выхода, но это приведёт к зависанию и не имеет смысла.
В FreeBasic реализовано несколько различных конструкций, которые удобны для различных ситуаций.
Они подробно рассмотрены в соответствующих главах
петля do ... loop
for ... next
Конечно можно использовать оператор goto но это категорически не рекомендуеться.
Согласно идеологии структурного программирования, разрыв или принудительный выход из петли запрещён. Цикл должен повторяться, пока верно условие.
Условие для петель задаёться ключевым словом while, а для циклов его конечным значением. Что также было разобрано в соответствующих главах.
Вы должны строить ваш код, так чтобы он был нагляден. А разрыв неоговоренный условием может быть неочевидным.
Вложение циклов и петель
Как вы уже поняли, в нутри петли или цикла может быть любой код. Может быть одна строка или несколько. Может быть даже другой цикл или петля. Но в случае со вложенными циклами нужно быть аккуратнее, цикл должен быть именно вложен, как матрёшка один внутри другого.
- Код:
dim i as integer
dim k as integer
' открываем цикл для i
for i = 0 to 3
print "begin " & i
' открываем цикл для k
for k = i to 3
print k
' циклы закрываються в обратном открытию порядке
' сначало k
next k
' потом i
next i
sleep
begin 0
0
1
2
3
begin 1
1
2
3
...
И так далее.
Когда вы разрываете петлю, с помощью exit do или exit for, то разрываеться именно внутренняя петля, внешняя всё ещё замкнута.
Чтобы разорвать сразу несколько петель можно перечислить их через запятую, ничего не пропуская, в обратном порядке.
- Код:
dim c as integer
dim i as integer
dim k as integer
for c = 0 to 9
for i = 0 to 9
for k = 0 to 9
exit for, for ' разрываем только циклы i, k
next k
next i
next c
Аналогично и с петлями do ... loop.
Стоит заметить, что если вы разрываете петлю находясь в цикле, то цикл будет также разорван.
- Код:
dim i as integer
print "begin"
' начало петли
do
' начало цикла
for i = 1 to 9
if i = 4 then
' разрываем петлю
exit do
end if
print i
next
loop
' конец петли
print "end"
Программа выведет
begin
1
2
3
end
Оператор возврата из функции return так же разрывает цикл. Его использование считаеться более корректным чем операторы разрыва цикла exit for или петли exit do
- Код:
function foot( byVal s as string ) as integer
' счётчик пробелов
dim a as integer = 0
' переменная цикла
dim i as integer
for i = 1 to len(s)
' если пробел, то увеличиваем счётчик
if mid(s, i, 1) = " " then
a += 1
end if
' если символ конца строки то заканчиваем ссканирование
if mid(s, i, 1) = chr(13) then
return a
end if
next
' функция возвращает число встречанных в строке пробелов
return a
end function
Последний раз редактировалось: Eric-S (Ср Авг 19, 2009 11:44 am), всего редактировалось 3 раз(а)
Re: петли и циклы вложение и выход из них
Кстати, может кто знает. Иногда нужно разорвать сразу несколько петель, как это правильно делать?
Например если у меня два вложенных цикла, то я заключаю их в петлю и разрываю именно её.
В C у break можно указать метку, а блок так же пометить, тогда можно разрывать сколько угодно петель.
В бэйсике можно конечно воспользоваться GoTo ... но может есть другой, более правильный вариант?
Например если у меня два вложенных цикла, то я заключаю их в петлю и разрываю именно её.
- Код:
do
for i ..
for k ...
exit do
next
next
loop while 0
В C у break можно указать метку, а блок так же пометить, тогда можно разрывать сколько угодно петель.
В бэйсике можно конечно воспользоваться GoTo ... но может есть другой, более правильный вариант?
Re: петли и циклы вложение и выход из них
- Код:
dim as integer i, j
for i=1 to 5
for j=1 to 5
print i, j
exit for, for
next j
next i
print "end"
sleep
Re: петли и циклы вложение и выход из них
Нифига себе!
А можно так?
exit for, do, for?
Или это можно сократить до
exit do, for
А можно так?
exit for, do, for?
Или это можно сократить до
exit do, for
Re: петли и циклы вложение и выход из них
нет, начиная от внутриннего цикла надо перечислять все попорядку
Re: петли и циклы вложение и выход из них
Считаю, что следует упомянуть в главе о том, что с точки зрения идеологии структурного программирования, все эти exit, goto и явное изменение счётчика в циклах for, ведущие к досрочному выходу за пределы цикла, являются крайне нежелательными
justar- Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 50
Откуда : Кишинёв, Республика Молдоа
Re: петли и циклы вложение и выход из них
Ещё бы знать, в чём заключаеться энта идеология...
Ладно, пойду по гуглю.
И если досрочный выход запрещаеться, то как тогда быть?
Вот например задачка, найти фрагмент подстроки, типа функция InStr.
Как правильно поступать? Имхо только рвать цикл или же писать прогу без циклов. Могу предложить например рекурсивный вызов сравнения, кода не приведу, т.к. громоздко выйдет.
Ладно, пойду по гуглю.
И если досрочный выход запрещаеться, то как тогда быть?
Вот например задачка, найти фрагмент подстроки, типа функция InStr.
- Код:
function InStr( byVal s as string, byVal f as string ) as integer
dim p as integer
dim l as integer = len(f)
function = 0
for p = 1 to len(s)
if mid(s, p, l) = f then
function = p
exit for
end if
next
end function
Как правильно поступать? Имхо только рвать цикл или же писать прогу без циклов. Могу предложить например рекурсивный вызов сравнения, кода не приведу, т.к. громоздко выйдет.
Re: петли и циклы вложение и выход из них
Вот к чему приводят, казалось бы, ерундовые придирки.
Прочитал весьма интересную статью, я конечно это и раньше знал, но освежить память было не вредно.
структурное программирование
Явно оператор exit не противоречит иделологии. Хотя...
А вот выставлять значение, которое приведёт к окончанию цикла, как раз таки можно. Но это не так наглядно и явно как exit.
Прочитал весьма интересную статью, я конечно это и раньше знал, но освежить память было не вредно.
структурное программирование
Явно оператор exit не противоречит иделологии. Хотя...
Отсюда следует, что разрывать его нельзя.
цикл должен выполняться, пока условие верно.
А вот выставлять значение, которое приведёт к окончанию цикла, как раз таки можно. Но это не так наглядно и явно как exit.
Re: петли и циклы вложение и выход из них
Вместо оператора Exit желательно использовать Return, как в предыдущем примере
- Код:
function InStr( byVal s as string, byVal f as string ) as integer
dim p as integer = -1
dim l as integer = len(f)
function = 0
for p = 1 to len(s)
if mid(s, p, l) = f then
' Возвращааем позицию в строке
Return p
end if
next
end function
Re: петли и циклы вложение и выход из них
В первом варианте, я именно так и написал, а потом исправил на тот который запостил.
Исправил, чтобы спецально подчеркнуть необходимость разрыва цикла.
А return всё равно же разрывает, не противоречит ли это идеологии?
Исправил, чтобы спецально подчеркнуть необходимость разрыва цикла.
А return всё равно же разрывает, не противоречит ли это идеологии?
Re: петли и циклы вложение и выход из них
Eric-S пишет:
И если досрочный выход запрещаеться, то как тогда быть?
Он не то, что бы запрещается, а именно нежелателе - так как использование его делает программы менее понятной и таит в себе сложно отлавливаемые ошибки. Но если иначе ни как, то, конечно, можно применять - для того эти команды в языках и сохраняют.
Замени цикл for на цикл while - и всего делов то ;-) Алгоритмически это будет звучать: "перебираем, пока не нашли" - а как нашли, так и цикл сам по себе закончился.
Вот например задачка, найти фрагмент подстроки, типа функция InStr.
Долго перебирали, и наконец фрагменты совпали. Ну мы цикл рвём, нафиг нам дальше перебирать?
Как правильно поступать?
justar- Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 50
Откуда : Кишинёв, Республика Молдоа
Re: петли и циклы вложение и выход из них
О, как! Что значит искусство дипломатии! Уважаю!
Сам люблю с языком по прикалываться (естественным тоже), всякие вывернутые фразочки составить.
Но ещё до высшего пилотажа не дошол. Учиться и ещё раз учиться. Пример ясно показал, что ничего невозможного нет, а бэйсик очень даже гибок.
Сам люблю с языком по прикалываться (естественным тоже), всякие вывернутые фразочки составить.
Но ещё до высшего пилотажа не дошол. Учиться и ещё раз учиться. Пример ясно показал, что ничего невозможного нет, а бэйсик очень даже гибок.
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения