delphi цикл for с шагом

что-то не пойму. неужели в 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


Adil Aliyev ( 2003-12-30 01:09 ) [3]

for i=1 to 20 step 2
print i
next i

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

Здесь нет ни умножения как в примере Германн © (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]
>
>Первое. В моем примере меньше человеко-часов программистского >труда. Точнее человеко-секунд. Да и пальцы меньше страдают >от .клавы. :)))
>Второе. Ваш пример не соответствует сабжу, поскольку начинается >с нуля, а не с единицы. :)))


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 можно было делать переприсваивание переменной цикла (чего не сделаешь в Делфи (стандартными средствами))

Delphi — Циклы for. to. do

Это логика расчета факториала. Давайте перенесем ее на язык программирова­ния Delphi. Цикл в Delphi оформляется следующим образом:

После слова for нужно присвоить какой-нибудь переменной начальное значе­ние. Эта переменная будет использоваться в качестве счетчика выполнения цикла.

Закажи видеокурс по Delphi прямо сейчас и получи 106 видеоуроков! Кликни сюда:

ЗАКАЗАТЬ

После каждого выполнения действия этот счетчик будет увеличиваться на единицу, пока переменная не превысит конечного значения. В качестве счетчика я привык использовать переменную с именем index или i, но некоторые специалисты счи­тают, что и счетчикам нужно давать более внятные имена. На мой взгляд, более внятного имени далеко не всегда можно придумать. В общем виде цикл выглядит так:

Посмотри подробный видеоурок с примерами о том как работать с такими циклами:

Хочешь больше таких видеоуроков — тогда скачай прямо сейчас их бесплатно — СКАЧАТЬ БЕСПЛАТНО.

В этом примере объявляются две переменные index и sum типа «целое число». Сначала переменной sum присваивается значение 0. После этого запускается цикл, в котором переменная index будет изменяться от 0 до 5. Теперь посмотрим поэтапно, что здесь происходит.

  1. На первом этапе переменная index равна 0. sum тоже равна нулю, значит, вы­полнится операция sum:=o+o. Результат sum = о;
  2. На втором этапе index увеличена на 1, значит, выполнится действие sum: =о+1. Результат sum = 1.
  3. Здесь index увеличена на 1 и уже равна 2, a sum = 1. Значит, выполнится дейст­вие Sum: =1+2. Результат Sum = 3.
  4. Здесь index увеличена на 1 и уже равна 3, a sum = 3. Значит, выполнится дейст­вие sum: =3+3. Результат sum = б.
  5. Здесь index увеличена на 1 и уже равна 4, a sum = 6. Значит, выполнится дейст­вие Sum: =4 + 6. Результат Sum = 10.
  6. Здесь index увеличена на 1 и уже равна 5, a sum = 10. Значит, выполнится дей­ствие Sum: =5+10. Результат sum = 15.

Заметьте, что мы не увеличиваем значение переменной index, используя для этого определенные команды. Значение увеличивается автоматически, потому что эта переменная объявлена счетчиком в цикле for.

В принципе, текст тот же самый. Единственная разница заключается в том, что цикл запускается, начиная от 0 до числа, введенного в компонент EndEdit. EndEdit содержит текст, а нам нужно превратить его в число, поэтому мы используем функцию strToint для преобразования строки в число. Эта функция работает так же, как и intTostr, которая наоборот преобразовывала число в строку.

Результат преобразования сохраняется в переменной EndCount:

После этого запускается цикл, в котором переменная index будет изменятся от 0 ДО значения EndCount (в котором находится ЧИСЛО, введенное В EndEdit).

Запустите программу и введите в строку Конечное значение число 5. После этого нажмите на кнопку, и в строке результата должно появиться число 15.

Здесь необходимо еще отметить то, что после цикла for будет выполняться только одно действие. Например, если вы захотите выполнить два действия подряд, то вы должны заключить их в скобки begin и end, как это показано в следующем примере.

Здесь на каждом шаге цикла sum увеличивается еще на единицу. Если вы по­пробуете написать так:

то выполняться в цикле будет только строка sum:=sum+index. Вторая строка Sum: =sum+i выполнится только по окончании цикла.

Posted by Chas under Delphi

Вот как мне пустить цикл

не с шагом 1 (0, 1, 2, 3, 4, 5, …., 100), а с шагом, скажем, 2 (0, 2, 4, 6, …, 100) или с другим каким не будь. Уж очень не хочиться юзать if…then в цикле. Или while…do предётся взять.

Serge_Bliznykov
вопрос понятен, во многих других языках есть конструкция for … step
но в Delphi такого нет.
Поэтому нужно воспользоваться любым из двух других циклов: while … do или repeat .. until
например:
for counter := 0 to 50 do
begin
i:= counter shl 1;
< Тыры пыры >
end;

Оцените статью