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:

Strings werden falsch sortiert? - Alternative???

 
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: 960
Wohnort: Niederbayern

BeitragVerfasst am: 15.02.2018, 23:15    Titel: Strings werden falsch sortiert? - Alternative??? Antworten mit Zitat

Ich habe Strings die wie folgt aus sehen:

Code:
Temp(1) = "1"
Temp(2) = "10"
Temp(3) = "1.5"
Temp(4) = "5.5"
Temp(5) = "2.5"
Temp(6) = "4"
Temp(7) = "12"
Temp(8) = "9"
Diese sollen von 1-12/12-1, quasi aufsteigend oder absteigend sortiert werden. Leider sortiert der bei Strings immer so:

Code:
Temp(1) = "1"
Temp(2) = "1.5"
Temp(3) = "10"
Temp(4) = "12"
Temp(5) = "2.5"
Temp(6) = "4"
Temp(7) = "5.5"
Temp(8) = "9"
Kann man das irgendwie ändern? Man wird jetzt einfach sagen: Integer verwenden, aber das ist in meinem Fall nicht so einfach mit Integer umzusetzen. Warum sortiert der Strings anders als Integer? Welche Alternativen gibt es? Irgendwelche Tricks anwendbar auf Strings?

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05


Zuletzt bearbeitet von ALWIM am 16.02.2018, 17:05, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 15.02.2018, 23:28    Titel: Antworten mit Zitat

Was du suchst nennt sich "Natural Sort". FreeBASIC kann das nicht von Haus aus, aber es gibt dutzende Quellen dazu im Internet die die Idee dahinter erklären und Beispielcode in diversen Sprachen dazu mitliefern, z.B. hier: https://unclassified.software/de/source/naturalsort
_________________
» 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: 960
Wohnort: Niederbayern

BeitragVerfasst am: 16.02.2018, 17:05    Titel: Antworten mit Zitat

Interessant, das zu hören...
Wäre das mit Freebasic-Mitteln zu lösen? Oder muss ich wirklich von String zu Integer wechseln? Auf jeden Fall, muss ich mir was einfallen lassen.

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


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

BeitragVerfasst am: 16.02.2018, 17:18    Titel: Antworten mit Zitat

Meine Güte, ALWIM, kannst du nicht ein einziges Mal etwaas Eigeninitiative zeigen, oder wartest du wieder darauf dass dir jemand die Funktion wie sie in dem Artikel beschrieben wird 1:1 nachbaut und sagst dann, dass du das auch gekonnt hättest?!

Aber gut, hier noch mal eine kurze Beschreibung, was du bei deinem Einsatzzweck tun musst:
1. Deine Sortierfunktion muss umgebaut werden damit sie nicht =, <, <=, >, >= oder was auch immer zum Vergleich verwendet, sondern ruft eine Funktion auf, die die zwei zu vergleichenden Strings als Parameter nimmt.
2. Diese Funktion schaut sich in die zu vergleichenden Strings ein Zeichen nach dem anderen an. Sind die beiden angeschauten Zeichen keine Ziffern, so werden sie ganz normal vergleich (z.B. mit <). Ein "echtes" Natural Sort würde hier auch noch z.B. Umlaute richtig einsortieren, z.B. "ä" zwischen "a" und "b", aber wir wollen erst mal simpel anfangen, gell?
3. Falls die verglichenen Zeichen aber beides Ziffern sind, schaust du dir die beiden Strings ab diesem Zeichen bis zum nächsten Zeichen, das keine Ziffer ist an (oder Stringende, falls es kein solches Zeichen gibt). Diesen Substrings konvertierst du dann tatsächlich nach Integer und vergleichst ihn. Sind beide konvertierte Zahlen gleich, fährt der Vergleich ganz normal fort, ansonsten gibt die Funktion eben zurück, dass einer der beiden Strings kleiner als der andere ist.

