Seite 1 von 3
Ganzzahlen ordnen
Verfasst: 20.01.2020 16:27
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
Re: Ganzzahlen ordnen
Verfasst: 20.01.2020 16:48
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
Re: Ganzzahlen ordnen
Verfasst: 20.01.2020 17:14
von Zerosurf
Super, vielen Dank!
Kann ich das ganze auch ohne Liste machen, nur mit den Variablen?
Re: Ganzzahlen ordnen
Verfasst: 20.01.2020 17:39
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.
Re: Ganzzahlen ordnen
Verfasst: 20.01.2020 17:40
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.
Re: Ganzzahlen ordnen
Verfasst: 20.01.2020 17:42
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!

Re: Ganzzahlen ordnen
Verfasst: 20.01.2020 17:46
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.

Re: Ganzzahlen ordnen
Verfasst: 20.01.2020 17:51
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.

Re: Ganzzahlen ordnen
Verfasst: 20.01.2020 18:02
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.
Re: Ganzzahlen ordnen
Verfasst: 20.01.2020 18:08
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")