diff --git a/Lista Encadeada/exercicios/funcoes.cpp b/Lista Encadeada/exercicios/funcoes.cpp new file mode 100644 index 0000000..524eca7 --- /dev/null +++ b/Lista Encadeada/exercicios/funcoes.cpp @@ -0,0 +1,276 @@ +#include +#include +#include "lista.hpp" + +#define MAXTAM 5 + +using namespace std; + +void CriaListaVazia(TipoLista *lista) +{ + if (!listaCriada) + { + lista->primeiro = new TipoElemento; + lista->ultimo = lista->primeiro; + lista->ultimo->prox = NULL; + listaCriada = true; + } + else + { + cout << "Lista já existe!"; + } + Sleep(1500); +} + +bool VerificaListaVazia(TipoLista *lista) +{ + return (lista->primeiro == lista->ultimo); +} + +int TamanhoLista(TipoLista *lista) +{ + return lista->tamanho; +} + +void AtualizaUltimo(TipoLista *lista) +{ + Apontador aux; + aux = lista->primeiro->prox; + while (aux->prox != NULL) + { + aux = aux->prox; + } + lista->ultimo = aux; +} + +void InsereListaUltimo(TipoLista *lista, TipoItem *item) +{ + lista->ultimo->prox = new TipoElemento; + lista->ultimo = lista->ultimo->prox; + lista->ultimo->item = *item; + lista->ultimo->prox = NULL; + lista->tamanho++; + id++; +} + +void ImprimeLista(TipoLista lista) +{ + if (VerificaListaVazia(&lista)) + { + cout << "Lista vazia!\n"; + Sleep(1000); + return; + } + Apontador aux; + aux = lista.primeiro->prox; + while (aux != NULL) + { + cout << "ID: " << aux->item.id << endl; + cout << "Nome: " << aux->item.nome << endl; + cout << "Telefone: " << aux->item.telefone << endl; + cout << "Celular: " << aux->item.celular << endl; + cout << "Email: " << aux->item.email << endl; + cout << "Aniversario: " << aux->item.aniversario.dia << "/" << aux->item.aniversario.mes << endl + << endl; + aux = aux->prox; + } + system("pause"); +} + +bool PesquisaItem(TipoLista *lista, char nome[]) +{ + Apontador aux; + aux = lista->primeiro->prox; + while (aux != NULL) + { + if (strcmp(aux->item.nome, nome) == 0) + { + return true; + } + aux = aux->prox; + } + return false; +} + +bool PesquisaItemPorId(TipoLista *lista, int id) +{ + Apontador aux; + aux = lista->primeiro->prox; + while (aux != NULL) + { + if (aux->item.id == id) + { + return true; + } + aux = aux->prox; + } + return false; +} + +bool PesquisaItemPorEmail(TipoLista *lista, char email[]) +{ + Apontador aux; + aux = lista->primeiro->prox; + while (aux != NULL) + { + if (strcmp(aux->item.email, email) == 0) + { + return true; + } + aux = aux->prox; + } + return false; +} + +int Atualiza(TipoLista *lista, TipoItem item, char valor[], int campo) +{ + Apontador aux; + aux = lista->primeiro->prox; + while (aux != NULL) + { + if (strcmp(aux->item.nome, item.nome) == 0) + { + if (campo == 1) + { + strcpy(aux->item.nome, valor); + return 1; + } + else if (campo == 2) + { + strcpy(aux->item.telefone, valor); + return 1; + } + else if (campo == 3) + { + strcpy(aux->item.celular, valor); + return 1; + } + else if (campo == 4) + { + strcpy(aux->item.email, valor); + return 1; + } + } + aux = aux->prox; + } + return 0; +} + +int AtualizaAniversario(TipoLista *lista, TipoItem item, int dia, int mes) +{ + Apontador aux; + aux = lista->primeiro->prox; + while (aux != NULL) + { + if (strcmp(aux->item.nome, item.nome) == 0) + { + aux->item.aniversario.dia = dia; + aux->item.aniversario.mes = mes; + return 1; + } + aux = aux->prox; + } + return 0; +} + +void ImprimeItem(TipoLista *lista, char nome[]) +{ + Apontador aux; + aux = lista->primeiro->prox; + while (aux != NULL) + { + if (strcmp(aux->item.nome, nome) == 0) + { + // cout << "Nome: " << aux->item.nome << endl; + cout << "ID: " << aux->item.id << endl; + cout << "Nome: " << aux->item.nome << endl; + cout << "Telefone: " << aux->item.telefone << endl; + cout << "Celular: " << aux->item.celular << endl; + cout << "Email: " << aux->item.email << endl; + cout << "Aniversario: " << aux->item.aniversario.dia << "/" << aux->item.aniversario.mes << endl + << endl; + break; + } + aux = aux->prox; + } +} + +void ImprimeItemPorId(TipoLista *lista, int id) +{ + Apontador aux; + aux = lista->primeiro->prox; + while (aux != NULL) + { + if (aux->item.id == id) + { + cout << "Nome: " << aux->item.nome << endl; + cout << "Telefone: " << aux->item.telefone << endl; + cout << "Celular: " << aux->item.celular << endl; + cout << "Email: " << aux->item.email << endl; + cout << "Aniversario: " << aux->item.aniversario.dia << "/" << aux->item.aniversario.mes << endl + << endl; + break; + } + aux = aux->prox; + } +} + +void RemoveListaPrimeiro(TipoLista *lista) +{ + if (VerificaListaVazia(lista)) + { + return; + } + Apontador aux; + aux = lista->primeiro->prox; + lista->primeiro->prox = aux->prox; + delete aux; + lista->tamanho--; +} + +void RemoveListaUltimo(TipoLista *lista) +{ + if (VerificaListaVazia(lista)) + { + return; + } + Apontador aux, atual; + atual = lista->primeiro->prox; + aux = lista->ultimo; + while (atual->prox != lista->ultimo) + { + atual = atual->prox; + } + atual->prox = NULL; + lista->ultimo = atual; + delete aux; + lista->tamanho--; +} + +void RemoveItemPorId(TipoLista *lista, int id) +{ + if (VerificaListaVazia(lista)) + { + return; + } + + Apontador aux, anterior, x; + + aux = lista->primeiro->prox; + + x = lista->primeiro; + + while (x != NULL) + { + if (x->prox->item.id == id) + { + anterior = x; + break; + } + x = x->prox; + } + aux = anterior->prox; + anterior->prox = aux->prox; + delete aux; + lista->tamanho--; +} diff --git a/Lista Encadeada/exercicios/lista.hpp b/Lista Encadeada/exercicios/lista.hpp new file mode 100644 index 0000000..f35855e --- /dev/null +++ b/Lista Encadeada/exercicios/lista.hpp @@ -0,0 +1,55 @@ +#ifndef LISTA_H +#define LISTA_H + +typedef struct TipoData +{ + int dia; + int mes; +} TipoData; + +typedef struct TipoItem +{ + unsigned int id; + char nome[40]; + char telefone[15]; + char celular[15]; + char email[40]; + TipoData aniversario; +} TipoItem; + +typedef struct TipoElemento *Apontador; + +typedef struct TipoElemento +{ + TipoItem item; + struct TipoElemento *prox; +} TipoElemento; + +typedef struct TipoLista +{ + Apontador primeiro; + Apontador ultimo; + int tamanho = 0; +} TipoLista; + +bool listaCriada = false; +int id = 1; + +void CriaListaVazia(TipoLista *lista); +bool VerificaListaVazia(TipoLista *lista); +void InsereListaUltimo(TipoLista *lista, TipoItem *item); +void AtualizaUltimo(TipoLista *lista); +void ImprimeLista(TipoLista lista); +bool PesquisaItem(TipoLista *lista, char nome[]); +bool PesquisaItemPorId(TipoLista *lista, int id); +bool PesquisaItemPorEmail(TipoLista *lista, char email[]); +void ImprimeItem(TipoLista *lista, char nome[]); +void ImprimeItemPorId(TipoLista *lista, int id); +void RemoveListaPrimeiro(TipoLista *lista); +void RemoveListaUltimo(TipoLista *lista); +void RemoveItemPorId(TipoLista *lista, int id); +int TamanhoLista(TipoLista *lista); +int Atualiza(TipoLista *lista, TipoItem item, char nome[], int campo); +int AtualizaAniversario(TipoLista *lista, TipoItem item, int dia, int mes); + +#endif \ No newline at end of file diff --git a/Lista Encadeada/exercicios/main.cpp b/Lista Encadeada/exercicios/main.cpp new file mode 100644 index 0000000..20aa522 --- /dev/null +++ b/Lista Encadeada/exercicios/main.cpp @@ -0,0 +1,307 @@ +#include +#include +#include "lista.hpp" +#include "funcoes.cpp" + +using namespace std; + +void Menu() +{ + system("cls"); + cout << "--------------------------------\n"; + cout << " AGENDA TELEFÔNICA \n"; + cout << "--------------------------------\n"; + cout << "1. Novo contato\n"; + cout << "2. Listar contatos\n"; + cout << "3. Buscar contato\n"; + cout << "4. Excluir contato\n"; + cout << "0. Sair\n"; +} + +void Escolher() +{ + system("cls"); + cout << "--------------------------------\n"; + cout << " EDIÇÃO \n"; + cout << "--------------------------------\n"; + cout << "1. Nome\n"; + cout << "2. Telefone\n"; + cout << "3. Celular\n"; + cout << "4. E-mail\n"; + cout << "5. Aniversário\n"; + cout << "0. Voltar\n"; +} + +void Busca() +{ + system("cls"); + cout << "--------------------------------\n"; + cout << " PESQUISAR CONTATO \n"; + cout << "--------------------------------\n"; + cout << "1. ID\n"; + cout << "2. Nome\n"; + cout << "0. Voltar\n"; +} + +bool VerificaMes(int mes) +{ + if (mes < 1 || mes > 12) + { + return false; + } + return true; +} + +bool VerificaDia(int dia, int mes) +{ + if (dia < 1 || dia > 31) + { + return false; + } + if (mes == 2 && dia > 28) + { + return false; + } + if ((mes == 4 || mes == 6 || mes == 9 || mes == 11) && dia > 30) + { + return false; + } + return true; +} + +void Edicao(TipoLista *lista, TipoItem item) +{ + char op; + cout << "\n--------------------------------\n"; + cout << "Deseja editar o contato? (s/n): "; + cin >> op; + int escolher; + if (op == 'S' || op == 's') + { + do + { + char nome[30], telefone[15], celular[15], email[40]; + int dia, mes; + + Escolher(); + cout << "Opção: "; + cin >> escolher; + switch (escolher) + { + case 1: + cout << "\nNome: " << item.nome << " -> "; + cin >> nome; + Atualiza(lista, item, nome, 1); + cout << "\nNome atualizado com sucesso!\n"; + system("PAUSE"); + break; + case 2: + cout << "\nTelefone: " << item.telefone << " -> "; + cin >> telefone; + Atualiza(lista, item, telefone, 2); + cout << "\nTelefone atualizado com sucesso!\n"; + system("PAUSE"); + break; + case 3: + cout << "\nCelular: " << item.celular << " -> "; + cin >> celular; + Atualiza(lista, item, celular, 3); + cout << "\nCelular atualizado com sucesso!\n"; + system("PAUSE"); + break; + case 4: + cout << "E-mail: " << item.email << " -> "; + cin >> email; + Atualiza(lista, item, email, 4); + cout << "\nE-mail atualizado com sucesso!\n"; + system("PAUSE"); + break; + case 5: + cout << "\nData de aniversário\n"; + do + { + cout << "Mês: " << item.aniversario.mes << " -> "; + cin >> mes; + if (!VerificaMes(mes)) + { + cout << "\nMês inválido!\n"; + Sleep(1500); + } + } while (!VerificaMes(mes)); + do + { + cout << "Dia: " << item.aniversario.dia << " -> "; + cin >> dia; + if (!VerificaDia(dia, mes)) + { + cout << "\nO mês " << mes << " não possui o dia " << dia << ".\n"; + Sleep(1500); + } + } while (!VerificaDia(dia, mes)); + AtualizaAniversario(lista, item, dia, mes); + cout << "\nData de aniversário atualizada com sucesso!\n"; + system("PAUSE"); + break; + default: + break; + } + } while (escolher != 0); + } +} + +int main() +{ + UINT CPAGE_UTF8 = 65001; + UINT CPAGE_DEFAULT = GetConsoleOutputCP(); + SetConsoleOutputCP(CPAGE_UTF8); + + TipoLista lista; + TipoItem item; + int opcao, ret; + char op; + + CriaListaVazia(&lista); + + do + { + system("cls"); + Menu(); + cout << "Opção: "; + cin >> opcao; + + switch (opcao) + { + case 1: + system("cls"); + cout << "--------------------------------\n"; + cout << " AGENDA TELEFÔNICA \n"; + cout << "--------------------------------\n"; + cout << "Novo contato\n"; + cout << "--------------------------------\n"; + cout << "Nome: "; + item.id = id; + // strcpy(item.nome, "Eduardo"); + cin >> item.nome; + cout << "Telefone: "; + strcpy(item.telefone, "(38)999705297"); + // cin >> item.telefone; + cout << "Celular: "; + strcpy(item.celular, "(38)999705297"); + // cin >> item.telefone; + cout << "E-mail: "; + strcpy(item.email, "eduardo.trindade@ifmg.edu.br"); + // cin >> item.email; + cout << "\nData de aniversário\n"; + do + { + cout << "Mês: "; + cin >> item.aniversario.mes; + if (!VerificaMes(item.aniversario.mes)) + { + cout << "\nMês inválido!\n"; + Sleep(1500); + } + } while (!VerificaMes(item.aniversario.mes)); + do + { + cout << "Dia: "; + cin >> item.aniversario.dia; + if (!VerificaDia(item.aniversario.dia, item.aniversario.mes)) + { + cout << "\nO mês " << item.aniversario.mes << " não possui o dia " << item.aniversario.dia << ".\n"; + Sleep(1500); + } + } while (!VerificaDia(item.aniversario.dia, item.aniversario.mes)); + InsereListaUltimo(&lista, &item); + break; + case 2: + system("cls"); + cout << "--------------------------------\n"; + cout << " AGENDA TELEFÔNICA \n"; + cout << "--------------------------------\n"; + cout << "Listar contato(s)\n"; + cout << "--------------------------------\n"; + ImprimeLista(lista); + break; + case 3: + system("cls"); + cout << "--------------------------------\n"; + cout << " AGENDA TELEFÔNICA \n"; + cout << "--------------------------------\n"; + int opcaoBusca, cod; + char nome[30]; + do + { + Busca(); + cout << "\nOpção: "; + cin >> opcaoBusca; + switch (opcaoBusca) + { + case 1: + cout << "ID: "; + cin >> cod; + if (PesquisaItemPorId(&lista, cod)) + { + cout << endl; + ImprimeItemPorId(&lista, cod); + Edicao(&lista, item); + } + else + { + cout << "Contato não encontrado!\n"; + system("PAUSE"); + } + break; + case 2: + cout << "Nome: "; + cin >> nome; + if (PesquisaItem(&lista, nome)) + { + cout << endl; + ImprimeItem(&lista, nome); + Edicao(&lista, item); + } + else + { + cout << "Contato não encontrado!\n"; + system("PAUSE"); + } + break; + default: + break; + } + } while (opcaoBusca != 0); + + system("PAUSE"); + break; + case 4: + system("cls"); + cout << "--------------------------------\n"; + cout << " AGENDA TELEFÔNICA \n"; + cout << "--------------------------------\n"; + cout << "Excluir contato\n"; + cout << "--------------------------------\n"; + unsigned int codigo; + cout << "ID: "; + cin >> codigo; + if (PesquisaItemPorId(&lista, codigo)) + { + ImprimeItemPorId(&lista, codigo); + cout << "\n--------------------------------\n"; + cout << "Confirma a exclusão do contato? (s/n): "; + cin >> op; + if (op == 'S' || op == 's') + { + RemoveItemPorId(&lista, codigo); + cout << "\nContato excluído com sucesso!\n"; + } + } + else + { + cout << "Contato não encontrado!\n"; + } + system("PAUSE"); + break; + } + } while (opcao != 0); +} \ No newline at end of file diff --git a/Lista Encadeada/exercicios/readme.md b/Lista Encadeada/exercicios/readme.md new file mode 100644 index 0000000..eca854e --- /dev/null +++ b/Lista Encadeada/exercicios/readme.md @@ -0,0 +1,17 @@ +## Atividade Prática + +1. Em uma agenda telefônica os contatos são cadastrados com os seguintes dados: + +- Id - código gerado automaticamente (inteiro); +- Nome – nome do contato (máximo 40 caracteres); +- Telefone – cadeia de caracteres com o número do telefone do contato (máximo 15 caracteres); +- Celular – cadeia de caracteres com o número do celular do contato (máximo 15 caracteres); +- Email – cadeia de caracteres com o email do contato (máximo 40 caracteres); +- DataAniversario – data de aniversário do contato (contendo dia e mês); + +Utilizando listas encadeadas, escreva um programa que permita o cadastro, edição, remoção, busca e impressão de contatos desta agenda telefônica. + +Sugestão de melhorias: + +- criar uma função para inserir por ordem alfabética; +- exibir todos os contatos com mesmo nome em uma busca. \ No newline at end of file