Kết hợp tất cả
Thuộc phần Logic và luồng điều khiển trong hành trình C của Coddy. Bài học 54 trên 63.
Thử thách
DễHoàn thiện hệ thống quản lý liên hệ bằng cách tích hợp tất cả các hàm bạn đã tạo trong những bài học trước. Chương trình của bạn cần:
- Sử dụng cùng định nghĩa struct
Contactnhư trong các bài học trước, với các thành viên:- Một mảng ký tự (character array)
namecó kích thước 50 - Một mảng ký tự
phonecó kích thước 20 - Một mảng ký tự
emailcó kích thước 40 - Một số nguyên
age
- Một mảng ký tự (character array)
- Sử dụng cùng hàm
createContactnhư trong các bài học trước. Hàm này:- Cấp phát bộ nhớ động cho một struct
Contact - Khởi tạo tất cả thành viên bằng giá trị mặc định
- Trả về một con trỏ đến liên hệ
- Cấp phát bộ nhớ động cho một struct
- Sử dụng cùng hàm
populateContactnhư trong các bài học trước. Hàm này:- Nhận một con trỏ đến struct
Contactlàm tham số - Yêu cầu người dùng nhập dữ liệu và điền dữ liệu vào tất cả các trường liên hệ
- Xác thực dữ liệu đầu vào
- Nhận một con trỏ đến struct
- Viết hàm
displayContact. Hàm này:- Nhận một con trỏ hằng đến struct
Contactlàm tham số - In từng trường trên một dòng theo đúng định dạng sau:
Name: John
Phone: 555-1234
Email: john@email.com
Age: 25
- Nhận một con trỏ hằng đến struct
- Viết hàm có tên
updateContact. Hàm này:- Nhận một con trỏ đến struct
Contactlàm tham số - Không trả về giá trị nào (void)
- Yêu cầu người dùng chọn trường cần cập nhật bằng cách in ra:
What would you like to update?1. Name2. Phone3. Email4. AgeEnter choice (1-4):
- Đọc lựa chọn của người dùng và cập nhật trường tương ứng:
- Nếu lựa chọn là 1: in
Enter new name:và cập nhật tên - Nếu lựa chọn là 2: in
Enter new phone:và cập nhật số điện thoại - Nếu lựa chọn là 3: in
Enter new email:và cập nhật email - Nếu lựa chọn là 4: in
Enter new age:và cập nhật tuổi - Nếu lựa chọn không hợp lệ (không nằm trong khoảng từ 1 đến 4): in
Invalid choice
- Nếu lựa chọn là 1: in
- Sau khi cập nhật thành công, in
Contact updated successfully
- Nhận một con trỏ đến struct
- Trong hàm main, triển khai quy trình quản lý liên hệ hoàn chỉnh:
- Tạo một liên hệ bằng hàm
createContact - Kiểm tra xem việc tạo liên hệ có thành công hay không
- Gọi hàm
populateContactđể điền dữ liệu ban đầu cho liên hệ - In
--- Initial Contact --- - Gọi hàm
displayContactđể hiển thị thông tin liên hệ ban đầu - In
--- Updating Contact --- - Gọi hàm
updateContactđể sửa đổi một trường - In
--- Updated Contact --- - Gọi lại hàm
displayContactđể hiển thị thông tin liên hệ đã cập nhật - Giải phóng bộ nhớ đã cấp phát động
- In
Contact management completed
- Tạo một liên hệ bằng hàm
Lưu ý: Hàm displayContact trong bài học này dùng định dạng đơn giản: mỗi trường nằm trên một dòng, không có thông tin hay đơn vị bổ sung (ví dụ: tuổi được in dưới dạng số thông thường, không phải "25 years old"). Hãy đảm bảo đầu ra khớp chính xác với định dạng ở trên vì các test case phụ thuộc vào định dạng này.
Thử thách cuối cùng này kết hợp tất cả thành phần trong hệ thống quản lý liên hệ của bạn: định nghĩa struct, cấp phát bộ nhớ động, nhập và xác thực dữ liệu, hiển thị theo định dạng, và sửa đổi dữ liệu. Bạn sẽ thực hành toàn bộ vòng đời của một struct được cấp phát động, từ lúc tạo đến khi dọn dẹp, đồng thời rèn luyện cách tổ chức hàm và sử dụng con trỏ đúng cách trong toàn bộ quy trình.
Tự làm thử
#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;
}Tất cả bài học trong Logic và luồng điều khiển
1Nền tảng về con trỏ
Con trỏ là gì?Khai báo con trỏToán tử lấy địa chỉ (&)Toán tử giải tham chiếu (*)Con trỏ NULLÔn tập: kiến thức cơ bản về con trỏ4Dự án: Công cụ xử lý văn bản đơn giản
Tổng quan dự ánĐếm ký tự2Con trỏ và mảng
Tên mảng dưới dạng con trỏPhần tử mảng và con trỏPhép toán con trỏSo sánh con trỏÔn tập: duyệt mảng bằng con trỏ5Con trỏ và hàm
Truyền theo giá trịTruyền con trỏ vào hàmSửa đổi biến qua con trỏVí dụ kinh điển: hoán đổiTruyền mảng vào hàmÔn tập: đối số con trỏ hàm3Mảng ký tự và chuỗi
Chuỗi dưới dạng mảng charKý tự kết thúc nullNhập chuỗi bằng scanfDùng strlen()Dùng strcpy()Dùng strcat()Dùng strcmp()Ôn tập: các hàm xử lý chuỗi cơ bản6Quản lý bộ nhớ
Bộ nhớ ngăn xếp và bộ nhớ heapCấp phát động với malloc()Dùng sizeof() để cấp phátKiểm tra lỗi cấp phátGiải phóng bộ nhớ với free()Cấp phát với calloc()Ôn tập: Mảng động9Dự án: Nhập thông tin liên hệ đơn giản
Định nghĩa struct ContactHàm tạo liên hệTự luyện tập: Trình biên dịch C online