Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.08;
Скачать: CL | DM;

Вниз

FOR or WHILE   Найти похожие ветки 

 
vasIZmax ©   (2007-03-12 14:27) [0]

Почему везде вместо цикла for используется цикл while?
Причиной тому некоторые особенности реализации цикла for в Delphi. В языке AlgoPascal если цикл не выполнялся не разу, то управляющая переменная цикла содержит стартовое значение. В Delphi если цикл не выполнялся не разу, то управляющая переменная цикла не изменяется. Однажды я встретил исходник, в котором эта разница играла большую роль, и решил заменить цикл for в программах на Delphi циклом while, который полностью совпадает по своему поведению с циклом в AlgoPascal.


До сегодняшнего дня всегда использовал for для циклов, и редко while и repeat(в основном когда надо было step не 1, а n).
Вот сейчас надо прогу написать (различные виды сортировок), ну я к гуглу, чтобы найти инфу по сортировка (сами алгоритмы) и попался мне выше указанный абзац.
В самом деле лучше использовать WHILE вместо FOR?
Сильно ли это сказывается на временных затратах работы программы?

ЗЫ. извините, если баян))
ЗЫЫ. абзац взят с http://alglib.sources.ru/faq.php#q6


 
tesseract ©   (2007-03-12 14:30) [1]


> Причиной тому некоторые особенности реализации цикла for
> в Delphi


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

Поведение цикла до BDS 2006 и после отличаеться.


 
Думкин ©   (2007-03-12 14:30) [2]

Условие while будет считаться на каждой интерации, для FOR это не так. Уже сколько веток было на эту тему.


 
Gero ©   (2007-03-12 14:31) [3]

> Почему везде вместо цикла for используется цикл while?

Почему автор сего сабжа каждый день пьет одеколон?


 
Думкин ©   (2007-03-12 14:33) [4]

По ссылке:

Массивы в Delphi начинают нумерацию элементов с ноля.


 
Kolan ©   (2007-03-12 14:36) [5]

> [4] Думкин ©   (12.03.07 14:33)
> По ссылке:
>
> Массивы в Delphi начинают нумерацию элементов с ноля.

Чтоже будет когда он увидет A: array [100..110] of Integer;


> Почему автор сего сабжа каждый день пьет одеколон?

Вместо красной икры булку ситную, он намажет помадой губной (с)


 
Аноним   (2007-03-12 14:42) [6]


> Однажды я встретил исходник, в котором эта разница играла
> большую роль


В топку такой исходник.


> и решил заменить цикл for в программах на Delphi циклом
> while


гениально.


 
Сергей М. ©   (2007-03-12 14:46) [7]


> Сильно ли это сказывается на временных затратах работы программы?
>


Для разработчиков софта, никак не связанного с пуском ракет с ядерным зарядом на борту - "не сильно")


 
vasIZmax ©   (2007-03-12 14:49) [8]

все-то понятно, не понятно одно: "что лучше?"
for - если знаю сколько надо итераций,
while - не знаю, но при каких-то условиях прервать работу цикла.
что быстрее будет работать? или это конкретно зависит от ТЗ?


> Почему везде вместо цикла for используется цикл while?

ребят, ну это ж из текста выдрано, поэтому смысл и теряется)))
ЗЫ. ссылка указана, чисто для того чтобы не думали, что с пионерил, или сам придумал сие))
ЗЫЫ. на крайний случай - удалите тему)))


 
vasIZmax ©   (2007-03-12 14:53) [9]


> Сергей М. ©   (12.03.07 14:46) [7]

Понимаете надо провести анализ сортировок, и здесь миллисекунды так сказать играют роль))), а из-за "корявости" кода, будут сделаны неправильные выводы о скорости сортировки. (хотя большинству будет пофик на это).

ЗЫ. для меня это важно


 
MBo ©   (2007-03-12 14:57) [10]

Если по логике for, то его и надо использовать, будет чуть быстрее.

А что за сортировки надо сравнивать?


 
Сергей М. ©   (2007-03-12 14:58) [11]


> vasIZmax ©   (12.03.07 14:53) [9]


Здесь надо понимать, какой конкретно код генерирует оптимизирующий компилятор (в т.ч. и в п.о.) для while- и for-конструкций, в каждом конкретном случае. Без этого дальнейший разговор лишен смысла.


 
TUser ©   (2007-03-12 15:03) [12]

