Menu
Coddy logo textTech

Собираем всё воедино

Часть раздела Logic & Flow путешествия по C на Coddy — урок 54 из 63.

challenge icon

Задание

Легко

Завершите создание системы управления контактами, интегрировав все функции, которые вы создали в предыдущих уроках. Ваша программа должна:

  1. Использовать то же определение структуры Contact из предыдущих уроков со следующими полями:
    • Символьный массив name размером 50
    • Символьный массив phone размером 20
    • Символьный массив email размером 40
    • Целое число 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: и обновляет 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;
}

Все уроки раздела Logic & Flow