Aufgabe 1: (40 Punkte) Schreiben Sie ein Programm, welches einen beliebigen Text (einzelne Zeilen sind durch Newline voneinander getrennt) von der Tastatur einliest und transfor- miert auf den Bildschirm ausgibt. Die durchzuführende Transformation soll da- bei mittels genau einer der folgenden Aufrufoptionen durch den Anwender wählbar sein: -tn : zu Beginn einer Textzeile aufeinander folgende (führende) Tabu- latorzeichen (Ersatzdarstellung: \t) werden durch n (n=1,2,...) Spa- ces (Leerzeichen) ersetzt. -sn : jede Folge von n führenden Spaces (n=1,2,...) einer Textzeile wird durch ein Tabulatorzeichen ersetzt. Bei Fehlaufrufen (z.B. beide Optionen gesetzt, n<1, etc.) sollte Ihr Programm mit einer Fehlermeldung und einem Fehlercode ungleich null terminieren. Zur Wandlung der auf den Optionsbuchstaben folgenden Ziffernfolge in einen Inte- gerwert kann die Funktion int atoi(char *str) verwendet werden (wobei str ei- nen Zeiger auf den zu konvertierenden String darstellt). Erstellen Sie zuerst ein Struktogramm und dokumentieren Sie Ihr Programm mit kurzen, aber aussagekräftigen Kommentaren! Auf das Struktogramm entfällt die Hälfte der Punkte! Aufgabe 2: (10 Punkte) Was berechnet das folgende (sinnlose) Programm? Geben Sie die Inhalte der ver- wendeten Variablen nach jeder ausgeführten Anweisung an! Verwenden Sie dazu die untenstehende Tabelle! (1) int j=0; (2) void f(int *k) (3) { (4) int m=j; (5) j = m + (*k); (6) *k = j * j; (7) } (8) void main() (9) { (10) int k=10,m=0; (11) f(&k); (12) m += k--; (13) f(&j); (14) m += j; (15) printf("m = %d\n",m); (16) } Aufgabe 3: (10 Punkte) Markieren und verbessern Sie die Fehler in folgendem C-Programm, das die Lö- sungen einer quadratischen Gleichung berechnen soll. Als Fehler markierte korrekte Teile führen zu Punktabzug. Die Tatsache, daß das Programm kaum Kommentare enthält und kein Struktogramm beigefügt ist, wird ausnahmsweise nicht als Fehler betrachtet. (Bemerkung: Loesungsformel war auf Klausur angegeben, laesst sich aber als Text hier nicht vernuenftig darstellen) include <math.h> /* für Wurzelfunktion sqrt() */ void main() { double a,b,c,wu,x1,x2; while(1) { printf("\nBitte a b c eingeben : "); scanf("%lf %lf %lf",&a,&b,c); if (a .eq. 0.0) printf("a muss ungleich null sein !\n"); continue; if ((wu = b^2 - 4.0 a c) < 0.0); printf("\nKeine Loesung !\n"); else { x1 = (-b + sqrt(wu)) / (2.0 * a); x2 = (-b - sqrt(wu)) / (2.0 * a); printf("\nLoesungen : %lf %lf\n",x1,x2) } printf("\nNoch mehr Gleichungen (0=nein)); scanf("d%",&eingabe); if (eingabe = 0) break; } } Aufgabe 4: (10 Punkte) Angenommen, ein Integerwert wird im Rechner mit 8 Bit repräsentiert (incl. 1 Bit Vorzeichen; negative Zahlen werden analog zur Vorlesung im Zweierkom- plement dargestellt). Welche Bitmuster (bzw. Dezimalwerte) ergeben sich dann für folgende Ausdrücke? (1) 0x2d (2) 0376 (3) !45 (4) ~45 (5) 45>>2 (6) 45 & -2 (7) 45 | -2 Aufgabe 5: (10 Punkte) Bauen Sie schrittweise aus der Zahlenfolge 12, 15, 8, 7, 10, 9 einen Binärbaum auf (Konstruktionsschema gemäß Vorlesung: ein Knoten km ist linker Nachfolger eines Knotens kl, wenn der Schlüssel von km kleiner als der Schlüssel von kl ist, sonst rechter Nachfolger)! Die einzelnen Schritte müssen erkennbar sein! Ist der entstandene Baum ausbalanciert?