Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

Stringmanipulation 2

von MitgliedThe_MuhSeite 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
  • Das Tutorial wurde am 05.08.2008 von MitgliedThe_Muh angelegt.
  • Die aktuellste Version wurde am 06.08.2008 von MitgliedThe_Muh gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen