Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Sortieren

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 27.09.2016, 22:02    Titel: Sortieren Antworten mit Zitat

Ich sortiere Spieler aufsteigend nach ihren erreichten Punkten (Platz 1 bis ...). Jetzt ist es so, dass mehrere Spieler punktgleich sind! Diese Punktgleichen Spieler will ich ebenfalls nach einer entsprechenden Zahl sortieren. Wie realisiere ich das ganze? Habe noch keine Idee???

erste Sortierung habe ich wie folgt gelöst:
Code:
OR j = Anfang TO ENDE
      FOR k = Anfang TO ENDE-1
         IF Punkte(k) < Punkte(k+1) THEN
            SWAP Temp(k, 1), Temp(k+1, 1) ' Punkte
            SWAP Temp(k, 2), Temp(k+1, 2) ' Name
         END IF
      NEXT
   NEXT


jetzt sollen die Punktgleichen untereinander, ebenfalls noch sortiert werden.

Irgendjemand eine Idee?

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 28.09.2016, 07:32    Titel: Antworten mit Zitat

Das ergibt sich beim Sortieren von selbst. Beispiel
Code:

Dim Punkte(1 To 10) As Integer = {2, 4, 7,  9, 4, 11, 2, 17, 4, 6}
Dim Temp(1 To 10, 1 To 2) As Integer
Dim As Integer Anfang= 1, Ende= 10, j, k

FOR j = Anfang TO ENDE
      FOR k = Anfang TO ENDE-1
         IF Punkte(k) < Punkte(k+1) THEN
          Swap Punkte(k), Punkte(k+ 1)
            'SWAP Temp(k, 1), Temp(k+1, 1) ' Punkte
            'SWAP Temp(k, 2), Temp(k+1, 2) ' Name
         END IF
      NEXT
   NEXT   

For j= 1 To Ende
  Print Punkte(j)
Next j

Du brauchst auch keine zwei Arrays zum sortieren, sondern kannst direkt auf das Spieler Array zugreifen. Ich würde da ein UDT verwenden z.B.
Code:

Type _
  TSpieler Field= 1
    Spieler As String
    Punkte As Integer
  End Type

ReDim Spieler(Any) As TSpieler


Edit: Ein konkretes Beispiel um zu zeigen was ich meine:
Code:

Type _
  TSpieler Field= 1
    Spieler As String
    Punkte As Integer
  End Type

Dim Spieler(1 To 10) As TSpieler
Dim As Integer Anfang= 1, Ende= 10, j, k

  For j= Anfang To Ende
    Read Spieler(j).Spieler, Spieler(j).Punkte
  Next j

  For j= Anfang To Ende
    For k= Anfang To Ende- 1
      If(Spieler(k).Punkte < Spieler(k+ 1).Punkte) Then
        Swap Spieler(k), Spieler(k+ 1)
      End If
    Next k
  Next j

  For j= 1 To Ende
    Print Spieler(j).Spieler, Spieler(j).Punkte
  Next j

/' --- data --- '/
Data "Gustav", 2, "Walter", 4, "Udo", 7, "Georg", 9, "Karim", 4, _
     "Klaus", 11, "Karl", 2, "Josef", 17, "Peppe", 4, "Juergen", 6

Wie du siehst, kannst du Punktezahl und Spieler Name in einem Abwasch tauschen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 28.09.2016, 13:41    Titel: Antworten mit Zitat

Wenn du bei Punktegleichstand nach einem weiteren Kriterium sortieren möchtest, dann musst du... *Trommelwirbel* auf Punktegleichstand prüfen - also ein weiterer Block "IF Punkte(k) = Punkte(k+1) THEN ..." und darin ein beliebiges anderes Kriterium vergleicheren.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 28.09.2016, 16:23    Titel: Antworten mit Zitat

Jojo hat Folgendes geschrieben:
Wenn du bei Punktegleichstand nach einem weiteren Kriterium sortieren möchtest, dann musst du... *Trommelwirbel* auf Punktegleichstand prüfen - also ein weiterer Block "IF Punkte(k) = Punkte(k+1) THEN ..." und darin ein beliebiges anderes Kriterium vergleicheren.
Hmmm.... ????
Das dumme ist ja, dass mehrere die gleiche Punktezahl haben können. Irgendwie denke ich da jetzt zu komliziert?

Beispiel:

Zitat:
Falter Georg 5,5 Punkte
Meier Lars 5 Punkte <---- Sortieren 1
Huber Hans 5 Punkte <---- Sortieren 1
Karl Karl 4 Punkte
Mayer Manu 3 Punkte <---- Sortieren 2
Meyer Uwe 3 Punkte <---- Sortieren 2


