/* Programm: Adressdatenbank 1 Funktion: Verwaltung von Adressen mit Strukturen Autor: Gerhard Zapf Update: 21.12.99 */ #include #include #define MAX 20 typedef struct{ char name[15]; char vorname[20]; char strasse[30]; char hausnr[4]; long plz; char ort[15]; }adresse; /* Den folgenden Funktionen wird jeweils ein Zeiger auf einen Datensatz übergeben. SucheEintrag und SchreibeAlle erwartet einen Zeiger auf dern ersten Datensatz im Feld, da sie alle Sätze bearbeiten */ /* Eingabefunktionen */ void ReadFromKeyb( adresse *daten ); /* Suchfunktionen */ int SucheEintrag( adresse *daten ); /* Ausgabefunktionen */ void SchreibeEintrag( adresse *daten ); void SchreibeAlle( adresse *daten, int anzahl ); int main( void ) { adresse daten[MAX]; // Platz für 20 Datensätze adresse *p_daten = daten; // Zeiger auf den ersten Datensatz int auswahl; // Menüauswahl zwischenspeichern do { // Menü ausgeben printf("\nBitte waehlen Sie einen Menuepunkt aus:\n"); printf("0 - Programm beenden\n"); printf("1 - Adresse eingeben\n"); printf("2 - Adresse suchen (nach Nachname)\n"); printf("3 - Alle Adressen ausgeben\n\n"); printf("Sie haben bereits %d Datensaetze eingegeben!\n", p_daten-daten ); printf("Ihre Auswahl: "); scanf("%d", &auswahl ); // Eingabe auswerten switch( auswahl ) { case 1: /* Adresse eingeben */ if( p_daten-daten < MAX - 1 ) { ReadFromKeyb( p_daten ); p_daten++; } break; case 2: /* Adresse suchen nach nachname */ if( !(p_daten-daten == 0) ) // Mindestens ein Eintrag vorhanden { // Der Rückgabewert der Funktion wird einfach verworfen SucheEintrag( daten ); } break; case 3: /* Alle Adressen ausgeben */ if( !(p_daten-daten == 0) ) // Mindestens ein Eintrag vorhanden { SchreibeAlle( daten, p_daten-daten ); } break; } }while( auswahl != 0 ); return 0; } void ReadFromKeyb( adresse *daten ) { printf("Nachname: "); scanf("%s", daten->name ); printf("Vornachname: "); scanf("%s", daten->vorname ); printf("Strasse: "); scanf("%s", daten->strasse ); printf("Hausnummer: "); scanf("%s", daten->hausnr ); printf("Postleitzahl: "); scanf("%ld", &daten->plz ); printf("Ort: "); scanf("%s", daten->ort ); } void SchreibeEintrag( adresse *daten ) { char name[30] = ""; char wohn[55] = ""; /* strcpy: kopiert einen strng in einen anderen strcat: hängt einen string an einen anderen an */ /* Den Wohnort zusammensetzen */ strcpy( wohn, daten->strasse ); strcat( wohn, " " ); strcat( wohn, daten->hausnr ); strcat( wohn, " in " ); strcat( wohn, daten->ort ); /* Aus Name und Vorname einen String machen */ strcpy( name, daten->name ); strcat( name, ", "); strcat( name, daten->vorname ); printf("%-30s %s (%-05ld)\n", name, wohn, daten->plz); } void SchreibeAlle( adresse *daten, int anzahl ) { int i; // Zählvariable printf("\nName Wohnort\n"); for( i = 0; i < anzahl; i++, daten++ ) { SchreibeEintrag( daten ); } } int SucheEintrag( adresse *daten ) { int i, match=0; // Zählvariabele, Statusanzeige char name[20]; // Vergleichswert printf("Welchen Nachnamen suchen: "); scanf("%20s", name ); // Die Nachlaufanweisung kann auch aus mehreren Anweisungen bestehen // hier wird die Zählvariable und der Zeiger um eins erhöht for( i = 0; i < MAX - 1; i++, daten++ ) { /* strcmp vergleicht zwei zeichenketten gibt bei übereinstimmung 0 zurück */ if( strcmp( name, daten->name ) == 0 ) { if( match == 0 ) printf("Name Wohnort\n"); SchreibeEintrag( daten ); match++; } } return match; }