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?