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 #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!