Post by Marco Kurvers on May 16, 2024 14:15:30 GMT
Onderstaande twee voorbeelden geven hetzelfde sorteerresultaat. Het laat zien dat het niet moeilijk is om uit een dataset een bepaalde kolom te sorteren.
De twee voorbeelden geven verschillende versies. De eerste met de standaard BASIC mogelijkheden en de tweede met een moderne BASIC code. Alle twee werken in Liberty BASIC. Het eerste voorbeeld kan ook werken in QB64, maar waarschijnlijk zal dan de label wat aangepast moeten worden.
De twee voorbeelden geven verschillende versies. De eerste met de standaard BASIC mogelijkheden en de tweede met een moderne BASIC code. Alle twee werken in Liberty BASIC. Het eerste voorbeeld kan ook werken in QB64, maar waarschijnlijk zal dan de label wat aangepast moeten worden.
'gewijzigde BubbleSort versie
' FiegeCSV
' Sorting an csv file by 2 columns
' v 0.03
' Liberty basic 451
' inspired by a question/idea from Hans Fiege
' proof of concept - no optimalization - many conditions just assumed
' is aangeboden aan de HCC LB groep
' program sorteert op plaatsnaam
' indien gelijkheid, dan verder sorteren op voornaam.
' Er wordt dus gesorteerd op twee kolommen, maar niet tegelijk....
' De twee kolommen hebben een onderlinge prioriteit
' ...en dat is de kern van het misverstand vorige week 8 feb 2024.
nrec=8 ' number of records
a$(1)="Paul, Baak, ,1915, Gotoplein, 170, Voorburg"
a$(2)="Gordon, Rahman, ,1950, Geer Tasserstraat, 6, Haarlem"
a$(3)="Marco, Kurvers, ,1973, Libertyroad, 451, Barneveld"
a$(4)="Wim, Beek, van, 1951, Zandsteeg, 13, Zoeterwoude"
a$(5)="Bas, Neve, , 2000, Feyenoordkuipstraat, 2, Rotterdam"
a$(6)="Hans, Fiege, , 1940, Champs Elysee, 99, Parijs"
a$(7)="Achmed, Abutaleb, , 1960, Coolsingel, 1, Rotterdam"
a$(8)="Baruch, Spinoza, , 1629, Kerkstaat, 13, Voorburg"
for j=1 to nrec 'toon oorspr. data
print a$(j)
next j
[dobubbel]
swapped=0
for n=1 to (nrec-1) ' bubblesort
' n is het eerste record in de bubbelronde, n+1 de tweede
' p is een pointer voor de stringbewerkingen
' veld1$ en 2 zijn bepalend voor een swap
for p=len(a$(n)) to 1 step -1 ' bepaal veld in kolom 7
if mid$(a$(n),p,1)="," then veld1$=mid$(a$(n),p+2):exit for
next p
for p=len(a$(n+1)) to 1 step -1 ' bepaal andere veld in kolom 7
if mid$(a$(n+1),p,1)="," then veld2$=mid$(a$(n+1),p+2):exit for
next p
if veld1$>veld2$ then 'goto [quit1] ' tweetal is reeds gesorteerd, dus wegwezen
temp$=a$(n):a$(n)=a$(n+1):a$(n+1)=temp$:swapped=1
' plaatsnamen dus gelijk; we sorteren verder op voornaam:
else
if veld1$ = veld2$ then
for p=1 to len(a$(n)) ' bepaal veld in kolom 1
if mid$(a$(n),p,1)="," then veld1$=left$(a$(n),p-1) : exit for
next p
for p=1 to len(a$(n)) ' bepaal andere veld in kolom 1
if mid$(a$(n+1),p,1)="," then veld2$=left$(a$(n+1),p-1) : exit for
next p
if veld1$>veld2$ then temp$=a$(n):a$(n)=a$(n+1):a$(n+1)=temp$:swapped=1
end if
end if
next n
if swapped=1 then [dobubbel]
print
for j=1 to nrec ' after sorting
print a$(j)
next j
'*** Tweede voorbeeld is gemoderniseerd ***
data$ = "Paul,Baak,,1915,Gotoplein,170,Voorburg;" + _
"Gordon,Rahman,,1950,Geer Tasserstraat,6,Haarlem;" + _
"Marco,Kurvers,,1973,Libertyroad,451,Barneveld;" + _
"Wim,Beek,van,1951,Zandsteeg,13,Zoeterwoude;" + _
"Bas,Neve,,2000,Feyenoordkuipstraat,2,Rotterdam;" + _
"Hans,Fiege,,1940,Champs Elysee,99,Parijs;" + _
"Achmed,Abutaleb,,1960,Coolsingel,1,Rotterdam;" + _
"Baruch,Spinoza,,1629,Kerkstraat,13,Voorburg"
dim a$(8)
a$(0) = str$(8)
nRec = val(a$(0))
call VulArray nRec, data$
call BubbleSort nRec
print
call ToonArray nRec
sub VulArray nRec, data$
for i = 1 to nRec
a$(i) = word$(data$, i, ";")
next i
call ToonArray nRec
end sub
sub ToonArray nRec
for i = 1 to nRec
print a$(i) 'print de records
next i
end sub
sub BubbleSort nRec
do
swapped = 0
for n = 1 to nRec - 1
veld1$ = word$(a$(n), 7, ",")
veld2$ = word$(a$(n + 1), 7, ",")
if veld1$ > veld2$ then
temp$ = a$(n)
a$(n) = a$(n + 1)
a$(n + 1) = temp$
swapped = 1
else
if veld1$ = veld2$ then
'plaatsnamen zijn gelijk; we sorteren verder op voornaam
veld1$ = word$(a$(n), 1, ",")
veld2$ = word$(a$(n + 1), 1, ",")
if veld1$ > veld2$ then
temp$ = a$(n)
a$(n) = a$(n + 1)
a$(n + 1) = temp$
swapped = 1
end if
else
'tweetal is al gesorteerd
end if
end if
next n
loop while swapped
end sub