Menu
CoddyTech

整合所有内容

本课属于 Coddy C 学习旅程的“逻辑与流程”单元。第 54 课,共 63 课。

challenge icon

挑战

简单

通过整合你在前几课中创建的所有函数,完成你的联系人管理系统。你的程序应当:

  1. 使用前几课中的相同 Contact 结构体定义,包含以下成员:
    • 一个大小为 50 的字符数组 name
    • 一个大小为 20 的字符数组 phone
    • 一个大小为 40 的字符数组 email
    • 一个整数 age
  2. 使用前几课中的相同 createContact 函数,该函数:
    • 为 Contact 结构体动态分配内存
    • 将所有成员初始化为默认值
    • 返回指向联系人的指针
  3. 使用前几课中的相同 populateContact 函数,该函数:
    • 将指向 Contact 结构体的指针作为参数
    • 提示用户输入,并填充所有联系人字段
    • 验证输入数据
  4. 编写一个 displayContact 函数,该函数:
    • 将指向 Contact 结构体的常量指针作为参数
    • 按照以下确切格式,将每个字段单独打印在一行中:
      Name: John
      Phone: 555-1234
      Email: john@email.com
      Age: 25
  5. 编写一个名为 updateContact 的函数,该函数:
    • 将指向 Contact 结构体的指针作为参数
    • 不返回任何内容(void)
    • 通过打印以下内容,提示用户选择要更新的字段:
      • What would you like to update?
      • 1. Name
      • 2. Phone
      • 3. Email
      • 4. Age
      • Enter choice (1-4):
    • 读取用户的选择,并更新相应的字段:
      • 如果选择为 1:打印 Enter new name: ,并更新姓名
      • 如果选择为 2:打印 Enter new phone: ,并更新电话
      • 如果选择为 3:打印 Enter new email: ,并更新邮箱
      • 如果选择为 4:打印 Enter new age: ,并更新年龄
      • 如果选择无效(不是 1-4):打印 Invalid choice
    • 成功更新后,打印 Contact updated successfully
  6. 在 main 函数中,实现完整的联系人管理流程:
    • 使用 createContact 函数创建联系人
    • 检查是否成功创建联系人
    • 调用 populateContact 函数,填入联系人的初始数据
    • 打印 --- Initial Contact ---
    • 调用 displayContact 函数,显示联系人的初始信息
    • 打印 --- Updating Contact ---
    • 调用 updateContact 函数,修改一个字段
    • 打印 --- Updated Contact ---
    • 再次调用 displayContact 函数,显示更新后的联系人信息
    • 释放动态分配的内存
    • 打印 Contact management completed

注意:本课中的 displayContact 函数使用简单的格式:每个字段占一行,不包含额外说明或单位(例如,年龄只打印普通数字,而不是 "25 years old")。请确保输出与上面显示的格式完全一致,因为测试用例依赖于此格式。

这个最终挑战将联系人管理系统的所有组成部分结合起来:结构体定义、动态内存分配、数据输入与验证、格式化显示以及数据修改。你将展示动态分配的结构体从创建到清理的完整生命周期,同时练习函数组织方式以及在整个流程中正确使用指针。

亲手试试

#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;
}

逻辑与流程中的所有课

自己练习: C 在线编译器