Übungsaufgabe für alle :: Nr. 6 - Strings parsen

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

wunderkind

Betreff: Übungsaufgabe für alle :: Nr. 6 - Strings parsen

BeitragMi, Feb 09, 2005 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Und weiter. Die letzte Aufgabe wurde wieder mit Bravour gelöst. Dieses Mal geht es vorrangig um das Parsen eines Strings.

Aufgabe
Erstelle ein BB-Programm, welches einen String interpretiert und entsprechend bei der Ausgabe auf dem Bildschirm eine bestimmte Farbe für eingeschlossene Zeichen verwendet. Folgende Farbkodierungstags sollen gültig sein:

{r}Dieser Text ist rot.{/r}
Ausgabe: Dieser Text ist rot.

{g}Dieser Text ist grün.{/g}
Ausgabe: Dieser Text ist grün.

{b}Dieser Text ist blau.{/b}
Ausgabe: Dieser Text ist blau.

{rgb 255 0 255}Dieser Text ist lila.{/rgb}
Ausgabe: Dieser Text ist lila

Die Standardfarbe ist weiß.


Es gibt zwei Varianten der Aufgabe:

Einfach Variante
Die Farb-Tags müssen nicht geschlossen werden! Wird dennoch ein Tag zum Schließen gefunden (egal welches), dann wird für die folgenden Zeichen die Standardfarbe verwendet bis ein weiteres Farb-Tag gefunden wird. Ein gültig kodierter String würde z.B. so aussehen: "Karl geht {b}mit seiner Freundin {r}in den Park, um zu angeln und{/b} etwas Ruhe zu finden." Es müssen keine Fehler gemeldet werden, auch nicht bei fehlerhaftem {rgb}-Tag. Ist dieser Tag fehlerhaft, dann wird er normal im Text ausgegeben.

Schwierigere Variante
Alle Tags müssen geschlossen werden und dürfen nicht über Kreuz verschachtelt sein. Gültig wäre "{b}Ein blauer Text wird plötzlich {r}rot{/r} und dann wieder blau{/b}". Nicht gültig hingegen "{b}Blau ist blau {r} und rot ist rot{/b}.{/r}". Fehler müssen bei dieser Variante unbedingt genannt werden. Ein nicht korrekt kodierter String wird nicht ausgegeben.

Ich hoffe, ich habe nichts vergessen.

Zum Lösen der Aufgabe habt ihr eine Woche Zeit (bis zum 16.02.).

Eine Bitte
Wie immer die Bitte: Posted eure vollständigen Lösungen bitte nicht vor Mittwoch 16.02. damit alle eine Chance haben, selbstständig ihre Lösung zu finden. Fragen und Teillösungen sind natürlich wieder willkommen, damit jeder hier etwas lernen kann. Fertige Programme könnt ihr selbstverständlich als .exe jederzeit zum Download bereitstellen.

Die vergangenen Übungsaufgaben findet ihr hier:
Aufgabe Nr. 1 : Logische Operatoren
Aufgabe Nr. 2 : Menüstruktur unter Verwendung von Types
Aufgabe Nr. 3 : Umwandlung von Zahlen zwischen Binär-, Dezimal- und Hexadezimalsystem
Aufgabe Nr. 4 : Rekursion
Aufgabe Nr. 5 : Hamming-Distanz

Viel Erfolg!
  • Zuletzt bearbeitet von wunderkind am So, März 13, 2005 13:16, insgesamt einmal bearbeitet

Maniac

BeitragMi, Feb 09, 2005 21:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Sollen die Strings aus einem File gelesen werden oder schon im Code vor definiert sein?
User posted image
^^

wunderkind

BeitragMi, Feb 09, 2005 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Woher der String stammt, ist egal. Einfacher zu handhaben ist ein String aus einer Konstanten.

Maniac

BeitragMi, Feb 09, 2005 22:52
Antworten mit Zitat
Benutzer-Profile anzeigen
ok (:
User posted image
^^

Maniac

BeitragDo, Feb 10, 2005 15:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch eine Frage =)

Soll das RGB Tag beliebig verändert werden können oder soll nur lila sozusagen "ausgelesen" werden?

