Autor Beitrag
Ebbi19
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Di 19.04.05 21:40 
Hallo!!
Habe in Delphi eine Programm programmiert wo ich Ergebnisse von Spieltagen eingebe und aus diesen wird eine Tabelle erzeugt. Diese wird nach Punkten und Toren sortiert.
Aber leider klappt nur die Sortierung nach Punkten.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
for i:= 1 to 18 do
Begin     Max := VereinA[i].Punkte;
          Pos := i;
          VereinB := VereinA[i];
          for j := i+1 to 18 do
          If VereinA[j].Punkte > Max Then
          Begin Max := VereinA[j].Punkte;
                      Pos := j;
                      VereinB:=VereinA[j];

          VereinA[pos] := VereinA[i];
          VereinA[i] := VereinB;
          TordifTA[x] := VereinA[i].Tordifferenz;
          endend;


--> Hier findet die Sortierung nach Punkten statt dafür habe ich ein Array vom Typ Record erstellt für 18 Mannschften.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
If VereinA[1].Punkte = VereinA[2].Punkte
Then begin  Anzahl := 2;
            Anfang := 1;
            Ende := 4;

for x:= Anfang to Ende do
Begin     TordifTA[x] := VereinA[i].Tordifferenz;
          Max2 := TordifTA[x];
          Pos2 := x;
          TordifTB := TordifTA[x];
          for y := Anfang+1 to Ende do
          If TordifTA[y] > Max Then
          Begin Max2 := TordifTA[y];
                      Pos2 := y;
                      TordifTB:= TordifTA[y];

          TordifTA[pos2] := TordifTA[x];
          TordifTA[x] := TordifTB;
          VereinA[i].Tordifferenz := TordifTB;
         end;

          endend

else begin  VereinA[pos] := VereinA[i];
            VereinA[i] := VereinB;
          end;
If VereinA[1].Punkte = VereinA[3].Punkte
Then begin  Anzahl := 3;
            Anfang := 1;
            Ende := 3;

for x:= Anfang to Ende do
Begin     TordifTA[x] := VereinA[i].Tordifferenz;
          Max2 := TordifTA[x];
          Pos2 := x;
          TordifTB := TordifTA[x];
          for y := Anfang+1 to Ende do
          If TordifTA[y] > Max Then
          Begin Max2 := TordifTA[y];
                      Pos2 := y;
                      TordifTB:= TordifTA[y];

          TordifTA[pos2] := TordifTA[x];
          TordifTA[x] := TordifTB;
          VereinA[i].Tordifferenz := TordifTB;
         end;


          endend
else begin
          TordifTA[pos2] := TordifTA[x];
          TordifTA[x] := TordifTB;
          end;


--> Hier ist mein Ansatz für die Sortierung nach der Tordifferenz
wobei dies von den Punkten abhänig ist. Nur bei Punktgleichheit soll nach der Tordifferenz sortiert werden. Habe dies nür für erste 3 Mannschaften gemacht. Dafür habe ich ein Array vom Type integer erstellt. Aber leider funktioniert es nicht.

Ich hoffe ihr könnt mir helfen oder mir eine einfachere variante der Sortierung nennen.
Danke, Danke !!

jetzt noch zwei Sorry:
- einmal dafür das text nicht formatiert ist
--> Fehlermeldung bei Formations Versuch (Laufzeitfehler)
- zweites falls ich frage in flasches Forum
geschrieben habe

MfG
Ebbi
astaria
Hält's aus hier
Beiträge: 10

Win 98, Win XP Prof
D6 Ent
BeitragVerfasst: Do 12.05.05 12:46 
Hmm, da haste ja was ganz schön kompliziertes hingebastelt ;) Is zwar nu schon lange her, aber ich antworte trotzdem mal. Mein Vorschlag zur Lösung des Problems:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
var
  sortcomplete:Boolean;
  i:Integer;
  tempVerein:TVerein;

sortcomplete:=False;
while not sortcomplete do
begin
  sortcomplete:=True;
  for i:=1 to 17 do
  begin
    if VereinA[i].Punkte<VereinA[i+1].Punkte then
    begin 
      // Verein i+1 hat mehr Punkte als i -> Position tauschen
      tempVerein:=VereinA[i];
      VereinA[i]:=VereinA[i+1];
      VereinA[i+1]:=tempVerein;
      sortComplete:=False;
    end else
    if VereinA[i].Punkte=VereinA[i+1].Punkte then
    begin
      // gleiche Punktzahl -> sortieren nach Tordifferenz
      if VereinA[i].Tordifferenz<VereinA[i+1].Tordifferenz then
      begin
        // Verein i+1 hat höhere Tordifferenz -> muss nach vorn
        tempVerein:=VereinA[i];
        VereinA[i]:=VereinA[i+1];
        VereinA[i+1]:=tempVerein;
        sortComplete:=False;
      end;
    end;
  end;
end;


Ich hab das zwar nicht probiert, sollte aber im großen und ganzen so gehen. Basis des ganzen ist ein simples Bubble-Sort (bei 18 Einträgen mehr als vertretbar). Dabei wird immer wieder überprüft, ob ein Verein weniger Punkte erzielt hat, als der Nächste in der Liste. Ist das der Fall, werden die Positionen getauscht. Sind die Punktestände gleich, wird zusätzlich die Tordifferenz zum Vgl. herangezogen und bei Bedarf wiederum getauscht. Nach und nach wandert nun das beste Team nach oben, das schlechteste nach unten. Wenn kein Austausch mehr vorgenommen wurde, ist sortcomplete=true und unsere Liste ist sortiert (Index 1 ist das Beste Team).

Viele Grüße aus Graz nach Dresden ;)

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.

_________________
Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.