В данной статье мы рассмотрим, как обработать массив объектов в Turbo Pascal, используя три элемента массива в каждой итерации цикла и возвращаясь к началу массива после обработки последних трех элементов.
Проблема
У нас есть массив coords типа PointType с семью элементами:
Нам нужно написать цикл, который бы обрабатывал три элемента массива за раз и возвращался к началу массива после обработки последних трех элементов. Например:
arrayLength := SizeOf(coords) div SizeOf(PointType);
for i := 1 to (arrayLength-2)
do begin
WriteLn(someFunction(coords[i-1], coords[i], coords[i+1]));
end;
WriteLn(someFunction(coords[arrayLength - 2], coords[arrayLength - 1], coords[0]));
WriteLn(someFunction(coords[arrayLength - 1], coords[0], coords[1]));
Однако, мы хотим сделать это в один проход, не указывая последние две итерации явно.
Решение
Для решения этой задачи мы можем использовать оператор mod (остаток от деления) в Turbo Pascal. Оператор mod возвращает остаток от деления первого операнда на второй. Мы можем использовать это для циклической обработки массива:
arrayLength := SizeOf(coords) div SizeOf(PointType);
for i := 0 to (arrayLength-1)
do begin
WriteLn(someFunction(coords[i],
coords[(i+1) mod arrayLength],
coords[(i+2) mod arrayLength]));
end;
В этом коде мы инициализируем i равным 0, а не 1, чтобы обработать первый элемент массива. Затем мы используем (i+1) mod arrayLength и (i+2) mod arrayLength для получения следующих двух элементов массива. Так как (i+1) mod arrayLength и (i+2) mod arrayLength могут дать отрицательные значения, когда i равен arrayLength-1, arrayLength-2 соответственно, оператор mod гарантирует, что мы всегда получаем положительные индексы массива.
Альтернативный ответ
Если количество элементов в массиве может меняться, мы можем использовать цикл while вместо цикла for для обработки всех элементов массива:
arrayLength := SizeOf(coords) div SizeOf(PointType);
i := 0;
while i < arrayLength do
begin
WriteLn(someFunction(coords[i],
coords[(i+1) mod arrayLength],
coords[(i+2) mod arrayLength]));
i := (i + 3) mod arrayLength;
end;
В этом коде мы инициализируем i равным 0 и используем цикл while для обработки всех элементов массива. В теле цикла мы увеличиваем i на 3 после каждой итерации, а оператор mod гарантирует, что i всегда остается в диапазоне допустимых индексов массива.
Статья о том, как обработать массив в Turbo Pascal, обрабатывая три элемента за раз и возвращаясь к началу массива после обработки последних трех элементов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.