Ganzzahlen ordnen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Ganzzahlen ordnen

Beitrag von Zerosurf »

Hallo Leute,
hab nach langer Pause endlich wieder mal mit dem Programmieren weitergemacht und komm einfach nicht drauf, wie ich eine Reihe bzw Liste von unterschiedlichen Zahlen der Reihe nach ordnen und deren Werte ändern kann, so daß es wie folgt aussieht:

a = 12
b = 3
c = 5
d = 1
usw....

diese möchte ich dann aufsteigend ordnen, daß sie so zb aussieht:

d = 1
b = 3
c = 5
a = 12

dann sollten die Werte so geändert werden, daß sie bei Null beginnend eine normale Zahlenfolge ergibt:

d = 0
b = 1
c = 2
a = 3

Wie schaff ich das?
Liebe Grüße aus Tirol,
zerosurf
PureBasic 6.00 | Windows 10 pro (x64)
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: Ganzzahlen ordnen

Beitrag von PureLust »

Hi Zerosurf, . . . vielleicht meinst Du so etwas?

Code: Alles auswählen

Structure MyWerte
	Name.s
	Wert.l
EndStructure

NewList MyList.MyWerte()

; ------------------------  unsortierte Liste mit zufälligen Ganzzahlen erzeugen  -------------------------

For n = 1 To 10
	AddElement(MyList())
	MyList()\Name = Chr(64+n)					; erzeugt die Namen 'a', 'b', 'c', usw.
	MyList()\Wert = Random(1000)           ; vergibt einen zufälligen Wert zwischen 0 und 1000
Next

Debug "---- unsortiert ----"+#CRLF$

ForEach MyList()
	Debug MyList()\Name + " = " + MyList()\Wert
Next

; ---------------------  Liste an hand der 'Werte' sortieren  -------------------

