петля do ... loop

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

петля do ... loop

Сообщение  Eric-S в Вт Авг 11, 2009 10:52 pm

Что же такое конструкция
Код:

do
...
loop


Это петля. Или проще говоря повторение блока инструкций, заключённых в неё.

Если вспомнить устаревший оператор goto, то петлю можно оформить как

Код:

begin:
...
goto begin

Но петля не нуждается в метках. И её конструкция более понятна и удобна
для использования, чем запутанные переходы оператором goto.

Если написать

Код:

do
 print "xxx"
  loop

То экран заполнится строчками

xxx
xxx
xxx
xxx

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

Из петли можно выйти задав условия выхода с помощью ключевого слова union или продолжать пока условие заданное ключевым словом while истенно.

Код:

do while (условие)
...
loop


И пока Условие верно, петля будет выполнятся.
Если же условие, станет ложным, то повторение прекратится.
В случае, если условие изначально будет ложным, то блок вовсе не будет выполнен.


Код:

print "start"
do while 0
print "block"
loop
print "end"


Выведет


start
end


Если условие задано в конце петли


Код:

do
...
loop while (условие)


То блок инструкций будет выполнен как минимум один раз.

Соответственно, если условие проверяется в начале, то это означает, что блок будет выполнен, только при истенном условии.
А если условие проверяется в конце, то выполнение блока начнётся с начала, только если условие будет истенным.



Код:

print "start"
do
print "block"
loop while 0
print "end"

На экране выведет


start
block
end

Повторюсь. Условие после слова while задаёт когда петлю нужно замкнуть. Если же условие ложно, то петля разрываеться.

Обратное действие даёт использование until. Петля замкнута пока условие ложно, но истина разрывает петлю.

возьмем простой пример с while, и потом такой же с until.

Код:

dim a as string
print "нажмите esc, для выхода"
do
sleep 30
a=inkey
loop while a <> chr(27)

пример с until
Код:

dim a as string
print "нажмите esc, для выхода"
do
sleep 30
a = inkey
loop until a = chr(27)

Заметили разницу?
В первом случае мы повторяем петлю, пока нажимаються любые клавиши кроме esc. А во втором мы петлю разрываем, когда нажимаеться клавиша esc[/i].


Петли используются при ожидании каких-то событий.
Например при чтении файла, читаем, пока не достигнем конца файла

Код:

dim s as string
open "test.txt" for input as #1
do until eof(1)
line input #1, s
print s
loop
close #1


В данном случае функция eof() возвращает истину, только если был достигнут конец файла.
А значит условие будет верно пока не конец файла #1.

Также петли используются для приёма команд от клавиатуры.
Пример, выхода из петли, по клавише [b]esc
, был продимонстрирован выше.


Код:

dim a as string
do
sleep 30
a = inkey
locate 24, 1, 0
print left( _
"нажата клавиша '" & a & "'. С кодом #" & str(asc(a)) & "." & _
space(80), 80 );
loop while a <> chr(27)

Здесь функция inkey() возвращает код клавиши, которая нажата в данный момент. И если он не совпадает с символом esc, то условие верно.

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

Петлю можно разорвать изнутри, например оператором return или подобными, выйдя из функции.


Код:

sub pause()
print "для выхода из программы, нажмите клавишу &lt;esc&gt;"
do
sleep 30

' когда будет нажат эскейп, то процедура будет завершена
if inkey = chr(27) then
exit sub
end if
loop
end sub

Также для выхода из петли можно использовать оператор exit do.

Код:

print "для выхода из программы, нажмите клавишу &lt;esc&gt;"
do
sleep 30

' когда будет нажат эскейп, то петля будет разорвана
if inkey = chr(27) then
  exit do
end if
loop

Оператор continue do
переходит к началу петли do ... loop

пример. программа выводит только нечетные числа

Код:

dim counter as single = 0
do
counter = counter + 1
if (int(counter/2) +0.5)*2 = counter then
  print "no parity",counter
else
  continue do
end if
print "ok"
loop until counter = 20

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

