Aufgabe 1: ( 14+26 Punkte)

Schreiben Sie ein Programm zur statistischen Auswertung von Mewerten. Ihr 
Programm liest dazu von der Standardeingabe zuerst die Anzahl zu verarbeiten-
der Werte und anschlieend die eigentlichen Werte ein. Aus diesen Werten be-
rechnet das Programm den Mittelwert und die Standardabweichung und gibt sie 
aus.

Bearbeiten Sie dazu folgende beiden Teilaufgaben:

a) Fr eine Folge a[i], i=1..n  von Mewerten berechnen sich der Mittelwert E_a, 
und die Standardabweichung D_a folgendermaen:
                   n
	          ---
	      1  |
	E_a = - * > a[i]
	      n  |
	          ---
	          i=1
		   
                      n
                     ---
                    |
	D_a = sqrt(  > (E_a - a[i])^2    (sqrt ist die Quadratwurzel!)
	            |
		     ---
		     i=1
		     
Sowohl der Mittelwert, als auch die Standardabweichung sollen dabei als ei-
genstndige Funktionen implementiert werden, die die folgenden Prototypen 
realisieren:
	Mittelwert:
		double average(int cnt, double *values);
Standardabweichung:
		double deviation(int cnt, double *values);
Beide Funktionen erhalten in cnt die Anzahl der Mewerte, die in dem Feld 
values enthalten sind. Die Hlfte der Punkte entfllt auf die ebenfalls zu erstel-
lenden Struktogramme.

b) Erstellen Sie das Hauptprogramm, das die nachfolgend beschriebenen Kom-
mandozeilenparameter verarbeiten kann, die Mewerte von der Standardein-
gabe einliest, mittels der in a) erstellten Funktionen verarbeitet und die 
Ergebnisse auf die Standardausgabe ausgibt.

   -a Das Programm gibt nicht mehr automatisch Mittelwert und Standardab-
      weichung aus, sondern nur noch den Mittelwert.

   -d Wie -a, jedoch mit der ausschlielichen Ausgabe der Standardabwei-
      chung.

Selbstverstndlich knnen auch mehrere Optionen angegeben werden! 

Achten Sie darauf, da Ihr Programm angemessen auf falsche Kommandozeilen-
optionen reagiert. Sie knnen aber davon ausgehen, da nur korrekte Eingabeda-
ten auf die Standardeingabe geliefert werden.

Erstellen Sie auch hier zuerst wieder ein Struktogramm, aus dem der Aufbau Ih-
rer Funktion hervorgeht, und codieren Sie die Funktion anschlieend in C, wobei 
auf kurze aber aussagekrftige Kommentare zu achten ist! Auf die Struktogram-
me entfllt wieder die Hlfte der Punkte.


Aufgabe 2: (10 Punkte)

Markieren und verbessern Sie die Fehler (max. 15 Stck!) in dem untenstehen-
den Programm, welches einen Text von der Standardeingabe einliest und seiten-
weise mit Seitenzahlen versehen auf die Standardausgabe ausgibt. Die 
Standardseitenlnge von 60 Zeilen kann mittels der Option -n Zeilenzahl vern-
dert werden. (Achtung: atoi ist eine in stdlib.h korrekt deklarierte Funkti-
on zum Umwandeln eines Strings in einen Integerwert, '\014' ein korrektes 
Steuerzeichen fr den Seitenumbruch!)

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#define MAX_LINELENGTH 80;

int main(int argc, int *argv) 
{ 
	int lines_per_page := 60; \* Default: 60 Zeilen *\
	int line = 0; 
	void page = 1; 
	char zeile[MAX_LINELENGTH+1];
	if((argc!=1) && (argc!= 3))
		printf("usage: print [-n lines_per_page]\n"); 
		return; 
	}
	if((argc==3) && (strcmp(argv[1], '-n')=0))	{ 
		lines_per_page = atoi(argv[3]); 
		if(lines_per_page < 3) {
			printf("zu kleine Zeilenzahl: $d\n";
					lines_per_page); 	 
			return 1; 
		} 
	}
	while(zeile = gets(zeile)) { 
		printf("%s\n",zeile); 
		if(++line == lines_per_page-2) { 	 
			printf("\n\t\t-- %d --\n\014", page++); 	 
			line = 0; 
		} 
	} 
	if(line>0) { 
		for(; line<lines_per_page-2; line++)
			printf("\n"); 
		printf("\n\t\t-- %d --\n\014"); 
	} 
} 



Aufgabe 3: (10 Punkte)

Was berechnet das nachfolgende Programm? Geben Sie die Inhalte der verwen-
deten Variablen nach jeder ausgefhrten Anweisung an! Verwenden Sie dazu die 
untenstehende Tabelle!

	1	#include <stdio.h> 
	2	#include <stdlib.h>
	3	int k[] = {3, -2, 3, -4, 5, 6, 7};
	4	int i = 5;
	5	int f(int *a, int *b) 
	6	{ 
	7		i = *a;
	8		for(a += i+1; i>0; a++) 
	9			*b += *a * k[i--]; 
	10		return *b; 
	11	}
	12	int main() 
	13	{ 	
	14		int i=0;
	15		do 
	16			*k = f(k, &i); 
	17		while(i>0);
	18		printf("*k=%d\n",*k); 
	19	}




Aufgabe 4: (10 Punkte)

Ein Programm besteht aus zwei C-Dateien mit jeweils mehreren Funktionen so-
wie lokalen und globalen Variablen.

a) Welche Bedeutung hat in diesem Zusammenhang das Schlsselwort static, 
d.h. was passiert, wenn innerhalb einer Datei globale Variablen als static ge-
kennzeichnet sind?

b) Wie knnen Sie innerhalb einer C-Datei auf die globalen Variablen der jeweils 
anderen Datei zugreifen?

c) Welche Bedeutung hat das Schlsselwort static bei der Definition lokaler Va-
riablen?

d) Erklren Sie den Unterschied zwischen "eine Variable definieren" und "eine 
Variable deklarieren".

e) In welcher Weise und durch welche Programme knnen Sie nun die beiden C-
Dateien in ein einziges lauffhiges Programm umwandeln?


Aufgabe 5: (10 Punkte)

Sie stehen vor der Aufgabe, ein Programm zur Verwaltung von Musik-CDs zu 
schreiben. Dabei soll das Programm fr beliebig viele Datenstze geeignet sein. 
Aus diesem Grund entschlieen Sie sich zur Verwendung einer verketteten Liste 
fr die CDs.

Um auch mit Doppel- und Sammel-CDs zurecht zu kommen, trennen Sie die 
Verwaltungsstrukturen in die folgenden vier Teilstrukturen auf:

- CD-Hllen, bestehend aus einem Titel, einer Herstellerbezeichnung, der 
  Gesamtspieldauer, einer verketteten Liste tatschlich darin enthaltener 
  CDs und der Verkettung zur nchsten CD-Hlle.

- CDs, bestehend aus einer laufenden Nummer, der Gesamtspieldauer und 
  einer verketteten Liste enthaltener Musikstcke.

- Musikstcke, bestehend aus Titel, Interpret und Spieldauer.

- Spieldauern, bestehend aus Stunden, Minuten und Sekundenangaben.

Sie knnen dabei fr alle numerische Werte ganze Zahlen verwenden. Die Daten-
felder fr Namen und Bezeichnungen sollen jeweils die Speicherung von bis zu 
40 Textzeichen erlauben!
