Rangliste

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Elisa

Betreff: Rangliste

BeitragMo, Aug 18, 2014 11:42
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo freunde,

wie kann ich eine rangliste erstellen ? hab es nicht hinbekommen...

ich möchte 100 namen eine zufallswert von 10-300 geben und die namen sollen nach dem
höchsten wert von oben bis unten aufgelistet werden.

kann mir da vileicht jemand helfen ?

sirokuhl

BeitragMo, Aug 18, 2014 12:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Elisa,

zeig doch am besten mal deinen bisherigen Code, damit wir besser beurteilen können, wie du's bisher versucht hast und wo der/die Fehler liegt/liegen.

Und wo genau hapert's denn? Hast du die Liste mit den Namen und Zufallswerten soweit hinbekommen und es hängt nur bei der Sortierung? Oder weißt du gar nicht erst, wie du das Gesamte angehen sollst?

Xeres

Moderator

BeitragMo, Aug 18, 2014 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
~VERSCHOBEN~
Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Elisa

BeitragMo, Aug 18, 2014 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
kannst du mir vileicht ein beispiel shema zeigen,das soll so aussehen.


name1 50 ,name2 90 ,name3 15 usw. also insgesamt 100 namen,bei dem die werte zufaellig verteilt werden,und der name,der den höchsten wert hat oben aufgezeigt wird und alle anderen nachdem wert
der zahlen aufgelistet werden.

also quasi ein rangliste erstellen.
 

Lador

BeitragMo, Aug 18, 2014 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Elisa,

(ich hoffe, ich bekomme das nach all den Jahren in BlitzMax auch noch in BlitzBasic hin Wink )
ich schätze mal, dass du dich noch nicht mit Types beschäftigt hast und das so schnell auch nicht vorhast (ist für den Anfang ein etwas heikles Thema). Das Stichwort hierfür lautet Arrays bzw. Felder. Dazu benötigst du den Befehl Dim. Damit erstellst du je eine Liste für die Punkte und die Namen:
BlitzBasic: [AUSKLAPPEN]
Dim Punkte(99)
Dim Namen$(99)

Die Zahl 99 gibt den höchsten ansprechbaren Index an. Der Computer beginnt bei 0 zu zählen, deswegen hast du damit 100 Elemente initialisiert. Für Zufall benötigst du vor allem den Befehl Rand. Damit du bei jedem Start nicht dieselben Werte erhältst, solltest du die Zufalls-"Saat" vorher mit SeedRnd festlegen (am besten mit SeedRnd MilliSecs()).
Nachdem du mit "Dim Punkte(99)" das Array erstellt hast, kannst du mit Punkte(i) auf jeden Eintrag des Feldes zugreifen, wobei i eine ganze Zahl zwischen 0 und 99 ist (genannt Index). Diese kannst du wie eine gewöhnliche Variable behandeln, also z.B. mit
BlitzBasic: [AUSKLAPPEN]
Punkte(17) = Rand(10,300)

dem 18. Eintrag einen zufälligen Wert zwischen 10 und 300 zuweisen und mit
BlitzBasic: [AUSKLAPPEN]
Print Punkte(17)

