Erlangen, den 17.01.1997 Aufgabe 1: (35 Punkte) Schreiben Sie ein Programm, das innerhalb eines Textes eine Zeichenkette durch eine andere ersetzt. Ihr Programm liest dazu sowohl die zu suchende Zeichenket- te wie auch deren Ersatz von der Kommandozeile ein. Anschließend soll Ihr Pro- gramm einen beliebig langen Text zeilenweise von der Standardeingabe einlesen und in jeder Zeile suchen und ersetzen. Wird außerdem in der Kommandozeile die Option -g angegeben, werden auch mehrere Vorkommen der Zeichenkette in- nerhalb jeder Zeile ersetzt. Ohne diese Option wird das Durchsuchen einer Zeile nach der ersten Ersetzung abgebrochen und der Rest der Zeile unverändert ausge- geben. Um innerhalb einer Zeile Wortgrenzen feststellen zu können, dürfen Sie die Funktion int isspace(int ch) (deklariert in ctype.h) verwenden, die überprüft, ob das übergebene Zeichen ein Whitespace (Leerzeichen, Tabulator usw.) darstellt und entsprechend einen Wert gleich Null oder ungleich Null zurückliefert. Weite- re Funktionen, insbesonders aus der Zeichenkettenbibliothek dürfen nicht ver- wendet werden! Zur Vereinfachung dürfen Sie aber davon ausgehen, daß keine Zeile des einzulesenden Textes mehr als 80 Zeichen enthält. Bearbeiten Sie dazu folgende Teilaufgaben, wobei jeweils etwa die Hälfte der Punkte auf ein zugehöriges Struktogramm entfällt. Dokumentieren Sie Ihr Pro- gramm mit kurzen, aber aussagekräftigen Kommentaren! a) Erstellen Sie eine Funktion int string_equal(char *s1, char *s2) Diese Funktion soll zwei Zeichenketten vergleichen und 1 zurückliefern, falls die Zeichenketten gleich sind, sonst 0. (6 Punkte) b) Entwickeln Sie für die eigentliche Suche und Ersetzung eine Funktion: void search_replace(char *line, char *search, char *replace, int global) Diese Funktion erhält die zu durchsuchende Zeile (line), die zu suchende Zeichenkette(search), die Ersatzzeichenkette(replace) und die Angabe, ob alle Vorkommen ersetzt werden sollen (global==1) oder nur das erste (global==0). Der sich ergebende Text soll durch die Funktion auf die Standardausgabe ausgegeben werden. (15 Punkte) c) Entwickeln Sie das Hauptprogramm, in dem die Kommandozeilenparameter ausgewertet werden, der Text eingelesen und die Suche initiiert wird. Greifen Sie dabei auf die Funktionen zurück, die sie unter a) und b) erstellt haben. (14 Punkte) Aufgabe 2: (10 Punkte) Was berechnet das folgende Programm trace, wenn es als trace 21 12 aufgerufen wird? Geben Sie die Inhalte der verwendeten Variablen nach jeder relevanten Anweisung an! Verwenden Sie dazu die untenstehende Tabelle! (Hinweis: int atio(char *str) wandelt eine Zeichenkette in einen Inte- gerwert um) (1) #include (2) int f(int *a) (3) { (4) int *b = a+1; (5) if(!(*a && *b)) return 1; (6) for(; *(a+1); b=++a+1) (7) *(a+2) = *a % *b; (8) return *a; (9) } (10) int main(int argc, char *argv[]) (11) { (12) int b, a[10]; (13) if(argc!=3) return 0; (14) a[0] = atoi(argv[1]); (15) a[1] = atoi(argv[2]); (16) b = f(a); (17) return b; (27) } Aufgabe 3: (10 Punkte) Markieren und verbessern Sie die Fehler (Mehr als 10! Falsch angestrichene Feh- ler führen zu Punktabzug!) in folgendem C-Programm, das innerhalb eines ein- zugebenden Textes nach dem Auftreten einer in der Kommandozeile angegebenen Zeichenkette sucht und entweder alle Zeilen, die das Suchmuster enthalten ausgibt oder - bei Option -v - alle, die die Zeichenkette nicht enthalten. Bei der Option -n erscheinen zusätzlich Zeilennummern in der Ausgabe. include include define OPT_V "-v"; define OPT_N "-n"; int main(int argc, char argv[]) { int opt_n = 0; int opt_v = 0; int count = 0; int ret = 0; int found,i; char suchbegriff, zeile[81]; if (argc<2) { printf( "usage: %s [-v] [-n] searchpattern\n"); return; } suchbegriff = argv[argc]; for(i=1,i 10) continue; j = do_something(j,i); if(j < 10) break; } Setzen Sie dieses Programmfragment so in die nachfolgend geforderten Schlei- fenkonstrukte um, daß sich die Semantik nicht verändert. a) Formulieren Sie das Programmstück mit Hilfe einer "while" Schleife. b) Formulieren Sie das Programmstück mit Hilfe einer "do-while" Schleife. Aufgabe 5: (15 Punkte) Für eine Firma wird ein neues Personalverwaltungsprogramm erstellt. Ihre Auf- gabe ist es die notwendigen Strukturen zu entwickeln, die für die Verwaltung be- liebig vieler Personen, Räume und Abteilungen notwendig sind. Nach gründlicher Analyse der Aufgabenstellung entscheiden Sie, daß Sie unter anderem die folgenden Strukturen benötigen: - Abteilungen, bestehend aus einer Anschrift, einer ganzzahligen Abteilungs- nummer, einem Verweis auf den Datensatz des Abteilungsleiters und einer verketteten Liste an Räumen, aus der die Abteilung aufgebaut ist. Da eine unbekannte Anzahl von Abteilungen existieren kann, werden die Abteilun- gen ebenfalls als verkettete Liste verwaltet. - Räume, bestehend aus einem Verweis auf die Abteilung, zu der sie gehören, einem Raumnamen (15 Zeichen) und einer verketteten Liste aller in diesem Raum arbeitenden Personen. Außerdem sollen sie die Verwaltung von belie- big vielen Räumen in Form einer einfachen, verketteten Liste ermöglichen. - Personen, bestehend aus Vor- und Nachnamen, einem Einstellungsdatum, dem monatlichen Gehalt und der Anschrift der Person. Wie bei den Räumen soll auch hier wieder eine verkettete Liste zur Verwaltung verwendet werden. - Anschriften, bestehend aus Straße, Hausnummer (5 Zeichen), Postleitzahl (5 Zeichen) und Ort. - Datumsangaben, bestehend aus Tag, Monat und Jahr - jeweils als ganze Zahlen. Soweit nicht anders erwähnt sollen alle Textfelder 40 Zeichen fassen können. Für die numerischen Datenfelder sind passende Datentypen zu wählen!