В некоторых случаях, конструкцию do ... loop удобно использовать в не совсем обычных ситуациях. Например при множественной проверке, когда if ... then и
select case уже бессильны или неудобны.

Код:

' результат
dim result as integer = 0

' строка
dim str1 as string = "    Hello, world!    "

' сколько пробелов в начале строки
dim spc1 as integer = 0

do

  ' если строка короткая, то нет смысла её анализировать дальше
  if len(str1) < 2 then
  exit do
end if

  ' посчитаем сколько пробелов в начале строки
  for i = 1 to len(str1)
  if asc(str1, i) = 32 then
  spc1 += 1
  else
  exit for
  end if
next

' если вся строка состоит из пробелов, то нет смысла дальше анализировать её
if spc1 = len(str1) then
  q = 1
  exit do
end if

' проверим, не состоит ли строка из чёрточек
for i = 1 to len(str1)
if asc(str1, i) <> chr("-") then
  ' не все символы чорточки
  q = 2
  exit for
  end if
next

' если все символы оказались чорточками, то закончим анализ
if q = 0 then
q = 3
exit do
end if


' Обратите внимание, что обеспечен выход из петли!
q = 10
loop while 0

' код результата
print "result: "; result

Этакий анализ можно продолжать ещё долго. Например подсчитав число символов или слов.
Или сделав проверку на ключевые слова.
Но пример показывает, что можно легко обойтись без нагромождений условных блоков, ограничившись одной лишь разорванной петлёй.


конструкция while ... wend

синтакс:
while выражение
...
wend

повсей видимости, все это оставлено для совместимости, так как следующие два примера будут работать одинаково.

Код:

dim a as string
print "press esc, to quit"
do while a <> chr(27)
a=inkey
sleep 30
loop

Код:

dim a as string
print "press esc, to quit"
while a <> chr(27)
a=inkey
sleep 30
wend