diesen ausgeben.
Für die Namen benötigst du Strings, also Zeichenketten (s. Hilfe: https://www.blitzforum.de/help/?subcat=21). Dir ist hierbei sicherlich das $-Zeichen nach dem Feldnamen aufgefallen. Ansonsten funktioniert das aber genauso wie bei den Punkten.

Hilfreich sind sicherlich noch die Befehle Data und Read.

Ich hoffe das konnte dir weiterhelfen und ich hab nicht zu viel verraten. Wink

MFG Lador
Mein aktuelles Projekt:
2D-Rollenspiel "Iliran"
Screenshot | Worklog
Fortschritt: ca. 70%
 

CO2

ehemals "SirMO"

BeitragMo, Aug 18, 2014 21:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Für das Sortieren benötigst du einen "Sort" (wer hätte das gedacht?). Es gibt ganz viele davon, hier eine unvollständige Liste:
- Bubblesort
- Selectionsort
- Insertionsort
- Shellsort
- Quicksort
- Heapsort

Ich benutze für soetwas immer den Bubblesort, denn der ist recht einfach. Er folgt diesem Schema:
Code: [AUSKLAPPEN]
Für x = [Größe des Arrays], x > 1, bei jedem Schleifendurchlauf x = x - 1
     Für y = 0, y < (x - 1), Bei jedem Schleifendurchlauf y = y + 1
          Wenn das y-te Element des Arrays größer ist, als das y-te + 1 Element, dann
               Tausche Beide


Was wird gemacht?
Es wird das ganze Array rückwärts durchlaufen. Bei jedem Schleifendurchlauf wird eine zweite Schleife gestartet, die alle Elemente des Arrays bis zu der Position der oberen Schleife durchläuft. Nun wird geschaut, ob das momentan zu betrachtende Element größer ist, als das nächst Element; Ist das der Fall, so werden beide getausch, ansonsten passiert nichts.

Folgendes Array als Beispiel:
Code: [AUSKLAPPEN]
Array = 1, 3, 7, 2

1. Äußere Schleifendurchlauf, x hat den Index des letzten Elements (3)
1. Innere Schleifendurchlauf, y hat den Wert 0:
Bedingung: 1 > 3? - Nein, es geht also weiter.
2. Innere Schleifendurchlauf, y hat den Wert 1:
Bedingung: 3 > 7? - Nein, es geht also weiter.
3. Innere Schleifendurchlauf, y hat den Wert 2:
Bedingung: 7 > 2? - Ja, Werte tauschen, die neue Version des Arrays:
Code: [AUSKLAPPEN]
Array = 1, 3, 2, 7

Innere Schleife beendet, y hat den Wert x - 1, also
2. Äußere Schleifendurchlauf, x hat den Index des vorletzten Elements (2)
1. Innere Schleifendurchlauf, y hat den Wert 0:
Bedingung: 1 > 3? - Nein, es geht also weiter.
2. Innere Schleifendurchlauf, y hat den Wert 1:
Bedingung: 3 > 2? - Ja, Werte tauschen, die neue Version des Arrays:
Code: [AUSKLAPPEN]
Array = 1, 2, 3, 7

Innere Schleife beendet, y hat den Wert x - 1, also
Äußere Schleife startet nicht mehr, da x nun den Wert 1 erreichen würde.
Das Array ist der Größe nach aufsteigend sortiert.

Ich hoffe ich konnte helfen.
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

DAK

BeitragDi, Aug 19, 2014 6:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Dazu sei noch angemerkt: Der Bubblesort ist zwar einer der einfachsten Sortierungsalgos, aber gleichzeitig einer der Langsamsten. Er hat eine Laufzeit von O(n²), das heißt, ganz grob geschätzt brauchst du bei einer zu sortierenden Liste mit n Elementen n² Schritte. Bei 100 Einträgen sind das dann 10000 Schritte.

Wenn dir die Performance egal ist (wie das hier beim einmaligen Sortieren von nur 100 Elementen der Fall ist), dann passt auch der Bubblesort dafür. Wenn du das für irgendwas im Spiel brauchst, dass jedes Frame läuft oder riesige Datensätze sortieren soll (z.B. Pathfinding), dann brauchst du dafür einen anderen Sortierungsalgo.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Elisa

BeitragDi, Aug 19, 2014 7:30
Antworten mit Zitat
Benutzer-Profile anzeigen
thx für die schnellen und hilfreichen antworten.

mit dims und rands komme ich inzwischen schon klar aber
dieser bubblesort technik ist genau das was ich brauche,
ich werde mal versuchen das hinzukriegen.

gibt es hier im portal vileicht ein beispiel programm wo das bubblesort angewendet wird das ich
downloaden kann,um es besser zu begreiffen ?

und gibt es da noch andere techniken,wie geht das zb. mit quicksort ?

DAK

BeitragDi, Aug 19, 2014 9:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hier hat mir mal die Boardsuche ausgespuckt: https://www.blitzforum.de/foru...bubblesort
Erster Link bei einer Suche nach Bubblesort.

Ansonsten kann ich Wikipedia sehr empfehlen. Dort gibt es natürlich nix in Blitz sondern nur in Pseudocode, aber Pseudocode in echten Code umwandeln ist nicht schwer und ein absoluter Basisskill für jeden Programmierer.
Gewinner der 6. und der 68. BlitzCodeCompo
 

CO2

ehemals "SirMO"

BeitragDi, Aug 19, 2014 18:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Eben schnell "hingeschmiert" (Bubblesort):

BlitzBasic: [AUSKLAPPEN]
Local Arr[10]				; Ein Array mit 10 Elementen (0 bis 9)
Local FillArr

For FillArr = 0 To 9 ; Hier wird das o.g. Array mit Zufallswerten gefüllt
Arr[FillArr] = Rand(0, 100)
Next

Print("Unsortiert:") ; Und Hier das unsortierte Array ausgegeben
For FillArr = 0 To 9
Print(FillArr + ": " + Arr[FillArr])
Next
Print("")

; Es folgt der Bubblesort:
For x = 9 To 1 Step -1
For y = 0 To (x - 1)
If(Arr[y] > Arr[y + 1])
Hilf = Arr[y]
Arr[y] = Arr[y + 1]
Arr[y + 1] = Hilf
EndIf
Next
Print("Array nach dem " + x + "ten Schleifendurchlauf:")
For FillArr = 0 To 9
Print(FillArr + ": " + Arr[FillArr])
Next
Next
Print("")

; Ausgabe des sortierten Arrays (aufsteigend, klein nach groß):
Print("Sortiert:")
For FillArr = 0 To 9
Print(FillArr + ": " + Arr[FillArr])
Next

End
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
 

Elisa

BeitragDi, Aug 19, 2014 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
sieht zwar gut aus aber klappt bei blitz3d nicht,ich arbeite immer noch dran...

gehts nicht einfacher zb. mit dims ?
  • Zuletzt bearbeitet von Elisa am Di, Aug 19, 2014 22:29, insgesamt 3-mal bearbeitet

PSY

BeitragDi, Aug 19, 2014 21:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

der Code muss unter Blitz3D laufen, so wie er da steht. Er scrollt halt nur komplett durch, d.h. Du siehst die einzelnen Schleifendurchlaeufe nicht.

Hab 2 'waitkey' eingebaut und den Zaehler korrigiert:

Code: [AUSKLAPPEN]

Local Arr[10]            ; Ein Array mit 10 Elementen (0 bis 9)
Local FillArr

For FillArr = 0 To 9         ; Hier wird das o.g. Array mit Zufallswerten gefüllt
   Arr[FillArr] = Rand(0, 100)
Next

Print("Unsortiert:")         ; Und Hier das unsortierte Array ausgegeben
For FillArr = 0 To 9
   Print(FillArr + ": " + Arr[FillArr])
Next
Print("")

; Es folgt der Bubblesort:
For x = 9 To 1 Step -1
   For y = 0 To (x - 1)
      If(Arr[y] > Arr[y + 1])   
         Hilf = Arr[y]
         Arr[y] = Arr[y + 1]
         Arr[y + 1] = Hilf
      EndIf
   Next
   Print("Array nach dem " + (10-x) + "ten Schleifendurchlauf:")
   For FillArr = 0 To 9
      Print(FillArr + ": " + Arr[FillArr])
   Next
   WaitKey
Next

Print("")

; Ausgabe des sortierten Arrays (aufsteigend, klein nach groß):
Print("Sortiert:")
For FillArr = 0 To 9
   Print(FillArr + ": " + Arr[FillArr])
Next

WaitKey

End


Mit irgendner Taste gehts weiter zum naechsten Schleifendurchlauf.


Cheers,
PSY

(edit) Denk dran, ein seedrnd millisecs() einzubauen, sonst hast Du immer die gleichen Zahlen!
(edit2) Wenn Du das ganze mit DIMS loesen willst, macht das keinen Unterschied, ausser in der Deklaration und den Klammern (DIM Arrays benoetigen runde statt eckiger Klammern). DIMS koennen halt multi-dimensional sein, und Du kannst sie resizen, was aber bei Deinem Problem nicht notwendig ist.
PSY LABS Games
Coders don't die, they just gosub without return
  • Zuletzt bearbeitet von PSY am Di, Aug 19, 2014 21:44, insgesamt 2-mal bearbeitet

BladeRunner

Moderator

BeitragDi, Aug 19, 2014 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ab davon könntest Du einfach mal das posten was DU bislang an Code erarbeitet hast.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Elisa

BeitragDi, Aug 19, 2014 22:35
Antworten mit Zitat
Benutzer-Profile anzeigen
ja super !
das mit der warte schleife war ne gute idee,
endlich klappt mal was,ich werd mal etwas mit dem code rumexperementieren.mit dims zu
arbeiten faellt mir leichter.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group