SAI || Vorlesungen im WS 96/97 || Programmieren || Übungen

Übungen zu Programmieren WS 96/97
Blatt 13 (15.02.97 - 15.04.97)

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:		  R
Produktionsregeln:
___________________________________________________________________________
|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     |	  |
|_________|____________|___________|_____________|_____________|__________|

Aufgabe 1 ( Punkte)

Geben Sie einen endlichen Automaten an, der dieselbe Sprache wie die oben angegebene Grammatik definiert.

Aufgabe 2 ( Punkte)

Implementieren Sie den endlichen Automaten aus Aufgabe 8 in Modula-2. Angewandt auf eine zu erstellende Test-Datei soll das Programm die Zeilennummern der falschen Ausdrücke ausgeben.


Aufgabe 3 ( Punkte)

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.
Testen Sie Ihr Programm mit geeigneten Text-Dateien!


Aufgabe 4 ( Punkte)

In der vorigen Aufgabe haben Sie bereits eine Zeile in Felder zerlegt und diese in einem Array abgelegt. Dazu haben Sie ein zweidimensionales ARRAY benutzt. Der Nachteil dieser Methode ist, daß relativ viel Platz verschenkt wird, da kleine Felder genauso viel Platz benötigen wie große.

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.


Aufgabe 5 ( Punkte)

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.


Aufgabe 6 ( Punkte)

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!


SAI || Vorlesungen im WS 96/97 || Programmieren || Übungen

Franz Schweiggert, 05.02.1997