Das alles ist in FreeBASIC problemlos umsetzbar. Nach über 12 Jahren hier im Forum solltest du jetzt auch mal zeigen können, dass du so eine Beschreibung selbstständig in Code umsetzen kannst.
_________________
» 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
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1855
Wohnort: D59192

BeitragVerfasst am: 16.02.2018, 18:01    Titel: Bubble-Sort Beispiel für FreeBasic Antworten mit Zitat

Leicht geändertes Bubble-Sort Beispiel aus FreeBasic Portal:
Code:
'Bubble-Sort Beispiel für FreeBasic
'Der Code darf frei verwendet werden.
'Für eventuelle Schäden wird nicht gehaftet.
'AnzeigeCheck:|Il1 sind Alt-0124, Großes i, kleines L, Eins „ä”öüáߎę֚Üñ±¸©ø°
Dim Temp(8) As String

Sub BubbleSort(Tipp() As String, ByVal how As String=">") 'Sortiert kleinere Datenmengen zuverlässig in beiden Richtungen
  Dim As Long l=LBound(Tipp), u=UBound(Tipp)
  For i As Long = l To u
    For j As Long = l To u 'vom Anfang der Schleife bis zu ihrem Ende
      If IIf(how=">", Val(Tipp(i))<Val(Tipp(j)), Val(Tipp(i))>Val(Tipp(j))) Then Swap Tipp(i), Tipp(j) 'je nach gewählter Richtung werden die Elemente getauscht
    Next
  Next
End Sub

Sub MatOut(Msg As String="", Tipp() As String) 'Gibt die Matrix aus
  If Msg<>"" Then Print Msg 'Meldung vorhanden? Ja, dann ausgeben..
  For i As Long =LBound(Tipp) To UBound(Tipp)
    Print Tipp(i)
  Next
End Sub

Temp(0) = "0.5"
Temp(1) = "1"
Temp(2) = "10"
Temp(3) = "1.5"
Temp(4) = "5.5"
Temp(5) = "2.5"
Temp(6) = "4"
Temp(7) = "12"
Temp(8) = "9"

BubbleSort(Temp()) 'und sortieren, aufwärts ist default, braucht also nicht angegeben zu werden
MatOut("Aufw„rts", Temp()) 'sortierte Matrix ausgeben..

BubbleSort(Temp(), "<") 'und sortieren, diesmal aber abwärts
MatOut("Abw„rts", Temp()) 'sortierte Matrix ausgeben..
Sleep 'Programmende, auf Tastendruck warten, funktioniert aber nur im Konsolenmodus
aber das hast du bestimmt schon selbst gefunden?
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 960
Wohnort: Niederbayern

BeitragVerfasst am: 17.02.2018, 00:36    Titel: Antworten mit Zitat

Jojo hat Folgendes geschrieben:
Das alles ist in FreeBASIC problemlos umsetzbar.
Mehr wollte ich nicht hören! Dass mir jemand ein Beispiel liefert, oder etwas programmiert, war nicht in meinem Sinne. Ich bringe es auch ohne Hilfe hin. Wollte nur im Voraus wissen, ob es möglich ist. Bis jetzt habe ich mein Projekt immer noch zu 98% bis 99% selber programmiert.

volta hat Folgendes geschrieben:
Leicht geändertes Bubble-Sort Beispiel aus FreeBasic Portal:
Das Beispiel schaue ich gar nicht mal an. Schließlich will ich es selber programmieren! Immerhin weiß ich jetzt, dass es möglich ist.

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



Anmeldungsdatum: 03.10.2010
Beiträge: 860
Wohnort: Ruhrpott

BeitragVerfasst am: 17.02.2018, 15:33    Titel: Antworten mit Zitat

Jojo hat Folgendes geschrieben:
Meine Güte, ALWIM, kannst du nicht ein einziges Mal etwaas Eigeninitiative zeigen
Lass ihn doch, so kommt wenigstens etwas Leben ins Forum. zwinkern