Er schwerend wäre hierbei nämlich, dass man nicht weiß, ob es sich nun um 3,2, oder eine Zahl handelt.. (255,255,255),(255,43,222),(92,2,122)
Oder darf man die fehlenden "Zahlen" mit führenden 0len auffüllen?
User posted image
^^

Spikespine

BeitragDo, Feb 10, 2005 15:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Es wäre ja nicht wirklich schwer. Du musst das doch nur auf ein Komma prüfen... edit: äh, auf erin leerzeichen seh ich gerade...

Maniac

BeitragDo, Feb 10, 2005 16:04
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn man sich auf ein Trennzeichen einigen könnte wäre es um einiges einfacher..
Da man dann einfach nach nem Strichpunkt zb sucht,
Aber das Leerzeichen kommt ja nicht nur in den FormatTags vor ;]

edit: ok es ist insofern egal ob leerzeichen oder Sonderzeichen -.-
User posted image
^^

Chester

BeitragDo, Feb 10, 2005 16:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Irgendwie verstehe ich das jetzt nit.

Ist das jetzt so gemeint? :

Text x,y, "[b]Ich bin der Text![b]"

oder wie?

simi

BeitragDo, Feb 10, 2005 16:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Nö, du schreibst eine Funktion, z.B:
Code: [AUSKLAPPEN]

GibTextFormatiertAus("{r}Dieser Text ist rot.{/r} ")

Und jetzt sollte dein Programm auf den Bildschirm (oder TextArea) das so ausgeben:
Zitat:

Dieser Text ist rot.


Klar?!

wunderkind

BeitragDo, Feb 10, 2005 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Genügt euch denn bei rgb-Tag als Trennzeichen das Leerzeichen nicht? Nehmt einfach das Leerzeichen.

Jemand fragte, ob nur Lila mit dem rgb-Tag gemeint ist? Natürlich nicht Wink! Die drei Werte beim rgb-Tag können je beliebig von 0 bis 255 reichen.

Maniac

BeitragDo, Feb 10, 2005 16:55
Antworten mit Zitat
Benutzer-Profile anzeigen
jaja habs ja eh schon^^
User posted image
^^

Chester

BeitragFr, Feb 11, 2005 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
simi hat Folgendes geschrieben:
Nö, du schreibst eine Funktion, z.B:
Code: [AUSKLAPPEN]

GibTextFormatiertAus("{r}Dieser Text ist rot.{/r} ")

Und jetzt sollte dein Programm auf den Bildschirm (oder TextArea) das so ausgeben:
Zitat:

Dieser Text ist rot.


Klar?!


So einfach? na dass krieg ja wahrscheinlich ich schon hin.
 

David

BeitragFr, Feb 11, 2005 15:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Naja, etwas komplizierter ist das schon. Es sollen ja unterschiedliche Tags unterstützt werden, desweiteren sollen die Tags beliebig kombiniert werden können usw... Steht ja alles oben. Nicht zu vergessen die Fehlerausgabe.

grüße
 

feider

ehemals "Decelion"

BeitragSo, Feb 13, 2005 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kannb nächste Woche wahrscheinlich nicht ans Internet.
Ich hab dir den Code nun per PN geschickt, es wäre schön wenn du ihn veröfffentlichen würdest.
(Natürlich unter meinem Namen)

wunderkind

BeitragSo, Feb 13, 2005 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
@Wammerl
Das ist Mittwoch. Sollte gehen.

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSo, Feb 13, 2005 22:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Na dann will ich mal meine 08/15.exe hier zum download anbieten

das proggie erstellt beim ersten Start eine neue Textdatei, die dann nach belieben geändert werden kann!
bei jedem Neustart des Programms wird diese dann eingelesen und ausgegeben!
http://people.freenet.de/ralli...llimen.exe
Gültige Tags
mit r,g oder b
{r}{/r}{ r }{ / r }

{Rgb 122 10 250} Hier auf die 3 Ziffern mit Leerzeichen achten
{ /rgb }
[BB2D | BB3D | BB+]

wunderkind

BeitragSo, Feb 13, 2005 22:52
Antworten mit Zitat
Benutzer-Profile anzeigen
@Rallimen
Sehr schön. Mitsamt Fehlerangabe und funktioniert.

wunderkind

