Aufgabe 1: (40 Punkte)

Schreiben Sie ein Programm calc, welches zwei beim Programmaufruf in der 
Kommandozeile (Achtung: nicht von der Standardeingabe einlesen!!!) übergebe-
ne Fließkomma-Zahlen (operand1 und operand2) gemäß eines zusätzlich über-
gebenen Operators (operator) miteinander verknüpft und die Aufrufargumente 
sowie das Ergebnis (ergebnis) der Verknüpfung auf die Standardausgabe ausgibt.

Beispiel: Bei Aufruf Ihres Programms mittels

    calc   operand1  operand2  operator                             (also z.B.:  calc  4.5  7  + )

soll Ihr Programm

            operand1  operator  operand2  =  ergebnis       (hier also: 4.5  +  7  =  11.5 )

ausgeben und terminieren.

Ihr Programm soll folgende Operatoren erkennen und entsprechend handeln (ma-
thematische Funktionen der C-Library wie pow() o.ä. dürfen bei der Implemen-
tierung von Ihnen nicht verwendet werden!):


	+	: Berechnen von operand1 + operand2

	-	: Berechnen von operand1 - operand2

	*	: Berechnen von operand1 * operand2

	/	: Berechnen von operand1 / operand2

	^	: Berechnen von operand1operand2  (, ganzzahlig)


Zur Wandlung einer in der Aufrufzeile gegebenen Ziffernfolge in eine Fließkom-
ma-Zahl kann die Funktion double atof(char *str) verwendet werden (wobei str 
einen Zeiger auf den zu konvertierenden String darstellt).

Bei Fehlaufrufen (z.B. fehlendes Argument, unerlaubter Operator, etc.) soll Ihr 
Programm mit einer Fehlermeldung und einem Fehlercode ungleich null termi-
nieren.

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[] = { 1, 0, 1, 0 };
		(2)                  void f(int *k)
		(3)                  {  int m = *k-2;
		(4)                     do {
		(5)                        m       =  k[1];
		(6)                        *(k+1) += *k;
		(7)                        k++;
		(8)                     }while(m > 0);
		(9)                     (*k)++;
		(10)                  }

		(11)                  void main()
		(12)                  {  int *m = k;
		(13)                     f(m);
		(14)                     m++;
		(15)                     f(m);
		(16)                  }


Aufgabe 3: (10 Punkte)

Markieren und verbessern Sie die Fehler in dem aus Kernighan/Ritchie "Pro-
grammieren in C" bekannten Programm, welches einen Text über die Standard-
eingabe einliest und die Zahl der Zeichen, Worte (ein Wort wird hier definiert als 
Zeichenfolge, die keine Leerzeichen, Tabulatorzeichen bzw. Zeilentrenner ent-
hält) und Zeilen darin zählt und ausgibt.

Als Fehler markierte korrekte Teile führen zu Punktabzug. Die Tatsache, daß das 
Programm keine Kommentare enthält und kein Struktogramm beigefügt ist, wird 
ausnahmsweise nicht als Fehler betrachtet.


#include <stdio.h>

#define OUT 0;

int main(void)
{
	int c, nl, nw, state;

	state = OUT;
	nl = nw = nc = 0;

	while((c=getchar() != EOF) {
		++nc;
		if ( c == '\n' )
			++nl;
		if ( c == ' ' || c == '\n' || c == '/t' );
			sate = OUT;
		else
			if ( state = OUT )
				state = IN;
				+nw;
	}

	printf("Zeilen: %d Worte: %d Zeichen: %d\n",nl,nw,nc);

	return 0;
}


Aufgabe 4: (10 Punkte)

Geben Sie für die folgenden for-, while- und do-while-Schleifen jeweils an, wie 
oft und mit welchen Werten der Schleifenvariablen diese jeweils durchlaufen wer-
den!

	int j,k;

	a) for(j = 10; j > 4; j -= 2) { ...... }

	b) k=8;
	   for(j = 8; j <= k; j++) { k=10; ...... }

	c) j=4;
	   while(++j < 8) { ...... }

	d) j=10;
	   do { ...... }while(j < 10);



Aufgabe 5: (10 Punkte)

Entwerfen Sie geeignete Datenstrukturen zur sortierten Speicherung von Perso-
naldaten (ein Personaldatensatz besteht hier vereinfacht aus Name, Vorname, 
Personalnummer und Gehalt (z.B.: "Mustermann", "Hans", 4711, 2345.67)) in 
Form eines Binärbaumes (sortiert wird lexikographisch nach Namen). Gehen Sie 
dabei davon aus, daß Strings nicht mehr als 20 Zeichen enthalten, und daß maxi-
mal 100 Personaldatensätze zu speichern sein werden!