Tutorial
Stringmanipulation 2
von The_Muh | Seite 1 von 1 |
Vorwort:
Ich setze einfach mal voraus das du Maos Tutorial schon gelesen hast. Dies ist lediglich eine Erweiterung und Ergänzung. Außerdem solltest du bereits die Arbeitsweise von For.. Next und Do... Loop Schleifen kennen.
Also los geht’s:
Fangen wir mit einem Problem an das früher oder später jedem begegnen wird. Wie verarbeite ich auf einfache Weise einzelne Tastendrücke? Dafür gibt es in Freebasic den Befehl Inkey. Inkey übergibt den momentanen Tastatur-Puffer in eine Variable, Beispiel:
Dim key as string
Key = Inkey
print Key
Sleep
Das würde, wenn der User schnell genug drückt, die Taste ausgeben die er gedrückt hat, da das Programm aber zu schnell abläuft müssen wir uns anders Abhilfe schaffen, dazu nehmen wir eine Do... Loop-Schleife und Sleep. Beispiel:
Dim key as string
do
sleep 1
key = inkey
loop until key <> ""
print key
sleep
Erklärung : Sleep 1 bremst einfach nur die schleife aus, damit die Prozessor Auslastung nicht in die Höhe schießt, Key = inkey bewirkt das der Tastatur-Puffer in die Variable Key wandert. loop until key "" sagt der Schleife das sie beendet werden soll sobald key nicht mehr leer ist. Print Key gibt dann den Inhalt von key aus. Mit diesen einfachen Methoden kann man wunderbare Dinge anstellen, sogar Tasten wie F1-F12 oder die Pfeiltasten auswerten. Jetzt stellt sich nur die Frage, wie wir das machen.
Erstmal brauchen wir eine Rechen-günstige Methode Key abzufragen. Das geht am besten wenn wir Key in einen Zahlenwert umwandeln (siehe Maos Tutorial) und mit einem Case-Block abfragen. Man kann das zwar auch umgekehrt machen und anhand der Zahlenwerte ein Zeichen generieren und dann vergleichen, allerdings wird dann bei jedem vergleich ein neues Zeichen generiert und das ist nicht grade sehr effizient. Zur Erinnerung: ASC() gibt einen Integer-Wert zurück, Chr() gibt einen String aus (als einzelnen Buchstaben). Nun ein Beispiel:
Dim key as string
dim first as integer
dim second as integer
dim ascF as integer
dim ascS as integer
do
sleep 1
key = inkey
loop until key <> ""
first = left(key, 1)
second = right(key 1)
ascF = asc(first)
ascS = asc(second)
select case ascF ' erstes Zeichen auswerten
case 13
print "Du hast Enter gedrückt"
case 27
print "Du hast ESC gedrückt"
case 8
print "Du hast Backspace gedrückt"
end select
select case ascS 'zweites Zeichen
case 72
print "Du hast Pfeil-Oben gedrückt"
case 80:
print "Du hast Pfeil-Unten gedrückt"
end select
Erklärung:
Wir müssen Key mit left und right zerteilen da bei Tasten wie F1 oder den Pfeiltasten nicht 1 Zeichen, sondern 2 Zeichen in Key gesteckt werden, die einfachere Variante wäre, bei select case gleich asc(first) bzw asc(second) zu benutzen, dies hab ich der Übersicht halber nicht gemacht. Information am Rande: Bei Tasten die key mit zwei statt einem Zeichen füttern ist der erste ASC-wert fast immer 255, die Prüfung mit CHR() sehe dann so aus:
...
case chr(255,72) 'Pfeil nach oben
...
Dies ist aber nur bei Prüfung auf eine Taste zu empfehlen (Das ganze geht nartürlich auch mit normalen Tasten wie ESC)
Da wohl Niemand alle diese Zahlenwerte auswendig kennt, hier ein kleiner Code der die Werte bei Tastendruck ausgibt:
Dim Taste as string
do
Taste=inkey
'Taste mit dem aktuellem Puffer füttern
if len(taste) = 1 then ' "normale taste"
' Prüfen ob einfaches Zeichen
Print "Chr(" & Asc(Taste) & ")"
'Den ASCII-Code ausgeben
elseif len(taste) = 2 then
' Prüfen ob „Spezielles“ Zeichen
Print "Chr(" & Asc(Left(Taste,1)) & "," & Asc(Right(Taste,1)) & ")
'beide ASCII-Codes ausgeben
end if
'Prüfung ordnungsgemäß beenden
loop until taste=chr(27) 'Do-Loop verlassen sobald ESC gedrückt wurde
Dieser Code stammt nicht von mir, leider kann ich nicht mehr sagen von wem genau er ist.
Damit ist die Grundlage geschaffen um beispielsweise die Steuerung für ein Spiel zu machen.
Weiter mit Problem Nummer 2: Wie prüfe ich ob in String A der String B enthalten ist? Auch hierfür gibt es einen extra Befehl, wir müssen also nicht mit Mid, Left und Right herum experimentieren. Stattdessen nehmen wir Instr(). Beispiel:
dim text as string
dim suchwort as string
dim treffer as integer
text = "Hallo welt, dies ist ein Test"
suchwort = "Test“
treffer = instr(1,text,suchwort)
print treffer
sleep
Die 1 bei Instr() gibt die Position an ab der gesucht werden soll.
Der Code gibt „26“ zurück. Also die Stelle an der Test anfängt. Sollte Test nicht vorkommen, dann bekommt die Variable Treffer den Wert 0. Mit dieser Methode lässt sich aber nur die Position des ersten Treffers im String finden, also müssen wir etwas komplizierter werden.
Beispiel:
dim treffer as integer
dim suchpos as integer
dim text as string
dim suchwort as string
text = "der die das, der die das, der dir das"
suchwort = "der"
do
treffer = instr(suchpos+1,text,suchwort)
if treffer > 0 then
print "Position: "& treffer
end if
suchpos = treffer + len(suchwort) -1
loop until treffer= 0
Ausgabe:
Position: 1
Position: 14
Position: 27
Erklärung:
In jedem Durchgang wird mit Instr Treffer ein neuer Wert gegeben, wenn Treffer nicht 0 ist wird die Position des Fundes ausgegeben, dann wird die nächste Suchposition errechnet : letzte Trefferpositon, + die Länge des Suchwortes -1 . Sollte Treffer = 0 sein wird die Schleife verlassen und das Programm beendet. Ansonsten beginnt ein neuer Durchlauf mit der neuen Suchposition.
Benutzen kann man diese Funktion beispielsweise für Spiele wie Hangman (auch als Galgenmännchen bekannt), da man mit Instr auch nach einzelnen Buchstaben suchen kann.
Nun werden wir eine Zeichenkette erstellen!
Manchmal braucht man in einem Programm eine Zeichenkette mit festem Inhalt, der meistens nur aus einer Wiederholung von Zeichen besteht. Beispielsweise eine Linie.
Eine möglich Lösung wäre:
dim linie as string
for i as integer = 1 to 25
linie = linie + "-"
next
print Linie
einfacher geht es aber mit String(), Beispiel:
dim linie as string
Linie = string(25,"-")
print linie
oder auch die direkte Methode
print string(25,"-")
Alle 3 Codes geben jeweils 25 – hintereinander aus. String() wird eigentlich nicht oft gebraucht, allerdings fand ich diese Funktion erwähnenswert, da sie Code und Zeit spart.
Übrigens lässt sich so immer nur ein Zeichen „vervielfältigen“, auch Zeichen wie CHR(255,59) funktionieren damit nicht.
Und nun ein letztes Häppchen: Text im Grafikmodus ausgeben!
Du hast bestimmt schon mal Screen oder Screenres ausprobiert und gemerkt das man mit Locate und Print nicht genau positionieren kann. Doch dafür gibt es eine Abhilfe: Draw String(),
Mit Draw String kannst du pixelgenau Positionieren und die Farbe kontrollieren und das in einem Befehl:
screenres 400,400 ' Grafik-Fenster mit 400 * 400 pixeln erstellen
DRAW STRING (10, 20), "Hallo Welt", 2
sleep
Ausgabe:
Hallo Welt (in Grün)
Das wars dann erstmal, ich hoffe ich konnte euch ein wenig Helfen.
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|