Gdzie jest błąd w tym prostym kodzie?


(Bochenekmarcin) #1

witam,

nie mogę znaleźć błędu w kodzie, albo mi tablicy nie sortuje albo sortuje tylko tego nie wyświetla, nie wiem gdzie może być błąd, proszę więc o pomoc, nie jestem doświadczony w programowaniu więc błąd może być banalny.

z góry dzięki

program SortowanieFlagami; {autor: mb}


{$APPTYPE CONSOLE}


uses

  SysUtils,

  Math;


var

  a:array of integer;

  f,t:integer;


procedure generuj01 (var a:array of integer);

  var

    i:integer;

  begin

    randomize;

    for i:=0 to high(a) do

      a[i]:=random(2);

  end;


procedure generuj012 (var a:array of integer);

  var

    i:integer;

  begin

    randomize;

    for i:=0 to high(a) do

      a[i]:=random(3);

  end;


procedure wyswietl (var a:array of integer);

  var

    i:integer;

  begin

    for i:=0 to high(a) do

      write(a[i],' ');

      writeln;

  end;


procedure flagapolska(a:array of integer);

  var

    k0,p1,x:integer;

  begin

    k0:=-1;

    p1:=high(a)+1;

    while k0
    begin

      repeat k0:=k0+1 until (a[k0]=1) or (k0=high(a));

      repeat p1:=p1-1 until (a[p1]=0) or (p1=0);

      if k0
      begin

        x:=a[k0];

        a[k0]:=a[p1];

        a[p1]:=x;

      end;

    end;

  end;


procedure flagafrancuska(a:array of integer);

  var

    k0,k1,p2,x1,x2:integer;

  begin

    k0:=-1;

    k1:=0;

    p2:=high(a)+1;

    while k1
    begin

      if a[k1]=0 then

        begin

          inc(k0);

          x1:=a[k0];

          a[k0]:=a[k1];

          a[k1]:=x1;

          inc(k1);

        end

      else

        if a[k1]=1 then inc(k1)

      else

        begin

          dec(p2);

          x2:=a[k1];

          a[k1]:=a[p2];

          a[p2]:=x2;

        end;

    end;

  end;




begin

  Writeln('Program sortujacy flagami');

  Writeln('Wybierz 1 dla sortowania FLAGA POLSKA');

  Writeln('Wybierz 2 dla sortowania FLAGA FRANCUSKA');

  Readln(f);

  writeln;

  case f of

    1:begin

        writeln('Wybrales sortowanie FLAGA POLSKA');

        writeln('Podaj dlugosc tablicy');

        readln(t);

        setlength(a,t);

        generuj01(a);

        writeln;

        writeln('Wylosowano nastepujaca tablice do posortowania');

        wyswietl(a);

        flagapolska(a);

        writeln;

        writeln('Oto posortowana tablica:');

        wyswietl(a);

        writeln;

      end;

    2:begin

        writeln('Wybrales sortowanie FLAGA FRANCUSKA');

        writeln('Podaj dlugosc tablicy');

        readln(t);

        setlength(a,t);

        generuj012(a);

        writeln;

        writeln('Wylosowano nastepujaca tablice do posortowania');

        wyswietl(a);

        flagafrancuska(a);

        writeln;

        writeln('Oto posortowana tablica:');

        wyswietl(a);

        writeln;

      end;

    else writeln('Zly znak wprowadzony z klawiatury! Wybierz 1 lub 2.');

  end;

writeln('Dziekuje za skorzystanie z programu');

writeln('Nacisnij ENTER, aby zakonczyc...');

readln;

end.

(Bochenekmarcin) #2

nikt nie potrafi pomoc? wydawalo mi sie ze nic w tym trudnego nie ma :frowning:


(Kuna 87) #3

Nie znam sie moze aż tak .. ale według mnie to troche namieszałeś ... po pętli for z tego co wiem to używa sie begin..


(Benji8) #4

jeśli w pętli będzie więcej niż jedna instrukcja to zgadzam się, trzeba wtedy użyć begin,

mbs600 - powiedz lepiej jaki błąd wyskakuje


(Bochenekmarcin) #5

wszystko chodzi i sie kompiluje, program startuje ale:

  1. albo nie sortuje bo przed sortowaniem i po sortowaniu jest wyświetlana taka sama tablica

  2. albo sortuje ale nie wyswietla nowej tablicy- nie wydobywa jej z pamięci.

wrzućie sobie do jakiegoś środowiska programistycznego i zobaczycie :slight_smile: nie wiem co z tym zrobić :confused: