| 
				
					|  | Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
 |  
 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |  
		| Autor | Nachricht |  
		| ALWIM 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 27.09.2016, 22:02    Titel: Sortieren |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| Elor 
 
 
 Anmeldungsdatum: 12.07.2013
 Beiträge: 205
 Wohnort: Konstanz
 
 | 
			
				|  Verfasst am: 28.09.2016, 07:32    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| Jojo alter Rang
 
  
 Anmeldungsdatum: 12.02.2005
 Beiträge: 9736
 Wohnort: Neben der Festplatte
 
 | 
			
				|  Verfasst am: 28.09.2016, 13:41    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| ALWIM 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 28.09.2016, 16:23    Titel: |   |  
				| 
 |  
				|  	  | 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. | 
  ???? 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 |  |  
		|  |  
		| Elor 
 
 
 Anmeldungsdatum: 12.07.2013
 Beiträge: 205
 Wohnort: Konstanz
 
 | 
			
				|  Verfasst am: 28.09.2016, 21:04    Titel: |   |  
				| 
 |  
				|  	  | 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
 
 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. 	  | Code: |  	  | IF Punkte(k) = Punkte(k+1) THEN | 
 |  |  
		| Nach oben |  |  
		|  |  
		| ALWIM 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 28.09.2016, 22:11    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 28.09.2016, 22:18    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| Sebastian Administrator
 
  
 Anmeldungsdatum: 10.09.2004
 Beiträge: 5969
 Wohnort: Deutschland
 
 | 
			
				|  Verfasst am: 28.09.2016, 23:09    Titel: |   |  
				| 
 |  
				| 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.
   
 Viele Grüße!
 Sebastian
 _________________
 
   Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
 |  |  
		| Nach oben |  |  
		|  |  
		| Elor 
 
 
 Anmeldungsdatum: 12.07.2013
 Beiträge: 205
 Wohnort: Konstanz
 
 | 
			
				|  Verfasst am: 29.09.2016, 09:38    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| ALWIM 
 
  
 Anmeldungsdatum: 08.08.2006
 Beiträge: 1048
 Wohnort: Niederbayern
 
 | 
			
				|  Verfasst am: 29.09.2016, 22:09    Titel: |   |  
				| 
 |  
				| 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)! 	  | 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.
 | 
 _________________
 SHELL SHUTDOWN -s -t 05
 |  |  
		| Nach oben |  |  
		|  |  
		| dreael Administrator
 
  
 Anmeldungsdatum: 10.09.2004
 Beiträge: 2531
 Wohnort: Hofen SH (Schweiz)
 
 | 
			
				|  Verfasst am: 01.10.2016, 19:05    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| Elor 
 
 
 Anmeldungsdatum: 12.07.2013
 Beiträge: 205
 Wohnort: Konstanz
 
 | 
			
				|  Verfasst am: 02.10.2016, 08:35    Titel: |   |  
				| 
 |  
				| @dreael: Spätestens jetzt bekommt ALWIM erst recht Angst vor den UDT's.
  |  |  
		| Nach oben |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 02.10.2016, 13:56    Titel: |   |  
				| 
 |  
				| Wieso? Ist doch alles ganz logisch! 	  | Elor hat Folgendes geschrieben: |  	  | Spätestens jetzt bekommt ALWIM erst recht Angst vor den UDT's. lächeln | 
   
 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 |  |  
		|  |  
		|  |  
  
	| 
 
 | 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.
 
 |  |