Menu
Coddy logo textTech

Juntando Tudo

Parte da seção Logic & Flow do Journey de C da Coddy — lição 54 de 63.

challenge icon

Desafio

Fácil

Complete seu sistema de gerenciamento de contatos integrando todas as funções que você criou nas lições anteriores. Seu programa deve:

  1. Usar a mesma definição da struct Contact das lições anteriores com os membros:
    • Um array de caracteres name com tamanho 50
    • Um array de caracteres phone com tamanho 20
    • Um array de caracteres email com tamanho 40
    • Um inteiro age
  2. Usar a mesma função createContact das lições anteriores que:
    • Aloca dinamicamente memória para uma struct Contact
    • Inicializa todos os membros com valores padrão
    • Retorna um ponteiro para o contato
  3. Usar a mesma função populateContact das lições anteriores que:
    • Recebe um ponteiro para uma struct Contact como seu parâmetro
    • Solicita a entrada do usuário e preenche todos os campos do contato
    • Valida os dados de entrada
  4. Escrever uma função displayContact que:
    • Recebe um ponteiro constante para uma struct Contact como seu parâmetro
    • Imprime cada campo em sua própria linha neste formato exato:
      Name: John
      Phone: 555-1234
      Email: john@email.com
      Age: 25
  5. Escrever uma função chamada updateContact que:
    • Recebe um ponteiro para uma struct Contact como seu parâmetro
    • Não retorna nada (void)
    • Solicita ao usuário que escolha qual campo atualizar imprimindo:
      • What would you like to update?
      • 1. Name
      • 2. Phone
      • 3. Email
      • 4. Age
      • Enter choice (1-4):
    • Lê a escolha do usuário e atualiza o campo correspondente:
      • Se a escolha for 1: imprime Enter new name: e atualiza o nome
      • Se a escolha for 2: imprime Enter new phone: e atualiza o telefone
      • Se a escolha for 3: imprime Enter new email: e atualiza o email
      • Se a escolha for 4: imprime Enter new age: e atualiza a idade
      • Se a escolha for inválida (não for 1-4): imprime Invalid choice
    • Após uma atualização bem-sucedida, imprime Contact updated successfully
  6. Na função main, implementar um fluxo completo de gerenciamento de contatos:
    • Criar um contato usando a função createContact
    • Verificar se a criação do contato foi bem-sucedida
    • Chamar a função populateContact para preencher os dados iniciais do contato
    • Imprimir --- Initial Contact ---
    • Chamar a função displayContact para mostrar as informações iniciais do contato
    • Imprimir --- Updating Contact ---
    • Chamar a função updateContact para modificar um campo
    • Imprimir --- Updated Contact ---
    • Chamar a função displayContact novamente para mostrar as informações atualizadas do contato
    • Liberar a memória alocada dinamicamente
    • Imprimir Contact management completed

Nota: A função displayContact nesta lição usa um formato simples — uma linha por campo sem detalhes extras ou unidades (por exemplo, a idade é impressa como um número simples, não "25 years old"). Certifique-se de que sua saída corresponda exatamente ao formato mostrado acima, pois os casos de teste dependem disso.

Este desafio final reúne todos os componentes do seu sistema de gerenciamento de contatos: definição de struct, alocação dinâmica de memória, entrada e validação de dados, exibição formatada e modificação de dados. Você demonstrará o ciclo de vida completo de uma struct alocada dinamicamente, da criação à limpeza, enquanto pratica a organização de funções e o uso adequado de ponteiros durante todo o processo.

Experimente você mesmo

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

Todas as lições de Logic & Flow