Alles zusammenfügen
Teil des Abschnitts Logic & Flow der C-Journey von Coddy — Lektion 54 von 63.
Aufgabe
EinfachVervollständigen Sie Ihr Kontaktverwaltungssystem, indem Sie alle Funktionen integrieren, die Sie in den vorherigen Lektionen erstellt haben. Ihr Programm sollte:
- Dieselbe
Contact-Strukturdefinition aus den vorherigen Lektionen mit folgenden Elementen verwenden:- Ein Zeichen-Array
namemit der Größe 50 - Ein Zeichen-Array
phonemit der Größe 20 - Ein Zeichen-Array
emailmit der Größe 40 - Eine Ganzzahl
age
- Ein Zeichen-Array
- Dieselbe
createContact-Funktion aus den vorherigen Lektionen verwenden, die:- Dynamisch Speicher für eine
Contact-Struktur reserviert - Alle Elemente mit Standardwerten initialisiert
- Einen Pointer auf den Kontakt zurückgibt
- Dynamisch Speicher für eine
- Dieselbe
populateContact-Funktion aus den vorherigen Lektionen verwenden, die:- Einen Pointer auf eine
Contact-Struktur als Parameter entgegennimmt - Benutzereingaben anfordert und alle Kontaktfelder ausfüllt
- Die Eingabedaten validiert
- Einen Pointer auf eine
- Schreiben Sie eine
displayContact-Funktion, die:- Einen konstanten Pointer auf eine
Contact-Struktur als Parameter entgegennimmt - Jedes Feld in einer eigenen Zeile in genau diesem Format ausgibt:
Name: John
Phone: 555-1234
Email: john@email.com
Age: 25
- Einen konstanten Pointer auf eine
- Schreiben Sie eine Funktion namens
updateContact, die:- Einen Pointer auf eine
Contact-Struktur als Parameter entgegennimmt - Nichts zurückgibt (void)
- Den Benutzer auffordert, das zu aktualisierende Feld zu wählen, indem sie Folgendes ausgibt:
What would you like to update?1. Name2. Phone3. Email4. AgeEnter choice (1-4):
- Die Auswahl des Benutzers liest und das entsprechende Feld aktualisiert:
- Wenn die Wahl 1 ist: gibt
Enter new name:aus und aktualisiert den Namen - Wenn die Wahl 2 ist: gibt
Enter new phone:aus und aktualisiert die Telefonnummer - Wenn die Wahl 3 ist: gibt
Enter new email:aus und aktualisiert die E-Mail - Wenn die Wahl 4 ist: gibt
Enter new age:aus und aktualisiert das Alter - Wenn die Wahl ungültig ist (nicht 1-4): gibt
Invalid choiceaus
- Wenn die Wahl 1 ist: gibt
- Nach einer erfolgreichen Aktualisierung
Contact updated successfullyausgibt
- Einen Pointer auf eine
- Implementieren Sie in der Hauptfunktion (main) einen vollständigen Workflow zur Kontaktverwaltung:
- Erstellen Sie einen Kontakt mit der Funktion
createContact - Prüfen Sie, ob die Erstellung des Kontakts erfolgreich war
- Rufen Sie die Funktion
populateContactauf, um die initialen Kontaktdaten auszufüllen - Geben Sie
--- Initial Contact ---aus - Rufen Sie die Funktion
displayContactauf, um die initialen Kontaktinformationen anzuzeigen - Geben Sie
--- Updating Contact ---aus - Rufen Sie die Funktion
updateContactauf, um ein Feld zu ändern - Geben Sie
--- Updated Contact ---aus - Rufen Sie die Funktion
displayContacterneut auf, um die aktualisierten Kontaktinformationen anzuzeigen - Geben Sie den dynamisch reservierten Speicher frei
- Geben Sie
Contact management completedaus
- Erstellen Sie einen Kontakt mit 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 years old"). Stellen Sie sicher, dass Ihre Ausgabe exakt dem oben gezeigten Format entspricht, da die Testfälle davon abhängen.
Diese abschließende Herausforderung führt alle Komponenten Ihres Kontaktverwaltungssystems zusammen: Strukturdefinition, dynamische Speicherreservierung, Dateneingabe und -validierung, formatierte Anzeige und Datenänderung. Sie demonstrieren den vollständigen Lebenszyklus einer dynamisch reservierten Struktur von der Erstellung bis zur Bereinigung, während Sie die Funktionsorganisation und die korrekte Verwendung von Pointern während des gesamten Prozesses üben.
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 Logic & Flow
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