Meier und Huber werden sortiert sowie Mayer und Meyer werden sortiert. Wobei Mayer nie vor Huber landen kann!

Dann würde der Quellcode in etwa so aussehen?:

Code:
OR j = Anfang TO ENDE
      FOR k = Anfang TO ENDE-1
         IF Punkte(k) < Punkte(k+1) THEN
            SWAP Temp(k, 1), Temp(k+1, 1) ' Punkte
            SWAP Temp(k, 2), Temp(k+1, 2) ' Name
              IF Punkte(k) = Punkte(k+1) THEN
                 SWAP Temp(k, 3), Temp(k+1, 3) ' Sonderpunkte
                 SWAP Temp(k, 1), Temp(k+1, 1) ' Punkte
                 SWAP Temp(k, 2), Temp(k+1, 2) ' Name
             END IF
         END IF
      NEXT
   NEXT


Keine Ahnung, ob ich da jetzt richtig liege? Habe es noch nicht getestet. Wie gesagt, das bereitet mir jetzt ein wenig Kopfzerbrechen.

Vielen herzlichen Dank an alle, die versuchen mir zu helfen!

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 28.09.2016, 21:04    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:

Dann würde der Quellcode in etwa so aussehen?:

Code:

OR j = Anfang TO ENDE
      FOR k = Anfang TO ENDE-1
         IF Punkte(k) < Punkte(k+1) THEN
            SWAP Temp(k, 1), Temp(k+1, 1) ' Punkte
            SWAP Temp(k, 2), Temp(k+1, 2) ' Name
              IF Punkte(k) = Punkte(k+1) THEN
                 SWAP Temp(k, 3), Temp(k+1, 3) ' Sonderpunkte
                 SWAP Temp(k, 1), Temp(k+1, 1) ' Punkte
                 SWAP Temp(k, 2), Temp(k+1, 2) ' Name
             END IF
         END IF
      NEXT
   NEXT   


Wenn die Bedingung
Code:
  IF Punkte(k) < Punkte(k+1) THEN
erfüllt ist, kann in diesem Block die Bedingung
Code:
  IF Punkte(k) = Punkte(k+1) THEN
nie war werden, dass müsstest du mit einem Else If abfragen. Innerhalb dieser schleife ist das Array noch nicht sortiert, das heißt das zu diesem Zeitpunkt noch gar nicht klar ist, wie viele Spieler mit Punktegleichheit existieren. Ich würde nach dem sortieren die Spieler mit Punktegleichstand heraus suchen (Gruppen bilden) und diese Gruppen nach Sonderpunkten sortieren.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 28.09.2016, 22:11    Titel: Antworten mit Zitat

Wie wäre es damit:

Code:

Temp(j, 1) = Spieler(j)
Temp(j, 2) = LTRIM$(STR$(Sonderpunkte(j)))

FOR j = Anfang TO ENDE
   FOR k = Anfang TO ENDE-1
      IF Punkte(k) < Punkte(k+1) THEN
         SWAP Punkte(k), Punkte(k+1)
         SWAP Temp(k, 1), Temp(k+1, 1) ' Name
         SWAP Temp(k, 2), Temp(k+1, 2) ' Sonderpunkte
      END IF
   NEXT
NEXT

FOR j = Anfang TO ENDE
   FOR k = Anfang TO ENDE-1
      IF Punkte(k) = Punkte(k+1) THEN
         IF Temp(k, 3) < Temp(k+1, 3) THEN
            Sonderpunkte(k), Sonderpunkte(k+1)
            SWAP Temp(k, 2), Temp(k+1, 2) ' Sonderpunkte
            SWAP Temp(k, 1), Temp(k+1, 1) ' Name
         END IF
      END IF
   NEXT
NEXT

Habe es 2x getestet! Funktioniert bei mir!?
Ich kann nicht glauben, dass das wirklich funktioniert.
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 28.09.2016, 22:18    Titel: Antworten mit Zitat

Wie wäre es denn damit?

