#include #include #include #define NAME_LEN 30 #define ORT_LEN 30 #define STRASSE_LEN 50 #define ADRESSBUCH_LEN 100 #define MENUEPUNKTE_LEN sizeof(menuePunkte) / sizeof(TMENUEPUNKT) void Eingabe(TADRESSE adressen[], int *index); void AusgabeDatensatz(const TADRESSE adressen[], int index); void Ausgabe(const TADRESSE adressen[], int anzahl); int SucheName(const TADRESSE adressen[], int anzahl); void LoescheDatensatz(TADRESSE adressen[], int *anzahl); void LeereEingabepuffer(); void Menue(); char MenueAuswahl(); /* Strukturtyp fuer eine Adresse */ typedef struct { int id; // ID char name[NAME_LEN]; // Name der Person char strasse[STRASSE_LEN]; // Strasse long plz; // Postleitzahl char ort[ORT_LEN]; // Wohnort } TADRESSE; /* Strukturtyp fuer einen Menuepunkt */ typedef struct { char zeichen; // Auswahl: Kleinbuchstabe od. Zeichen char *text; // Informeller Text } TMENUEPUNKT; /* Feld von 5 Menuepunkten */ TMENUEPUNKT menuePunkte[] = { { '1', "Eingabe" }, { '2', "Ausgabe" }, { '3', "Suchen" }, { '4', "Loeschen" }, { '0', "Beenden" }, }; /* Eingabe: Einlesen eines Datensatzes * Parameter: * adressen Die gesamte Datenbank * index Index des naechsten leeren Elements im Feld, * gleichzeitig Laenge des Feldes * Rueckgabewert: Keiner */ void Eingabe(TADRESSE adressen[], int *index) { // fortlaufende id als eindeutige Kennung eines Datensatzes vergeben static int id = 1; adressen[*index].id = id++; printf("\n"); printf("Nachname: "); gets(adressen[*index].name); printf("PLZ: "); scanf("%ld", &adressen[*index].plz); getchar(); printf("Ort: "); gets(adressen[*index].ort); printf("Strasse: "); gets(adressen[*index].strasse); *index = *index + 1; } /* AusgabeDatensatz: Ausgabe eines Datensatzes * Parameter: * adressen Die gesamte Datenbank * index Index des Elementes * Rueckgabewert: Keiner */ void AusgabeDatensatz(const TADRESSE adressen[], int index) { printf("\n"); printf("ID: %d\n", adressen[index].id); printf("Name: %s\n", adressen[index].name); printf("PLZ: %ld\n", adressen[index].plz); printf("Ort: %s\n", adressen[index].ort); printf("Strasse: %s\n", adressen[index].strasse); } /* Ausgabe: Ausgabe aller Datensaetze * Parameter: * adressen Die gesamte Datenbank * anzahl Laenge des Feldes * Rueckgabewert: Keiner */ void Ausgabe(const TADRESSE adressen[], int anzahl) { for (int i = 0; i < anzahl; i++) AusgabeDatensatz(adressen, i); } /* SucheName: Suchen nach einem Datensatz anhand * des Namens * Parameter: * adressen Die gesamte Datenbank * anzahl Laenge des Feldes * Rueckgabewert: Position im Feld. -1 bei Fehler */ int SucheName(const TADRESSE adressen[], int anzahl) { char suchname[NAME_LEN]; printf("Name: "); gets(suchname); for (int i = 0; i < anzahl; i++) if (!(strncmp(suchname, adressen[i].name, strlen(suchname)))) return i; return -1; } /* LoescheDatensatz: Loeschen eines Datensatzes anhand des Namens * Parameter: * adressen Die gesamte Datenbank * anzahl Laenge des Feldes * Rueckgabewert: Keiner */ void LoescheDatensatz(TADRESSE adressen[], int *anzahl) { int index; index = SucheName(adressen, *anzahl); if (index == -1) { printf("\n"); printf("Datensatz nicht gefunden\n"); printf("\n"); return; } printf("\n"); AusgabeDatensatz(adressen, index); printf("\n"); printf("Datensatz wirklich loeschen? (j/n): "); { char zeichen; zeichen = getchar(); getchar(); if (tolower(zeichen) != 'j') return; } // Luecke fuellen: Alle folgenden Datensaetz "ruecken" eins nach links for (++index; index < *anzahl; index++) adressen[index - 1] = adressen[index]; // wir haben nun einen Datzensatz weniger *anzahl = *anzahl - 1; } /* LeereEingabepuffer: Leert den Standardeingabepuffer * bis zum naechsten '\n' * Parameter: Keiner * Rueckgabewert: Keiner */ void LeereEingabepuffer() { while (getchar() != '\n'); } /* Menue: Gibt ein Menue auf der Konsole aus * * Parameter: Keiner * Rueckgabewert: Keiner */ void Menue() { printf("\n"); printf("Menue\n"); printf("=====\n"); for (int i = 0; i < MENUEPUNKTE_LEN; i++) printf(" %c ... %s\n", menuePunkte[i].zeichen, menuePunkte[i].text); printf ("\n"); } /* MenueAuswahl: Benutzerabfrage zum Anwendungsmenue * Parameter: Keiner * Rueckgabewert: Korrekte Benutzereingabe */ char MenueAuswahl() { char zeichen; // Schleife solange durchlaufen, bis gueltiger Menuepunkte gewaehlt wurde while(1) { printf("Ihre Wahl (m fuer Menue): "); zeichen = getchar(); zeichen = tolower(zeichen); LeereEingabepuffer(); // Menue zeigen if (zeichen == 'm') { Menue(); continue; } // eingegebenes Zeichen auswerten for (int i = 0; i < MENUEPUNKTE_LEN; i++) if (zeichen == menuePunkte[i].zeichen) return zeichen; printf("Falsche Eingabe!\n"); } } int main() { TADRESSE Adressbuch[ADRESSBUCH_LEN]; int AnzahlAdressen = 0; int beenden = 0; printf("Kleine Adressverwaltung\n"); printf("=======================\n"); do { // Auswahlmenue anzeigen Menue(); // gewaehlte Menueoption vom Benutzer lesen char zeichen = MenueAuswahl(); printf("\n"); // gewaehlte Funktion ausfuehren switch (zeichen) { // Beenden case '0': beenden = 1; break; // Eingabe case '1': if (AnzahlAdressen < ADRESSBUCH_LEN) Eingabe(Adressbuch, &AnzahlAdressen); else fprintf(stderr, "Die Addressdatenbank ist voll!\n"); break; // Ausgabe case '2': Ausgabe(Adressbuch, AnzahlAdressen); break; // Suche case '3': { int index; // Datensatz suchen index = SucheName(Adressbuch, AnzahlAdressen); // Datensatz ausgeben if (index == -1) fprintf(stderr, "Name im Adressbuch nicht gefunden!\n"); else AusgabeDatensatz(Adressbuch, index); } break; // Loeschen case '4': LoescheDatensatz(Adressbuch, &AnzahlAdressen); break; } printf("\n"); } while (beenden != 1); return 0; }