FERIEN-UEBUNGSBLATT
Gegeben sei die Grammatik von Übungsblatt 3 in leicht abgeänderter Form:
Terminalsymbolmenge: { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ., +, -, E} Nonterminalsymbolmenge: {R, M, Ex, V, N, Z, D} Startsymbol: RProduktionsregeln:
___________________________________________________________________________ |R -> M Ex| M -> V . N| V -> Z | V -> + Z | V -> - Z | N -> | |_________|____________|___________|_____________|_____________|__________| |N -> Z | Ex -> | Ex -> E Z| Ex -> E + Z| Ex -> E - Z| Z -> Z D| | | | | | | | |_________|____________|___________|_____________|_____________|__________| |Z -> D | D -> 0 | D -> 1 | D -> 2 | D -> 3 | D -> 4 | |_________|____________|___________|_____________|_____________|__________| |D -> 5 | D -> 6 | D -> 7 | D -> 8 | D -> 9 | | |_________|____________|___________|_____________|_____________|__________|
Implementieren Sie einen Filter, der jede Eingabezeile in Felder unterteilt und diese in umgekehrter Reihenfolge wieder ausgibt. Dabei erfolgt die Unterteilung einer Zeile in Felder durch einen Feldtrenner, der als Konstante im Programm definiert wird. Ein Feld besteht also aus allen Zeichen ungleich Feldtrenner und Zeilenende.
Beispiel :
Eingabesatz: "heute:kommt der:Nikolaus" Trenner = ' ' Feld1 = "heute:kommt", Feld2 = "der:Nikolaus" Ausgabe: "der:Nikolaus heute:kommt" Trenner = ':' Feld1 = "heute", Feld2 = "kommt der", Feld3 = "Nikolaus" Ausgabe: "Nikolaus:kommt der:heute"Die maximale Feldanzahl pro Zeile, sowie die maximale Feldlänge sollen ebenfalls als Konstante definiert werden. Das Programm soll erkennen, wenn die oberen Grenzen überschritten werden und eine entsprechende Fehlermeldung ausgeben. Eine Fehlermeldung soll also ausgegeben werden, wenn eine zu lange Zeile oder ein zu langes Feld in der Eingabe auftaucht. In einem solchen Fall soll das Programm beendet werden.
Eine weitere Möglichkeit besteht darin, die Worte hintereinander in ein großes Zeichenfeld zu schreiben (wieder unter Verwendung des Null-Bytes 0C):
0 1 2 ... ... 6 ... ... 12 ... ________________________________________________________________________________________ |W| o| r| t | 1| 0C | W| o | r| t| 2| 0C | W | o | r| t| 3| 0C| ... |_|___|___|_____|___|_____|___|_____|___|___|___|_____|____|_____|___|___|___|____|_____
Bei dieser Methode ist die Verwendung eines Indexfeldes sinnvoll, in dem die Wortanfänge abgelegt werden.
0 1 2 ... _________________ |0|__6|__12|__...
Schreiben Sie ein Programm, das jeweils eine Zeile seiner Eingabe liest,
die Zeile in Worte unterteilt und die Worte in die oben beschriebene
Struktur ablegt. Am Ende einer Zeile sollen die Worte ausgegeben und
anschließend die nächste Zeile abgearbeitet werden.
Ein Wort ist dabei eine Folge von Buchstaben und Ziffern. Sonstige
Zeichen (Satzzeichen, usw.) sollen ignoriert werden.
Die maximal erlaubte Anzahl von Wöertern innerhalb einer Zeile, sowie
die maximale Anzahl von Zeichen innerhalb einer Zeile sollen wieder durch
Konstante definiert werden, damit das Programm leicht an andere
Anforderungen angepaßt werden kann.
Erweitern Sie das in Aufgabe 4 erstellte
Programm derart, daß die Ausgabe der Worte sortiert erfolgt.
Schreiben Sie dazu eine Prozedur Sort, die mit dem Bubble-Sort-Algorithmus
arbeitet.
Bubble-Sort:
Das Verfahren beruht darauf, im Feld der zu sortierenden Elemente jeweils
zwei benachbarte Elemente richtig anzuordnen. Geht man ein Feld mit n
Elementen einmal von links nach rechts durch, so wandert dabei das
wertgrößte Element an das Ende des Feldes. Wendet man dieses Verfahren
sukzessiv (maximal n-1 mal) an, so ist das Feld sortiert.Darüber hinaus
kann man sich die Position des bei einem Durchgang zuletzt erfolgten
Tauschvorgangs merken, denn rechts davon sind die Daten bereits sortiert und
brauchen nicht weiter betrachtet zu werden. Ist kein Tauschvorgang mehr
notwendig, so ist das Feld sortiert.
Das Tauschen zweier Worte erfolgt natürlich nicht im großen Zeichenfeld,
sondern durch Vertauschen der zugehörigen Indizes im Indexfeld.
Verwenden Sie zum lexikographischen Vergleich zweier Worte die Funktion
StrCmp aus Strings.
Sie haben die Aufgabe ein kleines Kopierprogramm mycopy zu schreiben.
Folgende Aufrufvarianten sollen zulässig sein :
_____________________________________________________________________________________ |mycopy | Standardeingabe (stdin) in Standardausgabe (stdout) kopieren.| |___________________|_______________________________________________________________| |mycopy file | Datei file in Standardausgabe (stdout) kopieren. | | | | |___________________|_______________________________________________________________| |mycopy - file | Standardeingabe (stdin) in Datei file kopieren. | |___________________|_______________________________________________________________| |mycopy file1 file2 | Datei file1 in Datei file2 kopieren. | |___________________|_______________________________________________________________|
Falls die Zieldatei, in die die Ausgabe geschrieben werden soll, bereits
existiert, darf deren Inhalt nicht einfach gelöscht werden. In solch einem
Fall soll beim Benutzer angefragt werden, ob die Zieldatei überschrieben
werden soll.
Ob eine Datei bereits existiert kann man überprüfen, indem man sie
zum Lesen öffnet.
Falls die Eingabedatei nicht existiert soll das Programm mit einer
entsprechenden Fehlermeldung abbrechen.
Bei falschen Programmaufrufen (falsche Anzahl Argumente) soll eine
Usage-Meldung ausgegeben werden.
Gliedern Sie Ihr Programm in Prozeduren.
Ein Beispielprogramm zum Kopieren von Dateien finden Sie im Skript
(MyCopy.m2) im Kapitel File-I/O.
Viel Erfolg!