Sortieren von Tabellen

Anfängerfragen zum Programmieren mit PureBasic.
Oli
Beiträge: 16
Registriert: 14.02.2006 13:14

Sortieren von Tabellen

Beitrag von Oli »

Hallo!

Wie kann ich folgendes Beispiel sortiert in einer Tabelle ausgeben?

Structure Spieler

Name.s
Alter.w
Groesse.w

Endstructure

Dim Teilnehmer.Spieler(10)


damit sowas rauskommt:

Name _ _ Punkte _ _ Sätze
1. Klaus _ 54 _ _ _ 22
2. Peter _ 38 _ _ _ 36
3. Tim _ _ 38 _ _ _ 27
4. Paul _ _ 22_ _ _ 17

Entscheidendes Kriterium sollen natürlich die meisten Punkte sein. Bei Punktegleichstand soll die höhere Anzahl an Sätzen gelten.

Mit Sortarray fluppt das irgendwie nicht.

Vielen Dank
Oli
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Vielleicht so?

Code: Alles auswählen

Structure Spieler
  Name.s
  Alter.w
  Groesse.w
  Punkte.l
  Saetze.l
EndStructure

Dim Teilnehmer.Spieler(10) 

Teilnehmer(0)\Name = "Pedro"
Teilnehmer(0)\Punkte = 10
Teilnehmer(1)\Name = "Miguel"
Teilnehmer(1)\Punkte = 50
Teilnehmer(2)\Name = "Sanchez"
Teilnehmer(2)\Punkte = 20

SortStructuredArray(Teilnehmer(), 1, OffsetOf(Spieler\Punkte),  #PB_Sort_Long)

For I = 0 To 2
  Debug  Teilnehmer(I)\Name + ": " + Str(Teilnehmer(I)\Punkte)
Next
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Oli
Beiträge: 16
Registriert: 14.02.2006 13:14

Beitrag von Oli »

Hallo ts-soft,

vielen Dank für deine Antwort.

Das Problem ist allerdings, dass ich nicht weiß, wie ich es bei Punktegleichstand schaffe, dass er dann den mit den meisten Sätzen zuerst ausgibt.

Ich brauche also sozusagen eine verschachtelte Sortierfunktion. Gibt es sowas?

Viele Grüße
Oli
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Versuch doch 2 Sortierungen, erst nach dem Zweirangigem und danach nach
dem Erstrangigem. Habs nicht getestet, sollte aber gehen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Oli
Beiträge: 16
Registriert: 14.02.2006 13:14

Beitrag von Oli »

Oh man!

Da wär ich nie drauf gekommen! :-)

Vielen Dank, es scheint zu funktionieren!
Oli
Beiträge: 16
Registriert: 14.02.2006 13:14

Beitrag von Oli »

Hallo nochmal!

Klappt leider doch noch nicht richtig mit der Tabelle ... :-(

Habe mal diese kleine Tabellen-Übung geschrieben.

Wie gesagt, erster soll der mit den meisten Punkten sein, bei Punktgleichheit soll die bessere Tordifferenz entscheiden (wie in Sportligen).
Doch beim zweiten Sortstructuredarray bringt er die Tordifferenz wieder durcheinander.
Structure Mannschaft
Name$

Punkte.w
Tore.w
Gegentore.w
Tordifferenz.w

EndStructure



Dim Team.Mannschaft(10)


Procedure Ausgabe_Tabelle()

If OpenWindow(0, 100, 100, 500, 400, #PB_Window_SystemMenu , "Tabelle")

If CreateGadgetList(WindowID())

ListIconGadget(0, 5, 5, 490, 390, "Platz", 40)
AddGadgetColumn(0, 1, "Mannschaft", 200)
AddGadgetColumn(0, 2, "Punkte", 50)
AddGadgetColumn(0, 3, "Tore", 50)
AddGadgetColumn(0, 4, "Dif.", 50)

EndIf

For i = 1 To 5
AddGadgetItem(0, -1, Str(i) + "." + Chr(10) + team(i)\Name$ + Chr(10) + Str(team(i)\Punkte) + Chr(10) + Str(team(i)\Tore) + " : " + Str(team(i)\gegentore) + Chr(10) + Str(team(i)\Tordifferenz) )
Next

EndIf


Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
Quit = 1
EndIf
Until Quit=1

EndProcedure



team(1)\name$ = "Team 1"
team(1)\punkte = 12
team(1)\Tore = 22
team(1)\Gegentore = 18
team(1)\Tordifferenz = team(1)\Tore - team(1)\gegentore

team(2)\name$ = "Team 2"
team(2)\punkte = 11
team(2)\Tore = 26
team(2)\Gegentore = 12
team(2)\Tordifferenz = team(2)\Tore - team(2)\gegentore

team(3)\name$ = "Team 3"
team(3)\punkte = 11
team(3)\Tore = 21
team(3)\Gegentore = 13
team(3)\Tordifferenz = team(3)\Tore - team(3)\gegentore

team(4)\name$ = "Team 4"
team(4)\punkte = 10
team(4)\Tore = 17
team(4)\Gegentore = 19
team(4)\Tordifferenz = team(4)\Tore - team(4)\gegentore

team(5)\name$ = "Team 5"
team(5)\punkte = 11
team(5)\Tore = 18
team(5)\Gegentore = 10
team(5)\Tordifferenz = team(5)\Tore - team(5)\gegentore




SortStructuredArray(Team(), 1, OffsetOf(Mannschaft\Tordifferenz), #PB_Sort_Word, 1, 5 )

SortStructuredArray(Team(), 1, OffsetOf(Mannschaft\Punkte), #PB_Sort_Word, 1, 5 )


Ausgabe_Tabelle()

Hat jemand vielleicht eine Idee, wie ich das Problem lösen kann oder wo mein Denkfehler ist?

Vielen Dank und viele Grüße
Oli
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Das wird kompliziert. Am besten legste zusätzlich eine structurierte Linkliste
an, die nur ein Identifiezierungsfeld, sowie die Tordifferenz enthält. Jetzt
mußte vor der Anzeige noch durch die 2 Liste iterieren um den besseren zu
finden, diesen entfernste dann gleich aus der linklist.

Ist etwas komplizierter, deswegen hab ich im Moment auch keine Lust, ein
Beispiel zu proggen, sry.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Oli
Beiträge: 16
Registriert: 14.02.2006 13:14

Beitrag von Oli »

Hallo TS-SOft,

kein Problem :-)

Wenigstens weiß ich jetzt schon, wo ich suchen muss.

Vielen Dank und viele Grüße
Oli
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Mach dich mal schlau darüber was ein stabiler und ein unstabiler Sortieralgorithmus ist und bring das dann Fred (dem PB-Chefentwickler) bei :|
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Du kannst auch mit SwapElements() arbeiten, und dir damit deine eigene Sortier-Funktion basteln.
Das wäre vermutlich einfacher
Antworten