Metoda dziel i zwyciężaj - brak wiedzy odnośnie kodu

0

Witam analizuje sobie kod metody dziel i zwyciężaj i po prostu nie rozumiem nie których linijek jakby ktoś mógł mi wytłumaczyć ;)

program metoda_dziel_i_zwyciezaj;
uses crt;
var
     tablica:array[1..50] of integer;
     tablicam:array[1..25] of integer;
     tablicaw:array[1..25] of integer;
     i,j,max,min: integer;
 
procedure losowanie;
    begin
      randomize;
        for i:=1 to 50 do begin
            tablica[i]:=random(101);
        end;
    end;
    procedure dziel;
      begin
        j:=0;
        i:=1;
        repeat
           if tablica[i]<tablica[i+1] then
               begin
                  j:=j+1;
                  tablicam[j]:=tablica[i];
                  tablicaw[j]:=tablica[i+1];
              end else
               begin
                  j:=j+1;
                  tablicaw[j]:=tablica[i];
                  tablicam[j]:=tablica[i+1];
              end;
           i:=i+2;
        until i>=50;
    end;
    procedure zwyciezaj;
       begin
          min:=tablicam[1];
          for i:=1 to 25 do if tablicam[i]<min then min:=tablicam[i];
          max:=tablicaw[1];
          for i:=1 to 25 do  if tablicaw[i]>max then max:=tablicaw[i];
       end;
 begin
    clrscr;
    losowanie;
    writeln('Wylosowane liczby');
    for i:=1 to 50 do write (tablica[i],' ');
    dziel;
    zwyciezaj;
    writeln;
    writeln('Liczba najmniejsza ',min);
    writeln('Liczba najwieksza ',max);
    repeat until keypressed;
 end. 

Mam tutaj ten kodzik i tak nie rozumiem procedury dziel;

ponieważ z góry mamy założone i= 0 , j = 1 i ~~> if tablica[i]<tablica[i+1] then ...

jeśli to powtarza i i= 1 potem 2 potem 3 potem 4 to po co pisać else nie wiem czy dobrze to rozumiem bo i tak zawsze i+1 będzie wieksze

i po co jest ta linijka j:=j+1; tego nie rozumiem wgl

i czemu jest to tablicam[j] np a nie i ?

co to jest to j ?

i dla czego jest na koncu i:= i+2 ????

procedure zwyciezaj i losowanie rozumiem

Jeśli ma ktoś chwilę czasu żeby mi to wytłumaczyć byłbym naprawdę bardzo wdzięczny !

Pozdrawiam!

1

Mam dwie rady:

  1. Nie analizuj cudzych kodów kiedy nie wiesz co robią i nie wiesz czy są dobre. Patrząc jak ktoś jeździ na riwierze nie nauczy cię jeździć.
  2. Zacznij od prostszych rzeczy, które nie będziesz musiał podglądać, zaś w ciągu powiedzmy godziny sam ogarniesz.
1

jeśli to powtarza i i= 1 potem 2 potem 3 potem 4 to po co pisać else nie wiem czy dobrze to rozumiem bo i tak zawsze i+1 będzie wieksze

  1. wartość tablica[i + 1] nie musi być wcale większa od tablica[i], ponieważ nie porównujesz liczby i tylko element w tablicy.
  2. Kod pisany przez kogoś to nie wyrocznia, tutaj faktycznie ktoś nie pomyślał i np. w obu blokach if-else pisze coś takiego j:=j+1; (duplikacja kodu), i zmienne głupio nazwał tablicam i tablicaw(łatwo o pomyłkę) i powtórzona logika, tj. to:
tablicam[j]:=tablica[i];
tablicaw[j]:=tablica[i+1];

oraz to:

 tablicaw[j]:=tablica[i];
 tablicam[j]:=tablica[i+1];

można by scalić w jedno...

generalnie nie dziwne więc, że Mam tutaj ten kodzik i tak nie rozumiem procedury dziel;, bo kod, który jest słabej jakości i zawiera nadmiarowe sformułowania ciężko zrozumieć.

edit:
Niestety zła wiadomość jest taka, że w profesjonalnym programowaniu będziesz miał do czynienia z kodem jeszcze gorszej jakości (chociaż pewnie nie w Pascalu, ale język programowania najmniej ważny w tej chwili).

0

To jest jakiś prostszy kod łatwiejszy do zrozumienia bez zawiłości i jakiś błędów który byście polecili ?
Metody dziel i zwyciężaj w pascalu

0
LukeJL napisał(a):

... i powtórzona logika, tj. to:

tablicam[j]:=tablica[i];
tablicaw[j]:=tablica[i+1];

oraz to:

 tablicaw[j]:=tablica[i];
 tablicam[j]:=tablica[i+1];

można by scalić w jedno...
To akurat nie bardzo da się scalić, a twoja pomyłka spowodowana dokładnie tym o czym mówisz tuż wcześniej:

LukeJL napisał(a):

... zmienne głupio nazwał tablicam i tablicaw (łatwo o pomyłkę)

1

http://4programmers.net/Forum/1160806
W tym temacie masz coś na kształt swojego dziel i zwyciężaj. Dzielenie dużej tablicy na 4 mniejsze, sortowanie ich, a następnie scalenie w jedną tablice już posortowaną.

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