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

![]() |
wunderkindBetreff: Übungsaufgabe für alle :: Nr. 6 - Strings parsen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sollen die Strings aus einem File gelesen werden oder schon im Code vor definiert sein? | ||
User posted image
^^ |
![]() |
wunderkind |
![]() Antworten mit Zitat ![]() |
---|---|---|
Woher der String stammt, ist egal. Einfacher zu handhaben ist ein String aus einer Konstanten. | ||
![]() |
Maniac |
![]() Antworten mit Zitat ![]() |
---|---|---|
ok (: | ||
User posted image
^^ |
![]() |
Maniac |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Irgendwie verstehe ich das jetzt nit.
Ist das jetzt so gemeint? : Text x,y, "[b]Ich bin der Text![b]" oder wie? |
||
![]() |
simi |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
![]() |
Maniac |
![]() Antworten mit Zitat ![]() |
---|---|---|
jaja habs ja eh schon^^ | ||
User posted image
^^ |
![]() |
Chester |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
feiderehemals "Decelion" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Wammerl
Das ist Mittwoch. Sollte gehen. |
||
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Rallimen
Sehr schön. Mitsamt Fehlerangabe und funktioniert. |
||
![]() |
wunderkind |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger. | ||
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
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+]
|
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group