Menu
CoddyTech

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.

challenge icon

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:

  1. Sử dụng cùng định nghĩa struct Contact như 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) name có kích thước 50
    • Một mảng ký tự phone có kích thước 20
    • Một mảng ký tự email có kích thước 40
    • Một số nguyên age
  2. Sử dụng cùng hàm createContact như 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ệ
  3. Sử dụng cùng hàm populateContact như trong các bài học trước. Hàm này:
    • Nhận một con trỏ đến struct Contact là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
  4. Viết hàm displayContact. Hàm này:
    • Nhận một con trỏ hằng đến struct Contact là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
  5. Viết hàm có tên updateContact. Hàm này:
    • Nhận một con trỏ đến struct Contact là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. Name
      • 2. Phone
      • 3. Email
      • 4. Age
      • Enter 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
    • Sau khi cập nhật thành công, in Contact updated successfully
  6. 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

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

Tự luyện tập: Trình biên dịch C online