Fazer um programa para simular uma agenda de telefones. Para cada pessoa devem-se ter os seguintes dados:
- Nome
- E-mail
- Endereço (contendo campos para Rua, número, complemento, bairro, cep, cidade, estado, país).
- Telefone (contendo campo para DDD e número)
- Data de aniversário (contendo campo para dia, mês, ano).
- Observações: Uma linha (string) para alguma observação especial.
(a) Definir a estrutura acima.
(b) Declarar a variável agenda (vetor) com capacidade de agendar até 100 nomes.
© Definir um bloco de instruções busca por primeiro nome: Imprime os dados da pessoa com esse nome (se tiver mais de uma pessoa, imprime para todas).
(d) Definir um bloco de instruções busca por mês de aniversário: Imprime os dados de todas as pessoas que fazem aniversário nesse mês.
(e) Definir um bloco de instruções busca por dia e mês de aniversário: Imprime os dados de todas as pessoas que fazem aniversário nesse dia e mês.
(f) Definir um bloco de instruções insere pessoa: Insere por ordem alfabética de nome.
(g) Definir um bloco de instruções retira pessoa: Retira todos os dados dessa pessoa e desloca todos os elementos seguintes do vetor para a posição anterior.
(h) Definir um bloco de instruções imprime agenda com as opções:
- Imprime nome, telefone e e-mail.
- Imprime todos os dados.
(i) O programa deve ter um menu principal oferecendo as opções acima.
(a) Definir a estrutura acima.
(b) Declarar a variável agenda (vetor) com capacidade de agendar até 100 nomes.
© Definir um bloco de instruções busca por primeiro nome: Imprime os dados da pessoa com esse nome (se tiver mais de uma pessoa, imprime para todas).
(d) Definir um bloco de instruções busca por mês de aniversário: Imprime os dados de todas as pessoas que fazem aniversário nesse mês.
(e) Definir um bloco de instruções busca por dia e mês de aniversário: Imprime os dados de todas as pessoas que fazem aniversário nesse dia e mês.
(f) Definir um bloco de instruções insere pessoa: Insere por ordem alfabética de nome.
(g) Definir um bloco de instruções retira pessoa: Retira todos os dados dessa pessoa e desloca todos os elementos seguintes do vetor para a posição anterior.
(h) Definir um bloco de instruções imprime agenda com as opções:
(i) O programa deve ter um menu principal oferecendo as opções acima.
Passo 1
O enunciado pede um programa em C que simula uma agenda telefônica com várias funcionalidades: busca (por primeiro nome, mês e dia/mês de aniversário), inserção ordenada, remoção, impressão parcial ou completa e um menu para o usuário. Precisamos de estruturas aninhadas para representar endereço, telefone e data de aniversário, e uma estrutura principal Pessoa que agrupe Nome, E-mail, Endereço, Telefone, Data e Observações.
Passo 2
Declaramos um array global Pessoa agenda[100] e uma variável int n = 0 que controla quantos contatos estão cadastrados. Criamos funções auxiliares de impressão: uma que imprime todos os campos de uma Pessoa e outra que imprime apenas Nome, Telefone e E-mail.
Passo 3
Implementamos busca por primeiro nome: a função recebe uma string, percorre agenda[0…n-1], extrai o primeiro nome de cada Pessoa (com strtok) e compara com strcmp. Para busca por mês de aniversário, percorremos agenda e comparamos pessoa.data.mes com o mês informado, imprimindo quem bater. Para busca por dia e mês de aniversário, fazemos o mesmo, comparando ambos os campos.
Passo 4
Para inserir em ordem alfabética, encontramos a posição i tal que strcmp(agenda[i].nome, nova.nome)>0, deslocamos agenda[i…n-1] uma posição à frente e colocamos nova em agenda[i], incrementando n. Para remoção, buscamos todas as pessoas com aquele nome (ou primeiro nome?) conforme enunciado, e para cada ocorrência deslocamos agenda[j+1…n-1] para j…n-2 e decrementamos n.
Passo 5
Criamos função de impressão da agenda que, via parâmetro, escolhe imprimir somente resumo ou tudo. No main(), montamos um laço while(1) que exibe um menu, lê a opção, chama a função correspondente e sai quando o usuário pede. No final temos um programa completo que atende (a) a (i).
Resposta
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 100
#define STR 100
typedef struct {
char rua[STR];
int numero;
char complemento[STR];
char bairro[STR];
char cep[20];
char cidade[STR];
char estado[STR];
char pais[STR];
} Endereco;
typedef struct {
int ddd;
char numero[20];
} Telefone;
typedef struct {
int dia;
int mes;
int ano;
} Data;
typedef struct {
char nome[STR];
char email[STR];
Endereco end;
Telefone tel;
Data aniversario;
char obs[STR];
} Pessoa;
Pessoa agenda[MAX];
int n = 0; // número de contatos atuais
void leiaString(const char *prompt, char *s, int tamanho) {
printf("%s", prompt);
fgets(s, tamanho, stdin);
s[strcspn(s, “\n”)] = ‘\0’;
}
void imprimeCompleto(const Pessoa *p) {
printf(“Nome: %s\n”, p->nome);
printf(“Email: %s\n”, p->email);
printf(“Endereco: %s, %d, %s, %s, %s, %s, %s, %s\n”,
p->end.rua, p->end.numero, p->end.complemento,
p->end.bairro, p->end.cep, p->end.cidade, p->end.estado, p->end.pais);
printf(“Telefone: (%d) %s\n”, p->tel.ddd, p->tel.numero);
printf(“Aniversario: %02d/%02d/%04d\n”, p->aniversario.dia, p->aniversario.mes, p->aniversario.ano);
printf(“Observacoes: %s\n”, p->obs);
printf("-----------------------------\n");
}
void imprimeResumo(const Pessoa *p) {
printf(“Nome: %s | Telefone: (%d) %s | Email: %s\n”,
p->nome, p->tel.ddd, p->tel.numero, p->email);
}
#include <string.h>
#include <stdlib.h>
#define MAX 100
#define STR 100
typedef struct {
char rua[STR];
int numero;
char complemento[STR];
char bairro[STR];
char cep[20];
char cidade[STR];
char estado[STR];
char pais[STR];
} Endereco;
typedef struct {
int ddd;
char numero[20];
} Telefone;
typedef struct {
int dia;
int mes;
int ano;
} Data;
typedef struct {
char nome[STR];
char email[STR];
Endereco end;
Telefone tel;
Data aniversario;
char obs[STR];
} Pessoa;
Pessoa agenda[MAX];
int n = 0; // número de contatos atuais
void leiaString(const char *prompt, char *s, int tamanho) {
printf("%s", prompt);
fgets(s, tamanho, stdin);
s[strcspn(s, “\n”)] = ‘\0’;
}
void imprimeCompleto(const Pessoa *p) {
printf(“Nome: %s\n”, p->nome);
printf(“Email: %s\n”, p->email);
printf(“Endereco: %s, %d, %s, %s, %s, %s, %s, %s\n”,
p->end.rua, p->end.numero, p->end.complemento,
p->end.bairro, p->end.cep, p->end.cidade, p->end.estado, p->end.pais);
printf(“Telefone: (%d) %s\n”, p->tel.ddd, p->tel.numero);
printf(“Aniversario: %02d/%02d/%04d\n”, p->aniversario.dia, p->aniversario.mes, p->aniversario.ano);
printf(“Observacoes: %s\n”, p->obs);
printf("-----------------------------\n");
}
void imprimeResumo(const Pessoa *p) {
printf(“Nome: %s | Telefone: (%d) %s | Email: %s\n”,
p->nome, p->tel.ddd, p->tel.numero, p->email);
}
void cadastraPessoa(Pessoa *p) {
leiaString("Nome: ", p->nome, STR);
leiaString("Email: ", p->email, STR);
leiaString("Rua: ", p->end.rua, STR);
printf(“Numero: “); scanf(”%d”, &p->end.numero); getchar();
leiaString("Complemento: ", p->end.complemento, STR);
leiaString("Bairro: ", p->end.bairro, STR);
leiaString("CEP: ", p->end.cep, 20);
leiaString("Cidade: ", p->end.cidade, STR);
leiaString("Estado: ", p->end.estado, STR);
leiaString("Pais: ", p->end.pais, STR);
printf(“DDD: “); scanf(”%d”, &p->tel.ddd); getchar();
leiaString("Numero Tel: ", p->tel.numero, 20);
printf(“Dia Aniv: “); scanf(”%d”, &p->aniversario.dia);
printf(“Mes Aniv: “); scanf(”%d”, &p->aniversario.mes);
printf(“Ano Aniv: “); scanf(”%d”, &p->aniversario.ano); getchar();
leiaString("Observacoes: ", p->obs, STR);
}
leiaString("Nome: ", p->nome, STR);
leiaString("Email: ", p->email, STR);
leiaString("Rua: ", p->end.rua, STR);
printf(“Numero: “); scanf(”%d”, &p->end.numero); getchar();
leiaString("Complemento: ", p->end.complemento, STR);
leiaString("Bairro: ", p->end.bairro, STR);
leiaString("CEP: ", p->end.cep, 20);
leiaString("Cidade: ", p->end.cidade, STR);
leiaString("Estado: ", p->end.estado, STR);
leiaString("Pais: ", p->end.pais, STR);
printf(“DDD: “); scanf(”%d”, &p->tel.ddd); getchar();
leiaString("Numero Tel: ", p->tel.numero, 20);
printf(“Dia Aniv: “); scanf(”%d”, &p->aniversario.dia);
printf(“Mes Aniv: “); scanf(”%d”, &p->aniversario.mes);
printf(“Ano Aniv: “); scanf(”%d”, &p->aniversario.ano); getchar();
leiaString("Observacoes: ", p->obs, STR);
}
void insereOrdenado() {
if (n >= MAX) { printf(“Agenda cheia!\n”); return; }
Pessoa novo;
cadastraPessoa(&novo);
int i = 0;
while (i < n && strcmp(agenda[i].nome, novo.nome) < 0) i++;
for (int j = n; j > i; j–) agenda[j] = agenda[j-1];
agenda[i] = novo; n++;
printf(“Inserido com sucesso.\n”);
}
if (n >= MAX) { printf(“Agenda cheia!\n”); return; }
Pessoa novo;
cadastraPessoa(&novo);
int i = 0;
while (i < n && strcmp(agenda[i].nome, novo.nome) < 0) i++;
for (int j = n; j > i; j–) agenda[j] = agenda[j-1];
agenda[i] = novo; n++;
printf(“Inserido com sucesso.\n”);
}
void removePessoa() {
char chave[STR];
leiaString("Nome (exato) a remover: ", chave, STR);
int i = 0;
while (i < n) {
if (strcmp(agenda[i].nome, chave) == 0) {
for (int j = i; j < n-1; j++) agenda[j] = agenda[j+1];
n–; // não incrementa i para checar nova pessoa na posição i
} else i++;
}
printf(“Remocao concluida.\n”);
}
char chave[STR];
leiaString("Nome (exato) a remover: ", chave, STR);
int i = 0;
while (i < n) {
if (strcmp(agenda[i].nome, chave) == 0) {
for (int j = i; j < n-1; j++) agenda[j] = agenda[j+1];
n–; // não incrementa i para checar nova pessoa na posição i
} else i++;
}
printf(“Remocao concluida.\n”);
}
void buscaNome() {
char chave[STR];
leiaString("Primeiro nome a buscar: ", chave, STR);
for (int i = 0; i < n; i++) {
char copia[STR]; strcpy(copia, agenda[i].nome);
char *primeiro = strtok(copia, " ");
if (strcmp(primeiro, chave) == 0) imprimeCompleto(&agenda[i]);
}
}
char chave[STR];
leiaString("Primeiro nome a buscar: ", chave, STR);
for (int i = 0; i < n; i++) {
char copia[STR]; strcpy(copia, agenda[i].nome);
char *primeiro = strtok(copia, " ");
if (strcmp(primeiro, chave) == 0) imprimeCompleto(&agenda[i]);
}
}
void buscaMes() {
int mes;
printf(“Mes de aniversario a buscar (1-12): “); scanf(”%d”, &mes); getchar();
for (int i = 0; i < n; i++)
if (agenda[i].aniversario.mes == mes)
imprimeCompleto(&agenda[i]);
}
int mes;
printf(“Mes de aniversario a buscar (1-12): “); scanf(”%d”, &mes); getchar();
for (int i = 0; i < n; i++)
if (agenda[i].aniversario.mes == mes)
imprimeCompleto(&agenda[i]);
}
void buscaDiaMes() {
int d, m;
printf(“Dia: “); scanf(”%d”, &d);
printf(“Mes: “); scanf(”%d”, &m); getchar();
for (int i = 0; i < n; i++)
if (agenda[i].aniversario.dia == d && agenda[i].aniversario.mes == m)
imprimeCompleto(&agenda[i]);
}
int d, m;
printf(“Dia: “); scanf(”%d”, &d);
printf(“Mes: “); scanf(”%d”, &m); getchar();
for (int i = 0; i < n; i++)
if (agenda[i].aniversario.dia == d && agenda[i].aniversario.mes == m)
imprimeCompleto(&agenda[i]);
}
void imprimeAgenda() {
int op;
printf(“1- Resumo (nome, tel, email)\n”);
printf(“2- Completo\n”);
printf(“Escolha: “); scanf(”%d”, &op); getchar();
for (int i = 0; i < n; i++) {
if (op == 1) imprimeResumo(&agenda[i]);
else imprimeCompleto(&agenda[i]);
}
}
int op;
printf(“1- Resumo (nome, tel, email)\n”);
printf(“2- Completo\n”);
printf(“Escolha: “); scanf(”%d”, &op); getchar();
for (int i = 0; i < n; i++) {
if (op == 1) imprimeResumo(&agenda[i]);
else imprimeCompleto(&agenda[i]);
}
}
int main() {
int escolha;
do {
printf("— AGENDA —\n");
printf(“1- Inserir pessoa\n”);
printf(“2- Remover pessoa\n”);
printf(“3- Buscar por primeiro nome\n”);
printf(“4- Buscar por mes de aniversario\n”);
printf(“5- Buscar por dia e mes de aniversario\n”);
printf(“6- Imprimir agenda\n”);
printf(“0- Sair\n”);
printf(“Escolha: “); scanf(”%d”, &escolha); getchar();
switch (escolha) {
case 1: insereOrdenado(); break;
case 2: removePessoa(); break;
case 3: buscaNome(); break;
case 4: buscaMes(); break;
case 5: buscaDiaMes(); break;
case 6: imprimeAgenda(); break;
case 0: printf(“Tchau!\n”); break;
default: printf(“Opcao invalida.\n”);
}
} while (escolha != 0);
return 0;
}
int escolha;
do {
printf("— AGENDA —\n");
printf(“1- Inserir pessoa\n”);
printf(“2- Remover pessoa\n”);
printf(“3- Buscar por primeiro nome\n”);
printf(“4- Buscar por mes de aniversario\n”);
printf(“5- Buscar por dia e mes de aniversario\n”);
printf(“6- Imprimir agenda\n”);
printf(“0- Sair\n”);
printf(“Escolha: “); scanf(”%d”, &escolha); getchar();
switch (escolha) {
case 1: insereOrdenado(); break;
case 2: removePessoa(); break;
case 3: buscaNome(); break;
case 4: buscaMes(); break;
case 5: buscaDiaMes(); break;
case 6: imprimeAgenda(); break;
case 0: printf(“Tchau!\n”); break;
default: printf(“Opcao invalida.\n”);
}
} while (escolha != 0);
return 0;
}