Консультация № 150672
16.11.2008, 08:27
0.00 руб.
0 1 1
Здраствуйте,уважаемые эксперты. Помогите мне справится вот с такой задачей.

Массив m получается из массива n следущим образом: Сначала идут четные цифры второй половины массива n , затем в
обратном порядке цифры первой половины, затем нечетный цифры второй половины.(прим.ИСПОЛЬЗОВАТЬ ТОЛЬКО ОДИН МАССИВ)

Обсуждение

Неизвестный
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.
Форма ответа