Code:
Temp(j, 1) = Spieler(j)
Temp(j, 2) = LTRIM$(STR$(Sonderpunkte)

FOR j = Anfang TO ENDE
   FOR k = Anfang TO ENDE-1
      IF Punkte(k) < Punkte(k+1) THEN
         SWAP Punkte(k), Punkte(k+1)
         SWAP Temp(k, 1), Temp(k+1, 1) ' Name
         SWAP Temp(k, 2), Temp(k+1, 2) ' Sonderpunkte
      ELSEIF Punkte(k) = Punkte(k+1) THEN
         IF Temp(k, 3) < Temp(k+1, 3) THEN
            Sonderpunkte(k), Sonderpunkte(k+1)
            SWAP Temp(k, 2), Temp(k+1, 2) ' Sonderpunkte
            SWAP Temp(k, 1), Temp(k+1, 1) ' Name
         END IF
      END IF
      END IF
   NEXT
NEXT

_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 28.09.2016, 23:09    Titel: Antworten mit Zitat

Hi ALWIM,

hier auch noch eine Idee:

Code:
Dim Namen (1 To ...) As String  = { "Gunilla", "Horatio", "Ramses", "Clodwig", "Ronny", "Zwiebelia", "Aalbert" }
Dim Punkte(1 To ...) As Integer = {       100,        99,        99,      111,      99,          99,        99 }  'Mehr ist besser
Dim BNoten(1 To ...) As Integer = {         1,         2,         2,        5,       1,           7,         5 }  'Mehr ist besser

For n As Integer = UBound(Namen)+1 To 3 Step -1
    For i As Integer = 1 To n-2 Step 1
        If ( Punkte(i) < Punkte(i+1) ) Or ( ( Punkte(i) = Punkte(i+1) ) And ( BNoten(i) < BNoten(i+1) ) ) Then
            Swap Namen (i), Namen (i+1)
            Swap Punkte(i), Punkte(i+1)
            Swap BNoten(i), BNoten(i+1)
        End If
    Next i
Next n

Print "Rang | Name        | Punkte | B-Note"
Print "------------------------------------"
For i As Integer = LBound(Namen) To UBound(Namen)
    Print Using "#### | "; i;
    Print Using "\         \ | "; Namen(i);
    Print Using "###### | "; Punkte(i);
    Print Using "######"; BNoten(i)
Next i
Print "------------------------------------"

GetKey
End


Aber wie schon neulich erwähnt, würde ich statt irgendwelcher Array-"Verrenkungen" lieber auf ein UDT-Array setzen, um Datensätze mit mehreren Attributen zusammenzufassen. lächeln

Viele Grüße!
Sebastian
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 29.09.2016, 09:38    Titel: Antworten mit Zitat

Ich hatte am Anfang schon mal gezeigt,wie das mit einem UDT eleganter zu lösen ist. Sebastian hat das jetzt noch mal erwähnt, deshalb das gleiche Beispiel von oben, aber um die Sonderpunkte erweitert.
Code:

  TSpieler Field= 1
    Spieler As String
    Punkte As Integer
    SonderPunkte As Integer
  End Type

Dim Spieler(1 To 10) As TSpieler
Dim As Integer Anfang= 1, Ende= 10, j, k

  For j= Anfang To Ende
    Read Spieler(j).Spieler, Spieler(j).Punkte, Spieler(j).SonderPunkte
  Next j

  For j= Anfang To Ende
    For k= Anfang To Ende- 1
      If(Spieler(k).Punkte < Spieler(k+ 1).Punkte) Then
        Swap Spieler(k), Spieler(k+ 1)
      ElseIf(Spieler(k).Punkte = Spieler(k+ 1).Punkte) Then
        If(Spieler(k).SonderPunkte < Spieler(k+ 1).SonderPunkte) Then
          Swap Spieler(k), Spieler(k+ 1)
        End If
      End If
    Next k
  Next j

  For j= 1 To Ende
    Print Spieler(j).Spieler, Spieler(j).Punkte, Spieler(j).SonderPunkte
  Next j

/' --- data --- '/
Data "Gustav", 2, 2, "Walter", 4, 5, "Udo", 7, 3, "Georg", 9, 2, "Karim", 4, 9, _
     "Klaus", 11, 3, "Karl", 2, 5, "Josef", 17, 3, "Peppe", 4, 2, "Juergen", 6, 6

Der Vorteil ist, das du nur ein einziges Array brauchst um alle Informationen eines Spielers zu speichern und kannst (das hab ich oben ebenfalls schon erwähnt) alles mit einem einzigen SWAP tauschen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 29.09.2016, 22:09    Titel: Antworten mit Zitat

Elor hat Folgendes geschrieben:
Ich hatte am Anfang schon mal gezeigt,wie das mit einem UDT eleganter zu lösen ist. Sebastian hat das jetzt noch mal erwähnt, deshalb das gleiche Beispiel von oben, aber um die Sonderpunkte erweitert.
Code:

  TSpieler Field= 1
    Spieler As String
    Punkte As Integer
    SonderPunkte As Integer
  End Type

Dim Spieler(1 To 10) As TSpieler
Dim As Integer Anfang= 1, Ende= 10, j, k

  For j= Anfang To Ende
    Read Spieler(j).Spieler, Spieler(j).Punkte, Spieler(j).SonderPunkte
  Next j

  For j= Anfang To Ende
    For k= Anfang To Ende- 1
      If(Spieler(k).Punkte < Spieler(k+ 1).Punkte) Then
        Swap Spieler(k), Spieler(k+ 1)
      ElseIf(Spieler(k).Punkte = Spieler(k+ 1).Punkte) Then
        If(Spieler(k).SonderPunkte < Spieler(k+ 1).SonderPunkte) Then
          Swap Spieler(k), Spieler(k+ 1)
        End If
      End If
    Next k
  Next j

  For j= 1 To Ende
    Print Spieler(j).Spieler, Spieler(j).Punkte, Spieler(j).SonderPunkte
  Next j

/' --- data --- '/
Data "Gustav", 2, 2, "Walter", 4, 5, "Udo", 7, 3, "Georg", 9, 2, "Karim", 4, 9, _
     "Klaus", 11, 3, "Karl", 2, 5, "Josef", 17, 3, "Peppe", 4, 2, "Juergen", 6, 6

Der Vorteil ist, das du nur ein einziges Array brauchst um alle Informationen eines Spielers zu speichern und kannst (das hab ich oben ebenfalls schon erwähnt) alles mit einem einzigen SWAP tauschen.
Vielen herzlichen Dank für die Antworten! Mit Types habe ich noch nie gearbeitet. Kenne mich damit nicht aus! Auch wenn es besser ist, so habe ich es dennoch ohne Types hinbekommen. Dürfte jedem klar sein, was ich programmiere bzw. programmiert habe (Sonneborn-Berger)!
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 01.10.2016, 19:05    Titel: Antworten mit Zitat

Ein UDT ist letztendlich auch eine Klasse, der Du im Prinzip einen geeigneten Grössenvergleich für diesen Fall spendieren darfst.
Code:
' Beilage zu https://forum.qbasic.at/viewtopic.php?t=8774

Type TSpieler
   Spieler As String * 15
   Punkte As Integer
   SonderPunkte As Integer
   
   Declare Function toString As String
End Type

Function FuehrNull(z As Integer, b As Integer)As String
   Dim h As String = Str(z)
   Return Space(b - Len(h)) + h
End Function

Function TSpieler.toString As String
   Return FuehrNull(this.Punkte, 5) + FuehrNull(this.SonderPunkte, 5) + " " + this.Spieler
End Function

' Und hier die Vergleichsoperation für den UDT
Operator <(a As TSpieler, b As TSpieler)As Integer
   If a.Punkte <> b.Punkte Then
      Return a.Punkte < b.Punkte
   Else
      Return a.SonderPunkte < b.SonderPunkte
   End If
End Operator

Dim spieler(...) As TSpieler => {("Gustav", 2, 2), ("Walter", 4, 5), ("Udo", 7, 3), _
  ("Georg", 9, 2), ("Karim", 4, 9), ("Klaus", 11, 3), ("Karl", 2, 5), _
  ("Josef", 17, 3), ("Peppe", 4, 2), ("Juergen", 6, 6)}
 
Dim  j As Integer, k As Integer

ScreenRes 640, 480
Width 80, 30

For j = LBound(spieler) To UBound(spieler) - 1
   For k = j + 1 To UBound(spieler)
      ' Dank unserem "operator <" dürfen wir direkt vergleichen!
      If spieler(j) < spieler(k) Then
         Swap Spieler(k), Spieler(j)
      End If
   Next k
Next j

For j=LBound(spieler) To UBound(spieler)
   Print Spieler(j).toString
Next j

Sleep

_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 02.10.2016, 08:35    Titel: Antworten mit Zitat

@dreael:
Spätestens jetzt bekommt ALWIM erst recht Angst vor den UDT's. lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 02.10.2016, 13:56    Titel: Antworten mit Zitat

Elor hat Folgendes geschrieben:
Spätestens jetzt bekommt ALWIM erst recht Angst vor den UDT's. lächeln
Wieso? Ist doch alles ganz logisch! grinsen

Noch praktischer fände ich eine Property, die schon beim Erstellen des Arrays jeden Datensatz an die richtige Stelle schreibt (und nebenbei die Verwaltung des Arrays gleich mit übernimmt). Dann hätte man zu jeder Zeit eine fertig sortierte Tabelle.

Guß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz