Free Pascal- Sortowanie elementów tablicy malejąco


(alabama1) #1

Tym razem proszę o radę, jak przesortować elementy tablicy malejąco. Ja coś takiego kombinowałem:

program sortuj;

uses crt;

var

A:ARRAY[1..8] of integer;

i,max,pom:integer;

begin

clrscr;

for i:=1 to 8 do A[i]:=i;

for i:=1 to 8 do write(A[i],',');

writeln;

i:=0;

while i<9 do

begin

i:=i+1;

A[i]:=pom;

if A[i]>pom then

begin

pom:=A[i];

A[i]:=A[i-1];

write(pom,',');

end;

end;

readln;

end.

ale jak można było się spodziewać, nie podołałem zadaniu. Pogubiłem się w części zasadniczej, tj. porównywanie i przypisywanie zmiennej tymczasowej.


(Rolek0) #2

Dobrym algorytmem na początek nauki jest sortowanie bąbelkowe. Możesz wygooglać sboie opis tego algorytmu. W zależności czy zastosujesz porównanie większy czy mniejszy uzyskasz odpowiedni kierunek sortowania.

Dlaczego używasz

i:=0;

while i<9 do

begin

i:=i+1;

zamiast zwykłego fora? Dokładnie przeczytaj co napisałeś

A[i]:=pom;

if A[i]>pom then

i zasatanów się dlaczego jest to bez sensu.

Nauczyłbyś się w końcu robić wcięcia żeby kod był bardziej czytelny.


(B.Andy) #3

To wygląda na próbę sortowania bąbelkowego, ale oczywiście nieudaną. Zanim następnym razem napiszesz temat, przeczytaj kod na głos i odpowiedz sobie: "Czy to ma sens?" Masz u siebie na początku pętli:

A[i]:=pom;

Przypisuję aktualnej komórce zmienną pom

if A[i]>pom then

Potem porównuję tę samą komórkę (która ma wartość zmiennej pom) ze zmienną pom, a więc warunek nigdy nie zostanie spełniony, bo porównujesz te same wartości (nieprawda, że a>a)! Czy o to chodziło? Na pewno nie. Spróbuj napisać taki kod:

Powtarzaj

         CosJeszczeZmieniono := false

        for i = 1 ... MAX-1

               Jeśli a[i]
               begin

                        Zamien pozycję [b]i[/b] oraz [b]i+1[/b]

                        CosJeszczeZmieniono := true

                end;

Dopóki (CosJeszczeZmieniono = true)

[/code]

(alabama1) #4

Zaraz się za to zabiorę, idę na kolację :slight_smile: .

Rolek0 i B.Andy- ja wiem, że to, co napisałem, to brednie. Chciałem zrobić if A[i+1]>pom, ale wyskakiwał błąd 201.I nie miałem pomysłu, co z tym zrobić.


(Rolek0) #5

A ja mam: wpisać w google "pascal błąd 201" i znaleźć co on oznacza oraz zastawowić się, w którym momencie występuje i dlaczego.

Podobnie jak w poprzednim temacie polecam metodę kartki i ołówka (ewentualnie długopisu) :wink:


(Drobok) #6

Lepiej sobie w paincie naszkicować. Szanujmy zieleń :))


(alabama1) #7

"Nie miałem pomysłu co z tym zrobić" oznaczało to, że wiedziałem, że jest to błąd związany z przepełnieniem rozmiaru tablicy oraz to, że nie miałem pomysłu na jakąś zmianę. Już się zabieram za wasze rady.

20:15- można chyba powiedzieć, że rozumiem.