Autor Beitrag
tj004
Hält's aus hier
Beiträge: 3



BeitragVerfasst: So 21.06.09 13:08 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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!
ausblenden 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:
ausblenden 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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: de.wikipedia.org/wiki/Sortierverfahren

==> Am einfachsten zu schrieben ist wohl Bubblesort, am effizientesten Introsort ;)