BeitragDo, Feb 17, 2005 10:00
Antworten mit Zitat
Benutzer-Profile anzeigen
War euch die Aufgabe zu schwer?

Hier die Lösung von Wammerl:

Code: [AUSKLAPPEN]
Graphics 800, 600, 16, 2
Satz$=Input("Geben sie bitte einen Satz ein: ")
intAnzForm=1
intChange=1
For i = 1 To Len(satz)
   Select Mid(Satz$, i, 3)
      Case "{r}"
         intChange=intChange+1
      Case "{g}"
         intChange=intChange+1
      Case "{b}"
         intChange=intChange+1
      Case "{w}"
         intChange=intChange+1
      Case "{s}"
         intChange=intChange+1
   End Select
Next

Dim Form$(intChange, 2)

For i = 1 To Len(satz$)
   If Mid(Satz, i, 1)="{" Then
      i=i+1
      Select Mid(Satz, i, 2)
         Case "r}"
            i=i+2
            intAnzForm=intAnzForm+1

            Form(intAnzForm, 2)=1
         Case "g}"
            i=i+2
            intAnzForm=intAnzForm+1

            Form(intAnzForm, 2)=2           
         Case "b}"
            i=i+2
            intAnzForm=intAnzForm+1

            Form(intAnzForm, 2)=3           
         Case "w}"
            i=i+2
            intAnzForm=intAnzForm+1

            Form(intAnzForm, 2)=0
         Case "s}"
            i=i+2
            intAnzForm=intAnzForm+1

            Form(intAnzForm, 2)=4   
      End Select

   EndIf
   Form(intAnzForm, 1)=Form(intAnzForm, 1)+Mid(Satz, i, 1)
Next
Print ""
For i = 1 To intAnzForm
   Select Form(i, 2)
      Case 0
         Color 255, 255, 255
      Case 1
         Color 255, 0, 0
      Case 2
         Color 0, 255, 0
      Case 3
         Color 0, 0, 255
      Case 4
         Color 0, 0, 0
   End Select
   Write Form(i, 1)
Next
 

lettorTrepuS

BeitragDo, Feb 17, 2005 10:07
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDo, Feb 17, 2005 10:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier meinsCode: [AUSKLAPPEN]

AppTitle "Nr. 6 - Strings parsen (c)Rallimen"
Type ColStack Field RGB,Tag$ End Type
Type TextStack Field RGB,TextString$,Farbe$ End Type
Graphics 1000 ,500,16,2
Font = LoadFont ("Ariel",22,0,0,0)
SetFont font
Dat = ReadFile ("CodeTagsTextDatei.txt")
If Dat = False Then Dat = CreateDat ()

While Not Eof (Dat)
    A$ = ReadLine (Dat)
    Ausgabe a$
Wend

CloseFile Dat
Print ""
Print ""
Ausgabe (" {rgb 255 255 0}KeyHit {rgb 100 200 0}={/rgb} End{/rgb }")
WaitKey ()
End

Function CreateDat ()
    Dat = WriteFile ("CodeTagsTextDatei.txt")
    WriteLine Dat,"{rgb 255 255 0}TestDatei kann ediert werden {g} >>CodeTagsTextDatei.txt<<{/g}{/rgb}"
    WriteLine Dat,"{rgb 255 125 0} Diese { r } >>CodeTagsTextDatei.txt<<{/r} befindet sich im gleichen Verzeichnis {/rgb} "
    WriteLine Dat,"Hier kommt jetzt ein fehlerhafter CodeTag >>{/r} {b} Na, gesehen {/b}"
    WriteLine Dat," "
    WriteLine Dat,"{rgb 255 255 0} Gelb {b} Blau {r} Rot{g} Grün {/g} Rot {/r} Blau {/b}{/rgb} Weiss{b} Blau {r} Rot{g} Grün {/g} Rot {/r} Blau {/b}"
    CloseFile Dat
    Dat = ReadFile ("CodeTagsTextDatei.txt")
    Return Dat
End Function

