整合所有内容
本课属于 Coddy C 学习旅程的“逻辑与流程”单元。第 54 课,共 63 课。
挑战
简单通过整合你在前几课中创建的所有函数,完成你的联系人管理系统。你的程序应当:
- 使用前几课中的相同
Contact结构体定义,包含以下成员:- 一个大小为 50 的字符数组
name - 一个大小为 20 的字符数组
phone - 一个大小为 40 的字符数组
email - 一个整数
age
- 一个大小为 50 的字符数组
- 使用前几课中的相同
createContact函数,该函数:- 为
Contact结构体动态分配内存 - 将所有成员初始化为默认值
- 返回指向联系人的指针
- 为
- 使用前几课中的相同
populateContact函数,该函数:- 将指向
Contact结构体的指针作为参数 - 提示用户输入,并填充所有联系人字段
- 验证输入数据
- 将指向
- 编写一个
displayContact函数,该函数:- 将指向
Contact结构体的常量指针作为参数 - 按照以下确切格式,将每个字段单独打印在一行中:
Name: John
Phone: 555-1234
Email: john@email.com
Age: 25
- 将指向
- 编写一个名为
updateContact的函数,该函数:- 将指向
Contact结构体的指针作为参数 - 不返回任何内容(void)
- 通过打印以下内容,提示用户选择要更新的字段:
What would you like to update?1. Name2. Phone3. Email4. AgeEnter choice (1-4):
- 读取用户的选择,并更新相应的字段:
- 如果选择为 1:打印
Enter new name:,并更新姓名 - 如果选择为 2:打印
Enter new phone:,并更新电话 - 如果选择为 3:打印
Enter new email:,并更新邮箱 - 如果选择为 4:打印
Enter new age:,并更新年龄 - 如果选择无效(不是 1-4):打印
Invalid choice
- 如果选择为 1:打印
- 成功更新后,打印
Contact updated successfully
- 将指向
- 在 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 在线编译器