![]() |
![]() |
|
Конструкция "Пока 1 = 1 Цикл " | ☑ | ||
---|---|---|---|---|
0
ice123
05.02.10
✎
16:12
|
Увидел подобную конструкцию в программном коде и задался вопросом, а для чего она используется?
Для чего организовывать подобный цикл? |
|||
1
ДенисЧ
05.02.10
✎
16:13
|
Для того, чтобы вычислять условие прерывания унутре цикла. Вообще - это частный случай goto, который многие ненавидят лютой ненавистью...
|
|||
2
ОбычныйЧеловек
05.02.10
✎
16:13
|
(0) внутри где то есть "прервать"...найди и поймешь для чего...
|
|||
3
Скользящий
05.02.10
✎
16:13
|
цикл с условием выхода.
|
|||
4
План счетов
05.02.10
✎
16:13
|
Видимо когда нет возможности посчитать кол-во циклов
|
|||
5
XLife
05.02.10
✎
16:13
|
простой бесконечный цикл, выход задаешь внутри
|
|||
6
ice123
05.02.10
✎
16:17
|
Спасибо! всем!!! посмотрю ща....
|
|||
7
Скользящий
05.02.10
✎
16:17
|
однако. 5 ответов в течение одной минуты. Рекорд для тематической ветки.
|
|||
8
zak555
05.02.10
✎
16:24
|
если много вариантов : 2=2, 3=3, "х"<>"й" ...
|
|||
9
Ненавижу 1С
гуру
05.02.10
✎
16:29
|
потому что в 1С (который я, конечно, ненавижу) нет цикла с постусловием:
do ... while |
|||
10
NcSteel
05.02.10
✎
16:34
|
(9) Пос условие можно эммулировать (даже нужно ) другим способом .
|
|||
11
Ненавижу 1С
гуру
05.02.10
✎
16:38
|
(10) можно, непонятно почему "даже нужно"
|
|||
12
NcSteel
05.02.10
✎
16:39
|
(11) Потому что не будет такой конструкции , которая может принести больше хлапот чем выгод.
|
|||
13
truba
05.02.10
✎
16:41
|
(12) ровно же столько сколько и конструкция
Пока Цикл КонецЦикла; А читаемость кода в некоторых случая растет в разы |
|||
14
nop
05.02.10
✎
16:44
|
(10) как ?
|
|||
15
NcSteel
05.02.10
✎
16:53
|
(14) Например так :
А = 10; Пока А<20 Цикл А = А+1; КонецЦикла; |
|||
16
zak555
05.02.10
✎
16:54
|
(14)
|
|||
17
фобка
05.02.10
✎
16:58
|
(15) ну как бэ..
For i = 10 To 19 Do EndDo; |
|||
18
truba
05.02.10
✎
16:59
|
ага, только А=10 может из нескольких десятков строк состоять (это в хорошем случае) и с точностью до запятой повторять А=А+1; очень удобно.
|
|||
19
NcSteel
05.02.10
✎
17:02
|
(17) Ты не в теме . Это всего лишь пример абстрактный.
(18) больше 10 строк обычно занашу в функцию , конечно не считая запросы. Так что такой пример будет выглядить так: А = 10; А = Функция(А); Пока А < 20 Цикл А = Функция(А); КонецЦикла; |
|||
20
фобка
05.02.10
✎
17:06
|
(19) А так?
For i = 10 To 19 Do i = Function(i); EndDo; |
|||
21
filh
05.02.10
✎
17:08
|
(20) твой код отработает 10 раз и усе...
|
|||
22
filh
05.02.10
✎
17:08
|
хотя менять переменную цикла внутри цикла...
|
|||
23
NcSteel
05.02.10
✎
17:11
|
(20) У тебя с воображением туго .
|
|||
24
H A D G E H O G s
05.02.10
✎
17:11
|
Нашли что обсудить.
|
|||
25
NcSteel
05.02.10
✎
17:11
|
(24) Не видишь я нашел гиперссылку "v7" .
|
|||
26
фобка
05.02.10
✎
17:12
|
(23) не жалуюсь ;)
|
|||
27
NcSteel
05.02.10
✎
17:13
|
(26) Имелось ввиду сама структура , а не реализация частной задачи , которая была взята только как абстрактный пример.
|
|||
28
фобка
05.02.10
✎
17:16
|
(27) понимаю, просто многие не любят оператор For To Do.. тема навеяла вот я и задумался
|
|||
29
truba
05.02.10
✎
17:22
|
(19) ну а какая разница? в чем выгода?
конструкция (16) вот оч. понятна для чтения и содержит в себе те же самые подводные камни, из цикла и там и там можно никогда не выйти. Какие еще камни возможны? |
|||
30
NcSteel
05.02.10
✎
18:00
|
(28) Я тоже не люблю , так как нет возможности указать шаг.
|
|||
31
zak555
05.02.10
✎
18:16
|
(28) почему не любят ?
|
|||
32
Ваше благородие
05.02.10
✎
18:22
|
Бу-га-га.
(16) Зачет! :) |
|||
33
DJ Anthon
06.02.10
✎
07:19
|
(8) лично мне больше нравится
Пока (2 * b) or not (2 * b) Цикл |
|||
34
1Сергей
06.02.10
✎
07:26
|
(33) Семерка так не работает
|
|||
35
DJ Anthon
06.02.10
✎
07:36
|
(34) уахххахахахахаааааа!
|
|||
36
DJ Anthon
06.02.10
✎
07:39
|
(34) это я над собой ))))
|
|||
37
1Сергей
06.02.10
✎
07:44
|
а... типа по Уильяму нашему Шекспиру? :))))))
сразу не догнал |
|||
38
DJ Anthon
06.02.10
✎
07:47
|
(37) ага, но это действительно из восьмерки, я в сабже поздно разглядел. кроме того, еще в глобальнике надо прописать переменную b, чтоб работало, а так - все изящнее, чем х <> у...
(16) а 1 = 1 быстрее набирается, если что... и понятнее, кста |
|||
39
Дядя Васька
06.02.10
✎
07:52
|
"х"<>"й" это зачетно )
|
|||
40
DJ Anthon
06.02.10
✎
07:59
|
Ну ладно-ладно, уговорили. Все равно у меня в конфиге матерных слов больше, чем скомпилированных...
|
|||
41
dk
06.02.10
✎
08:02
|
хз, меня такие циклы бесят
--- ведь можно же заменить на Пока МояПеременная <> УсловиеВыхода ну и в цикле задавать условиевыхода, хотя разницы конечно немного, но читать проще код |
|||
42
DJ Anthon
06.02.10
✎
08:17
|
мда... а если условий выхода несколько? СписокЗначений? чем тебя Прервать не устраивает? бесят... вот меня бесят ошибки в конфигах, ну никак не варианты задания циклов! между прочим, это оттого, что нет в 1ске аналога repeat until!
|
|||
43
VladZ
06.02.10
✎
08:18
|
(0) Такая конструкция используется, когда условий выхода из цикла много.
|
|||
44
dk
06.02.10
✎
08:24
|
(42) да хоть сто
Если ялялял Тогда УсловиеВыхода = 1 Если люлюлю тогда УсловиеВыхода = 1 ---- прервать тока для дополнительного выхода, основной цикл должен правильно работать --- впрочем это я так, ворчу немного, в принципе мой вариант от (0) почти не отличается, только читать удобнее |
|||
45
1Сергей
06.02.10
✎
08:42
|
(44) Я тоже обычно флаг использую
|
|||
46
VladZ
06.02.10
✎
08:54
|
(44) Когда код простой, можно и так. А вот когда у тебя в цикле обработка "космических утюгов" - удобнее через (0).
|
|||
47
NcSteel
06.02.10
✎
09:07
|
(46) Любой сложный код можно обернуть функцией и вернуть флаг выхода.
|
|||
48
НикДляЗапросов
06.02.10
✎
09:15
|
Пока "Все дома" = "Все дома" Цикл
Если Мама.УшлаПоМагазинам = Истина Тогда Прервать; КонецЕсли; КонецЦикла; |
|||
49
ДенисЧ
06.02.10
✎
09:20
|
Кстати, не забываем ещё про volatile-переменные, которые могут меняться по событиям...
Хотя в 1с они вряд дли поменяются в таком цикле... |
|||
50
zak555
06.02.10
✎
11:33
|
(49) переведи! :-)
|
|||
51
ДенисЧ
06.02.10
✎
11:34
|
(50) Какое слово тебе непонятно?
Начни отсюда http://en.wikipedia.org/wiki/Volatile |
|||
52
zak555
06.02.10
✎
11:35
|
(51) там тоже нужен перевод )))
|
|||
53
ДенисЧ
06.02.10
✎
11:38
|
(52) volatile-переменные - это те, которые могут изменить своё значение в произвольный момент, вне зависимости от логики кода. Например, в обработчике прерывания. Или константы в 1с...
|
|||
54
ALoHA
06.02.10
✎
11:48
|
Безусловный цикл. Один будет всегда равно один).
|
|||
55
Песец
06.02.10
✎
11:49
|
Процедура ОчистЗап()
ДБФ.Первая(); Пока 1 = 1 Цикл ДБФ.Очистить(); ДБФ.Записать(); Если ДБФ.Следующая() = 0 Тогда Возврат; КонецЕсли; КонецЦикла; КонецПроцедуры (с) ЖКК |
|||
56
1Сергей
06.02.10
✎
11:49
|
(54) Спасибо, Кэп
|
|||
57
zak555
06.02.10
✎
11:50
|
(55) см. поиск файлов по расширению!
например *.ert|*.efd |
|||
58
Cthulhu
06.02.10
✎
12:04
|
(52):
Изменчивый означает изменяться или изменчивый. Его форма существительного - изменчивость, которая обращается к любой из нескольких мер неустойчивости. Это может обратиться к: По химии: Изменчивость (химия), мера тенденции вещества, чтобы испариться. Это было также определено как мера того, как с готовностью вещество испаряется. Относительная изменчивость, мера давлений пара компонентов в жидкой смеси Volatiles, группа составов с низкими точками кипения, которые связаны с коркой планеты или луны и/или атмосферой Изменчивые органические составы, органические составы, которые могут испариться в нормальной температуре и давлении, и часто регулируются правительствами Изменчивая анастезиология, класс анастезиологии, которые испаряются легко Изменчивая токсикомания, злоупотребление домашними ингаляторами, содержащими изменчивые составы Изменчивая нефть, также известная как существенная нефть, нефть произошла из заводов с соединениями ароматического ряда, используемыми в косметике и приправе Изменчивая кислотность, срок, используемый в winemaking, чтобы указать недопустимым образом высокий уровень кислоты или уксуса и пищевой соды. |
|||
59
Cthulhu
06.02.10
✎
12:06
|
(58)+:
В информатике: Изменчивые переменные, переменные, которые могут быть изменены внешним процессом Изменчивая память, память, которая длится только, в то время как власть идет (и таким образом был бы потерянный после переначала) В астрологии Изменчивый кусок замороженного gasses найденный главным образом в поясе Kuiper. В экономике: Изменчивость (финансы), мера риска в финансовом инструменте В геологии: Volatiles, изменчивые составы магмы (главным образом водный пар), которые затрагивают появление и силу вулканов В математической теории вероятности: Стохастическая изменчивость В политике: Индекс Pedersen, мера избирательной изменчивости в политических партийных системах Другие использования: Изменчивые Игры, изготовитель видеоигр |
|||
60
Torquader
06.02.10
✎
13:01
|
В принципе, вместо бесконечного цикла можно использовать метки, но тогда их будет две - одна в начале цикла, а другая в конце, но все прекрасно понимают, что метки не позволяют сразу постичь логику программы (особенно, когда у вас цикл на несколько страниц кода), но с метками можно выходить из вложенных циклов без проверки всяких доп-условий.
А по скорости исполнения быстрее всего выполняется сравнение с нулём, поэтому в условии лучше всего писать 0=0. Процедура Выполнить() var p;var i; // вариант через goto - самое "нехорошее" p=_GetPerformanceCounter(); i=0; ~BeginLabel: if i>1000000 then goto ~EndLabel;endif; i=i+1; goto ~BeginLabel; ~EndLabel: Message("1:"+String(_GetPerformanceCounter()-p)); // вариант через цикл с нулём p=_GetPerformanceCounter(); i=0; while 0=0 do if i>1000000 then break;endif; i=i+1; enddo; Message("2:"+String(_GetPerformanceCounter()-p)); // вариант с единицей p=_GetPerformanceCounter(); i=0; while 1=1 do if i>1000000 then break;endif; i=i+1; enddo; Message("3:"+String(_GetPerformanceCounter()-p)); // вариант со сттрокой p=_GetPerformanceCounter(); i=0; while "a"<>"b" do if i>1000000 then break;endif; i=i+1; enddo; Message("4:"+String(_GetPerformanceCounter()-p)); КонецПроцедуры Результат выполнения: 1:842 2:1080 3:1080 4:1089 P.S. метки оказались достаточно быстрыми, а в остальных случаях никакой разницы нет. |
|||
61
1Сергей
06.02.10
✎
13:16
|
(60) попробовал вариант с флагом - самый медленный
|
|||
62
DJ Anthon
07.02.10
✎
14:13
|
(44) "прервать тока для дополнительного выхода, основной цикл должен правильно работать" а что выходы из цикла могут быть дополнительными или основными? лишнее усложнение теории и, соответственно, кода. выйти - так выйти. лучше бы кодеры беспокоились о граничных условиях и о пользователях/следующих программеров этого же гребаного кода....
|
|||
63
Дядя Васька
07.02.10
✎
14:15
|
(62) Да так уж и пиши, "Прервать" это для лохов...
|
|||
64
Torquader
07.02.10
✎
14:19
|
Прервать, это узаконенный goto, который переводит точку исполнения за пределы цикла. В отличие от goto нет возможности прерывания вложенных циклов.
|
|||
65
DJ Anthon
07.02.10
✎
14:23
|
(64) тут про вложенные циклы пока никто не говорил. это совсем другой коленкор!
(63) сам ты лох |
|||
66
Cthulhu
07.02.10
✎
14:30
|
(64): есть возможность - проверка граничного/проверяемого значения цикла сразу после цикла: если условие цикла выполнено (или граничное значение не превышено счетчиком) - значит выход выполнен прерыванием.
|
|||
67
DJ Anthon
07.02.10
✎
14:33
|
(66) угу, вариантов логики может быть море. главное, что механизму 1 = 1 - жить. а им лишь бы пообзываться.
|
|||
68
Киборг
07.02.10
✎
15:40
|
Конструкцией "Пока Истина Цикл" (так лучше) не надо злоупотреблять. Каждый случай использования должен быть исключительным. :)
|
|||
69
Cthulhu
07.02.10
✎
17:04
|
(68): категоричность кажется малоуместной, извини.
особено при том, что сама необходимость применения подобных вещей - сама по себе достаточно исключительна. |
|||
70
Киборг
08.02.10
✎
10:02
|
(69) то есть даже если это самый лучший из МНОГИХ вариантов и по МНОЖЕСТВУ факторов, то ты его все равно избегаешь?
|
|||
71
orefkov
08.02.10
✎
10:28
|
Имхо.
1. Применять можно, когда условие выхода должно быть в середине цикла. 2. Когда условие выхода должно быть в середине цикла, нужно применять Пока 1=1 Цикл, ибо это сразу дает понять, что условие выхода в середине цикла. Пример: Функция Из10в16(Знач Ч) с16 = "0123456789ABCDEF"; рез = ""; Пока 1 = 1 Цикл рез = Сред(с16, 1 + (Ч % 16), 1) + рез; Ч = Цел(Ч / 16); Если Ч = 0 Тогда Прервать; КонецЕсли; КонецЦикла; Возврат рез; КонецФункции // Из16В10 Если избавляться от "1 = 1", тогда нужно писать так: Функция Из10в16(Знач Ч) Если Ч = 0 Тогда Возврат "0"; КонецЕсли; с16 = "0123456789ABCDEF"; рез = ""; Пока Ч <> 0 Цикл рез = Сред(с16, 1 + (Ч % 16), 1) + рез; Ч = Цел(Ч / 16); КонецЦикла; Возврат рез; КонецФункции // Из16В10 |
|||
72
Киборг
08.02.10
✎
11:51
|
Не могу припомнить ни одного учебника по программированию, в котором бы описывались правила применения как бесконечного цикла, так и операторов перехода?! Тем не менее разработчики языков программирования упорно вставляют в них возможность использования этих конструкций разаработчиками программ. Почему? (Сказку про Синюю бороду не напоминает? Нафига было ей ключ давать?)
(71) Конструкция Пока Истина Цикл тянет на исключительную, а конструкция Пока 1=1 Цикл ну никак, как минимум, на одну из многих, типа Пока абракадабра=абракадабра Цикл :)) |
|||
73
truba
08.02.10
✎
12:01
|
Итого:
Все представленные здесь конструкции: УсловиеВыхода = 0; Пока УсловиеВыхода = 0 Цикл УсловиеВыхода = ПолучитьУсловиеВыхода(); КонецЦикла; Требуют инициализации Переменной УсловиеВыхода, которая, обычно, сложна. Все любители "правильный циклов" рано или поздно "оформляют это в отдельную функцию" либо разбив копья о мельницы в своих мозгах приходят к вообще то известную еще со времен паскаля и ранее конструкцию цикла с пост-условием. которая в 1с имеет вид Пока 1=1 Цикл. |
|||
74
orefkov
08.02.10
✎
12:02
|
(72) Ну нет в семерке Истина
А вот в С++ сплошь и рядом while(true) или for(;;) |
|||
75
Киборг
08.02.10
✎
12:10
|
(74) эээ... нуууу... тогда, да :)
|
|||
76
Табуретко
08.02.10
✎
14:03
|
и както все разом забыли в подобных циклах про некий счетчик, так на всякий пожарный, чтоб цикл не оказался вечным...
|
|||
77
Fragster
гуру
08.02.10
✎
14:04
|
а я пишу пока функция() цикл конеццикла;
|
|||
78
Fragster
гуру
08.02.10
✎
14:04
|
иногда
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |