Entwickler-Ecke
Sonstiges (Delphi) - erstellen einer rangliste
tj004 - So 21.06.09 13:08
Titel: erstellen einer rangliste
hi @ all!
ich habe ein recht umfangreiches problem. und zwar möchte ich eine tabelle auswerten, so dass am ende eine rangliste von platz eins bis min. platz 4 und max. platz 6 entsteht.
punkte sätze spiel Rangliste
p11 : p12 s11 : s12 sp11:sp12 1.
p21 : p22 s21 : s22 sp21:sp22 2.
p31 : p32 s31 : s32 sp31:sp32 3.
p41 : p42 s41 : s42 sp41:sp42 4.
p51 : p52 s51 : s52 sp51:sp52 5.
p61 : p62 s61 : s62 sp61:sp62 6.
3.kriterium 2.kriterium 1.kriterium
es ist jedoch zu beachten: beim ersten kriterium nimmt jede variable werten von 0 bis max. 5 an. wenn ein wert vor dem doppelpunkt 0 ist, so ist dieser spieler automatisch auf dem letzten platz( also 4-6,je nach spieleranzahl). wenn der wert hinter dem doppelpunkt 0 ist, ist dieser spieler automatisch erster.
wenn 2 werte vor dem doppelpunkt des des ersten kriteriums gleich sind, so müssen die dazu gehörigen werte des 2. kriteriums verglichen werden. zuerst die vor dem doppelpunkt,der größer wert ergibt eine bessere platzierung. wenn gleich, dann soll der wert hinter doppelpunkt verglichen werden. dort ist jedoch der kleinere der bessere. beim dritten kriterium verhält es sich genauso.
hat jemand eine idee, wie man an dieses problem rangehen sollte bzw. gleich eine lösung?
mit freundlichen grüßen tj004
jfheins - So 21.06.09 14:13
Ich nehme mal an, das ist sowas wie eine Tennis-Tabelle in der Spiele, Sätze und Matches als gewonnen:verloren tabelliert werden. (Oder so ähnlich)
Als erstes mal die Datenstruktur. Ich vermute mal, du hast das Zeug nicht als String gespeichert, sondern als record oder als Klasse. Wenn nicht, bitte nachholen!
Delphi-Quelltext
1: 2: 3:
| TPlayer = record games_won, games_lost, sets_won, sets_lost, matches_won, matches_lost: Cardinal; end; |
Dann würde ich als zweites Eine Vergleichsfunktion schreiben, die 2 Einträge miteinander vergleicht und was positives zurückgibt, wenn der erste besser ist, 0 wenn beide gleich gut sind und was negatives wenn der zweite besser ist:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function Compare(a, b: TPlayer): Integer; begin Result := CompareMatches(a, b);
if Result <> 0 then exit;
Result := CompareSets(a, b);
if Result <> 0 then exit;
Result := CompareGames(a, b); end; |
Es wird als erst das wichtigste Kriterium überprüft, wenn das Gleichheit liefert das zweitwichtigste und wenn das auch gleich ist, das letzte.
Die oben benutzten Funktionen könnten so aussehen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| function CompareMatches(a, b: TPlayer): Integer; begin Result := a.Matches_won - b.matches_won;
if Result = 0 then Result := b.Matches_lost - a.Matches_lost; end; |
Dann solltest du eine Vergleichsfunktion haben, die 2 Spieler verglichen kann und sagt, welcher besser ist.
Danach gibt es diverse Sortieralgorithmen, mit denen du die Liste sortieren kannst ;)
tj004 - So 21.06.09 17:55
danke erstmal. ich wär es mal ausprobieren und mich dann wieder melden,ob ichs hinbekommen hab oda ni.
mfg tj004
tj004 - Mo 22.06.09 16:03
also ich hab die werte jetzt erstmal so ausgewertet wie vorgeschlagen. Aber einen Sortieralgorithmus hab ich leider noch keinen gefunden, hättest du da en vorschlag?
mfg tj004
jfheins - Mo 22.06.09 16:48
Im Grunde kannst du dir einen aussuchen ;)
Für geringe Datenmengen kann man Bubblesort verwenden, sollte es mehr sein kann man auf Quicksort und Introsort zurückgreifen.
Oder man verwendet Slowsort oder Bogosort um eine schöne Fortschrittsleiste anzeigen zu können :mrgreen:
Siehe auch Wikipedia:
http://de.wikipedia.org/wiki/Sortierverfahren
==> Am einfachsten zu schrieben ist wohl Bubblesort, am effizientesten Introsort ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!