Форум: "Основная";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];
Внизшаг для for Найти похожие ветки
← →
Андреев (2003-12-29 20:32) [0]что-то не пойму. неужели в Pascal нет оператора задающего шаг.
В смысле for i=1 to 20 step 2 как на бэйсике?
Что мне теперь if вставлять?
← →
Stilgar (2003-12-29 20:37) [1]while do или repeat until (описано в любом учебнике)
← →
jack128 (2003-12-29 21:11) [2]
> for i=1 to 20 step 2
аналог на паскале
for i := 1 to 20 do
if i mod step = 0 then
<loop statements>
← →
Adil Aliyev (2003-12-30 01:09) [3]for i=1 to 20 step 2
print i
next i
Аналогично:
step:=2;
for i:=1 to 20 do begin
if i mod step=0 then begin
write(i);
end;
end;
← →
Германн (2003-12-30 01:16) [4]Можно еще и так:
for i:=0 to 9 do Write(i*2+1);
← →
Dima_dvp (2003-12-30 01:22) [5]По-любому лучше так:
i := 0;
while (i < 20) do begin
i:=i+2; //Кстати для step=2 быстее будет Inc(i); Inc(i);
end;
Здесь нет ни умножения как в примере Германн © (30.12.03 01:16) [4], здесь нет ни деления, как в примере Adil Aliyev (30.12.03 01:09) [3]. Для доказательства моей правоты можете заглянуть в ассемблер:)
← →
Adil Aliyev (2003-12-30 01:43) [6]Dima_dvp, правильно. Да, оператор for работает быстрее чем while но моем примере используется if поэтому они одиноково.
← →
Германн (2003-12-30 02:04) [7]2 Dima_dvp © (30.12.03 01:22) [5]
Первое. В моем примере меньше человеко-часов программистского труда. Точнее человеко-секунд. Да и пальцы меньше страдают от клавы. :)))
Второе. Ваш пример не соответствует сабжу, поскольку начинается с нуля, а не с единицы. :)))
← →
Adil Aliyev (2003-12-30 02:54) [8]>2 Dima_dvp © (30.12.03 01:22) [5]
>
>Первое. В моем примере меньше человеко-часов программистского >труда. Точнее человеко-секунд. Да и пальцы меньше страдают >от .клавы. :)))
>Второе. Ваш пример не соответствует сабжу, поскольку начинается >с нуля, а не с единицы. :)))
i := 1;
while (i < 20) do begin
i:=i+2; //Кстати для step=2 быстее будет Inc(i); Inc(i);
end;
а теперь?
← →
Palladin (2003-12-30 02:55) [9]
> Андреев (29.12.03 20:32)
понял бы, еслиб книжки читал...
← →
Юрий Зотов (2003-12-30 04:57) [10]Ого, какие нешуточные споры тут пошли... а ну-ка, и я влезу в драку.
:о)
> Андреев (29.12.03 20:32)
Паскаль с самого начала строился, так, чтобы в нем было все необходимое, но не было ничего лишнего. А задание шага в цикле for - это избыточная языковая конструкция, поэтому в Паскале ее и нет. Вы же не удивляетесь, например, тому, что бейсик не поддерживает ассемблерные вставки?
А Ваш пример в общем виде реализуется так. Пусть Step - это нужный шаг цикла, а Min и Max - его пределы. Тогда пишем:
var
i, j: integer;
...
for i := 0 to (Max - Min) div Step do
begin
j := Min + i * Step;
... // И теперь вместо i используем j
end;
> Dima_dvp © (30.12.03 01:22) [5]
Уж если оптимизировать код, то надо учесть, что циклы repeat и while работают медленнее, чем for (за счет большего количества операций с памятью, а не с регистрами), а вместо умножения или деления на 2 можно использовать более быстрые операции сдвига. Тогда получим почти вариант 4:
for i := 1 to 10 do WriteLn(i shl 1);
Это сработает быстрее, чем [5], даже если в [5] вместо i+2 или двух Inc(i) написать Inc(i,2).
← →
Dima_dvp (2003-12-31 01:26) [11]Юрий Зотов © (30.12.03 04:57) [10]
>> (за счет большего количества операций с памятью, а не с регистрами)
Не знаю как в Delphi, но в C компилятор поймает, что переменная существует только в этом цикле и нигде больше, поймёт, что это счётчик и поместит её в регистр (при соответствующих настройках компилятора)
← →
Pat (2003-12-31 01:37) [12]>Dima_dvp © (31.12.03 01:26) [11]
Loop veriable для for"а в Делфи тоже помещается в регистр, даже если эта переменная используется вне этого цикла. Кстати, на BP7 она была обыкновенной переменной в памяти, поэтому в цикле for можно было делать переприсваивание переменной цикла (чего не сделаешь в Делфи (стандартными средствами))
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c