Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-37703
Delphi_Ghost
2003-12-30 15:31
2004.01.13
Как найти компонент на форме, зная его Top и Left?


3-37518
Lonely
2003-12-16 17:32
2004.01.13
информация о структуре таблицы


1-37689
Unknown
2003-12-25 19:32
2004.01.13
Как дождаться события?


3-37556
md
2003-12-15 15:31
2004.01.13
Filds


4-37979
DriveSoft
2003-11-09 17:08
2004.01.13
Вставка текста в IE





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский