Alles zusammenfügen
Teil des Abschnitts Logik & Ablauf der C-Journey von Coddy. Lektion 54 von 63.
Aufgabe
EinfachVervollständige dein Kontaktverwaltungssystem, indem du alle Funktionen integrierst, die du in den vorherigen Lektionen erstellt hast. Dein Programm sollte:
- Dieselbe Definition der
Contact-Struktur aus den vorherigen Lektionen verwenden mit den Mitgliedern:- Ein Zeichenarray
namemit der Größe 50 - Ein Zeichenarray
phonemit der Größe 20 - Ein Zeichenarray
emailmit der Größe 40 - Eine Ganzzahl
age
- Ein Zeichenarray
- Dieselbe
createContact-Funktion aus den vorherigen Lektionen verwenden, die:- Dynamisch Speicher für eine
Contact-Struktur reserviert - Alle Mitglieder mit Standardwerten initialisiert
- Einen Zeiger auf den Kontakt zurückgibt
- Dynamisch Speicher für eine
- Dieselbe
populateContact-Funktion aus den vorherigen Lektionen verwenden, die:- Einen Zeiger auf eine
Contact-Struktur als Parameter entgegennimmt - Zur Eingabe durch den Benutzer auffordert und alle Kontaktfelder ausfüllt
- Die Eingabedaten validiert
- Einen Zeiger auf eine
- Eine
displayContact-Funktion schreiben, die:- Einen konstanten Zeiger auf eine
Contact-Struktur als Parameter entgegennimmt - Jedes Feld in einer eigenen Zeile in diesem exakten Format ausgibt:
Name: John
Phone: 555-1234
Email: john@email.com
Age: 25
- Einen konstanten Zeiger auf eine
- Eine Funktion namens
updateContactschreiben, die:- Einen Zeiger auf eine
Contact-Struktur als Parameter entgegennimmt - Nichts zurückgibt (void)
- Den Benutzer auffordert, das zu aktualisierende Feld auszuwählen, indem sie Folgendes ausgibt:
What would you like to update?1. Name2. Phone3. Email4. AgeEnter choice (1-4):
- Die Auswahl des Benutzers einliest und das entsprechende Feld aktualisiert:
- Wenn die Auswahl 1 ist: Gibt
Enter new name:aus und aktualisiert den Namen - Wenn die Auswahl 2 ist: Gibt
Enter new phone:aus und aktualisiert die Telefonnummer - Wenn die Auswahl 3 ist: Gibt
Enter new email:aus und aktualisiert die E-Mail-Adresse - Wenn die Auswahl 4 ist: Gibt
Enter new age:aus und aktualisiert das Alter - Wenn die Auswahl ungültig ist (nicht 1–4): Gibt
Invalid choiceaus
- Wenn die Auswahl 1 ist: Gibt
- Nach einer erfolgreichen Aktualisierung
Contact updated successfullyausgeben
- Einen Zeiger auf eine
- In der main-Funktion einen vollständigen Workflow zur Kontaktverwaltung implementieren:
- Einen Kontakt mithilfe der Funktion
createContacterstellen - Überprüfen, ob die Erstellung des Kontakts erfolgreich war
- Die Funktion
populateContactaufrufen, um die anfänglichen Kontaktdaten einzugeben --- Initial Contact ---ausgeben- Die Funktion
displayContactaufrufen, um die anfänglichen Kontaktinformationen anzuzeigen --- Updating Contact ---ausgeben- Die Funktion
updateContactaufrufen, um ein Feld zu ändern --- Updated Contact ---ausgeben- Die Funktion
displayContacterneut aufrufen, um die aktualisierten Kontaktinformationen anzuzeigen - Den dynamisch reservierten Speicher freigeben
Contact management completedausgeben
- Einen Kontakt mithilfe der Funktion
Hinweis: Die Funktion displayContact in dieser Lektion verwendet ein einfaches Format: eine Zeile pro Feld ohne zusätzliche Details oder Einheiten (z. B. wird das Alter als einfache Zahl ausgegeben, nicht als „25 Jahre alt“). Achte darauf, dass deine Ausgabe exakt dem oben gezeigten Format entspricht, da die Testfälle davon abhängen.
Diese abschließende Herausforderung verbindet alle Bestandteile deines Kontaktverwaltungssystems: Strukturdefinition, dynamische Speicherreservierung, Dateneingabe und -validierung, formatierte Ausgabe und Datenänderung. Du demonstrierst den vollständigen Lebenszyklus einer dynamisch reservierten Struktur – von der Erstellung bis zur Speicherfreigabe – und übst dabei die Organisation von Funktionen sowie die korrekte Verwendung von Zeigern während des gesamten Prozesses.
Probier es selbst
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Contact {
char name[50];
char phone[20];
char email[40];
int age;
};
struct Contact* createContact() {
struct Contact* contact = (struct Contact*)malloc(sizeof(struct Contact));
if (contact != NULL) {
strcpy(contact->name, "");
strcpy(contact->phone, "");
strcpy(contact->email, "");
contact->age = 0;
}
return contact;
}
void populateContact(struct Contact* contactPtr) {
printf("Enter name: ");
fgets(contactPtr->name, sizeof(contactPtr->name), stdin);
contactPtr->name[strcspn(contactPtr->name, "\n")] = '\0';
printf("Enter phone: ");
fgets(contactPtr->phone, sizeof(contactPtr->phone), stdin);
contactPtr->phone[strcspn(contactPtr->phone, "\n")] = '\0';
printf("Enter email: ");
fgets(contactPtr->email, sizeof(contactPtr->email), stdin);
contactPtr->email[strcspn(contactPtr->email, "\n")] = '\0';
printf("Enter age: ");
scanf("%d", &contactPtr->age);
}
void displayContact(const struct Contact *contactPtr) {
printf("=== CONTACT DETAILS ===\n");
printf("Name: %s\n", contactPtr->name);
printf("Phone: %s\n", contactPtr->phone);
printf("Email: %s\n", contactPtr->email);
printf("Age: %d years old\n", contactPtr->age);
printf("========================\n");
printf("Name length: %lu characters\n", strlen(contactPtr->name));
if (contactPtr->age >= 0 && contactPtr->age <= 12) {
printf("Generation: Child\n");
} else if (contactPtr->age >= 13 && contactPtr->age <= 19) {
printf("Generation: Teenager\n");
} else if (contactPtr->age >= 20 && contactPtr->age <= 39) {
printf("Generation: Young Adult\n");
} else if (contactPtr->age >= 40 && contactPtr->age <= 59) {
printf("Generation: Middle-aged Adult\n");
} else if (contactPtr->age >= 60) {
printf("Generation: Senior\n");
}
if (strchr(contactPtr->email, '@') != NULL) {
printf("Email format: Valid\n");
} else {
printf("Email format: Invalid\n");
}
}
int main() {
struct Contact* contact = createContact();
if (contact != NULL) {
populateContact(contact);
displayContact(contact);
free(contact);
printf("Program completed successfully\n");
}
return 0;
}Alle Lektionen in Logik & Ablauf
1Zeiger-Grundlagen
Was ist ein Zeiger?Zeiger deklarierenDer Adressoperator (&)Der Dereferenzierungsoperator (*)NULL-ZeigerZusammenfassung: Zeiger-Grundlagen4Projekt: Einfaches Text-Tool
ProjektübersichtZeichen zählen2Pointer und Arrays
Array-Namen als PointerArray-Elemente - PointerPointer-ArithmetikPointer vergleichenWiederholung: Array-Durchlauf mit Pointern5Zeiger und Funktionen
Wertübergabe (Pass-by-Value)Zeiger an Funktionen übergebenVariablen über Zeiger ändernEin klassisches Beispiel: SwapArrays an Funktionen übergebenZusammenfassung: Zeiger als Funktionsargumente8Structs und Zeiger
Zeiger auf StructsDer Pfeiloperator (->)Structs per Wert übergebenÜbergabe von Struct-ZeigernDynamische Allokation von StructsZusammenfassung: Struct ändern - Ptr11Finale Wiederholungsaufgaben
Wiederholung: Dynamische String-KonkatenationWiederholung: Array von StructsWiederholung: Wortfrequenz-Zähler3Character-Arrays und Strings
Strings als char-ArraysDer Null-TerminatorString-Eingabe mit scanfVerwendung von strlen()Verwendung von strcpy()Verwendung von strcat()Verwendung von strcmp()Zusammenfassung: Grundlegende String-Funktionen6Speicherverwaltung
Stack vs. Heap SpeicherDynamische Allokation - malloc()Verwendung von sizeof() für die AllokationÜberprüfung auf AllokationsfehlerSpeicher freigeben mit free()Allokation mit calloc()Rückblick: Dynamische Arrays9Projekt: Einfache Kontakteingabe
Projekt: Kontakt-Struct definierenFunktion zum Erstellen eines KontaktsÜbe selbstständig: Online-C-Compiler