ďťż

Ładny brzuch

podczas ppisania programu natrafiłem na problem: mam dwie procedury sortowania. Pierwsza 'wywala' mi program, i drugą którą za bardzo nie wiem jak wywołać.

pierwsza
procedure WstawianiePolowkowe(N:integer; var Tab:TTab); var i,j,l,p,m:integer; x:real; begin for i:=2 to N do begin x := Tab[i]; l:=1; p:=i-l; while l<=p do begin m:=(l+p) div 2; if x<Tab[m] then p:=m-l else l:=m+l end; for j:=i-1 downto 1 do Tab[j+l]:=Tab[j]; Tab[l]:=x; end; end;

i jej wywołanie
writeln('--> SORTOWANIE PRZEZ PZRESZUKIWANIE I WSTAWIANIE POLOWKOWE <--'); ShowTab(N,Tab); T1:=GetTickCount; WstawianiePolowkowe(N,Tab); T2:=GetTickCount; T:=T2-T1; ShowTab(N,Tab); writeln; writeln('Czas wykonania: ',T,'ms');

druga
procedure SortowanieMieszane(N:integer; var Tab:TTab); var j,k,l,p:integer; x:real; begin j:=2; p:=n; k:=n; repeat for j:=p downto 1 do begin if Tab[j-l]>Tab[j] then begin x:=Tab[j-l]; Tab[j-l]:=Tab[j]; Tab[j]:=x; k:=j; end; end; l:=k+l; for j:=l to p do if Tab[j-l]>Tab[j] then begin x:=Tab[j-l]; Tab[j-l]:=Tab[j]; Tab[j]:=x; k:=j; end; p:=k-l; until l>p end;

i też jej wywołanie
writeln; writeln('--> SORTOWANIE MIESZANE <--'); ShowTab(N,Tab); T1:=GetTickCount; SortowanieMieszane(N,Tab); T2:=GetTickCount; T:=T2-T1; ShowTab(N,Tab); writeln; writeln('Czas wykonania: ',T,'ms');

Proszę o pomoc

P.S. Da się zrobić pasek postępu w Delphi( postęp sortowania)
Użytkownik Przemko2000 edytował ten post 03 styczeń 2008, 15:48



Pierwsza 'wywala' mi program

Czy my jesteśmy czarodziejami, żeby wiedzieć jaki błąd kryje się pod wyrazem "wywala" ?

Postęp:
ProgressBar1.Step := 1; //o ile za jednym razem ma się przesuwać ... ProgressBar1.StepIt; //wklejasz na początku pętli, albo na końcu, jak kto woli

Do ProgressBar1.Max przypisujesz ilość elementów do posortowania
Użytkownik DEV edytował ten post 03 styczeń 2008, 17:12
wywala - program po kompilacji chodzi do mometu wywołanie feralnej procedury i sie i okno programu się zamyka


wywala - program po kompilacji chodzi do mometu wywołanie feralnej procedury i sie i okno programu się zamyka
Polecam odpalić z lini poleceń to zapewne zobaczysz komunikat błędu...



[Hint] Wstep_do_informatyki_program.dpr(154): Value assigned to 'j' never used [Warning] Wstep_do_informatyki_program.dpr(160): Variable 'l' might not have been initialized

To do procedury drugiej z pierwszej już zrezygnowałem.

@down
nie to nie to
Użytkownik Przemko2000 edytował ten post 03 styczeń 2008, 19:50

[Hint] Wstep_do_informatyki_program.dpr(154): Value assigned to 'j' never used [Warning] Wstep_do_informatyki_program.dpr(160): Variable 'l' might not have been initialized

To do procedury drugiej z pierwszej już zrezygnowałem.


Nie masz nic przypisanego do zmiennej "l"


@down
nie to nie to


Właśnie że po "begin" musisz dać gdzieś l:=???
Dlaczego? Ponieważ później korzystasz z tej zmiennej:
if Tab[j-l]>Tab[j] then
Jak kompilator może odjąć, skoro nie zna wartości, jaką należy odjąć?


Właśnie że po "begin" musisz dać gdzieś l:=???
Dlaczego? Ponieważ później korzystasz z tej zmiennej:
if Tab[j-l]>Tab[j] then
Jak kompilator może odjąć, skoro nie zna wartości, jaką należy odjąć?

Odejmuje program a nie kompilator ;). Program będzie znał, ale zapewne wartość nie będzie taka jak oczekiwana (np. będzie to -1 lub 12939 lub ... ;)).

A są jeszcze jakieś inne procedury sortowania oprócz:

1. Sortowania przez podział(QuickSort)
2. Sortowania przez proste wybieranie
3. Sortowania przez proste wstawianie
4. Sortowania bąbelkowego

Jest jeszcze sortowanie przez scalanie (używasz tutaj głównie rekurencji)
sortowanie kubełkowe

btw. tutaj masz właściwie większość opisaną

Sortowanie przez łączenie;
Sortowanie metodą Shella;
Chyba też sortowanie kubełkowe, ale pewien nie jestem.

A tak w ogóle, to szukaj w Google.

Mam taką procedure

procedure SortujKubelkowo(var Tab,TabP:TTab); var i,j:integer; begin for i:=1 to N do TabP[Tab[i]]:=TabP[Tab[i]]+1; //tu jest ten błąd i:=1; j:=1; repeat while TabP[i]>0 do begin Tab[j]:=i; inc(j); TabP[i]:=TabP[i]-1; end; inc(i); until j>N; end;
Podczas kompilacji wyskakuje błąd
[Error] zaje_program.dpr(273): Incompatible types: 'Integer' and 'Real'
Jak to poprawić?

@down:

chyba nie ma rzutowania w pascalu/delphi
Użytkownik Przemko2000 edytował ten post 07 styczeń 2008, 21:55
Strzelam w ciemno, bo delphi nie znam, ale na moja głowę to typy się nie zgadzają. Trzeba użyć rzutowania czy konwersji :P

W Delphi i w Pascalu jest rzutowanie, ale tutaj może na nic się nie zdać, lepiej po prostu zaokrąglać. Ale że od dawien dawna nie pisałem w Delphi, to nie pamiętam, jak to się robiło :D
Może round()?

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •