петли и циклы вложение и выход из них

Предыдущая тема Следующая тема Перейти вниз

петли и циклы вложение и выход из них

Сообщение  Eric-S в Чт Окт 09, 2008 4:32 am

Циклы это контейнер содержащий инструкции, которые могут повторяться.
Их ещё называют петлями.

У каждого цикла есть точка входа и условие выхода.

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

В 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 раз(а)

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: петли и циклы вложение и выход из них

Сообщение  Eric-S в Чт Окт 09, 2008 4:38 am

Кстати, может кто знает. Иногда нужно разорвать сразу несколько петель, как это правильно делать?

Например если у меня два вложенных цикла, то я заключаю их в петлю и разрываю именно её.
Код:

do
for i ..
for k ...
exit do
next
next
loop while 0

В C у break можно указать метку, а блок так же пометить, тогда можно разрывать сколько угодно петель.



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

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: петли и циклы вложение и выход из них

Сообщение  tux в Чт Окт 09, 2008 7:43 am

Код:
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
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: петли и циклы вложение и выход из них

Сообщение  Eric-S в Чт Окт 09, 2008 8:04 am

Нифига себе!
А можно так?
exit for, do, for?
Или это можно сократить до
exit do, for

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: петли и циклы вложение и выход из них

Сообщение  tux в Чт Окт 09, 2008 8:18 am

нет, начиная от внутриннего цикла надо перечислять все попорядку
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: петли и циклы вложение и выход из них

Сообщение  justar в Чт Окт 09, 2008 10:20 am

Считаю, что следует упомянуть в главе о том, что с точки зрения идеологии структурного программирования, все эти exit, goto и явное изменение счётчика в циклах for, ведущие к досрочному выходу за пределы цикла, являются крайне нежелательными

justar

Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 43
Откуда : Кишинёв, Республика Молдоа

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: петли и циклы вложение и выход из них

Сообщение  Eric-S в Чт Окт 09, 2008 11:11 am

Ещё бы знать, в чём заключаеться энта идеология...
Ладно, пойду по гуглю.

И если досрочный выход запрещаеться, то как тогда быть?

Вот например задачка, найти фрагмент подстроки, типа функция 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
Долго перебирали, и наконец фрагменты совпали. Ну мы цикл рвём, нафиг нам дальше перебирать?
Как правильно поступать? Имхо только рвать цикл или же писать прогу без циклов. Могу предложить например рекурсивный вызов сравнения, кода не приведу, т.к. громоздко выйдет.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: петли и циклы вложение и выход из них

Сообщение  Eric-S в Чт Окт 09, 2008 11:28 am

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


Явно оператор exit не противоречит иделологии. Хотя...

цикл должен выполняться, пока условие верно.
Отсюда следует, что разрывать его нельзя.

А вот выставлять значение, которое приведёт к окончанию цикла, как раз таки можно. Но это не так наглядно и явно как exit.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: петли и циклы вложение и выход из них

Сообщение  Замабувараев в Чт Окт 09, 2008 11:34 am

Вместо оператора 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
avatar
Замабувараев

Сообщения : 99
Дата регистрации : 2008-08-20
Возраст : 33
Откуда : Красноярск

Посмотреть профиль http://www.freebasic.su

Вернуться к началу Перейти вниз

Re: петли и циклы вложение и выход из них

Сообщение  Eric-S в Чт Окт 09, 2008 11:56 am

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

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: петли и циклы вложение и выход из них

Сообщение  Eric-S в Чт Окт 09, 2008 1:47 pm

Поправки в главу внесены. Чего ещё изволите покритиковать?

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: петли и циклы вложение и выход из них

Сообщение  justar в Чт Окт 09, 2008 1:47 pm

Eric-S пишет:
И если досрочный выход запрещаеться, то как тогда быть?

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


Вот например задачка, найти фрагмент подстроки, типа функция InStr.
Долго перебирали, и наконец фрагменты совпали. Ну мы цикл рвём, нафиг нам дальше перебирать?
Как правильно поступать?
Замени цикл for на цикл while - и всего делов то ;-) Алгоритмически это будет звучать: "перебираем, пока не нашли" - а как нашли, так и цикл сам по себе закончился.

justar

Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 43
Откуда : Кишинёв, Республика Молдоа

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: петли и циклы вложение и выход из них

Сообщение  Eric-S в Чт Окт 09, 2008 1:52 pm

О, как! Что значит искусство дипломатии! Уважаю!

Сам люблю с языком по прикалываться (естественным тоже), всякие вывернутые фразочки составить.
Но ещё до высшего пилотажа не дошол. Учиться и ещё раз учиться. Пример ясно показал, что ничего невозможного нет, а бэйсик очень даже гибок.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: петли и циклы вложение и выход из них

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения