• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

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

Object Storage Arubacloud
0 głosów
537 wizyt
pytanie zadane 27 grudnia 2015 w Inne języki przez niewiem17 Początkujący (480 p.)

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!

2 odpowiedzi

+1 głos
odpowiedź 28 grudnia 2015 przez sonquer Gaduła (4,280 p.)

Witaj, bez zbędnego pitolenia przejdę do rzeczy.

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

Otóż nie, mylisz się. Porównujesz wtedy element o indeksie n do elementu o indeksie n+1 czyli poprzedni do następnego. Więc warunek jest ok bo z tego co widzę trafia to do innych tablic. Pozwolę sobie przy okazji pominąć komentowanie działania jak i estetykę owego kodu powołując się na klauzurę sumienia.

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

Proste, ponieważ musisz iterować zmienną i owa musi rosnąć
podstaw sobie tam wartość np:0 i zacznij od niej, będzie wyglądało to tak:

0:=0+1 // 1
1:=1+1 // 2
2:=2+1 // 3

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

Ponieważ byłyby puste elementy w tablicy, albo nie tyle co puste lecz pewne elementy zostałby pominięte.
Dlatego też w Delphi stosuje się teraz taką implementację:
 

tablica := tablica + [ <jakaś wartość, np: 10 > ]

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

Jest tak ponieważ przeskakujesz o 2 indexy do przodu, bo skoro już coś sprawdziłeś to nie będziesz tego sprawdzał raz jeszcze, przynajmniej to wynika z tego kodu. Jeszcze wiele ale to wiele nauki przed Tobą, ale nie łam się i idź do przodu. Pozdrawiam! :-)

komentarz 28 grudnia 2015 przez niewiem17 Początkujący (480 p.)
Dzięki za wytłumaczenie tego postaram się ogarnąć a co do tego kodu o którym wspomniałeś widziałeś albo masz może kod który jest bardziej czytelnie rozpisany czy łatwiejszy, wiem że na necie jest tego pełno ale nie wiem z którego jest lepiej nauczyć tego działania.
komentarz 28 grudnia 2015 przez sonquer Gaduła (4,280 p.)

Jak dzisiaj znajdę chwilkę to coś Ci wyskrobię razem z komentarzami kodu.
Wracając jeszcze do twojego dzieła, czy wiesz że ten kod jest trochę popsuty? jest tak ponieważ może Cię oszukiwać z wartościami:

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];

 

Za wartość max powinieneś przyjąć 0 natomiast za min rzekłbym że nawet integer max value.

komentarz 29 grudnia 2015 przez niewiem17 Początkujący (480 p.)
Byłbym wdzięczny jeżeli byś mi coś wyskrobał ;)
komentarz 29 grudnia 2015 przez sonquer Gaduła (4,280 p.)
program Main;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

var
  tab : array of Integer; // zbiór elementów typu Integer o niekoreślonej wielkości
  max : Integer = 0;
  min : Integer = MaxInt; // 2147483647

procedure dziel_i_zwyciezaj( l,p : Integer );
var
  s : Integer;
begin
  { jeżeli lewy indeks jest większy od prawego zakończ "rozwijać" procedurę w pamięci }
  if l > p then
    Exit;

  { wybranie środkoego elementu między lewym indeksem a prawym }
  s := ( l + p ) div 2;
  { jeżeli element środkowy jest większy od max przypisz do max ten element }
  if tab[s] > max then max := tab[s];
  if tab[s] < min then min := tab[s];

  { rozwijaj dalej tą procedurę w pamięci "tnąc tablicę na fragmenty" }
  dziel_i_zwyciezaj(l,s-1);
  dziel_i_zwyciezaj(s+1,p);
end;

var
  I : Integer;
begin
  { obsługa wyjątku }
  try
    randomize;
    { losowanie 50 liczb z zakresu 0 - 255 }
    for I := 0 to 50 do
      begin
        tab := tab + [ Random(255) ]; // tablica = <poprzednie elementy> + <następny>
        { ostatni wypisywany element bez przecinka }
        if I <> 50 then Write( tab[I], ', ' )
        else Write( tab[I] )
      end;
    Writeln;

    { wywołanie procedury rekurencyjnej }
    dziel_i_zwyciezaj( 0, length(tab)-1 );
    Writeln('max : ', max);
    Writeln('min : ', min);

    Readln;
  except
    on E: Exception do
      begin
        {tylko w trybie debug wypisz błąd }
        {$IFDEF Debug}
          Writeln(E.ClassName, ': ', E.Message);
          Readln;
        {$ENDIF}
      end;
  end;
end.

 

komentarz 30 grudnia 2015 przez niewiem17 Początkujący (480 p.)
Błąd mi wywala przy tym  System.SysUtils; to jakieś dodatki trzeba wgrać do pascala?

wgl jeszcze nie miałem tego

{$APPTYPE CONSOLE}

{$R *.res}

muszę poczytać co nie co
0 głosów
odpowiedź 8 stycznia 2016 przez niewiem17 Początkujący (480 p.)
Witam to jeszcze raz ja teraz chciałbym żebyście zobaczyli czy oby na pewno wszystko rozumiem poprawnie. :)

Rozpisalem sobie to wszystko na kartce i wydaje mi się że
rozumiem to tak

Mam tablice i wypisalem sobie wylosowane przykladowe elementy

element :1  2  3   4   5   6

tablica[ 4, 8, 20, 10, 6, 3]

no i jedziemy 1 parę

element 1 i 2
 czyli      4   8

tablica[1 element] < tablicy [ i+1 czyli 2 element]
      jest mniejsze bo 4 < 8 then
j=1     ~~> tablicam[1 element] = tablica[1 element] czyli 4
            tablicaw[1 element] = tablica[i+1 element czyli 2element] czyli 8

i przykładowo 2 para czy rozumiem
element   3     4
               20   10

     tablica[3 element] < tablica [i+1 element czyli 4 element]
          nie bo 20 < 10 wtedy else

         i j:=2
      tablicam[2] = tablica[n+1 czyli 4 element] czyli 10
      tablicaw[2] = tablica[i czyli 3 element] czyli 20

i jest rowne 3 i 4 teraz bo i=i+2 czyli przeskakuje o 2

Mam nadzieje że jest to tak jak napisałem i że zrozumiałem ;)
Proszę o odpowiedź.

Podobne pytania

0 głosów
2 odpowiedzi 1,417 wizyt
0 głosów
1 odpowiedź 387 wizyt
pytanie zadane 12 października 2016 w Inne języki przez Josi Nowicjusz (190 p.)
+1 głos
4 odpowiedzi 1,047 wizyt
pytanie zadane 29 grudnia 2015 w Inne języki przez niewiem17 Początkujący (480 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...