второй вариант выглядит короче, да и похож на структуру других языков. если вы будете использовать while ... wend, вам несоставит особого труда понять конструкцию
while ... wend в других языках.
в языке си, заместо wend идет }, а начинается блок {.
Так же как и в конструкции do ... loop, здесь есть такие операторы как:
continue while
exit while


Последний раз редактировалось: Eric-S (Вт Авг 25, 2009 5:01 pm), всего редактировалось 3 раз(а)

Eric-S

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

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

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

Re: петля do ... loop

Сообщение  Kliment в Ср Авг 12, 2009 12:36 am

прикольно, пробую Very Happy пасиб!
avatar
Kliment

Сообщения : 23
Дата регистрации : 2009-08-05
Возраст : 33

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

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

Re: петля do ... loop

Сообщение  Eric-S в Ср Авг 12, 2009 10:05 am

Это не "прикольно", а это основы.
Был уверен, что про петли уже писал.
Но видемо склероз побил сектора.
Вы мне напоминайте, под настроение может ещё чего написакаю.

Eric-S

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

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

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

Re: петля do ... loop

Сообщение  electrik в Сб Авг 22, 2009 8:58 pm

еще в конструкции
do
..
loop
есть ключевое слово until
пример:
do until выражение
...
loop
или
do
...
loop until выражение

что такое until? даже как-то незнаю как обозвать. короче петля идет до выполнения условия.
возьмем простой пример с while, и потом такой-же с until.

Код:

dim a as string
print "press esc, to quit"
do while a <> chr(27)
a=inkey
sleep 30
loop

пример с until

Код:

dim a as string
do until a = chr(27)
a=inkey
sleep 30
loop

короче по русски, until- это while наоборот.
еще примерчик, как различаются while и until в конструкции do ... loop

Код:

dim a as string
do
a = inkey
if a = chr(27) then exit do
sleep 30
loop while 1

Код:

dim a as string
do
a = inkey
if a = chr(27) then exit do
sleep 30
loop until 0

не рекомендуется выходить из петель по условиям типа:
if a = chr(27) then exit do. если конечно для этого требуется специальный случай.
просто так было сделано для примера, чтоб вы могли понять различие while и until.
правильней будет так
loop until a = chr(27)

continue do
переходит к началу петли do ... loop

пример. программа выводит только нечетные числа

Код:

dim counter as single = 0
do
counter = counter + 1
if (int(counter/2) +0.5)*2 = counter then
print "no parity",counter
else
continue do
end if
print "ok"
loop until counter = 20
sleep

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

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

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

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

Re: петля do ... loop

Сообщение  Eric-S в Сб Авг 22, 2009 9:08 pm

Электрик, спасибо!
И ты ещё обещал с vent или как его там...

Eric-S

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

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

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

Re: петля do ... loop

Сообщение  electrik в Вс Авг 23, 2009 1:14 am

конструкция while ... wend

синтакс:
while выражение
...
wend

повсей видимости, все это оставлено для совместимости, так как следующие два примера будут работать одинаково.
Код:

dim a as string
print "press esc, to quit"
do while a <> chr(27)
a=inkey
sleep 30
loop

Код:

dim a as string
print "press esc, to quit"
while a <> chr(27)
a=inkey
sleep 30
wend

второй вариант выглядит короче, да и похож на структуру других языков. если вы будете использовать while ... wend, вам несоставит особого труда понять конструкцию while ... wend в других языках.
в языке си, заместо wend идет }, а начинается блок {.
Так же как и в конструкции do ... loop, здесь есть такие операторы как:
continue while
exit while

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

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

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

Re: петля do ... loop

Сообщение  Eric-S в Вс Авг 23, 2009 9:16 am

Ещё же вроде есть обратная, когда, условие в конце.

Но по мне так do ... loop наиболее удобная конструкция.
И даже в C++ синтаксис петель не очень удачный.

Если
Код:

while( expr )
{...
}

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

Eric-S

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

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

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

Re: петля do ... loop

Сообщение  electrik в Вс Авг 23, 2009 9:22 pm

в мануале не написано. помоему со случаем while ... wend, можно проверять только вначале.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

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

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

Re: петля do ... loop

Сообщение  Eric-S в Вс Авг 23, 2009 9:29 pm

Ну и фиг с ним тогда.

Eric-S

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

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

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

Re: петля do ... loop

Сообщение  Eric-S в Вт Авг 25, 2009 4:32 pm

Отредактировал главу, дополнив её примерами от Электрика.
Надеюсь ты не возражаешь?

Eric-S

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

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

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

Re: петля do ... loop

Сообщение  electrik в Ср Авг 26, 2009 11:54 am

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

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

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

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

Re: петля do ... loop

Сообщение  Eric-S в Ср Авг 26, 2009 1:36 pm

Ах ты зараза! Ах ты старый алкашуга! Значит "пусть прикалываеться"!
Я тут пишу-переписываю, а он "пусть прикалываеться"!
Я вот твоей жене всё раскажу!.. Как ты на до мной издеваешься.

Eric-S

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

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

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

Re: петля do ... loop

Сообщение  electrik в Ср Авг 26, 2009 3:40 pm

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

Код:

dim a as integer
for a = 1 to 4000
print a
next

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

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

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

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

Re: петля do ... loop

Сообщение  Eric-S в Ср Авг 26, 2009 8:48 pm

Согласен.
Кажеться, что уже знаю язык в доль и поперёк, но хлоп и чего-нибудь новенькое находиться.

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

Я как ещё из qbasic привык писать в файлах
Код:

dim ff1 as integer = freefile
open "test.txt" for input as #ff1
do while not eof(ff1)
line input #ff1, l
дloop
close ff1

Так так и буду писать. Привычка - страшная сила!
хотя ведь здесь лучше
Код:

do until eof(ff1)
короче, но... выглядит дико.

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

А я ведь тогда так и не разобрался с turbo basic. Забил на него. Всё qbasic 4.5 мучал, а потом и visual basic for dos version 1.0

В прочем было время, когда я на бэйсик вообще забил, разочаровавшись в нём.
А вот познакомившись с freebasic, опять вернулся.

Eric-S

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

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

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

Re: петля do ... loop

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


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


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

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


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