Заменяй на if ... then goto ... - так и Delphi, и любой другой компилятор должен понять одинаково :)


 
Ega23 ©   (2007-03-12 15:05) [13]

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

Блин. Даже не знаю как в двух словах объяснить. Нормализация БД с назначением в качестве ключа строкового поля в качестве примера в бошку лезет...


 
vasIZmax ©   (2007-03-12 15:07) [14]


> MBo ©   (12.03.07 14:57) [10]

э-э-э... мне сказал (препод) "все которые сможешь найти". ну вика конечно дала пищи для раздумий
http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8


> Сергей М. ©   (12.03.07 14:58) [11]

я это уже понял)).

Просто меня несколько смутило (я ж говорю чаще всего использую for, и оч редко while) высказывание приведенное в абзаце, вот я и спросил.


 
Ega23 ©   (2007-03-12 15:09) [15]


> Просто меня несколько смутило (я ж говорю чаще всего использую
> for, и оч редко while) высказывание приведенное в абзаце,
>  вот я и спросил.


А я кроме как While not Eof больше нигде и не пользую.
Ну кроме TSQL, конечно...  :)


 
DrPass ©   (2007-03-12 15:12) [16]


> Насколько я понимаю, while - это вырожденный for

Вообще-то скорее наоборот :)


> Здесь надо понимать, какой конкретно код генерирует оптимизирующий
> компилятор

Для for, насколько я знаю, во всех Паскалевских компиляторах результат будет одинаковый: без оптимизации - add/cmp/jle с переменной, с оптимизацией - dec/jz с регистром.
Ну а while, естессно, суть более хитрая конструкция, так что for в любом случае будет или чуть быстрее, или хотя бы таков же по быстродействию


 
Плохиш ©   (2007-03-12 15:12) [17]

Всем, спасибо. Настроение после обеда подняли :-))


 
Сергей М. ©   (2007-03-12 15:14) [18]


> vasIZmax ©   (12.03.07 15:07) [14]


> меня несколько смутило


И правильно смутило. Потому что там дурь несусветная.
Как говорит ИШ, "всякий овощ должен быть употреблен ..." (и т.д. и т.п.)

Там где очевиден for - надо применять for
Там где очевиден while - надо применять while
Там где ничерта не очевидно, надо бросать давить на кнопки и углубиться в чтение спецлитературы.


 
Ega23 ©   (2007-03-12 15:15) [19]


> Вообще-то скорее наоборот :)


Это смотря с какой стороны смотреть...  :)


 
DiamondShark ©   (2007-03-12 15:17) [20]


> В Delphi если цикл не выполнялся не разу, то управляющая
> переменная цикла не изменяется

В дельфи, а равно как и в паскале вообще со времён его появления управляющая переменная после цикла имеет неопределённое значение, не зависимо от того, сколько раз выполнялся цикл.


> ЗЫ. извините, если баян))

Не извиним, бо не боян, а мегабоянище.
Всех паскальщиков с первого класса школы фигачат носом об доску: "Не используй, сцуко, переменную цикла после цикла".


 
vasIZmax ©   (2007-03-12 15:28) [21]


> Ega23 ©   (12.03.07 15:09) [15]

во-во. та же ситуация:)


> DrPass ©   (12.03.07 15:12) [16]

по крайней мере, хуже (в смысле затрат времени) не будет, я ничего не теряю используя for.


> DiamondShark ©   (12.03.07 15:17) [20]
> Всех паскальщиков с первого класса школы

да вот как-то не приходилось, мне учиться в такой школе(не вышло, не сложилось вот как-то, а очень хотелось), а теперь тупые вопросы задаю.


 
DiamondShark ©   (2007-03-12 15:32) [22]


> да вот как-то не приходилось, мне учиться в такой школе(не
> вышло, не сложилось вот как-то, а очень хотелось), а теперь
> тупые вопросы задаю.

Это не проблема.
На этот случай Дельфи в коде вроде такого

 for i := 0 to 10 do writeln(i);
 writeln(i);

на второй строчке выдаёт варнинг:
[Warning] Unit1.pas(31): FOR-Loop variable "i" may be undefined after loop

Читать-то стопудово все умеют.


 
vasIZmax ©   (2007-03-12 15:37) [23]