Gruß
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
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 925
Wohnort: Austria

BeitragVerfasst am: 18.02.2018, 14:04    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:
Das Beispiel schaue ich gar nicht mal an. Schließlich will ich es selber programmieren! Immerhin weiß ich jetzt, dass es möglich ist.

Könnte aber dennoch nicht schaden es anzuschauen, denn es demonstriert die grundsätzliche Vorgangsweise anhand eines sehr einfachen Sortieralgorithmus. Wenn du eine performante Sortierung für größere Datenmengen brauchst kommt dann BubbleSort ohnehin nicht in Betracht. Du wirst also das gezeigte ohnehin auf einen anderen Sortieralgorithmus übertragen und somit den Code nicht 1:1 verwenden können.

Und übrigens ist im Allgemeinen jeder Algorithmus der in irgendeiner Programmiersprache implementiert wurde (z.B. C# für den von Jojo verlinkten Artikel) immer auch mit FreeBasic umsetzbar. Deine Frage ob etwas mit FreeBasic umsetzbar sei kann man demnach eigentlich immer mit Ja beantworten (und falls das nicht der Fall sein sollte wird man dich sicher darauf hinweisen).
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 960
Wohnort: Niederbayern

BeitragVerfasst am: 19.02.2018, 20:30    Titel: Antworten mit Zitat

St_W hat Folgendes geschrieben:
ALWIM hat Folgendes geschrieben:
Das Beispiel schaue ich gar nicht mal an. Schließlich will ich es selber programmieren! Immerhin weiß ich jetzt, dass es möglich ist.

Könnte aber dennoch nicht schaden es anzuschauen, denn es demonstriert die grundsätzliche Vorgangsweise anhand eines sehr einfachen Sortieralgorithmus. Wenn du eine performante Sortierung für größere Datenmengen brauchst kommt dann BubbleSort ohnehin nicht in Betracht. Du wirst also das gezeigte ohnehin auf einen anderen Sortieralgorithmus übertragen und somit den Code nicht 1:1 verwenden können.

Und übrigens ist im Allgemeinen jeder Algorithmus der in irgendeiner Programmiersprache implementiert wurde (z.B. C# für den von Jojo verlinkten Artikel) immer auch mit FreeBasic umsetzbar. Deine Frage ob etwas mit FreeBasic umsetzbar sei kann man demnach eigentlich immer mit Ja beantworten (und falls das nicht der Fall sein sollte wird man dich sicher darauf hinweisen).
Angeschaut habe ich mir es jetzt doch einmal! (Da ich mein Problem lösen konnte, brauche ich das Beispiel nicht mehr.) Ich habe aus dem String einfach einen Double gemacht. Somit wird alles richtig sortiert und gut ist. Ich musste letztendlich sowieso einen Double draus machen, da ich sonst an anderer Stelle Probleme kriege. War nicht leicht, bei meinem Programm aus dem String einen Double zu machen. Aber ich habe es zum Schluss doch hinbekommen! Richtig analysieren und studieren, werde ich das Beispiel ein anderes mal. Trotzdem vielen herzlichen Dank für die Infos!

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05


Zuletzt bearbeitet von ALWIM am 20.02.2018, 22:58, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 19.02.2018, 22:23    Titel: Antworten mit Zitat

Bei Zahlen mit Nachkommastellen würde ich ja eher zu SINGLE oder DOUBLE raten, aber wenn INTEGER für dich funktionieren, ist das selbstverständlich in Ordnung.
_________________
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
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 960
Wohnort: Niederbayern

BeitragVerfasst am: 20.02.2018, 22:56    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Bei Zahlen mit Nachkommastellen würde ich ja eher zu SINGLE oder DOUBLE raten, aber wenn INTEGER für dich funktionieren, ist das selbstverständlich in Ordnung.
Stimmt! Ich habe mich bloß verschrieben. In meinem Programm ist das ganze mit Double definiert und funktioniert.

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht 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