Другие языки программирования и технологии
Люди добрые извиняюсь за тупой и простой вопрос по паскалю но всё же помогите прогу дописать
Дан массив размера 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 надо эти добавки убрать.
Удачи!
Писал прямо в ответы и допустил несколько неточностей. Сорри.. .
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 надо эти добавки убрать.
Удачи!
Лучше в последних двух циклах использовать 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;
А вообще я думаю что можно твой код оптимизировать если работать со ссылками. Но ты не парься. Это малый код он отработает быстро!
сначало тебе надо вычислить сколько пар-чисел 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;
А вообще я думаю что можно твой код оптимизировать если работать со ссылками. Но ты не парься. Это малый код он отработает быстро!
Похожие вопросы
- нужна помощь с прогой на паскале. сортировка матрицы. в данной проге необходимо в начале вывести исходную матрицу в "кра
- помогите найти. как прога для создание сайта самая простая и эффективная для новичка,без знания языка прог-ния
- Паскаль, не трудная задачка, помогите начинающему программисту!
- Вопрос по паскалю и его применению.
- Нубские вопросы по паскалю. *)
- Вопросы про паскаль
- Вопрос по паскалю
- возник вопрос по паскалю
- Несколько вопросов по Паскалю =)
- какая самая простая ide для паскаля? и вообще какие существуют?