Program sortujący liczby w tablicy nie robi tego prawidłowo

0

Witam,próbuję sobie napisać program który posortuje elementy w tablicy.Już nie zgłębiając sie w to,czy sama procedura sortująca działa to tablica wypełnia mi się samymi zerami.Ktoś coś mi powie na ten temat?

 program Project1;

type

  Ttab = array[0..20] of integer ;

var

  tab:Ttab;
  a,i:integer;

  function fill(tab:Ttab):Ttab;

  var
    tab1:Ttab;

  begin
    for i:=low(tab) to high(tab) do
    begin
      tab[i]:=random(20);
    end;
    result := tab;
  end;

 procedure print(tab:Ttab);
    begin
    for i:=low(tab) to high(tab) do
    begin
      writeln(tab[i]);
    end;
  end;

 procedure sort(tab:Ttab);
 begin
    for i:=low(tab) to high(tab) do
    begin
     if(tab[i]<tab[i+1])then
     begin
       a:=tab[i];
       tab[i]:=tab[i+1];
       tab[i+1]:=a;
     end;
  end;
 end;

begin

   fill(tab);
   print(tab);
   writeln();
   sort(tab);
   print(tab);
   readln();

end.
        
0

Tak najprościej:

Zamień:

fill(tab);

na:

tab := fill(tab);
0

Rozwiązaem już problem w trochę inny sposób-zamieniłem funkcję fill na procedure.
Mógłbyś mi jednak podpowiedzieć dlaczego nie działa mi to sortowanie?(2 razy wyświetla identyczną tablice) a przykłady w internecie są praktycznie takie same jak to co napisałem

0

Mógłbyś mi jednak podpowiedzieć dlaczego nie działa mi to sortowanie?

Sądzę, że chciałeś zaimplementować sobie sortowanie bąbelkowe - niestety nie wyszło; W tym sortowaniu są dwie pętle, a Ty masz jedną, więc nie ma szans na prawidłowe posortowanie tablicy; Są szczególne przypadki, dla których procedura ta będzie prawidłowo sortować dane, ale to nie zmienia faktu, iż algorytm jest niepoprawny;

Poza tym ten kod jest bardzo zły - wszystkie Twoje procedury pobierają w parametrze tablicę, a parametry te nazywają się dokładnie tak samo, jak zmienna globalna, która jest dostępna dla wszystkich procedur; Mało tego - do każdej procedury pakujesz kopię tablicy i nie wiadomo co z nią robić; Z mniejszych pierdół, na pewno musisz poprawić formatowanie kodu - przede wszystkim odpowiednio dobrać wcięcia i zacząć korzystać z klawisza Shift.

0

Ale moja tablica ma tylko 1 wymiar,więc czemu 2 pętle?Mógłbyś trochę przybliżyć mi temat?

dobrze,wiem już co było źle,teraz wszystko gra i śpiewa;) szkoda tylko,że sam na takie pomysły nie wpadam

0

Ale moja tablica ma tylko 1 wymiar,więc czemu 2 pętle?Mógłbyś trochę przybliżyć mi temat?

To nie chodzi o liczbę wymiarów macierzy, a o liczbę iteracji i sprawdzeń; Twój kod sortujący tylko raz przechodzi od początku tablicy do jej końca i zamienia co trzeba zamienić, a to nie wystarczy - potrzeba więcej iteracji;

Napisałem przykładowy programik na bazie Twojego, z wykorzystaniem najprostszego zapisu wspomnianego sortowania:

type
  TNumbersArr = array [0 .. 9] of Integer;

  procedure Fill(out ANumbers: TNumbersArr);
  var
    LIndex: Integer;
  begin
    for LIndex := Low(ANumbers) to High(ANumbers) do
      ANumbers[LIndex] := Random(10);
  end;

  procedure Sort(var ANumbers: TNumbersArr);
  var
    LDown, LTo, LSwap: Integer;
  begin
    for LDown := High(ANumbers) - 1 downto Low(ANumbers) do
      for LTo := Low(ANumbers) to LDown do
        if ANumbers[LTo] > ANumbers[LTo + 1] then
        begin
          LSwap := ANumbers[LTo];
          ANumbers[LTo] := ANumbers[LTo + 1];
          ANumbers[LTo + 1] := LSwap;
        end;
  end;

  procedure Show(const ANumbers: TNumbersArr);
  var
    LIndex: Integer;
  begin
    for LIndex := Low(ANumbers) to High(ANumbers) do
      Write(ANumbers[LIndex]:2);

    WriteLn();
  end;

var
  LNumbers: TNumbersArr;
begin
  Randomize();

  Fill(LNumbers);
  Show(LNumbers);
  Sort(LNumbers);
  Show(LNumbers);

  ReadLn();
end.

Macierz zostaje wypełniona liczbami pseudolosowymi, wyświetlona w konsoli, następnie posortowana i znów wyświetlona, aby zobaczyć różnicę; Przykład wyjścia w konsoli:

 8 9 7 9 8 6 5 1 4 7
 1 4 5 6 7 7 8 8 9 9

Zapoznaj się z tym kodem - w razie czego pozmieniaj sobie nazwy (zmiennych czy procedur), gdybyś takich nie lubił; Jeżeli programy piszesz w Lazarusie to w funkcji wyświetlającej zawartość macierzy można użyć pętli For In Do:

procedure Show(const ANumbers: TNumbersArr);
var
  LNumber: Integer;
begin
  for LNumber in ANumbers do
    Write(LNumber:2);

  WriteLn();
end;

Zapis będzie nieco krótszy, ale działanie identyczne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1