SortStructuredList(MyList(), #PB_Sort_Ascending, OffsetOf(MyWerte\Wert), #PB_Long)			; ----- sortiert die Liste anhand des Feldes "Wert.l"

Debug #CRLF$+"---- sortiert ----"+#CRLF$

ForEach MyList()
	Debug MyList()\Name + " = " + MyList()\Wert
Next

; -------------------- 'Wert' auf die Nummer des Listenelements setzen ... also 0, 1, 2, 3, ...  ------------------------

Debug #CRLF$+"---- Werte durchnummeriert ----"+#CRLF$

ForEach MyList()
	MyList()\Wert = ListIndex(MyList())
	Debug MyList()\Name + " = " + MyList()\Wert
Next
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Re: Ganzzahlen ordnen

Beitrag von Zerosurf »

Super, vielen Dank!

Kann ich das ganze auch ohne Liste machen, nur mit den Variablen?
PureBasic 6.00 | Windows 10 pro (x64)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Ganzzahlen ordnen

Beitrag von NicTheQuick »

Nein. Purebasic ist keine Skriptsprache. Abgesehen davon würde dann ja die ganze Dynamik verloren gehen.

Hast du vielleicht ein ganz anderes Problem und uns nur die zweite Hälfte erzählt? Vielleicht können wir dir dann weiter helfen.
Bild
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: Ganzzahlen ordnen

Beitrag von PureLust »

Zerosurf hat geschrieben:Super, vielen Dank!

Kann ich das ganze auch ohne Liste machen, nur mit den Variablen?
Wenn Du eine 'Liste' von Werten verarbeiten möchtest, ist das Verwenden einzelner Variablen hierfür denkbar ungeeignet.
Hier wäre auch eine Sortierung seeeeehr aufwändig.

Wenn Du keinen Wert auf den 'Namen' (a,b,c,...) legst, kannst Du das Beispiel auch mit einer dimensionierten Variable umsetzen (siehe Befehl 'Dim').

Hier würdest Du die 'Werte' statt in 'einzelne' Variable (a,b,c,...) in eine dimensionierte Variable (z.B. Dim x(10)) schreiben (also statt in a,b,c,... in x(0), x(1), x(2),...)
Zum Sortieren kannst Du dann den Befehl "SortArray()" nutzen.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Re: Ganzzahlen ordnen

Beitrag von Zerosurf »

Ok, hier ist der Code:

Code: Alles auswählen

Template$ = "D-N - A - T"
Filename$ = "SF390-01 - Freya Ridings - Lost Without You"

PositionA = FindString(Template$, "A")
PositionT = FindString(Template$, "T")
PositionD = FindString(Template$, "D")
PositionN = FindString(Template$, "N")

NewList Positions.l()
AddElement(Positions()) : Positions() = PositionA
AddElement(Positions()) : Positions() = PositionT
AddElement(Positions()) : Positions() = PositionD
AddElement(Positions()) : Positions() = PositionN

SortList(Positions(), #PB_Sort_Ascending)

ForEach Positions()
  Positions() = ListIndex(Positions())
  Debug Positions()
Next

Debug PositionA
Debug PositionT
Debug PositionD
Debug PositionN

Artist$ = Trim(StringField(Filename$, PositionA, "-")) 
Title$ = Trim(StringField(Filename$, PositionT, "-")) 
DiscID$ = Trim(StringField(Filename$, PositionD, "-")) 
TrackNr$ = Trim(StringField(Filename$, PositionN, "-")) 

Debug "Artist: " + Artist$
Debug "Title: " + Title$
Debug "DiscID: " + DiscID$
Debug "TrackNr: " + TrackNr$
Mit "ListIndex" war es schon mal eine gute Idee, aber trotzdem komm ich da irgendwie nicht weiter! :(
PureBasic 6.00 | Windows 10 pro (x64)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Ganzzahlen ordnen

Beitrag von NicTheQuick »

Ohne Struktur wird das nichts. Schau dir das Beispiel von PureLust nochmal genauer an und versuche sie zu verstehen. Du hast eigentlich nichts davon angewandt. :wink:
Bild
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: Ganzzahlen ordnen

Beitrag von PureLust »

Mal 'ne kleine Frage ... was möchtest Du mit dem Code überhaupt bewirken?

Denn wenn Du das machen möchtest, was ich denke was Du machen möchtest, bist Du das ganze viiiiiel zu kompliziert angegangen. :wink:
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Re: Ganzzahlen ordnen

Beitrag von Zerosurf »

Der Code soll bewirken, daß ich Karaoke Lieder die in unterschiedlicher Form abgespeichert sind, wie zB. "DiscID-TrackNr - Artist - Title.mp3" oder "Artist - Title - TrackNr.mp3", also in den unterschiedlichsten Varianten in eine Datenbank speichern kann.

Ich muss dem Programm eben sagen, an welcher Stelle vom Dateinamen wo sich was befindet (Template$ = "D-N - A - T") welches ich mittels InputRequester eingebe und dann soll es alle Lieder mit dem richtigen "Naming" in der Datenbank abspeichern.
PureBasic 6.00 | Windows 10 pro (x64)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Ganzzahlen ordnen

Beitrag von NicTheQuick »

Ja, das hab ich auch so verstanden. Ich würde es in etwa wie folgt machen, aber das ist jetzt halt schon etwas fortgeschrittener und es gäbe noch ein Problem, wenn am Ende des Templates was anderes als ein Buchstabe steht. Es funktioniert mit allen Großbuchstaben von A bis Z. Alle andere Zeichen im Template werden als zwingende Trennzeichen angesehen.

Code: Alles auswählen

Procedure ExtractByMask(string.s, template.s, Map info.s())
	Protected it.i, itOld.i, t.s, marker.s = "", pos.i, between.s
	For it = 1 To Len(template)
		t = Mid(template, it, 1)
		If t >= "A" And t <= "Z"
			If marker <> ""
				between = Mid(template, itOld + 1, it - itOld - 1)
				pos = FindString(string, between)
				info(marker) = Mid(string, 1, pos - 1)
				string = Mid(string, pos + Len(between))
			EndIf
			itOld = it
			marker = t
		EndIf
	Next
	info(marker) = string
EndProcedure

Template$ = "D-N - A - T"
Filename$ = "SF390-01 - Freya Ridings - Lost Without You"

NewMap info.s()

ExtractByMask(Filename$, Template$, info())

Debug "Artist: " + info("A")
Debug "Title: " + info("T")
Debug "DiscID: " + info("D")
Debug "TrackNr: " + info("N")
Bild
Antworten