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 repräsentiert. Diese Struktur hat damit folgendes Aussehen: struct poly_t { int grad; double *koeff; }; So hätte etwa für das Polynom p(x) = 1 + 5*x + 3.3*x^2 + 2*x^3 grad den Wert 3 und koeff wäre ein Zeiger auf ein Feld der Länge 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) erhält die Strukturen zweier Polynome und liefert als Resultat wieder eine derartige Struktur, wobei der Speicher für die darin enthaltenen Koeffizienten dynamisch anzufordern ist! Die Multiplikation ist dabei nach folgender Formel durchzuführen: 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 anschließend in C, wobei auf kurze aber aussagekräftige Kommentare zu achten ist! Auf das Struktogramm entfällt die Hälfte 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") enthält, wird sie auf die Standardausgabe ausgegeben. Zusätzlich dazu kann das Verhalten des Programms noch durch die folgenden beiden Kommandozeilenoptionen verän- 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 zusätzlich die Zeilennummer, in der sie in der Eingabe auftauchte. Beachten Sie, daß auch beide Optionen gleichzeitig angegeben werden können! Sie können aber zur Vereinfachung davon ausgehen, daß der Suchbegriff als letzter Kommandozeilenparameter angegeben wird. Außerdem kann von einer maximalen Zeilenlänge von 80 Zeichen ausgegangen werden. Zur Realisierung des Programms stehen Ihnen die Funktionen aus der Zeichen- kettenbibliothek zur Verfügung. Unter anderem stellt diese die Funktion char *strstr(char *string, char *substring) zur Verfügung. Diese sucht innerhalb der Zeichenkette string nach der Zeichen- kette substring. Enthält string die andere Zeichenkette, wird die Adresse zu- rückgegeben, an der substring innerhalb von string beginnt, sonst NULL. Um die Funktionen aus dieser Bibliothek verwenden zu können, müssen Sie die Hea- derdatei string.h einbinden! Wenn das Programm grep terminiert, gibt es an den Aufrufer den Wert 0 zurück, falls die Zeichenkette nirgends in der Eingabe gefunden wurde. Sobald mindestens eine Zeile mit der gesuchten Zeichenkette auftrat, wird der Wert 1 zurückgeliefert. Erstellen Sie auch hier zuerst ein Struktogramm und dokumentieren Sie Ihr Programm mit kurzen, aber aussagekräftigen 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 ausführt und das Ergebnis wieder ausgibt, d.h. etwa: calc 2 + 3 #include #include int main(int argc, char argv[]) { if(argc!=4) return; a = str2int(argv[2]); b = str2int(argv[4]); switch(*argv[3]) /* Fallunterscheidung für { 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 ausgeführten Anweisung an! Verwenden Sie dazu die un- tenstehende Tabelle! 1 #include 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 Programmstücke. Wie oft werden die nachfolgenden Schleifen durchlaufen, und welche Werte werden dabei für 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) Für einen Versandbetrieb soll ein Programm zur Verwaltung von Bestellungen er- stellt werden. Als Daten fallen dabei Kundenadressen und Bestellaufträge an. Entwickeln Sie entsprechende Strukturtypen, wobei sowohl beliebig viele Kun- denadressen, wie auch Bestellaufträge möglich sein sollen. Deshalb sollen die Strukturtypen die Speicherung als lineare (verkettete) Liste ermöglichen! Die vier dafür notwendigen Strukturen sollen im einzelnen folgende Daten ent- halten: a) Kundenadressen benötigen Felder für Name, Vorname, Straße, Plz., Ort, Kundennummer und eine Liste der Bestellaufträge dieses Kunden. b) Bestellaufträge bestehen aus maximal 20 Bestelleinheiten und einem Datum. c) Bestelleinheiten bestehen aus einer Artikelnummer, der Artikelbezeichnung, der gewünschten Stückzahl und dem Einzelpreis des Artikels. d) Ein Datum besteht aus Tag, Monat und Jahr (nur Zahlen). Sie können davon ausgehen, daß alle Namen und Bezeichnungen nicht mehr als 20 Zeichen umfassen. Stückzahlen, PLZ u.ä. werden als ganze Zahl und Einzel- preise als Fließkommazahl dargestellt.