Function Ausgabe (A$)
    Asicherung$ = a$
   
    While Len (a$)
        DummyST = Instr (A$,"{")
        ;DummyEN = Instr (A$,"}")
       
        Select DummyST
         Case 0 ; kein tag gefunden
            T.TextStack = New TextStack
            T\TextString$ = A$
            T\RGB = $ffffff
            a$ = "";
         Case 1 ; code tag direckt am anfang gefunden
            STtag$ = Upper (Left (a$,Instr (A$,"}") ) )
            If Instr (STtag$,"/") = 0 Then; neue Farbe
                C.ColStack = New ColStack
                If Instr (STtag$,"RGB") Then
                    ;Nummern rausziehen ; keine optimierte Fehlerkontrolle
                    If Instr (STtag$," ") = 0 Then Fehler = True : Goto Fehlermarke
                    STtag$ = Mid (STtag$,Instr (STtag$," ") + 1)
                    If Instr (STtag$," ") = 0 Then Fehler = True : Goto Fehlermarke
                    RGB_R = Left (STtag$,Instr (STtag$," ") - 1)
                    STtag$ = Mid (STtag$,Instr (STtag$," ") + 1)
                    If Instr (STtag$," ") = 0 Then Fehler = True : Goto Fehlermarke
                    RGB_G = Left (STtag$,Instr (STtag$," ") - 1)
                    RGB_B = Mid (STtag$,Instr (STtag$," ") + 1)
                    c\rgb = (RGB_R Shl 16) + (RGB_G Shl 8) + RGB_B
                    C\Tag$ = "RGB"
                 Else If Instr (STtag$,"R")
                    C\RGB = $FF0000 ;= rot
                    C\Tag$ = "R"
                 Else If Instr (STtag$,"G")
                    C\RGB = $FF00 ;= grün
                    C\Tag$ = "G"
                 Else If Instr (STtag$,"B")
                    C\RGB = $FF ;= blau
                    C\Tag$ = "B"
                 Else;Farbe zurücksetzten
                    Fehler = True : Goto Fehlermarke
                End If
                A$ = Mid (A$,Instr (A$,"}") + 1 )
             Else ; wenn / farbe Stack kurzen
                If C.ColStack = Null Then
                    Fehler = True : Goto Fehlermarke
                End If
                If Instr (STtag$,"RGB") Then
                    If C\Tag$ = "RGB" Then
                        Delete c
                        C.ColStack = Last ColStack
                     Else
                        Fehler = True : Goto Fehlermarke
                    End If
                 Else
                    If Instr (STtag$,C\Tag$) Then
                        Delete c
                        C.ColStack = Last ColStack
                     Else
                        Fehler = True : Goto Fehlermarke
                    End If
                End If
                A$ = Mid (A$,Instr (A$,"}") + 1)
            End If
         Default
            T.TextStack = New TextStack
            If T.TextStack = Null Then T.TextStack = New TextStack
            If C.ColStack = Null Then
                T\RGB = $FFFFFF
                T\TextString$ = Left (a$,Instr (A$,"{") - 1) ;Text einfügen
             Else
                ;letzte Farbe nehmen
                T\RGB = C\RGB
                T\TextString$ = Left (a$,Instr (A$,"{") - 1)
            End If
            A$ = Mid (A$,Instr (A$,"{") )
        End Select
       
    Wend
   
    ; fehlerausgabe und Druck
    C.ColStack = Last ColStack
    If C.ColStack <> Null Then
        Fehler = True : Goto Fehlermarke
    End If
   
    For T.TextStack = Each TextStack
        Color 0 ,0,T\RGB
        Write T\TextString$
    Next
   
    Print ""
   
    .Fehlermarke
   
    Delete Each TextStack
    Delete Each ColStack
    If Fehler Then ; fehlerzeile ausgeben und 1.Fehler Markieren
        Color 0 ,0, $ffffff
        Print ""
        Print "Fehler in Zeile entdeckt"
        gs = Len (Asicherung)
        rs = Len (A)
        Asicherung = Left (Asicherung$,Len (Asicherung) - Len (A) )
        Write "Zeile: " + Asicherung$
        Color 0 ,0, $ff0000
        Write Left (a,Instr (a,"}") )
        If Instr (a,"}") <> Len (a) Then
            Color 0 ,0, $ffffff
            Print Mid (a,Instr (a,"}") + 1)
         Else
            Print ""
        EndIf
    End If
End Function


[BB2D | BB3D | BB+]

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group