Aufgabe 1: (30 Punkte) Schreiben Sie ein Programm kunden zum Erfassen einer beliebigen Anzahl von Kundendaten. Für jeden Kunden sollen folgende Daten erfasst werden - Nachname (max. 24 Buchstaben lang) - Vorname (max. 24 Buchstaben lang) - Geburtsdatum (10 Zeichen lang) - Kundennummer (als Zahl). Das Programm wird folgendermassen aufgerufen kunde Ausgabedatei und arbeitet dann wie folgt beschrieben: - Aufrufparameter wird ausgewertet, bei falschem Aufruf Fehlermeldung - mit Hilfe der Funktion "new_kunde" wird eine Datenstruktur zur Speicherung der Kundendaten erzeugt, diese Struktur wird mit Hilfe der Funktion erfasse_daten gefüllt und vorne in eine verkettete Liste solcher Strukturen eingehängt. Dieser Schritt wird wiederholt bis erfasse_daten das Ende der Eingabe meldet. - schliesslich werden alle in der Liste gespeicherten Kundendaten mit Hilfe der Funktion speichere_liste in die angegebene Ausgabedatei gespeichert. Auf den folgenden Seiten finden Sie ein Gerüst für das beschriebene Programm. In den Kommentaren sind die Aufgaben der einzelnen, zu ergänzenden Programmteile beschrieben. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> /* * Deklaration der Kundenstruktur */ struct kunde { __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ struct kunde *naechster; }; /* * Deklaration von Funktionen, die bei der Programmierung von * main benötigt werden und die im Rahmen dieser * Aufgabe (zusätzlich zu main) zu programmieren sind (Seite 6) */ struct kunde *new_kunde(); void speichere_liste(struct kunde *, char *); /* * Deklaration von Funktionen, die bei der Programmierung von * main benötigt werden, die aber nicht selbst programmiert * werden müssen */ /* erfasse_daten: liefert 0 am Ende der Eingabe, sonst 1 */ int erfasse_daten(struct kunde *); /* * Funktion main */ int main(int argc, char *argv[]) { /* Variablendefinitionen */ __________________________________________________________ __________________________________________________________ __________________________________________________________ /* Überprüfen der Kommandozeile */ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ /* * Erzeugen von Kundenstruktur, Daten erfassen, * vorne in Liste einketten */ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ /* * Liste in Ausgabedatei speichern */ __________________________________________________________ return 0; } /* * Funktion new_kunde zum Erzeugen einer neuen Kundenstruktur * (wenn beim Reservieren des Speichers ein Fehler auftritt, * gibt diese Funktion eine Fehlermeldung aus und beendet das * Programm) * Die neue Struktur soll nicht initialisiert werden! */ struct kunde *new_kunde() { __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ } /* * Funktion speichere_liste * öffnet zuerst die übergebene Datei * - wenn hierbei ein Fehler auftritt, wird eine entsprechende * Meldung ausgegeben und das Programm abgebrochen * anschliessend wird für jedes Listenelement eine Zeile in der Form * Nachname, Vorname, Geburtsdatum, Kundennummer * in die Datei geschrieben */ void speichere_liste(struct kunde *kunde, char *datei) { FILE *fp; __________________________________________________________ __________________________________________________________ /* Ausgabedatei öffnen */ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ /* Liste ausgeben */ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ __________________________________________________________ } Aufgabe 2: (8 Punkte) Markieren und verbessern Sie die Fehler (mind. 4, max. 7) in dem untenstehenden Programm, das zu gegebenem Jahr und Monatsnamen die Anzahl der Tage berechnet. Die Implementation der Funktion schaltjahr ist nicht angegeben. Sie liefert 1 wenn das Jahr ein Schaltjahr war, sonst 0. Beachten Sie, daß alle bis auf einen Fehler nicht als solche von Standard-Compilern erkannt werden. Falsch erkannte Fehler werden negativ gewertet! #include <stdio.h> #include <string.h> #define FEBRUAR 1; static int tage[] = {31,28,31,30,31,30,31,31,30,31,30,31}; static char *monate[] = { "Januar","Februar","Maerz","April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"}; int schaltjahr(int jahr); int main() { int i, ok = 0; int max_tage, jahr; char *monatsname; while(!ok); { printf("Monatsname: "); scanf("%32s", monatsname); printf("Jahr: " ); scanf("%s", &jahr); for(i=1; i<=12; i++) { if(strcmp(monate[i], monatsname) == 0) { ok = 1; break; } } } max_tage = tage[i]; if(i = FEBRUAR) if(schaltjahr(jahr)) max_tage = 29; printf("%s %d hat %d Tage\n", monatsname, jahr, max_tage); return 0; } Aufgabe 3: (12 Punkte) Was gibt das folgende Programm in Zeile 7 aus? Geben Sie die Inhalte der verwendeten Variablen nach jeder ausgeführten Anweisung an! Verwenden Sie dazu die untenstehende Tabelle! 1 #include <stdio.h> 2 int s(int a[], int b); 3 int main() 4 { 5 int i, a[] = { 2, 7, 5 }; 6 i = s(a, 3); 7 printf("%d mal => %d %d %d\n", i, a[0], a[1], a[2]); 8 return 0; 9 } 10 int s(int a[], int b) 11 { 12 int i, t, f = 0; 13 for(i=0; i<b-1; i++) 14 if(a[i]>a[i+1]) 15 { 16 t = a[i]; 17 a[i] = a[i+1]; 18 a[i+1] = t; 19 f++; 20 } 21 return f; 22 } +-------++-------+------------------+------+------+------+------+------+ | Zeile || imain | amain | as | bs | is | ts | fs | | || | a[0] a[1] a[2] | | | | | | +-------++-------+------------------+------+------+------+------+------+ | || | | | | | | | +-------++-------+------------------+------+------+------+------+------+ | || | | | | | | | +-------++-------+------------------+------+------+------+------+------+ | || | | | | | | | +-------++-------+------------------+------+------+------+------+------+ | || | | | | | | | +-------++-------+------------------+------+------+------+------+------+ | || | | | | | | | +-------++-------+------------------+------+------+------+------+------+ | || | | | | | | | +-------++-------+------------------+------+------+------+------+------+ | || | | | | | | | +-------++-------+------------------+------+------+------+------+------+ | || | | | | | | | +-------++-------+------------------+------+------+------+------+------+ | || | | | | | | | +-------++-------+------------------+------+------+------+------+------+ | || | | | | | | | +-------++-------+------------------+------+------+------+------+------+ | || | | | | | | | +-------++-------+------------------+------+------+------+------+------+ | || | | | | | | | +-------++-------+------------------+------+------+------+------+------+ | || | | | | | | | +-------++-------+------------------+------+------+------+------+------+ | || | | | | | | | +-------++-------+------------------+------+------+------+------+------+ | || | | | | | | | +-------++-------+------------------+------+------+------+------+------+ Aufgabe 4: (5 Punkte) Schreiben Sie eine rekursive Funktion, die den größten gemeinsamen Teiler zweier ganzer Zahlen berechnet. Der größte gemeinsame Teiler ist durch folgende Rekursionsgleichung definiert: ggT(x,y) = y, wenn x modulo y gleich 0 ist, ggT(x,y) = ggT(y, (x modulo y)), falls x modulo y ungleich 0 ist. Aufgabe 5: (5 Punkte) a) Welche Gefahr sehen Sie bei diesem Programmstück? Begründen Sie Ihre Antwort kurz. float f = 0.0; while(1) { f = f + 0.1, if(f == 1.0) break; } b) Was ist der Unterschied zwischen einer Funktionsdefinition und einer Funktionsdeklaration (Prototyp)? Warum werden Funktionsdeklarationen benötigt?