sortowanie bąbelkowe [pascal]

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
Wojtol
Sędziwy Jeż
Sędziwy Jeż
Posty: 45
Rejestracja: 30 sty 2007, 20:56
Płeć: Mężczyzna
Wersja Ubuntu: 8.04
Środowisko graficzne: GNOME

sortowanie bąbelkowe [pascal]

Post autor: Wojtol »

Witam. Mam pewien problem. Chcę posortować tablicę bąbelkowo. Program kompiluje się, jednak nie wiem dlaczego nie działa jak powinien. Mógłby mi ktoś wskazać błąd? Oto kod programu:

Kod: Zaznacz cały

program bombel;
uses
        Crt;
var
        i,j,tmp:integer;
        tab:array [1..15] of integer;
BEGIN
        clrscr;
        randomize;


	writeln ('tablica przed sortowaniem');
        for i:=1 to 15 do
        begin
        tab [i]:=random(100);
        writeln (tab[i]);
	end;

readln;

        for i:=1 to 14 do
        if tab[i] >tab[i+1] then
        begin
        tmp:=tab[i];
        tab[i]:=tab[i+1];
        tab[i+1]:=tmp;
        end;
     writeln ('wypisywanie po sortowaniu: ');
     begin
     for i:=1 to 15 do
     writeln (tab[i]);
     end;
readln;
        end.
Program porównuje wartość tablicy 1 z wartością tablicy 2. Jeśli wartość tablicy 1 jest większa program przesuwa ją "do góry" i w kolejnym obrocie pętli porównuje ją z kolejną wartością tablicy. Gdzie popełniam błąd? Proszę o pomoc ;)
rafal_rr
Sędziwy Jeż
Sędziwy Jeż
Posty: 57
Rejestracja: 27 paź 2008, 22:50
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Re: sortowanie bąbelkowe [pascal]

Post autor: rafal_rr »

nie dotykałem pascala z 3 lata, ale

1. formatowanie....
2. program wygląda poprawnie. możesz wrzucić całość wykonania programu z konsoli?
Awatar użytkownika
Wojtol
Sędziwy Jeż
Sędziwy Jeż
Posty: 45
Rejestracja: 30 sty 2007, 20:56
Płeć: Mężczyzna
Wersja Ubuntu: 8.04
Środowisko graficzne: GNOME

Re: sortowanie bąbelkowe [pascal]

Post autor: Wojtol »

Już jest ok, program działa. zamieszczam kod programu- może komuś kiedyś się przydać. ;) i krótko wyjaśnię jak działa ten program. Mam nadzieję, że to pomoże początkującym programistom ;)

Kod: Zaznacz cały

program bmbel;
uses
        Crt;
var
        i,j,tmp:integer;
        tab:array [1..15] of integer;     {i do 15 to ilość elementów tablicy}
BEGIN
        clrscr;
        randomize;


	writeln ('tablica przed sortowaniem');
        for i:=1 to 15 do
        begin
        tab [i]:=random(100);            {przypisujemy każdemu elementowi tablicy wartość losową}
        writeln (tab[i]);
	end;

    { S O R T O W A N I E }

readln;
        for i:=1 to 14 do                  
        for j:=1 to 14 do
        if tab[j] >tab[j+1] then
        begin
        tmp:=tab[j];
        tab[j]:=tab[j+1];
        tab[j+1]:=tmp;
        end;
     writeln ('wypisywanie po sortowaniu: ');
     begin
     for i:=1 to 15 do
     writeln (tab[i]);
     end;
readln;
        end.
Do czasu sortowania wszystko wydaje się proste. Postaram się wyjaśnić procedurę sortowania po kolei:
weźmy np. przykład tablicy zlożonej z elementów:
2 5 3 8 4

i teraz pytanie.. jak to działa? popatrzmy..

Kod: Zaznacz cały

for i:=1 to 4 do
        for j:=1 to 4 do    {1 do 5 ponieważ nasza przykladowa tablica zawiera 5 elementów}
        if tab[j] >tab[j+1] then
        begin
        tmp:=tab[j];
        tab[j]:=tab[j+1];
        tab[j+1]:=tmp;
        end;
Na początku zmienna sterująca (j) ma wartość 1. Po każdym obrocie pętli wartość ta rośnie o 1, czyli oznacza to, że pętla for będzie się wykonywała 14 razy. Na przykladzie naszej tablicy: po pierwszym obrocie pętli element pierwszy tablicy (2) porówna się z elementem drugim (5). Element o wartości 2 nie jest większy więc nie nastąpi przestawienie wartości zmiennych. Konczy się pętla. Zmienna sterująca zmienia wartość na większą o 1 czyli uzyskuje wartość 2, teraz z kolei porównywany jest element drugi z trzecim czyli wartości 5 i 3. 5 jest większe niz 3 dlatego następuje zmiania zmiennych (wartość tablicy 2 zamienia się z wartością tablicy 3). po wykonaniu tej pętli 5 razy liczby mogą się przesunąć maxymalnie o jedną pozycję w prawo lub w lewo, czyli na przykladzie naszej tablicy będzie wyglądało to tak:

2 3 5 4 8

Widzimy, że elementy dalej nie są posortowane. Dlatego w programie została użyta jeszcze jedna petla for:

Kod: Zaznacz cały

for i:=1 to 4 do
pętla ta pozwala na przejście pierwszego element tablicy na sam koniec np. jeśli nasza tablica ma elementy:
8 1 1 1 1 1 1 5
to pętla musi zostać wykonana 7 razy by element z początku przeniósł się na koniec.

Mam nadzieję, że w jakiś sposób pomogłem ;)
Awatar użytkownika
cukier_lukier
Przyjaciel
Przyjaciel
Posty: 1250
Rejestracja: 14 cze 2006, 18:25
Płeć: Mężczyzna
Wersja Ubuntu: 14.04
Środowisko graficzne: Brak
Architektura: x86

Re: sortowanie bąbelkowe [pascal]

Post autor: cukier_lukier »

pętla ta pozwala na przejście pierwszego element tablicy na sam koniec np. jeśli nasza tablica ma elementy:
Na szybko - tak naprawdę ta pętla (i) pozwoli wykonać się i razy zagnieżdżonej w niej pętli for (j). Transportem zajmuje się (i to też zależy od danego przypadku, np jeśli na początku będziesz miał 1 a potem same 9 to nic się nie przeniesie) właśnie ta druga for.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość