Использование оператора "мод" - PullRequest
2 голосов
/ 03 апреля 2011

Я пытаюсь отобразить всякий раз, когда мне нужно выполнить определенное действие в цикле for каждую 300-ю итерацию (имеет смысл?)

Вот в коде, что я хочу сделать, но не так, как я хочу это сделать:

for I := 0 to 2000 do
  Begin
   if I = 300 then
   DoAnAction;

   if I = 600 then
   DoAnAction

   if I = 900 then
   DoAnAction

   if I = 1200 ......... Same action all over, but I don't want to check all those conditions!
  End;

Итак, мне сказали использовать оператор mod, и вот как я это делаю:

for I := 0 to 2000 do
 Begin
  if I mod 300 = 299 then
  DoAnAction;
 End;

Однако , результаты с использованием приведенного выше фрагмента сделают действие на 299, 599, 899 ....

Как я могу сделать это на 300, 600, 900 ...... используя оператор Mod? (А делать if I mod 300 = 300 не получалось)

Спасибо!

Ответы [ 5 ]

10 голосов
/ 03 апреля 2011
for I := 0 to 2000 do
 Begin
  if (I mod 300 = 0) and (I > 0) then
    DoAnAction;
 End;

Хотя ваша предыдущая версия тоже имеет смысл, I = 299 - это 300-й проход;)

EDIT: I mod 300 = 300 не будет работать, поскольку оператор mod возвращает остаток от деления, чтопо определению будет в диапазоне 0..299

4 голосов
/ 03 апреля 2011

Используйте это:

if i mod 300 = 0

Оператор модуля возвращает остаток от деления.

Вот пример, чтобы помочь вам. Перетащите TMemo в новую пустую форму и укажите это в FormCreate evemt:

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
const
  Output = 'i mod %d = %d';
begin
  Memo1.Clear;
  for i := 0 to 10 do
    Memo1.Lines.Add(Format(Output, [i, i mod 5]));
end;

Запустите его и посмотрите на вывод в заметке.

4 голосов
/ 03 апреля 2011

Оператор mod возвращает остаток от деления. Так что если вы хотите делать это на каждой 300-й итерации, используйте i mod 300 = 0.

I mod 300 = 300 не имеет смысла, поскольку не может быть деления на 300, оставляя остальные 300.

1 голос
/ 03 апреля 2011

Попробуйте (I <> 0) AND ((I mod 300) = 0).

0 голосов
/ 31 января 2016

This image display what to change

procedure TForm1.Button1Click(Sender: TObject); var i:REal; begin i:=strtofloat(edit1.Text); if i mod 5 = 0 then begin label1.Caption:='Кратно 5'; end else begin label1.Caption:='Не кратно 5'; end; end;

...