петля do ... loop
Участников: 3
Страница 1 из 1
петля do ... loop
Что же такое конструкция
Это петля. Или проще говоря повторение блока инструкций, заключённых в неё.
Если вспомнить устаревший оператор goto, то петлю можно оформить как
Но петля не нуждается в метках. И её конструкция более понятна и удобна
для использования, чем запутанные переходы оператором goto.
Если написать
То экран заполнится строчками
И эта радость будет продолжатся, пока в принудительном порядке программа не будет прибита.
Из петли можно выйти задав условия выхода с помощью ключевого слова union или продолжать пока условие заданное ключевым словом while истенно.
И пока Условие верно, петля будет выполнятся.
Если же условие, станет ложным, то повторение прекратится.
В случае, если условие изначально будет ложным, то блок вовсе не будет выполнен.
Выведет
Если условие задано в конце петли
То блок инструкций будет выполнен как минимум один раз.
Соответственно, если условие проверяется в начале, то это означает, что блок будет выполнен, только при истенном условии.
А если условие проверяется в конце, то выполнение блока начнётся с начала, только если условие будет истенным.
На экране выведет
Повторюсь. Условие после слова while задаёт когда петлю нужно замкнуть. Если же условие ложно, то петля разрываеться.
Обратное действие даёт использование until. Петля замкнута пока условие ложно, но истина разрывает петлю.
возьмем простой пример с while, и потом такой же с until.
пример с until
Заметили разницу?
В первом случае мы повторяем петлю, пока нажимаються любые клавиши кроме esc. А во втором мы петлю разрываем, когда нажимаеться клавиша esc[/i].
Петли используются при ожидании каких-то событий.
Например при чтении файла, читаем, пока не достигнем конца файла
В данном случае функция eof() возвращает истину, только если был достигнут конец файла.
А значит условие будет верно пока не конец файла #1.
Также петли используются для приёма команд от клавиатуры.
Пример, выхода из петли, по клавише [b]esc, был продимонстрирован выше.
Здесь функция inkey() возвращает код клавиши, которая нажата в данный момент. И если он не совпадает с символом esc, то условие верно.
Петли можно использовать и в других ситуациях. Но обязательно нужно задавать условие выхода. Иначе это может привести к зависанию программы.
Петлю можно разорвать изнутри, например оператором return или подобными, выйдя из функции.
Также для выхода из петли можно использовать оператор exit do.
Оператор continue do
переходит к началу петли do ... loop
пример. программа выводит только нечетные числа
не самый удачный пример, но все-же он показывает, как можно по условию переходить к началу петли. если бы мы не переходили к началу петли, то у нас слово "ok", отображалось бы каждый цикл петли. нам же надо, чтоб оно отображалось, в случае нечетного числа.
В некоторых случаях, конструкцию do ... loop удобно использовать в не совсем обычных ситуациях. Например при множественной проверке, когда if ... then и
select case уже бессильны или неудобны.
Этакий анализ можно продолжать ещё долго. Например подсчитав число символов или слов.
Или сделав проверку на ключевые слова.
Но пример показывает, что можно легко обойтись без нагромождений условных блоков, ограничившись одной лишь разорванной петлёй.
конструкция while ... wend
синтакс:
while выражение
...
wend
повсей видимости, все это оставлено для совместимости, так как следующие два примера будут работать одинаково.
второй вариант выглядит короче, да и похож на структуру других языков. если вы будете использовать while ... wend, вам несоставит особого труда понять конструкцию
while ... wend в других языках.
в языке си, заместо wend идет }, а начинается блок {.
Так же как и в конструкции do ... loop, здесь есть такие операторы как:
continue while
exit while
- Код:
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 "для выхода из программы, нажмите клавишу <esc>"
do
sleep 30
' когда будет нажат эскейп, то процедура будет завершена
if inkey = chr(27) then
exit sub
end if
loop
end sub
Также для выхода из петли можно использовать оператор exit do.
- Код:
print "для выхода из программы, нажмите клавишу <esc>"
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 раз(а)
Re: петля do ... loop
прикольно, пробую пасиб!
Kliment- Сообщения : 23
Дата регистрации : 2009-08-05
Возраст : 40
Re: петля do ... loop
Это не "прикольно", а это основы.
Был уверен, что про петли уже писал.
Но видемо склероз побил сектора.
Вы мне напоминайте, под настроение может ещё чего написакаю.
Был уверен, что про петли уже писал.
Но видемо склероз побил сектора.
Вы мне напоминайте, под настроение может ещё чего написакаю.
Re: петля do ... loop
еще в конструкции
do
..
loop
есть ключевое слово until
пример:
do until выражение
...
loop
или
do
...
loop until выражение
что такое until? даже как-то незнаю как обозвать. короче петля идет до выполнения условия.
возьмем простой пример с while, и потом такой-же с until.
пример с until
короче по русски, until- это while наоборот.
еще примерчик, как различаются while и until в конструкции do ... loop
не рекомендуется выходить из петель по условиям типа:
if a = chr(27) then exit do. если конечно для этого требуется специальный случай.
просто так было сделано для примера, чтоб вы могли понять различие while и until.
правильней будет так
loop until a = chr(27)
continue do
переходит к началу петли do ... loop
пример. программа выводит только нечетные числа
не самый удачный пример, но все-же он показывает, как можно по условию переходить к началу петли. если бы мы не переходили к началу петли, то у нас слово "ok", отображалось бы каждый цикл петли. нам же надо, чтоб оно отображалось, в случае нечетного числа.
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
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: петля do ... loop
конструкция while ... wend
синтакс:
while выражение
...
wend
повсей видимости, все это оставлено для совместимости, так как следующие два примера будут работать одинаково.
второй вариант выглядит короче, да и похож на структуру других языков. если вы будете использовать while ... wend, вам несоставит особого труда понять конструкцию while ... wend в других языках.
в языке си, заместо wend идет }, а начинается блок {.
Так же как и в конструкции do ... loop, здесь есть такие операторы как:
continue while
exit while
синтакс:
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
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: петля do ... loop
Ещё же вроде есть обратная, когда, условие в конце.
Но по мне так do ... loop наиболее удобная конструкция.
И даже в C++ синтаксис петель не очень удачный.
Если
Ещё прикольно, то обратная ей, совсем изврат.
С этой стороны синтаксис бэйсика более удобен и нагляден.
Но по мне так do ... loop наиболее удобная конструкция.
И даже в C++ синтаксис петель не очень удачный.
Если
- Код:
while( expr )
{...
}
Ещё прикольно, то обратная ей, совсем изврат.
С этой стороны синтаксис бэйсика более удобен и нагляден.
Re: петля do ... loop
в мануале не написано. помоему со случаем while ... wend, можно проверять только вначале.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: петля do ... loop
Отредактировал главу, дополнив её примерами от Электрика.
Надеюсь ты не возражаешь?
Надеюсь ты не возражаешь?
Re: петля do ... loop
да нет, не возражаю. пусть народ прикалывается.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: петля do ... loop
Ах ты зараза! Ах ты старый алкашуга! Значит "пусть прикалываеться"!
Я тут пишу-переписываю, а он "пусть прикалываеться"!
Я вот твоей жене всё раскажу!.. Как ты на до мной издеваешься.
Я тут пишу-переписываю, а он "пусть прикалываеться"!
Я вот твоей жене всё раскажу!.. Как ты на до мной издеваешься.
Re: петля do ... loop
гыыыыы! надо же поиздеваться. а ведь для начинающего, это действительно прикол. народ пишет простую прогу, и ему прикольно, мол вот как я уже и с do, и с while разобрался.
я сам себя помню, когда написал простую програмку типа, бегущих чисел на экране, было мол круто!
программирование штука серьезная, но без приколов, извращений, тонкости труднее понять.
фантазируйте, пишите десять раз Hello world, когда придет время, научитесь и серьезные проги писать. за несколько месяцев, невозможно наработать методы, да и язык полностью не выучишь.
сколько мы тут на форуме долбаем FreeBasic, а ведь так и до конца не знаем всех его тонкостей.
есть конечноже супер крутые программеры, которые могут за два дня выучить любой язык программирования, но это дар.
я сам себя помню, когда написал простую програмку типа, бегущих чисел на экране, было мол круто!
- Код:
dim a as integer
for a = 1 to 4000
print a
next
программирование штука серьезная, но без приколов, извращений, тонкости труднее понять.
фантазируйте, пишите десять раз Hello world, когда придет время, научитесь и серьезные проги писать. за несколько месяцев, невозможно наработать методы, да и язык полностью не выучишь.
сколько мы тут на форуме долбаем FreeBasic, а ведь так и до конца не знаем всех его тонкостей.
есть конечноже супер крутые программеры, которые могут за два дня выучить любой язык программирования, но это дар.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: петля do ... loop
Согласен.
Кажеться, что уже знаю язык в доль и поперёк, но хлоп и чего-нибудь новенькое находиться.
А в другой момент, количество переходит в качество.
Переосмысляешь и в какой-то момент начинаешь писать совсем по другому. Используя новые средства. Или, что ещё забавнее, старые но по новому.
Я как ещё из qbasic привык писать в файлах
Так так и буду писать. Привычка - страшная сила!
хотя ведь здесь лучше
Ой... Я помню, как веселился набивая свои первые программулины. Ещё долго тупил как их нужно компилить.
А я ведь тогда так и не разобрался с turbo basic. Забил на него. Всё qbasic 4.5 мучал, а потом и visual basic for dos version 1.0
В прочем было время, когда я на бэйсик вообще забил, разочаровавшись в нём.
А вот познакомившись с freebasic, опять вернулся.
Кажеться, что уже знаю язык в доль и поперёк, но хлоп и чего-нибудь новенькое находиться.
А в другой момент, количество переходит в качество.
Переосмысляешь и в какой-то момент начинаешь писать совсем по другому. Используя новые средства. Или, что ещё забавнее, старые но по новому.
Я как ещё из 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, опять вернулся.
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения