Aufgabe 1: (20 Punkte)

Schreiben Sie eine Funktion zum Multiplizieren zweier Polynome. Die Polyno-
me werden im Programm durch eine Struktur, bestehend aus dem Grad des Poly-
noms und einem Feld mit seinen Koeffizienten reprsentiert. Diese Struktur hat 
damit folgendes Aussehen:

	struct poly_t {
		int		grad;
		double 		*koeff;
	};

So htte etwa fr das Polynom 
	p(x) = 1 + 5*x + 3.3*x^2 + 2*x^3
grad den Wert 3 und koeff wre ein Zeiger auf ein Feld der Lnge 4 mit 
den Werten 1, 5, 3.3 und 2.

Die von Ihnen zu erstellende Funktion

	struct poly_t poly_mult(struct poly_t a, struct poly_t b)

erhlt die Strukturen zweier Polynome und liefert als Resultat wieder eine 
derartige Struktur, wobei der Speicher fr die darin enthaltenen Koeffizienten
dynamisch anzufordern ist!

Die Multiplikation ist dabei nach folgender Formel durchzufhren:

Die Koeffizienten des Ergebnispolynoms
                 n+m
                 ---
                |         i
	P (x) =  >   c * x
         c      |     i
                 ---
                 i=0
ergeben sich aus den Polynomen 
                  n
                 ---
                |         i
	P (x) =  >   a * x
         a      |     i
                 ---
                 i=0
und 
                  m
                 ---
                |         i
	P (x) =  >   b * x
         b      |     i
                 ---
                 i=0

durch: 
               i
              ---
             |         
	c  =  >   a * b
         i   |     l   i-l
              ---
              l=0


Erstellen Sie zuerst ein Struktogramm, aus dem der Aufbau Ihrer Funktion her-
vorgeht, und codieren Sie die Funktion anschlieend in C, wobei auf kurze aber 
aussagekrftige Kommentare zu achten ist! Auf das Struktogramm entfllt die 
Hlfte der Punkte!





Aufgabe 2: (20 Punkte)

Schreiben Sie ein Programm grep, welches Text, den es zeilenweise von der 
Standardeingabe einliest, nach dem Vorkommen einer Zeichenkette hin unter-
sucht. Die Zeichenkette wird dabei in der Kommandozeile bergeben, z.B.:

	grep Suchbegriff

Wenn die Zeile die angegebene Zeichenkette (hier "Suchbegriff") enthlt, wird 
sie auf die Standardausgabe ausgegeben. Zustzlich dazu kann das Verhalten des 
Programms noch durch die folgenden beiden Kommandozeilenoptionen vern-
dert werden:

  -v Wird diese Option angegeben, werden im Gegensatz zu vorher
     diejenigen Zeilen ausgegeben, in denen der Suchbegriff nicht auftritt.

  -n Das Programm gibt vor jeder ausgegebenen Zeile zustzlich die 
     Zeilennummer, in der sie in der Eingabe auftauchte.

Beachten Sie, da auch beide Optionen gleichzeitig angegeben werden knnen! 
Sie knnen aber zur Vereinfachung davon ausgehen, da der Suchbegriff als 
letzter Kommandozeilenparameter angegeben wird. Auerdem kann von einer 
maximalen Zeilenlnge von 80 Zeichen ausgegangen werden.

Zur Realisierung des Programms stehen Ihnen die Funktionen aus der Zeichen-
kettenbibliothek zur Verfgung. Unter anderem stellt diese die Funktion

	char *strstr(char *string, char *substring)

zur Verfgung. Diese sucht innerhalb der Zeichenkette string nach der Zeichen-
kette substring. Enthlt string die andere Zeichenkette, wird die Adresse zu-
rckgegeben, an der substring innerhalb von string beginnt, sonst NULL. Um 
die Funktionen aus dieser Bibliothek verwenden zu knnen, mssen Sie die Hea-
derdatei string.h einbinden!

Wenn das Programm grep terminiert, gibt es an den Aufrufer den Wert 0 zurck, 
falls die Zeichenkette nirgends in der Eingabe gefunden wurde. Sobald 
mindestens eine Zeile mit der gesuchten Zeichenkette auftrat, wird der Wert 1 
zurckgeliefert.

Erstellen Sie auch hier zuerst ein Struktogramm und dokumentieren Sie Ihr 
Programm mit kurzen, aber aussagekrftigen Kommentaren! 



Aufgabe 3: (10 Punkte)

Markieren und verbessern Sie die Fehler (mehr als 10!) in dem untenstehenden 
Programm, welches von der Kommandozeile zwei ganze Zahlen und ein mathe-
matisches Symbol einliest, die entsprechende Operation auf die beiden Ganzzah-
len ausfhrt und das Ergebnis wieder ausgibt, d.h. etwa: calc 2 + 3

#include <stdio.h> 
#include <ctype.h>


int main(int argc, char argv[]) 
{

	if(argc!=4) return;

	a = str2int(argv[2]);
	b = str2int(argv[4]);
	switch(*argv[3]) 		  /*	Fallunterscheidung fr
	{                 			die Operatoren */
		case '+' : 	printf("%d + %d = %d\n",a,b,a+b);
				break;
		case '-' : 	printf("%d - %d = %d\n",a,b,a-b);
				break;
		case '*' : 	printf("%d * %d = %d\n";a,b,a*b);
				break;
		case '/' : 	printf("%d / %d = %d\n",a,b,a\b);
		devault : 		
			printf(unbekannter Operator %s\n,*argv[3]);
	}
	return 0;
}



int str2int(char *string) 
{
	int i, n;
	for(i=0; isspace(string{i}), i++);
	sign = (string[i] == '-') : -1 ? 1;
	if((string[i] == '+') || (string[i] = '-')
		i++;
	for(n=0; isdigit(string[i]); i++)
		n = 10 * m + (string[i] - "0");
	return sign*n; 
}



Aufgabe 4: (10 Punkte)

Was berechnet das folgende Programm? Geben Sie die Inhalte der verwendeten 
Variablen nach jeder ausgefhrten Anweisung an! Verwenden Sie dazu die un-
tenstehende Tabelle!

	1	#include <stdio.h>
	2	int k[] = {0,1,0,1,1,0};
	3	int f(int *k, int *v)
	4	{    
	5		int m = *(k + *k);
	6		int u,i;
	7
	8	 	k += 3;
	9		for(u=0,i=0;i<2;i++)
	10			u = 2 * u+ *(k++) * m;
	11		*v += u;
	12	}
	13	int main()
	14	{
	15		int v=0;
	16		while(++(*k) < 2) {
	17			v *= 2;
	18			f(k,&v);
	19		}
	20		printf("v=%d\n", v);
	21	}




Aufgabe 5: (10 Punkte)

Gegeben seien die beiden nachfolgenden Programmstcke. Wie oft werden die 
nachfolgenden Schleifen durchlaufen, und welche Werte werden dabei fr die 
Schleifenvariablen ausgegeben? Um welchen Typ von Schleife handelt es sich je-
weils (abweisend  nicht-abweisend)?

a)	for-Schleife:

	int i;
	for(i=10;i>5;i--) { printf("%d\n",i);};


b)	while-Schleife:

	int i=5;
	while(i<12) { i+=2; printf("%d\n",i);}

c)	do-while-Schleife:	

	int i=2;
	do { i+=2; printf("%d\n",i); } while (i<9)


Aufgabe 6: (10 Punkte)

Fr einen Versandbetrieb soll ein Programm zur Verwaltung von Bestellungen er-
stellt werden. Als Daten fallen dabei Kundenadressen und Bestellauftrge an.

Entwickeln Sie entsprechende Strukturtypen, wobei sowohl beliebig viele Kun-
denadressen, wie auch Bestellauftrge mglich sein sollen. Deshalb sollen die 
Strukturtypen die Speicherung als lineare (verkettete) Liste ermglichen!

Die vier dafr notwendigen Strukturen sollen im einzelnen folgende Daten ent-
halten:

a) Kundenadressen bentigen Felder fr Name, Vorname, Strae, Plz., Ort, 
   Kundennummer und eine Liste der Bestellauftrge dieses Kunden.

b) Bestellauftrge bestehen aus maximal 20 Bestelleinheiten und einem Datum.

c) Bestelleinheiten bestehen aus einer Artikelnummer, der Artikelbezeichnung, 
   der gewnschten Stckzahl und dem Einzelpreis des Artikels.

d) Ein Datum besteht aus Tag, Monat und Jahr (nur Zahlen).

Sie knnen davon ausgehen, da alle Namen und Bezeichnungen nicht mehr als 
20 Zeichen umfassen. Stckzahlen, PLZ u.. werden als ganze Zahl und Einzel-
preise als Fliekommazahl dargestellt.

