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. Anschlieend soll Ihr Pro-
gramm einen beliebig langen Text zeilenweise von der Standardeingabe einlesen 
und in jeder Zeile suchen und ersetzen. Wird auerdem 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 unverndert ausge-
geben.

Um innerhalb einer Zeile Wortgrenzen feststellen zu knnen, drfen Sie die 
Funktion int isspace(int ch) (deklariert in ctype.h) verwenden, die berprft, ob 
das bergebene Zeichen ein Whitespace (Leerzeichen, Tabulator usw.) darstellt 
und entsprechend einen Wert gleich Null oder ungleich Null zurckliefert. Weite-
re Funktionen, insbesonders aus der Zeichenkettenbibliothek drfen nicht ver-
wendet werden! Zur Vereinfachung drfen Sie aber davon ausgehen, da keine 
Zeile des einzulesenden Textes mehr als 80 Zeichen enthlt.

Bearbeiten Sie dazu folgende Teilaufgaben, wobei jeweils etwa die Hlfte der 
Punkte auf ein zugehriges Struktogramm entfllt. Dokumentieren Sie Ihr Pro-
gramm mit kurzen, aber aussagekrftigen Kommentaren!

a) Erstellen Sie eine Funktion
	int string_equal(char *s1, char *s2)
Diese Funktion soll zwei Zeichenketten vergleichen und 1 zurckliefern, 
falls die Zeichenketten gleich sind, sonst 0. (6 Punkte)

b) Entwickeln Sie fr die eigentliche Suche und Ersetzung eine Funktion:
	void search_replace(char *line, char *search, char *replace, int global)
Diese Funktion erhlt 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 zurck, 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 <stdio.h>
(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 fhren 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 zustzlich Zeilennummern in der Ausgabe.

include <stdio.h> 
include <string.h>
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<argc-1,i--)
		if(strcmp(argv[i], OPT_V)==0) opt_v = 1; 
		if(strcmp(argv[i], OPT-N)==0) opt_m = 1; 
	}
	while(gets(zeile)=!Null) do { 
		count++; 
		found = strstr(zeile,suchbegriff):1?0; 
		if(found && !opt_v) || (!found && opt_v)) { 	 
			if(opt_n) 	 
				printf("%d %c\n", count, zeile)
			else 	 
				printf("%s\n", zeile); 
		} 
		if(found) ret := 1; 
	}
	return ret; 
} 

Aufgabe 4: (10 Punkte)

Gegeben ist das folgende Programmstck:

		for(i=j;i<100;i++)
		{
			if(j > 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 verndert. 

a)	Formulieren Sie das Programmstck mit Hilfe einer "while" Schleife.
b)	Formulieren Sie das Programmstck mit Hilfe einer "do-while" Schleife.


Aufgabe 5: (15 Punkte)

Fr eine Firma wird ein neues Personalverwaltungsprogramm erstellt. Ihre Auf-
gabe ist es die notwendigen Strukturen zu entwickeln, die fr die Verwaltung be-
liebig vieler Personen, Rume und Abteilungen notwendig sind.

Nach grndlicher Analyse der Aufgabenstellung entscheiden Sie, da Sie unter 
anderem die folgenden Strukturen bentigen:

- Abteilungen, bestehend aus einer Anschrift, einer ganzzahligen Abteilungs-
nummer, einem Verweis auf den Datensatz des Abteilungsleiters und einer 
verketteten Liste an Rumen, aus der die Abteilung aufgebaut ist. Da eine 
unbekannte Anzahl von Abteilungen existieren kann, werden die Abteilun-
gen ebenfalls als verkettete Liste verwaltet.

- Rume, bestehend aus einem Verweis auf die Abteilung, zu der sie gehren, 
einem Raumnamen (15 Zeichen) und einer verketteten Liste aller in diesem 
Raum arbeitenden Personen. Auerdem sollen sie die Verwaltung von belie-
big vielen Rumen in Form einer einfachen, verketteten Liste ermglichen.

- Personen, bestehend aus Vor- und Nachnamen, einem Einstellungsdatum, 
dem monatlichen Gehalt und der Anschrift der Person. Wie bei den Rumen 
soll auch hier wieder eine verkettete Liste zur Verwaltung verwendet werden.

- Anschriften, bestehend aus Strae, Hausnummer (5 Zeichen), Postleitzahl 
(5Zeichen) und Ort.

- Datumsangaben, bestehend aus Tag, Monat und Jahr - jeweils als ganze 
Zahlen.

Soweit nicht anders erwhnt sollen alle Textfelder 40 Zeichen fassen knnen. Fr 
die numerischen Datenfelder sind passende Datentypen zu whlen!

