Aufgabe 1: (40 Punkte) Schreiben Sie ein Programm, welches einen beliebig langen Text (einzelne Zei- len sind durch Newline voneinander getrennt) von der Tastatur einliest und trans- formiert auf den Bildschirm ausgibt. Als Transformation soll Ihr Programm generell alle Leerzeichen am Ende einer jeden Textzeile entfernen. Ist bei Aufruf Ihres Programmes die Aufrufoption -r gesetzt, sollen zusätzlich alle Zeilen, welche lediglich aus Leerzeichen bestehen, komplett (also inkl. Newline-Zei- chen) aus dem Text entfernt werden. Bei Fehlaufrufen sollte Ihr Programm mit einer Fehlermeldung und einem Feh- lercode ungleich null terminieren. 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 k[] = { 2, 3, 10 }; (2) int *j = k+1; (3) void f(int *k) (4) { int m = *k; (5) if (m/2*2 == m) (6) *j += (m * m); (7) else (8) k[1] *= (m + m); (9) } (10) void main() (11) { int m=*k; (12) f(k); (13) m += k[1]; (14) f(j); (15) m += ++k[2]; (16) } Aufgabe 3: (10 Punkte) Markieren und verbessern Sie die Fehler in dem aus der Vorlesung bekannten C- Programm, welches prüfen soll, ob ein vom Anwender eingegebenes Datum eine bestimmte Form besitzt. Ein eingegebenes Datum der Form tag.monat.jahr (z.B. 1.1.1994) bzw. tag. monatsname jahr (z.B. 1. Januar 1994) soll als gültig, alle anderen Eingaben dagegen sollen als ungültig erkannt werden. 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. #include stdio.h int main() { char buffer[BUFSIZ],mname[2]; int tag,monat,jahr; printf("\n\t\tFormale Datums-Pruefung\n"); while(1) { /* Verlassen der Schleife, wenn gets() NULL-Pointer liefert oder eine */ Leerzeile eingegeben wird (s.u.) */ printf("\nBitte ein Datum eingeben : "); if (!gets(buffer) || buffer[0]) break; rv=sscanf(buffer,"%d. 19s %d",&tag,mname,&jahr); if (rv=3) printf("gueltig: %s\n",buffer); else rv=sscanf(buffer,"%d.%d %d",&tag,&mo- nat,&jahr); if (rv==3) printf("gueltig: %s\n",buffer); else printf("ungueltig: %s\n",buffer); } return; } Aufgabe 4: (10 Punkte) Angenommen, ein C-Programm enthält eine for-Schleife der Form for ( Ausdruck1; Ausdruck2; Ausdruck3 ) Anweisung Wie ist diese Schleife dann durch eine while-, wie durch eine do-while-Schleife zu ersetzen ? Aufgabe 5: (10 Punkte) Entwerfen Sie geeignete Datenstrukturen zur sortierten Speicherung von ganzen Zahlen in Form eines Binärbaumes (gehen Sie hier davon aus, daß nicht mehr als 100 Zahlenwerte zu sortieren sein werden)!