Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ упорядочение элементов массива после второго отрицательного

Автор: 18192123 30.10.2006 1:30

дан массив из 10 целых чисел. упорядочить все элементы после второго отрицательного по возрастанию. (считать, что такие отрицательные есть)

что-то у меня не вяжется здесь
помогите найти ошибку

uses crt
const n=10;
type vect=array[1..n] of integer;
var a:vect;
i,j,k,t:integer;
begin
clrscr;
writeln ('vvod massiva');
for i:=1 to n do read (a[i]);
i:=1;
k:=0;
while (i<=n)and(a[i]>=0)and(k<2) do
begin
i:=i+1;
if a[i]<0 then k:=k+1
end;
for j:=k to n-1 do
for i:=k to n-1 do
begin
if a[i]<a[i+1] then
begin
t:=a[i];
a[i]:=a[i+1];
a[i+1]:=t;
end;
end;
writeln ('sortirovka zavershena');
for i:=1 to n do writeln (a[i]);
readkey;
end.

Автор: volvo 30.10.2006 1:48

Во-первых, у тебя лишнее условие... Вот этого вполне достаточно при поиске второго отрицательного элемента:

while (i<=n)and(k<2) do


Во-вторых, K у тебя всегда = 2 (ты нашла 2 отриц. элемента), а ты действуешь так, как будто нашла индекс второго отр. элемента... Нужно перед сортировкой сделать еще:
k := i+1;
Ну, и наконец, классическая ошибка - посмотри, КАК делается "пузырек"... Я ж не просто так это все выкладывал, ты думаешь, ты первая, кто так ошибается?

http://forum.pascal.net.ru/index.php?showtopic=3065

Итого, с учетом всех замечаний, правильный кусок программы выглядит так:
  while (i<=n)and(k<2) do begin
i:=i+1;
if a[i]<0 then k:=k+1
end;

k := i+1;
for j:=k to n do
for i:=n downto j+1 do begin

if a[i]<a[i-1] then begin
t:=a[i]; a[i]:=a[i-1]; a[i-1]:=t;
end;

end;

Автор: 18192123 30.10.2006 2:49

спасибо большое! постараюсь таких ошибок больше не делать!
хорошо, когда есть люди, способные объяснить что-либо!