Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.033 c
1-1171135629
чуть помедленнее
2007-02-10 22:27
2007.04.08
TYPE CAST


2-1173946249
Knight
2007-03-15 11:10
2007.04.08
Какой смысл в TDatabase?


2-1172827762
adamst
2007-03-02 12:29
2007.04.08
Delphi получить html код по заданному URL


15-1174000637
Германн
2007-03-16 02:17
2007.04.08
Хреновая работа F1


3-1169105130
Dmitriy_info
2007-01-18 10:25
2007.04.08
Синтаксис SQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский