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

Вниз

шаг для 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
1-37707
@tom
2003-12-24 20:28
2004.01.13
Ошибка загрузки файла в RichEdit


3-37549
Diver
2003-12-16 02:59
2004.01.13
Image из базы Access


3-37537
DimonNew
2003-12-17 14:07
2004.01.13
ADO без DSN (Paradox, dBase, FoxPro, Access)


14-37877
Кукушкинд
2003-12-22 14:51
2004.01.13
Как вы относитесь к отечественному кинематографу?


6-37817
Sadya
2003-11-11 17:48
2004.01.13
Мне необходимо в цикле опросить по сокетам несколько машин