Juntando Tudo
Parte da seção Logic & Flow do Journey de C da Coddy — lição 54 de 63.
Desafio
FácilComplete seu sistema de gerenciamento de contatos integrando todas as funções que você criou nas lições anteriores. Seu programa deve:
- Usar a mesma definição da struct
Contactdas lições anteriores com os membros:- Um array de caracteres
namecom tamanho 50 - Um array de caracteres
phonecom tamanho 20 - Um array de caracteres
emailcom tamanho 40 - Um inteiro
age
- Um array de caracteres
- Usar a mesma função
createContactdas 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
- Aloca dinamicamente memória para uma struct
- Usar a mesma função
populateContactdas lições anteriores que:- Recebe um ponteiro para uma struct
Contactcomo seu parâmetro - Solicita a entrada do usuário e preenche todos os campos do contato
- Valida os dados de entrada
- Recebe um ponteiro para uma struct
- Escrever uma função
displayContactque:- Recebe um ponteiro constante para uma struct
Contactcomo 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
- Recebe um ponteiro constante para uma struct
- Escrever uma função chamada
updateContactque:- Recebe um ponteiro para uma struct
Contactcomo 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. Name2. Phone3. Email4. AgeEnter 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
- Se a escolha for 1: imprime
- Após uma atualização bem-sucedida, imprime
Contact updated successfully
- Recebe um ponteiro para uma struct
- 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
populateContactpara preencher os dados iniciais do contato - Imprimir
--- Initial Contact --- - Chamar a função
displayContactpara mostrar as informações iniciais do contato - Imprimir
--- Updating Contact --- - Chamar a função
updateContactpara modificar um campo - Imprimir
--- Updated Contact --- - Chamar a função
displayContactnovamente para mostrar as informações atualizadas do contato - Liberar a memória alocada dinamicamente
- Imprimir
Contact management completed
- Criar um contato usando a função
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
1Fundamentos de Ponteiros
O que é um Ponteiro?Declarando PonteirosO Operador de Endereço (&)O Operador de Desreferência (*)Ponteiros NULLRecapitulação: Fundamentos de Ponteiros4Projeto: Utilitário de Texto Simples
Visão Geral do ProjetoContando Caracteres2Ponteiros e Arrays
Nomes de Arrays como PonteirosElementos de Array - PonteirosAritmética de PonteirosComparando PonteirosRecapitulação: Percorrendo Arrays com Ponteiros5Ponteiros e Funções
Passagem por ValorPassando Ponteiros para FunçõesModificando Variáveis via PonteirosUm Exemplo Clássico: SwapPassando Arrays para FunçõesRecapitulação: Ponteiros como Argumentos3Arrays de Caracteres e Strings
Strings como Arrays de charO Terminador NuloEntrada de Strings com scanfUsando strlen()Usando strcpy()Usando strcat()Usando strcmp()Recapitulação: Funções Básicas de Strings6Gerenciamento de Memória
Memória Stack vs. HeapAlocação Dinâmica - malloc()Usando sizeof() para AlocaçãoVerificando Falhas de AlocaçãoLiberando Memória com free()Alocando com calloc()Recapitulação: Array Dinâmico9Projeto: Cadastro Simples de Contatos
Projeto: Definir a Struct de ContatoFunção para Criar um Contato