 |
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 |
Leader4
Anmeldungsdatum: 20.01.2005 Beiträge: 99 Wohnort: Leipzig
|
Verfasst am: 20.03.2005, 19:51 Titel: Sortiervorgang |
|
|
Moin . Kennt jemand zufällig einen Programmblock, mit dem man Strings alphabetisch sortieren kann? Ich dächte, dass ich einmal so einen Programmcode in einem Basicbuch gesehen hätte, aber ich finde es nicht mehr. Ich glaube, dass man dieses Problem mit mehreren verschachtelten Zählscheifen gelöst hat. Ich komm aber nicht mehr drauf.
Beispiel: Nachfolgede String sollen sortiert werden.
A$(1) = "Haus"
A$(2) = "Baum"
A$(3) = "Computer"
A$(4) = "Ahorn"
A$(5) = "Aachen"
So dass rauskommt:
Aachen
Ahorn
Baum
Computer
Haus |
|
Nach oben |
|
 |
Mecki Igel

Anmeldungsdatum: 10.09.2004 Beiträge: 985 Wohnort: Niederbayern
|
Verfasst am: 20.03.2005, 20:05 Titel: |
|
|
Hi!
Das müsstest du auch selber machen können.
Einfach den ersten Buchstaben von A$(n) und A$(n+1) vergleichen.
Über die ASCII-Tabelle kannst du entscheiden, welcher der "größere" ist. Also A=65, B=66 usw.
Also solltest du den String auch noch in Großbuchstaben umwandeln
Mit dem SWAP-Befehl kannst du dann, wenn die Reihenfolge der beiden Vergleichs-Strings falsch ist, diese vertauschen.
Code: | IF ASC(LEFT$(UCASE$(A$(n)),1)) > ASC(LEFT$(UCASE$(A$(n+1)),1)) THEN SWAP A$(n), A$(n+1) |
UCAE$(A$) macht alles in Großbuchstaben.
LEFT$(..., 1) gibt den linkesten Buchstaben aus.
ASC(...) liefert den ASCII-Code eines Strings.
Ich denke, dass du dir jetzt daraus selber eine Schleife basten können solltest, die alle Strings sortiert.
Tipp: Vor der Schleife schreiben: Something.Changed=0 und bei dem THEN.. noch: something:Changed=1 dazuschreiben
Dann kannst du eine DO-LOOP-Schleife machen, die UNTIL Something.Changed = 0 läuft
Grüßle,
Mecki _________________ » Yodl.de: So sucht man gestern.
» Geld verdienen im Netz + ICQ.
» Firefox!
» 100€ zu gewinnen
» FreeBASIC.de |
|
Nach oben |
|
 |
Tomtitom

Anmeldungsdatum: 20.09.2004 Beiträge: 308
|
Verfasst am: 20.03.2005, 20:51 Titel: |
|
|
das ASC kann man sich auch sparen, da QB beim vergleichen von 2 Strings automatisch in Ascii-Zahl umwandelt.
Und auch das Left$ brauchst du nicht, das macht alles schon QB für dich, nur groß-und kleinschreibung muss beachtet werden.
Code: | if ucase$(wort1$) > ucase$(wort2$) then swap ... |
reicht also, es wird auch erkannt, dass "aab" größer als "aaa" ist.
Wenn du die Bubbelsort-Methode von Mecki nimmst, musst du (n-1) mal alle Wörter durchlaufen, mit Quicksort oder Mergesort, allerdings nur n*log(n) -mal, ergo sie sind schneller, aber auch komplizierter.
Falls du dich für eine der Sortiermethoden interessierst, findest du im Netz oder wahrscheinlich auch hier im Forum viel darüber. |
|
Nach oben |
|
 |
stef
Anmeldungsdatum: 13.01.2005 Beiträge: 102
|
Verfasst am: 21.03.2005, 09:36 Titel: |
|
|
Beim Stringvergleich von Qbasic gibt es ein paar Probleme. Das eine (bereits erwähnte) ist das das Ergebnis nur richtig ist, wenn nur klein oder nur Großbuchstaben verwendet werden. Ein weiteres Problem sind Umlaute und das 'ß'.
Deshalb würde ich empfehlen den Vergleich in eine Funktion auszulagern wo all dies berücksichtigt wird:
Code: | '****************************************************
'* Vergleich von Zwei Texten unter berücksichtigung
'* von Umlauten, ß und der Groß-/Kleinschreibung
'****************************************************
FUNCTION groesserAls% (text1 AS STRING, text2 AS STRING)
t1$ = LCASE$(text1$)
t2$ = LCASE$(text2$)
FOR i% = 1 TO LEN(t1$)
SELECT CASE MID$(t1$, i%, 1)
CASE "ä", "Ä": MID$(t1$, i%, 1) = "a"
CASE "ö", "Ö": MID$(t1$, i%, 1) = "o"
CASE "ü", "Ü": MID$(t1$, i%, 1) = "u"
CASE "ß": MID$(t1$, i%, 1) = "s"
END SELECT
NEXT i%
FOR i% = 1 TO LEN(t1$)
SELECT CASE MID$(t2$, i%, 1)
CASE "ä", "Ä": MID$(t2$, i%, 1) = "a"
CASE "ö", "Ö": MID$(t2$, i%, 1) = "o"
CASE "ü", "Ü": MID$(t2$, i%, 1) = "u"
CASE "ß": MID$(t2$, i%, 1) = "s"
END SELECT
NEXT i%
groesserAls% = (t1$ > t2$)
END FUNCTION |
In dieser Funktion wird zum Beispiel das'Ä' wie ein 'A' behandelt, was ja in einem Lexikon überlich ist. Angewendet sieht das Ganze dann so aus:
Code: | if groesserAls(wort1$, wort2$) then swap ... |
|
|
Nach oben |
|
 |
Thomas Antoni

Anmeldungsdatum: 12.10.2004 Beiträge: 220 Wohnort: Erlangen
|
Verfasst am: 21.03.2005, 17:04 Titel: Ist alles in der QB-MonsterFAQ beschrieben ... |
|
|
Ist alles in der QB-MonsterFAQ beschrieben. Unter
"www.qbasic.de | QB-MonsterFAQ | Sortieren und Suchen | Wie kann ich ein paar Texte sortieren?" _________________ +++ Die beliebte QBasic CD-ROM von QBasic.de - 670 MB QBasic-Stuff mit komfortabler HTML-Oberfläche. Für nur 5 EUR bestellbar auf www.antonis.de/qbcdueb.htm +++ |
|
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.
|
|