16.11.2008, 13:53
общий
это ответ
Здравствуйте, [b]Locust[/b]!
Пример с комментариями находится в приложении. При нечетном n за первую половину принимается меньшая часть, за вторую - большая.
Алгоритм такой:
1. Переводим цифры первой половины в обратный порядок (reverse).
2. Перебираем вторую половину (moveOddToStart).
2.1. Если найден четный элемент, сдвигаем массив (элементы первой половины и нечетные элементы второй) вправо, четный элемент перемещаем в бывшее начало первой половины (ShiftR).
В примере используется всего один массив (arr). Тип PInt используется как указатель на этот массив (@arr).
Удачи!
Приложение:
program Q150672;
type
{ Указатель }
PInt = ^Integer;
{ Вывод массива }
procedure printArr(arr: PInt; const len: Byte);
var
i: Byte;
begin
if (len > 1) then
for i:= 0 to (len - 2) do
begin
write(arr^, ', ');
Inc(arr);
end;
writeln(arr^);
end;
{ Обратный порядок }
procedure reverse(arr: PInt; const fromPos, len: Byte);
{ Параметры: массив, начальная позиция, длина }
var
rarr: PInt;
i: Byte;
begin
if (len < 2) then
Exit;
rarr:= arr;
Inc(rarr, Pred(len));
for i:= 1 to (len div 2) do
begin
{ Обмен значениями элементов }
if (arr^ <> rarr^) then
begin
arr^:= arr^ xor rarr^;
rarr^:= arr^ xor rarr^;
arr^:= arr^ xor rarr^;
end;
Inc(arr);
Dec(rarr);
end;
end;
{ Перемещение четных элементов второй половины в начало }
procedure moveOddToStart(arr: PInt; const len: Byte);
{ Сдвиг массива вправо }
procedure ShiftR(toPos: Pint);
var
harr: PInt;
tmp: Integer;
i: Byte;
begin
tmp:= toPos^;
harr:= toPos;
Dec(harr);
while(harr <> arr) do
begin
toPos^:= harr^;
Dec(toPos);
Dec(harr);
end;
toPos^:= harr^;
arr^:= tmp;
end;
var
sarr: PInt;
i: Byte;
begin
if (len < 2) then
Exit;
sarr:= arr;
Inc(sarr, (len div 2));
{ Поиск нечетных элементов }
for i:= 1 to (Succ(len) div 2) do
begin
if ((sarr^ and 1) = 0) then
begin
ShiftR(sarr);
Inc(arr);
end;
Inc(sarr);
end;
end;
const
{ Максимальная длина массива }
MAX_ARR_SIZE = 50;
var
arr: array[0..MAX_ARR_SIZE-1] of Integer;
i, n: Byte;
begin
{ Вводим n }
repeat
write('n = '); readln(n);
until ((n <= MAX_ARR_SIZE) and (n > 0));
{ Заполнение массива случайными числами }
Randomize;
for i:= 0 to Pred(n) do
arr[i]:= Random(1000);
printArr(@arr, n);
{ Первую половину переводим в обратный порядок }
reverse(@arr, 0, n div 2);
{ Перемещаем четные элементы
второй половины в начало }
moveOddToStart(@arr, n);
{ Выводим результат }
printArr(@arr, n);
end.