> DiamondShark ©   (12.03.07 15:32) [22]

да, мне не надо использовать переменную-счетчик после цикла:).
мне скорость главное! что быстрее for или while? благо ответы получены)


 
MBo ©   (2007-03-12 15:40) [24]

>э-э-э... мне сказал (препод) "все которые сможешь найти
Так задача-то в чем? Для популярных сортировок известны асимптотики, и примерное соотношение скоростей в каждом асимптотическом классе.
Например, для O(n^2)
Insertion<Selection<Shaker/Bubble, хотя первая и последняя - адаптивные, скорость зависит от изначальной упорядоченности (количества инверсий).


 
vasIZmax ©   (2007-03-12 15:51) [25]


> MBo ©   (12.03.07 15:40) [24]

да вот хотелось сравнить "придуманное" (придуманное ли? это сейчас и выясняю) с имеющимися.

на счет "вставок" и "пузырька" Вы правы.


 
Vlad Oshin ©   (2007-03-12 15:53) [26]

for i := 0 to 10 do ;
            mov al,$0b
            dec al
            jnz -$04

repeat  inc(i); until i>10;
        add al,$01
        jnb +$05
        call @IntOver
        cmp al,$0a
        jbe -$0d

while i<10 do inc(i);
            add al,$01
            jnb +$05
            call @IntOver
            cmp al,$0a
            jb -$0d

судя по всему, for будет побыстрее


 
Чапаев ©   (2007-03-12 16:23) [27]

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

> все-то понятно, не понятно одно: "что лучше?"
Лучше пивка попить.

> Там где очевиден for - надо применять for
> Там где очевиден while - надо применять while
> Там где ничерта не очевидно, надо бросать давить на кнопки
> и углубиться в чтение спецлитературы.
А в каком случае голову подключать? %-)

> на второй строчке выдаёт варнинг:
> [Warning] Unit1.pas(31): FOR-Loop variable "i" may be undefined
> after loop
> Читать-то стопудово все умеют.
Настоящие кулхацкеры при виде варнингов и хинтов стискивают зубы и ругают Паскаль. :-D

> [26] Vlad Oshin ©   (12.03.07 15:53)
А если range check отключить? А вообще у меня BDS2006 "малость" другой код сгенерила. Что удивило, на пустых циклах компилятор мухлюет, из цикла с предусловием сделал цикл с постусловием.

Для программки
 for I := 0 to 10 do
   WriteLn(I);
 I:=0;
 while I<=10 do begin
   WriteLn(I);
   Inc(I);
 end;
 I:=0;
 repeat
   WriteLn(I);
   Inc(I);
 until I>10;

код для всех трёх циклов был сгенерирован почти одинаковый. Все три цикла стали циклами с постусловием. В цикле с параметром условие проверялось по jnz, в остальных -- по jle.


 
Anatoly Podgoretsky ©   (2007-03-12 22:42) [28]

> vasIZmax  (12.03.2007 15:37:23)  [23]

У тебя секундомера нет?


 
Нечитатель   (2007-03-13 00:53) [29]

Сравнение *алгоритмов* - вещь туманная.

Для одного и того же алгоритма несуществнные с точки зрения логики изменения кода могут дать прирост скорости примерно 20%.
И как тут сравнивать, если простая замена i на j может так повлиять?

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


 
Германн ©   (2007-03-13 01:10) [30]


> Ega23 ©   (12.03.07 15:09) [15]
>
...
> А я кроме как While not Eof больше нигде и не пользую.
> Ну кроме TSQL, конечно...  :)
>

А Repeat часто используешь?


 
J_f_S   (2007-03-13 14:21) [31]

Опять??

С полгодика назад знатнейшая буча была.



Страницы: 1 вся ветка

Текущий архив: 2007.04.08;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.046 c
3-1167918930
_ozzy_
2007-01-04 16:55
2007.04.08
Как упаковать файл Paradox?


15-1173556275
ArtemESC
2007-03-10 22:51
2007.04.08
Где найти?


15-1173873526
nimp
2007-03-14 14:58
2007.04.08
Ошибка в дельфях


15-1173880615
shikitomedo2
2007-03-14 16:56
2007.04.08
Увольняются все в последнее время...


15-1174069619
Kerk
2007-03-16 21:26
2007.04.08
Как в аське установить аватарку?