Другие языки программирования и технологии

Люди добрые извиняюсь за тупой и простой вопрос по паскалю но всё же помогите прогу дописать

Дан массив размера 10. Переставить в обратном порядке элементы массива, расположенные между его минимальными и максимальными элементами.MinN := A[1];MinI := 1;MaxN := A[1];MaxI := 1;for j:=2 to 10 do beginif A[j] < MinN then beginMinN := A[j];MinI := j;end;if A[j] > MaxN then beginMaxN := A[j];MaxI := j;end;end;if Abs(MinI - MaxI) = 1 then beginWriteLn('Между минимальным и максимальным элементами нет других элементов');Halt(1);end;if MinI < MaxI then begin while MinI < MaxI do beginBuf := A[MinI+1];A[MinI+1] := A[MaxI-1]; A[MaxI-1 := Buf;MimI := MinI + 1;MaxI := MaxI - 1;end;endelsewhile MinI > MaxI do begin Buf := A[MinI-1];A[MinI-1] := A[MaxI+1];A[MaxI+1 := Buf;MimI := MinI - 1;MaxI := MaxI + 1;end;
Доброго времени суток

Писал прямо в ответы и допустил несколько неточностей. Сорри.. .

program Mass;
uses Crt;
var
A : array[1..10] of Integer;
MinN, MaxN, MinI,MaxI, Buf, j : Integer;

begin
ClrScr;
Randomize;
for j:=1 to 10 do A[j] := Random(11); {заполнение массива случайными числами}
{можно организовать ручной ввод, тогда первые две строчки надо исправить}

for j:=1 to 10 do Write(A[j]:3); {вывод для контроля}
WriteLn;
WriteLn;

{поиск минимального и максимального элементов и их индексов}
MinN := A[1];
MinI := 1;
MaxN := A[1];
MaxI := 1;
for j:=2 to 10 do begin
if A[j] < MinN then begin {ищется минимальный}
MinN := A[j];
MinI := j;
end;
if A[j] > MaxN then begin {ищется максимальный}
MaxN := A[j];
MaxI := j;
end;
end;

if Abs(MinI - MaxI) = 1 then begin
WriteLn('Между минимальным и максимальным элементами нет других элементов');
Halt(1);
end;

WriteLn('Max ', MaxI, ' Min ',MinI);
WriteLn;

if MinI < MaxI then begin {минимальный левее максимального}
while MinI+1 <= MaxI-1 do begin
Buf := A[MinI+1];
A[MinI+1] := A[MaxI-1];
A[MaxI-1] := Buf;
MinI := MinI + 1;
MaxI := MaxI - 1;
end;
end
else {минимальный правее максимального}
while MinI-1 >= MaxI+1 do begin
Buf := A[MinI-1];
A[MinI-1] := A[MaxI+1];
A[MaxI+1] := Buf;
MinI := MinI - 1;
MaxI := MaxI + 1;
end;

for j:=1 to 10 do Write(A[j]:3); {вывод результата}
WriteLn;

ReadLn;
end.

Если надо переставлять элементы включая максимальный и минимальный, то везде, где к MaxI и MinI добавляется или вычитается 1 надо эти добавки убрать.

Удачи!
Петр Бевз
Петр Бевз
59 612
Лучший ответ
Лучше в последних двух циклах использовать for!
сначало тебе надо вычислить сколько пар-чисел MinI и MaxI между между
stepcount:=Abs(MinI - MaxI) mod 2
или
stepcount:=Abs(MinI - MaxI) div 2
Точно не помню что дает целую часть от деления (либо mod либо div)

Потом ставиш цикл от 1-го по stepcount и меняшь элементы:
Например, вместо первого твоего цикла "while do" можно написать следующий код:
for i:=1 to stepcount do
begin
k:= A[MinI+1] ;
A[MinI+1] :=A[MaxI-1];
A[MaxI-1]:=k;
end;

А вообще я думаю что можно твой код оптимизировать если работать со ссылками. Но ты не парься. Это малый код он отработает быстро!