Archief - [PROG] Delphi Bubblesort

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Republika

Legacy Member
hallo

ik heb een probleempje met een sorteermethode (bubblesort) in Delphi en ik hoop dat iemand mij hier kan helpen.
Het programma sorteert cijfers van groot naar klein.

Mijn probleem is nu dat ik op het einde van een reeks gesorteerde cijfers het cijfer "0" krijg en als het cijfer groter is dan 10 negeert hij het grootste cijfer.

dus als ik hem bijvoorbeeld zeg om deze cijfers van groot naar klein te sorteren "5, 6, 9, 8, 7," krijg ik dit "9, 8, 7, 6, 5,0"
Vanwaar komt die nul ?

En als ik hem zeg om deze cijfers te sorteren "98, 65, 32, 78, 12" krijg ik dit:
"78, 65, 32, 12, 0"
Waarom die 0? En waarom staat het grootste cijfer er niet bij?

code:

program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
a:array[1..5] of integer;
p,k: integer;
begin
begin
for k:=1 to 5 do
read (a[k]);
end;
begin
for k:=1 to 15 do
begin
p:=a[k];
a[k]:=a[k+1];
a[k+1]:=p;
end;
end;
begin
for k:=1 to 5 do
write (a[k]);
end;
end.

Tyfius

Legacy Member
Ik ken niets van delphi, dus vergeef mij een eventuele fout.

for k:=1 to 5 do
In de meeste talen begint een array bij 0 te tellen, logisch zou ik dan zeggen dat vermits je van 1 begint uw grootste getal niet getoond wordt, en je bij 5 eindigt in plaats van 4 de rest van je array 0 weergeeft.

't Kan dus zijn dat ik hier compleet fout ben, maar dat is zo 't eerste wat me opviel :)

Republika

Legacy Member
bedankt voor je antwoord maar het heeft helaas niet geholpen. Nu werkt er totaal niks meer :/

i386dx

Legacy Member
Wat als ge uwe array wat groter maakt? a:array[1..10]

zoals tyfius al zei is het trouwens wel logischer om uwe array bij 0 te laten beginnen (array[0..10] ofzo, maakt nie uit dat uwe array veel te groot is, dan zijde zeker dat uw fout daar nie zit).

//edit: je code nog eens verder bekeken:

deze blok:
Code:
for k:=1 to 15 do
  begin 
    p:=a[k];
    a[k]:=a[k+1];
    a[k+1]:=p; 
  end;

to 15... moet da nie 5 zijn? Uwe array is maar 5 groot.

//edit2: mijne eerste edit komt wa laat ;-).

wlibaers

Legacy Member
In deze taal kies je zelf een indexbereik, en hier is dat beginnend bij 1, dat is dus wel in orde. Ik denk eerder dat het aan het buiten de array lezen/schrijven ligt.

Deze regel bijvoorbeeld:
for k:=1 to 15 do
15? Nogal groot als index voor een array die tot 5 gaat. En eigenlijk zou k maar tot 4 mogen gaan als je k+1 ook als index gebruikt.

Republika

Legacy Member
Sorry, die 15 was een typfout, moest eigenlijk een 5 zijn. Ik heb nu die die array naar 4 veranderd. Dit heeft het probleem met die "0" wel opgelost maar de cijfers worden niet in volgorde gesorteerd maar willekeurig door elkaar.

i386dx

Legacy Member
Kijk dit eens na (komt van internet, zoeken op bubblesort en pascal (das de taal die Delphi gebruikt))

Code:
program Arrays;
 
var
   a: array[1..5] of Integer;
   i, j, tmp: Integer;
 
begin
   a[1] := 23;
   a[2] := 45;
   a[3] := 12;
   a[4] := 56;
   a[5] := 34;
   for i := 1 to 4 do
      for j := 2 to 5
         if a[j] > a[j + 1] then
            begin
               tmp := a[j];
               a[j] := a[j + 1];
               a[j + 1] := tmp;
            end
end.

.Acku.

Legacy Member
Ik ken geen Delphi maar als ik goed versta is dit uw algoritme

for k:=1 to 15 do
begin
p:=a[k];
a[k]:=a[k+1];
a[k+1]:=p;
end;

wat in java niet meer is als
for (int index=0;index<15;index++) {
int p = getallen[index];
getallen[index] = getallen[index+1];
getallen[index+1] = getallen[index]
}

de rest van uw statements initaliseren vars en lezen/schrijven ze naar de console.
Dat is dus allesbehlave een bubblesort algoritme. Het is slechts een klein deel ervan, je gaat nergens nar of een getal groter is als zijn buur. Je plaatst gewoon het eerste getal op de laatste plaats op een erg onhandige manier :)

Wat jij hoort te doen is blijven wisselen in de rij tot er een getal komt die groter is, dan stop je, en herbegin je bij de volgende in rij.

killgore

Legacy Member
nog nooit in delphi geprogrammeerd, maar dat trekt nu is perfect op maple code eh :p (prolly is maple daarop gebaseerd dus :)).

Maar, mis ik nu niets? die swaps moeten toch enkel gebeuren als je ene element groter is dan het andere :p (ik zie nergens een if in jouw code).

@2 hierboven:de bovengrens voor j is 5-i, het moet dus worden:
Code:
program Arrays;
 
var
   a: array[1..5] of Integer;
   i, j, tmp: Integer;
 
begin
   a[1] := 23;
   a[2] := 45;
   a[3] := 12;
   a[4] := 56;
   a[5] := 34;
   for i := 1 to 4 do
      for j := 2 to 5-i
         if a[j] > a[j + 1] then
            begin
               tmp := a[j];
               a[j] := a[j + 1];
               a[j + 1] := tmp;
            end
end.

ffs acku :p

EagleEye

Legacy Member
is het normaal om in die gekke taal arrays vanaf 1 te laten beginnen? :unsure:

Republika zei:
Sorry, die 15 was een typfout, moest eigenlijk een 5 zijn.
Als er nu één ding is dat ge niet moet maken tijdens het programmeren ;)

Bassman842

Legacy Member
killgore heeft de 2 problemen aangehaald

enerzijds moet je enkel wisselen tussen getal 1 en 2 als getal 1 groter (of kleiner al naargelang de sorteervolgorde) is dan het 2e

anderzijds mag je voor deze lus ook niet itereren tot en met 5, omdat je dan gaat vergelijken met het getal op plaats 6, wat in dit geval niet bestaat, en daar komt dan die bizarre 0 vandaan

+ moet je er nog een extra lus rondzetten om alle getallen te overlopen, en niet enkel het 1e te laten opborrelen naar boven
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan