Prévia do material em texto
UNIVERSIDADE FEDERAL DE MINAS GERAIS INSTITUTO DE CIÊNCIAS EXATAS DISCIPLINA ALGORITOS E ESTRUTURA DE DADOS I TRABALHO PRÁTICO FINAL por Clarisse Simões Ribeiro Aluna de Graduação do curso de Engenharia Elétrica Belo Horizonte, 03 de julho de 2009 RESUMO O Trabalho Prático Final constitui a elaboração de um programa em C++ de uma Agenda, utilizando para isso os conceitos trabalhados durante o semestre nesta disciplina. O programa deveria conter pelo menos sete funcionalidades descritas na apresentação do problema, exibidas em um menu de opções que aparece quando o usuário o executa. Para escolha de uma opção, o usuário digita o número correspondente a ela e o programa executa o módulo correspondente. Ao terminar a execução, o programa volta para o menu. INTRODUÇÃO Através do desenvolvimento de um algoritmo e de um programa correspondente em C++, deveria ser feita uma agenda com funcionalidades específicas, sendo cada uma delas representada por um módulo. Este relatório apresenta detalhadamente o desenvolvimento do trabalho, descrevendo seu problema, as soluções encontradas e o processo de desenvolvimento do programa e do algoritmo correspondente, que vêm como anexos. O Problema Usando o conceito de estruturas de dados heterogêneas, construir um programa para administrar uma agenda contendo dados sobre pessoas: • nome, • endereço (logradouro, numero, apartamento, bairro, cidade, etc.) , • telefone, • data de aniversário, • e-mail, • e outros dados que você achar de interesse. Esses dados deverão ser obrigatoriamente armazenados em uma variável composta heterogênea com capacidade de armazenar pelo menos 100 pessoas. Para administração da agenda o programa deverá ter as seguintes funcionalidades: • Inserção de novos dados na agenda – esta função permite inserção de registros completos de pessoas com todos os dados disponíveis. • Atualização de dados – a partir do nome da pessoa o programa deverá pesquisar na tabela de nomes e permitir que o usuário altere o próprio nome, ou qualquer dos demais dados. • Remoção de dados da agenda – neste caso a partir do nome pesquisado, o programa deverá apagar todos os dados de uma determinada pessoa. E para não ficar o registro vazio, o programa deverá deslocar todos os registros seguintes de forma a ocupar a posição vazia. • Imprimir a agenda – neste caso o programa deverá imprimir os dados de todas as pessoas cadastradas na agenda. • Salvar a agenda – salvar, em um arquivo, os dados cadastrados na agenda. • Carregar a agenda – ler os dados salvos anteriormente em um arquivo e remontar a agenda na estrutura de dados da memória. • Ordenar a agenda por ordem alfabética de nomes – usando algoritmos de ordenação o programa deverá trocar os registros de posição dentro da variável composta de forma que eles fiquem em armazenados em ordem alfabética de nome na variável composta. • Outras funcionalidades poderão se implementadas a critério dos projetistas. Para escolha da função o programa deverá exibir no inicio uma tela de opções de funções numeradas ou identificadas por letra. O usuário então escolhe uma função (pelo número, ou pela letra) e o programa executa o módulo correspondente. Ao terminar o módulo, o programa retorna ao menu. No menu deverá haver uma opção para terminar o programa – neste caso não esquecer de salvar a agenda atual. 2.1 Solução Adotada Para resolver o problema proposto, o primeiro passo foi a construção de um algoritmo. Cada uma das funcionalidades do programa, incluindo o menu, pôde ser desenvolvida separadamente, mas utilizando os dados das que foram utilizadas previamente. Segue abaixo o algoritmo de cada parte do programa com suas respectivas explicações. 2.1.2 Algoritmos 2.1.2.1 Menu Para a escolha das funcionalidades, o usuário precisa digitar um número que será armazenado na variável inteira x. Cada valor de x corresponde à execução de um módulo, sendo o valor 9 correspondente à impressão do menu. Assim, é estabelecido um valor de x que não corresponde a nenhum dos módulos (10, no caso) e o programa é executado enquanto x não possui esse valor. O algoritmo correspondente é: Enquanto x != 10 faça {Módulo 1 – Escrever o menu} se x = 9 então escreva “Menu” escreva “1.Insercao de novos dados na agenda” escreva “2.Atualizacao de dados” escreva “3.Remocao de dados da agenda” escreva “4.Imprimir a agenda” escreva “5.Salvar a agenda” escreva “6.Carregar a agenda ” escreva “7.Ordenar a agenda por ordem alfabetica de nomes” escreva “8.Finalizar programa” escreva “Digite o valor correspondente ao que voce quer fazer e tecle enter:” leia x fim se Uma dificuldade encontrada na implementação do programa em C++ foi a utilização do comando cin juntamente com o comando gets. Após o uso de algum comando cin, o programa ignorava a execução do comando gets que viesse em seguida. Para resolver o problema, foram criadas variáveis temporárias em string (Temp e opcao) e foi utilizada a função atoi para convertê-las em números inteiros, armazenados nas variáveis numéricas. 2.1.2.2 Inserção de novos dados na agenda Para a inserção de novos contatos na agenda, primeiro precisou-se criar um novo tipo registro, cujo nome é RegFunc. Esse registro armazena os dados contatos como nome, telefone, endereço, etc, todos como strings: Tipo RegFicha = registro nome, telefone, logradouro, apto, numero, CEP, bairro, cidade, estado, dia, mes, ano, email : literal fim registro Foi criada também uma subrotina de nome LeRegistro, que recebe por parâmetro a variável Pessoa e lê todos os dados de um respectivo contato. subrotina LeRegistro ( Pessoa ) {Declaração de parâmetro} Declare Pessoa RegFicha {Leitura de dados} escreva “Telefone:” leia Pessoa.telefone escreva “Logradouro:” leia Pessoa.logradouro escreva “Numero:” leia Pessoa.numero escreva “Apto:” leia Pessoa.apto escreva “CEP:” leia Pessoa.CEP escreva “Bairro:” leia Pessoa.bairro escreva “Cidade:” leia Pessoa.cidade escreva “Estado(sigla):” leia Pessoa.estado escreva “Bairro:” leia Pessoa.bairro escreva “Data de Aniversario(dd/mm/aa):” escreva “Dia:” leia Pessoa.di escreva “Mes:” leia Pessoa.mes escreva “Ano:” leia Pessoa.ano escreva “Email:” leia Pessoa.emai fim subrotina Com isso, o programa pede para a pessoa digitar o número de contatos que ela vai inserir e este valor fica armazenado em uma variável n. A variável composta que armazena os contatos foi chamada de Amigo[100], e é do tipo RegFicha. A variável que funciona como índice desta última é i. Utilizando a subrotina acima dentro de um comando de repetição que manda o índice i de Amigo variar de 0 até n, lê-se os dados dos contatos: se x = 1 então escreva “Inserção de novos dados na agenda” escreva “Quantos contatos voce vai inserir?” leia n para i ( 1 até i <= n passo 1 faça LeRegistro ( Amigo[i-1] ) fim para x ( 9 fim se Ao final da leitura, declara-se o valor de x como 9 para que o menu seja impresso novamente. Vale ressaltar que, no programa em C++, para que os strings de cada dado não ultrapassassem o valor máximo de caracteres declarados, foi realizado um teste que verifica quantos existem em cada um e, caso o valor esteja acima do limite, o programa pede o usuário para digitar novamente. 2.1.2.3 Atualização de dados Para a atualização de contatos na agenda, foi elaborado um sistema de busca de através de comparação das strings armazenadas na variável Amigo[i].nome com o nome buscado, que é armazenado na string nomeBuscado. O programa então compara este último com os dados já existentes na memória e, caso o nome seja encontrado, ele utilizaa subrotina de inserção de contatos para que o usuário redigite os dados de quem buscou. Caso o nome não seja encontrado, são oferecidas as opções de realizar uma nova busca - que reinicia a execução do módulo - ou de voltar para o menu. {Módulo 3 – Atualização de dados} se x = 2 escreva “"Digite o nome completo e sem acentuacao do contato a ser buscado e entao entre novamente com seus dados:” leia nomeBuscado opção ( 999 para i( 1 até i <= n passo 1 faça se nomeBuscado = Amigo[i].nome então LeRegistro (Amigo[i]) opção ( 0 fim se se opção ( 999 então escreva “O contato não foi encontrado.” opcao ( 0 fim se escreva “Deseja realizar uma nova busca? Digite 2 para SIM e 9 para NÃO:” leia opção se opção = 9 então x(9 fim se se opção = 2 então x(2 fim se fim se 2.1.2.4 Remoção de dados da agenda Assim como no caso da inserção de dados, foi criada uma rotina para remoção dos mesmos da agenda. Ela consiste, na verdade, em uma rotina de cópia. Dentro de um índice local j, o contato que será apagado tem seus dados na variável Amigo[i] substituídos pelos do próximo (Amigo[i+1]), e o contador do número de registros n tem seu valor diminuído de uma unidade. A subrotina de remoção RegDel tem como parâmetros duas variáveis do tipo RegFicha(Pessoa e ProxPessoa), e uma variável numérica que é o número máximo de contatos: subrotina RegDel ( Pessoa, ProxPessoa, maxcontatos ) {Declaração de parâmetros} Declare Pessoa RegFicha Declare ProxPessoa RegFicha Declare maxcontatos numérico {Declaração de variáveis locais} Declare j numérico {Copiar os dados de um contato para o outro} para j (0 até j<=maxcontatos passo 1 faça ProxPessoa.nome = Pessoa.nome ProxPessoa.telefone = Pessoa.telefone ProxPessoa.logradouro = Pessoa.logradouro ProxPessoa.apto = Pessoa.apto, ProxPessoa.numero =Pessoa.numero ProxPessoa.CEP = Pessoa.CEP ProxPessoa.bairro = Pessoa.bairro ProxPessoa.cidade = Pessoa.cidade ProxPessoa.estado = Pessoa.estado ProxPessoa.dia = Pessoa.dia ProxPessoa.mes = Pessoa.mes ProxPessoa.ano = Pessoa.ano ProxPessoa.email = Pessoa.email fim para fim subrotina O sistema de busca é o mesmo utilizado no item anterior. Após encontrar o contato, o programa pede o usuário para confirmar a sua exclusão e então executa a rotina acima. Ao fim, pergunta-se ao usuário se ele deseja excluir mais alguém ou voltar ao menu, e então é lido o valor de x. se x = 3 então escreva “Busca:” escreva “Digite o nome completo e sem acentuacao do contato a ser buscado:” leia nomeBuscado para i ( 1 até i <=n se nomeBuscado = Amigo[i].nome escreva “Tem certeza que deseja remover o contato " nomeBuscado “ ? Digite 1 para SIM e 2 para NAO:" leia opção se opção = 1 RegDel (Amigo[i], Amigo[i+1], n) n = n – 1 fim se fim para escreva "Deseja remover mais algum contato? Digite 3 para SIM e 9 para NAO:" leia x fim se 2.1.2.4 Imprimir a agenda A impressão da agenda é feita de uma forma muito simples: o programa imprime os dados do contato Amigo[i], com i variando de 1 até n (número máximo de contatos). se x = 4 então para i ( 1 até i <=n passo 1 faça escreva “Nome:” Amigo[i].nome escreva “Telefone:” Amigo[i].telefone escreva “Logradouro:” Amigo[i].logradouro escreva “Numero:” Amigo[i].numero escreva “Apto:” Amigo[i].apto escreva “CEP:” Amigo[i].CEP escreva “Bairro:” Amigo[i].bairro escreva “Cidade:” Amigo[i].cidade escreva “Estado(sigla):” Amigo[i].estado escreva “Bairro:” Amigo[i].bairro escreva “Data de Aniversario(dd/mm/aa):” escreva “Dia:” Amigo[i].dia escreva “Mes:” Amigo[i].mes escreva “Ano:” Amigo[i].ano escreva “Email:” Amigo[i].email fim para escreva " Digite 9 para voltar ao menu:" leia x fim se 2.1.2.5 Salvar a agenda Este módulo começa confirmando se o usuário deseja realmente salvar a agenda. Com a confirmação, são abertos três arquivos no formato txt: agenda.txt, memoria.txt e maxcontatos.txt. O primeiro armazena os dados no mesmo formato em que eles são impressos na tela durante a execução do item anterior. O segundo e o terceiro funcionam como a memória de armazenamento e leitura de dados para a execução do programa, sendo memoria.txt o arquivo que armazena as informações de cada contato e maxcontatos.txt um arquivo que armazena o valor da variável n, já que, no caso do programa precisar abrir um arquivo salvo, não haverá um valor previamente estabelecido durante aquela execução. Mais uma vez, utilizando o índice i para a variável Amigo[i], o programa escreve as respectivas informações em cada arquivo e avisa ao usuário que a operação foi concluída. Novamente, é pedido que ele digite o valor 9 para a variável x e o menu volta a ser impresso na tela. se x = 5 então escreva “Tem certeza que deseja salvar a agenda? Digite 1 para SIM e 2 para NÃO:” leia opção se opção = 1 então abrir agenda.txt escrita abrir memoria.txt escrita abrir maxcontatos.txt escrita para i ( 0 até i<= n passo 1 faça escreva “Nome:” agenda.Amigo[i].nome escreva “Telefone:” agenda.Amigo[i].telefone escreva “Logradouro:” agenda.Amigo[i].logradouro escreva “Numero:” agenda.Amigo[i].numero escreva “Apto:” agenda.Amigo[i].apto escreva “CEP:” agenda.Amigo[i].CEP escreva “Bairro:” agenda.Amigo[i].bairro escreva “Cidade:” agenda. Amigo[i].cidade escreva “Estado(sigla):” agenda.Amigo[i].estado escreva “Bairro:” agenda.Amigo[i].bairro escreva “Data de Aniversario(dd/mm/aa):” escreva “Dia:” agenda. Amigo[i].dia escreva “Mes:” agenda.Amigo[i].mes escreva “Ano:” agenda.Amigo[i].ano escreva “Email:” agenda.Amigo[i].email escreva memoria.Amigo[i].nome escreva memoria.Amigo[i].telefone escreva memoria.Amigo[i].logradouro escreva memoria.Amigo[i].numero escreva memoria.Amigo[i].apto escreva memoria.Amigo[i].CEP escreva memoria.Amigo[i].bairro escreva memoria. Amigo[i].cidade escreva memoria.Amigo[i].estado escreva memoria.Amigo[i].bairro escreva memoria. Amigo[i].dia escreva memoria.Amigo[i].mes escreva memoria.Amigo[i].ano escreva memoria.Amigo[i].email escreva nmaximocontatos.n fim para fechar agenda.txt fechar memoria.txt fechar maxcontatos.txt escreva "Sua agenda esta salva no arquivo agenda.txt , armazenado na mesma pasta que este programa. Voce pode fazer copias de seguranca caso deseje comecar uma nova agenda. “ fim se escreva ”Para continuar digite 9:” leia x fim se 2.1.2.6 Carregar a agenda Assim como o anterior, este módulo começa confirmando se o usuário deseja realmente executar esta operação. Com a confirmação, são abertos os arquivos maxcontatos.txt e memoria.txt, de onde são lidos, respectivamente, o valor da variável n, necessária para limitar a função para, e os dados de cada contato, que são lidos dentro da mesma. Para isso, novamentevaria-se o índice i de 1 até n e cada linha do texto armazenado no bloco de notas é transferida como um dado do contato. Ao terminar, o valor de x é definido como 9 e o menu é impresso na tela. se x = 6 escreva “Tem certeza que deseja carregar a agenda? Digite 1 para SIM e 2 para NAO” leia opcao se opcao = 1 abrir maxcontatos.txt leitura abrir memoria.txt leitura n ( maxcontatos para i ( 0 até i<=n passo 1 faça leia memoria.Amigo[i].nome leia memoria.Amigo[i].telefone leia memoria.Amigo[i].logradouro leia memoria.Amigo[i].numero leia memoria.Amigo[i].apto leia memoria.Amigo[i].CEP leia memoria.Amigo[i].bairro leia memoria.Amigo[i].cidade leia memoria.Amigo[i].estado leia memoria.Amigo[i].dia leia memoria.Amigo[i].mes leia memoria.Amigo[i].ano leia memoria.Amigo[i].email fim para fim se x(9 fim se 2.1.2.7 Colocar a agenda em ordem alfabética Para colocar a agenda em ordem alfabética, o programa verifica e compara os nomes de todos os contatos, dois a dois. Caso o segundo nome seja posterior ao primeiro, os dados do primeiro são copiados para uma variável auxiliar Aux, do tipo RegFunc. Para isso, mais uma vez foi utilizada uma subrotina de nome RegCopy, que tem como parâmetros duas variáveis do tipo RegFicha(Pessoa e ProxPessoa). De forma semelhante a rotina RegDel, ela copia os dados de ProxPessoa para Pessoa. Após isso, os dados do segundo(Amigo[i+1]) contato são copiados para o primeiro(Amigo[i]) e os dados deste último, que estavam armazenados em Aux, são copiados, por sua vez, para Amigo[i+1]. Assim, eles “trocam de lugar”. subrotina RegCopy ( Pessoa, ProxPessoa) {Declaração de parâmetros} Declare Pessoa RegFicha Declare ProxPessoa RegFicha {Copiar os dados de um contato para o outro} ProxPessoa.nome = Pessoa.nome ProxPessoa.telefone = Pessoa.telefone ProxPessoa.logradouro = Pessoa.logradouro ProxPessoa.apto = Pessoa.apto, ProxPessoa.numero =Pessoa.numero ProxPessoa.CEP = Pessoa.CEP ProxPessoa.bairro = Pessoa.bairro ProxPessoa.cidade = Pessoa.cidade ProxPessoa.estado = Pessoa.estado ProxPessoa.dia = Pessoa.dia ProxPessoa.mes = Pessoa.mes ProxPessoa.ano = Pessoa.ano ProxPessoa.email = Pessoa.email fim para fim subrotina se x = 7 para i ( 0 até i < n passo 1 faça se Amigo[i].nome > Amigo[i+1].nome então RegCopy(Amigo[i], Aux) RegCopy(Amigo[i+1], Amigo[i]) RegCopy(Aux, Amigo[i+1]) fim se fim para escreva “Sua agenda foi ordenada em alfabeticamente. Voce pode salva-la novamente caso deseje. Para continuar, digite 9.” leia x fim se 2.1.2.7 Finalizar o programa Antes de finalizar o programa, é oferecida ao usuário a opção de salvar a agenda. Neste caso, é utilizado o mesmo algoritmo do módulo já desenvolvido para isso. Depois, o valor de x é declarado como 10, o que faz a execução da impressão do menu e das outras funcionalidades parar de acontecer, como explicado em 2.1.2.1. se x =8 escreva “Deseja salvar sua agenda antes de sair? Digite 1 para SIM e 2 para NAO:” leia opção se opção = 1 então abrir agenda.txt escrita abrir memoria.txt escrita abrir maxcontatos.txt escrita para i ( 0 até i<= n passo 1 faça escreva “Nome:” agenda.Amigo[i].nome escreva “Telefone:” agenda.Amigo[i].telefone escreva “Logradouro:” agenda.Amigo[i].logradouro escreva “Numero:” agenda.Amigo[i].numero escreva “Apto:” agenda.Amigo[i].apto escreva “CEP:” agenda.Amigo[i].CEP escreva “Bairro:” agenda.Amigo[i].bairro escreva “Cidade:” agenda. Amigo[i].cidade escreva “Estado(sigla):” agenda.Amigo[i].estado escreva “Bairro:” agenda.Amigo[i].bairro escreva “Data de Aniversario(dd/mm/aa):” escreva “Dia:” agenda. Amigo[i].dia escreva “Mes:” agenda.Amigo[i].mes escreva “Ano:” agenda.Amigo[i].ano escreva “Email:” agenda.Amigo[i].email escreva memoria.Amigo[i].nome escreva memoria.Amigo[i].telefone escreva memoria.Amigo[i].logradouro escreva memoria.Amigo[i].numero escreva memoria.Amigo[i].apto escreva memoria.Amigo[i].CEP escreva memoria.Amigo[i].bairro escreva memoria. Amigo[i].cidade escreva memoria.Amigo[i].estado escreva memoria.Amigo[i].bairro escreva memoria. Amigo[i].dia escreva memoria.Amigo[i].mes escreva memoria.Amigo[i].ano escreva memoria.Amigo[i].email escreva nmaximocontatos.n fim para fechar agenda.txt fechar memoria.txt fechar maxcontatos.txt fim se x(10 fim se 2.2 Conclusão O trabalho de conclusão da matéria AEDS I representou um grande desafio. Utilizando as técnicas aprendidas durante o semestre, foi possível perceber a aplicabilidade do conhecimento adquirido. Apesar das dificuldades encontradas na elaboração, principalmente, do programa em C++, foi absolutamente satisfatório observar o resultado final, como mostra a figura abaixo: Em anexos, se encontram o algoritmo completo e o código do programa Agenda em C++. 2.3 Referência Bibliográficas FARRER, Harry; BECKER, Christiano; FARIA, Eduardo; MATOS, Helton; SANTOS, Augusto; MAIA, Miriam. Algoritmos Estruturados. Belo Horizonte. Editora Santuário, 1999. FRANÇA, Júnia. Manual para Normalização de Publicações Ténico-Científicas. Belo Horizonte. Editora UFMG, 2007. ANEXOS 1 . Algoritmo do programa Algoritmo Tipo RegFicha = registro nome, telefone, logradouro, apto, numero, CEP, bairro, cidade, estado, dia, mes, ano, email : literal fim registro subrotina LeRegistro ( Pessoa ) {Declaração de parâmetro} Declare Pessoa RegFicha {Leitura de dados} escreva “Telefone:” leia Pessoa.telefone escreva “Logradouro:” leia Pessoa.logradouro escreva “Numero:” leia Pessoa.numero escreva “Apto:” leia Pessoa.apto escreva “CEP:” leia Pessoa.CEP escreva “Bairro:” leia Pessoa.bairro escreva “Cidade:” leia Pessoa.cidade escreva “Estado(sigla):” leia Pessoa.estado escreva “Bairro:” leia Pessoa.bairro escreva “Data de Aniversario(dd/mm/aa):” escreva “Dia:” leia Pessoa.dia escreva “Mes:” leia Pessoa.mes escreva “Ano:” leia Pessoa.ano escreva “Email:” leia Pessoa.email fim subrotina subrotina RegDel ( Pessoa, ProxPessoa, maxcontatos ) {Declaração de parâmetros} Declare Pessoa RegFicha Declare ProxPessoa RegFicha Declare maxcontatos numérico {Declaração de variáveis locais} Declare j numérico {Copiar os dados de um contato para o outro} para j (0 até j<=maxcontatos passo 1 faça ProxPessoa.nome = Pessoa.nome ProxPessoa.telefone = Pessoa.telefone ProxPessoa.logradouro = Pessoa.logradouro ProxPessoa.apto = Pessoa.apto, ProxPessoa.numero =Pessoa.numero ProxPessoa.CEP = Pessoa.CEP ProxPessoa.bairro = Pessoa.bairro ProxPessoa.cidade = Pessoa.cidade ProxPessoa.estado = Pessoa.estado ProxPessoa.dia = Pessoa.dia ProxPessoa.mes = Pessoa.mes ProxPessoa.ano = Pessoa.ano ProxPessoa.email = Pessoa.email fim para fimsubrotina subrotina RegCopy ( Pessoa, ProxPessoa) {Declaração de parâmetros} Declare Pessoa RegFicha Declare ProxPessoa RegFicha {Copiar os dados de um contato para o outro} ProxPessoa.nome = Pessoa.nome ProxPessoa.telefone = Pessoa.telefone ProxPessoa.logradouro = Pessoa.logradouro ProxPessoa.apto = Pessoa.apto, ProxPessoa.numero =Pessoa.numero ProxPessoa.CEP = Pessoa.CEP ProxPessoa.bairro = Pessoa.bairro ProxPessoa.cidade = Pessoa.cidade ProxPessoa.estado = Pessoa.estado ProxPessoa.dia = Pessoa.dia ProxPessoa.mes = Pessoa.mes ProxPessoa.ano = Pessoa.ano ProxPessoa.email = Pessoa.email fim para fim subrotina {Declaração de variáveis} Declare x, i, n, opção, maximocaracteres numérico Declare Amigo[1:100] RegFicha Declare Temp[1:20], nomeBuscado[1:30] literal {Declaração de arquivos que serão lidos e escritos pelo programa} Declare agenda, {arquivo que salva a impressão da agenda de forma semelhante à impressão do programa} memoria, {arquivo de memoria da agenda} maxcontatos, {arquivo que armazena o numero máximo de contatos da agenda} arquivo seqüencial de RegFunc {Especificação do valor para x que imprime o menu} X ( 9 Enquanto x != 10 faça {Módulo 1 – Escrever o menu} se x = 9 então escreva “Menu” escreva “1.Insercao de novos dados na agenda” escreva “2.Atualizacao de dados” escreva “3.Remocao de dados da agenda” escreva “4.Imprimir a agenda” escreva “5.Salvar a agenda” escreva “6.Carregar a agenda ” escreva “7.Ordenar a agenda por ordem alfabetica de nomes” escreva “8.Finalizar programa” escreva “Digite o valor correspondente ao que voce quer fazer e tecle enter:” leia x fim se {Módulo 2 – Inserção de novos dados na agenda} se x = 1 então escreva “Inserção de novos dados na agenda” escreva “Quantos contatos voce vai inserir?” leia n para i ( 1 até i <= n passo 1 faça LeRegistro ( Amigo[i-1] ) fim para x ( 9 fim se {Módulo 3 – Atualização de dados} se x = 2 escreva “"Digite o nome completo e sem acentuacao do contato a ser buscado e entao entre novamente com seus dados:” leia nomeBuscado opção ( 999 para i( 1 até i <= n passo 1 faça se nomeBuscado = Amigo[i].nome então LeRegistro (Amigo[i]) opção ( 0 fim se se opção ( 999 então escreva “O contato não foi encontrado.” opcao ( 0 fim se escreva “Deseja realizar uma nova busca? Digite 2 para SIM e 9 para NÃO:” leia opção se opção = 9 então x(9 fim se se opção = 2 então x(2 fim se fim se {Módulo 4– Remoção de dados da agenda} se x = 3 então escreva “Busca:” escreva “Digite o nome completo e sem acentuacao do contato a ser buscado:” leia nomeBuscado para i ( 1 até i <=n se nomeBuscado = Amigo[i].nome escreva “Tem certeza que deseja remover o contato " nomeBuscado “ ? Digite 1 para SIM e 2 para NAO:" leia opção se opção = 1 RegDel (Amigo[i], Amigo[i+1], n) n = n – 1 fim se fim para escreva "Deseja remover mais algum contato? Digite 3 para SIM e 9 para NAO:" leia x fim se {Módulo 5– Imprimir a agenda} se x = 4 então para i ( 1 até i <=n passo 1 faça escreva “Nome:” Amigo[i].nome escreva “Telefone:” Amigo[i].telefone escreva “Logradouro:” Amigo[i].logradouro escreva “Numero:” Amigo[i].numero escreva “Apto:” Amigo[i].apto escreva “CEP:” Amigo[i].CEP escreva “Bairro:” Amigo[i].bairro escreva “Cidade:” Amigo[i].cidade escreva “Estado(sigla):” Amigo[i].estado escreva “Bairro:” Amigo[i].bairro escreva “Data de Aniversario(dd/mm/aa):” escreva “Dia:” Amigo[i].dia escreva “Mes:” Amigo[i].mes escreva “Ano:” Amigo[i].ano escreva “Email:” Amigo[i].email fim para escreva " Digite 9 para voltar ao menu:" leia x fim se {Módulo 6– Salvar a agenda} se x = 5 então escreva “Tem certeza que deseja salvar a agenda? Digite 1 para SIM e 2 para NÃO:” leia opção se opção = 1 então abrir agenda.txt escrita abrir memoria.txt escrita abrir maxcontatos.txt escrita para i ( 0 até i<= n passo 1 faça escreva “Nome:” agenda.Amigo[i].nome escreva “Telefone:” agenda.Amigo[i].telefone escreva “Logradouro:” agenda.Amigo[i].logradouro escreva “Numero:” agenda.Amigo[i].numero escreva “Apto:” agenda.Amigo[i].apto escreva “CEP:” agenda.Amigo[i].CEP escreva “Bairro:” agenda.Amigo[i].bairro escreva “Cidade:” agenda. Amigo[i].cidade escreva “Estado(sigla):” agenda.Amigo[i].estado escreva “Bairro:” agenda.Amigo[i].bairro escreva “Data de Aniversario(dd/mm/aa):” escreva “Dia:” agenda. Amigo[i].dia escreva “Mes:” agenda.Amigo[i].mes escreva “Ano:” agenda.Amigo[i].ano escreva “Email:” agenda.Amigo[i].email escreva memoria.Amigo[i].nome escreva memoria.Amigo[i].telefone escreva memoria.Amigo[i].logradouro escreva memoria.Amigo[i].numero escreva memoria.Amigo[i].apto escreva memoria.Amigo[i].CEP escreva memoria.Amigo[i].bairro escreva memoria. Amigo[i].cidade escreva memoria.Amigo[i].estado escreva memoria.Amigo[i].bairro escreva memoria. Amigo[i].dia escreva memoria.Amigo[i].mes escreva memoria.Amigo[i].ano escreva memoria.Amigo[i].email escreva nmaximocontatos.n fim para fechar agenda.txt fechar memoria.txt fechar maxcontatos.txt escreva "Sua agenda esta salva no arquivo agenda.txt , armazenado na mesma pasta que este programa. Voce pode fazer copias de seguranca caso deseje comecar uma nova agenda. “ fim se escreva ”Para continuar digite 9:” leia x fim se {Módulo 7– Carregar a agenda} se x = 6 escreva “Tem certeza que deseja carregar a agenda? Digite 1 para SIM e 2 para NAO” leia opcao se opcao = 1 abrir maxcontatos.txt leitura abrir memoria.txt leitura n ( maxcontatos para i ( 0 até i<=n passo 1 faça leia memoria.Amigo[i].nome leia memoria.Amigo[i].telefone leia memoria.Amigo[i].logradouro leia memoria.Amigo[i].numero leia memoria.Amigo[i].apto leia memoria.Amigo[i].CEP leia memoria.Amigo[i].bairro leia memoria.Amigo[i].cidade leia memoria.Amigo[i].estado leia memoria.Amigo[i].dia leia memoria.Amigo[i].mes leia memoria.Amigo[i].ano leia memoria.Amigo[i].email fim para fim se x(9 fim se {Módulo 8– Colocar a agenda em ordem alfabetica} se x = 7 para i ( 0 até i < n passo 1 faça se Amigo[i].nome > Amigo[i+1].nome então RegCopy(Amigo[i], Aux) RegCopy(Amigo[i+1], Amigo[i]) RegCopy(Aux, Amigo[i+1]) fim se fim para escreva “Sua agenda foi ordenada em alfabeticamente. Voce pode salva-la novamente caso deseje. Para continuar, digite 9.” leia x fim se {Módulo 9– finalizar o programa} se x =8 escreva “Deseja salvar sua agenda antes de sair? Digite 1 para SIM e 2 para NAO:” leia opção se opção = 1 então abrir agenda.txt escrita abrir memoria.txt escrita abrir maxcontatos.txt escrita para i ( 0 até i<= n passo 1 faça escreva “Nome:” agenda.Amigo[i].nome escreva “Telefone:” agenda.Amigo[i].telefone escreva “Logradouro:” agenda.Amigo[i].logradouro escreva “Numero:” agenda.Amigo[i].numero escreva “Apto:” agenda.Amigo[i].aptoescreva “CEP:” agenda.Amigo[i].CEP escreva “Bairro:” agenda.Amigo[i].bairro escreva “Cidade:” agenda. Amigo[i].cidade escreva “Estado(sigla):” agenda.Amigo[i].estado escreva “Bairro:” agenda.Amigo[i].bairro escreva “Data de Aniversario(dd/mm/aa):” escreva “Dia:” agenda. Amigo[i].dia escreva “Mes:” agenda.Amigo[i].mes escreva “Ano:” agenda.Amigo[i].ano escreva “Email:” agenda.Amigo[i].email escreva memoria.Amigo[i].nome escreva memoria.Amigo[i].telefone escreva memoria.Amigo[i].logradouro escreva memoria.Amigo[i].numero escreva memoria.Amigo[i].apto escreva memoria.Amigo[i].CEP escreva memoria.Amigo[i].bairro escreva memoria. Amigo[i].cidade escreva memoria.Amigo[i].estado escreva memoria.Amigo[i].bairro escreva memoria. Amigo[i].dia escreva memoria.Amigo[i].mes escreva memoria.Amigo[i].ano escreva memoria.Amigo[i].email escreva nmaximocontatos.n fim para fechar agenda.txt fechar memoria.txt fechar maxcontatos.txt fim se x(10 fim se fim algoritmo 1 . Programa em C++ #include <cstdlib> #include <iostream> #include <cstdio> #include <fstream> #include <cstring> using namespace std; struct RegFicha { char nome[45]; char telefone[15]; char logradouro[35]; char apto[6]; char numero[6]; char CEP[15]; char bairro[30]; char cidade[30]; char estado[4]; char dia[4]; char mes[4]; char ano[4]; char email[35]; }; void LeRegistro(RegFicha& Pessoa) { system( "CLS" ); system ( "COLOR F8" ); cout << "\t \t Insercao de novos dados na agenda \n \n " << "\n Nota: nao digite acentuacao \n \n" ; fflush(stdin); cout << "Nome Completo:"; gets(Pessoa.nome); if (strlen (Pessoa.nome) >= 45) {cout << "\n Erro. Por favor, digite um nome com menos de 45 caracteres: \n"; gets(Pessoa.nome);} fflush(stdin); cout << "Telefone: " ; fflush(stdin); gets(Pessoa.telefone); if (strlen (Pessoa.telefone) >= 15) {cout << "Erro. Por favor, digite um telefone com menos de 15 caracteres:"; gets(Pessoa.telefone);} cout << "Logradouro: " ; fflush(stdin); gets(Pessoa.logradouro); if (strlen (Pessoa.logradouro) >= 35) {cout << "Erro. Por favor, digite um endereco com menos de 35 caracteres:"; gets(Pessoa.logradouro);} cout << "Numero: " ; fflush(stdin); gets(Pessoa.numero); if (strlen (Pessoa.numero) >= 6) {cout << "Erro. Por favor, digite um numero com menos de 6 caracteres:"; gets(Pessoa.numero);} cout << "Apto: " ; fflush(stdin); gets(Pessoa.apto); if (strlen (Pessoa.apto) >= 6) {cout << "Erro. Por favor, digite um numero com menos de 6 caracteres:"; gets(Pessoa.apto);} cout << "CEP: " ; fflush(stdin); gets(Pessoa.CEP); if (strlen (Pessoa.CEP) >= 15) {cout << "Erro. Por favor, digite um CEP com menos de 15 caracteres:"; gets(Pessoa.CEP);} cout << "Bairro: " ; fflush(stdin); gets(Pessoa.bairro); if (strlen (Pessoa.bairro) >= 30) {cout << "Erro. Por favor, digite um bairro com menos de 30 caracteres:"; gets(Pessoa.bairro);} cout << "Cidade: " ; fflush(stdin); gets(Pessoa.cidade); if (strlen (Pessoa.cidade) >= 30) {cout << "Erro. Por favor, digite uma cidade com menos de 30 caracteres:"; gets(Pessoa.cidade);} cout << "Estado(sigla): " ; fflush(stdin); gets(Pessoa.estado); if (strlen (Pessoa.estado) >= 4) {cout << "Erro. Por favor, digite uma sigla para o estado com 2 caracteres:"; gets(Pessoa.estado);} cout << "Data de Aniversario(dd/mm/aa)\nDia: " ; fflush(stdin); gets(Pessoa.dia); if (strlen (Pessoa.dia) >= 4) {cout << "Erro. Por favor, digite um numero com 2 caracteres:"; gets(Pessoa.dia);} cout << "Mes: " ; fflush(stdin); gets(Pessoa.mes); if (strlen (Pessoa.mes) >= 4) {cout << "Erro. Por favor, digite um numero com 2 caracteres:"; gets(Pessoa.mes);} cout << "Ano: " ; fflush(stdin); gets(Pessoa.ano); if (strlen (Pessoa.ano) >= 4) {cout << "Erro. Por favor, digite um numero com 2 caracteres:"; gets(Pessoa.ano);} cout << "Email: " ; fflush(stdin); gets(Pessoa.email); if (strlen (Pessoa.email) >= 35) {cout << "Erro. Por favor, digite um email com menos de 35 caracteres:"; gets(Pessoa.email);} } void RegDel(RegFicha& Pessoa, RegFicha& ProxPessoa, int maxcontatos) { int j; for (j=0; j<maxcontatos ; j++) { strcpy (Pessoa.nome, ProxPessoa.nome); strcpy (Pessoa.telefone, ProxPessoa.telefone); strcpy (Pessoa.logradouro, ProxPessoa.logradouro); strcpy (Pessoa.apto, ProxPessoa.apto); strcpy (Pessoa.numero, ProxPessoa.numero); strcpy (Pessoa.CEP, ProxPessoa.CEP); strcpy (Pessoa.bairro, ProxPessoa.bairro); strcpy (Pessoa.cidade, ProxPessoa.cidade); strcpy (Pessoa.estado, ProxPessoa.estado); strcpy (Pessoa.dia, ProxPessoa.dia); strcpy (Pessoa.mes, ProxPessoa.mes); strcpy (Pessoa.ano, ProxPessoa.ano); strcpy (Pessoa.email, ProxPessoa.email); } } void RegCopy(RegFicha& Pessoa, RegFicha& ProxPessoa) { strcpy (ProxPessoa.nome, Pessoa.nome); strcpy (ProxPessoa.telefone, Pessoa.telefone); strcpy (ProxPessoa.logradouro, Pessoa.logradouro); strcpy (ProxPessoa.apto, Pessoa.apto); strcpy (ProxPessoa.numero, Pessoa.numero); strcpy (ProxPessoa.CEP, Pessoa.CEP); strcpy (ProxPessoa.bairro, Pessoa.bairro); strcpy (ProxPessoa.cidade, Pessoa.cidade); strcpy (ProxPessoa.estado, Pessoa.estado); strcpy (ProxPessoa.dia, Pessoa.dia); strcpy (ProxPessoa.mes, Pessoa.mes); strcpy (ProxPessoa.ano, Pessoa.ano); strcpy (ProxPessoa.email, Pessoa.email); } int main() { int x, i, n, opcao, maximocaracteres=0; RegFicha Amigo[100]; RegFicha Aux; char Temp[20]; char nomeBuscado[30]; x=9; while (x != 10) { if (x == 9){//Menu system ( "COLOR FC" ); system ("CLS"); cout << "\t \t Menu \n \n 1.Insercao de novos dados na agenda \n 2.Atualizacao de dados \n 3.Remocao de dados da agenda \n 4.Imprimir a agenda \n 5.Salvar a agenda \n 6.Carregar a agenda \n 7.Ordenar a agenda por ordem alfabetica de nomes \n 8.Finalizar programa \n \n Digite o valor correspondente ao que voce quer fazer e tecle enter:" ; gets (Temp); x = atoi (Temp) ; } if (x == 1){//Insercao de novos dados na agenda system ("CLS"); system ( "COLOR F8" ); cout << "\t \t Insercao de novos dados na agenda \n \n" ; cout << "Quantos contatos voce vai inserir?\n" ; gets (Temp); n = atoi (Temp); for (i = 1; i <= n ; i++ ) {LeRegistro(Amigo[i-1]);} x = 9; } if (x == 2){//Atualizacao de dados system ( "COLOR F5" ); system ("CLS"); cout << "\t \t Atualizacao de dados \n \n" ; cout << "Busca: \n \n \n" ; cout << "Digite o nome completo e sem acentuacao do contato a ser buscado e entao entre novamente com seus dados:\n" ; gets (nomeBuscado); opcao = 999; for (i = 0; i < n ; i++ ) { if (strcmp(nomeBuscado, Amigo[i].nome) == 0) { LeRegistro(Amigo[i]); opcao = 0; } } if (opcao == 999) {cout << "O contato nao foi encontrado. \n"; opcao = 0;} cout << "\nDeseja realizar uma nova busca? Digite 2 para SIM e 9 para NAO:\n"; gets (Temp); opcao = atoi (Temp) ; if (opcao == 9) {x = 9;} if (opcao == 2) {x = 2; } } if (x == 3){//Remocaode dados da agenda system ("CLS"); system ( "COLOR F1" ); cout << "\t \t Remocao de dados da agenda \n \n" ; cout << "Busca: \n \n \n" ; cout << "Digite o nome completo e sem acentuacao do contato a ser buscado:\n" ; gets (nomeBuscado); for (i = 0; i < n ; i++ ) { if (strcmp(nomeBuscado, Amigo[i].nome) == 0) { cout << "\n \n \n Tem certeza que deseja remover o contato " << nomeBuscado << " ? Digite 1 para SIM e 2 para NAO:"; gets (Temp); opcao = atoi (Temp) ; if (opcao == 1) {RegDel(Amigo[i], Amigo[i+1], n); n = n - 1; } } } cout << "Deseja remover mais algum contato? Digite 3 para SIM e 9 para NAO:"; gets (Temp); x = atoi (Temp) ; } if (x == 4){//Imprimir Agenda system ("CLS"); system ( "COLOR 0D" ); cout << "\t \t Agenda \n \n" ; for (i = 0; i < n ; i++ ) { cout << i + 1 << " ) " << Amigo[i].nome << "\n"; cout << "Telefone: " << Amigo[i].telefone << "\n"; cout << "Logradouro: " << Amigo[i].logradouro << "\n"; cout << "Numero: " << Amigo[i].numero; cout << " Apto: " << Amigo[i].apto << "\n"; cout << "CEP: " << Amigo[i].CEP << "\n"; cout << "Bairro: " << Amigo[i].bairro << "\n"; cout << "Cidade: " << Amigo[i].cidade ; cout << " / " << Amigo[i].estado << "\n"; cout << "Data de nascimento(dd/mm/aa): " << Amigo[i].dia ; cout << " / " << Amigo[i].mes ; cout << " / " << Amigo[i].ano << "\n"; cout << "Email: " << Amigo[i].email ; cout << "\n \n \n"; } cout << "Digite 9 para voltar ao menu:"; gets (Temp); x = atoi (Temp) ; } if (x == 5 ){//Salvar Agenda system ("CLS"); system ( "COLOR 2E" ); cout << "Tem certeza que deseja salvar a agenda? Digite 1 para SIM e 2 para NAO:" ; gets (Temp); opcao = atoi(Temp); if(opcao == 1) {ofstream salvar("agenda.txt"); ofstream agendamemoria("memoria.txt"); ofstream nmaximodecontatos("maxcontatos.txt"); for (i=0; i<n ; i++) { salvar << i + 1 << " ) " << Amigo[i].nome << "\n"; salvar << "Telefone: " << Amigo[i].telefone << "\n"; salvar << "Logradouro: " << Amigo[i].logradouro << "\n"; salvar << "Numero: " << Amigo[i].numero; salvar << "Apto: " << Amigo[i].apto << "\n"; salvar << "CEP: " << Amigo[i].CEP << "\n"; salvar << "Bairro: " << Amigo[i].bairro << "\n"; salvar << "Cidade: " << Amigo[i].cidade ; salvar << " / " << Amigo[i].estado << "\n"; salvar << "Data de nascimento(dd/mm/aa): " << Amigo[i].dia ; salvar << " / " << Amigo[i].mes ; salvar << " / " << Amigo[i].ano << "\n"; salvar << "Email: " << Amigo[i].email ; salvar << "\n \n \n"; agendamemoria << Amigo[i].nome << "\n"; agendamemoria << Amigo[i].telefone << "\n"; agendamemoria << Amigo[i].logradouro << "\n"; agendamemoria << Amigo[i].numero << "\n"; agendamemoria << Amigo[i].apto << "\n"; agendamemoria << Amigo[i].CEP << "\n"; agendamemoria << Amigo[i].bairro << "\n"; agendamemoria << Amigo[i].cidade << "\n"; agendamemoria << Amigo[i].estado << "\n"; agendamemoria << Amigo[i].dia << "\n"; agendamemoria << Amigo[i].mes << "\n"; agendamemoria << Amigo[i].ano << "\n"; agendamemoria << Amigo[i].email << "\n"; nmaximodecontatos << n; } cout << "Sua agenda esta salva no arquivo agenda.txt , armazenado na mesma pasta que este programa. Voce pode fazer copias de seguranca caso deseje comecar uma nova agenda. "; } cout << "Para continuar, digite 9 : \n" ; gets(Temp); x = atoi(Temp); } if (x == 6 ){//Carregar Agenda system ("CLS"); system ( "COLOR 8B" ); cout << "Tem certeza que deseja carregar a agenda? Digite 1 para SIM e 2 para NAO:" ; gets (Temp); opcao = atoi(Temp); if(opcao == 1) { ifstream lemaximo("maxcontatos.txt"); lemaximo.get(Temp, 2); n = atoi(Temp); ifstream lememoria("memoria.txt"); for (i=0; i<n ; i++) { fflush(stdin); lememoria.get(Amigo[i].nome, 45); lememoria.ignore (45, '\n'); fflush(stdin); lememoria.get(Amigo[i].telefone, 15); lememoria.ignore (15, '\n'); fflush(stdin); lememoria.get(Amigo[i].logradouro, 35); lememoria.ignore (35, '\n'); fflush(stdin); lememoria.get(Amigo[i].numero,6); lememoria.ignore (6, '\n'); fflush(stdin); lememoria.get(Amigo[i].apto, 6); lememoria.ignore (6, '\n'); fflush(stdin); lememoria.get(Amigo[i].CEP, 15); lememoria.ignore (15, '\n'); fflush(stdin); lememoria.get(Amigo[i].bairro, 30); lememoria.ignore (30, '\n'); fflush(stdin); lememoria.get(Amigo[i].cidade, 30) ; lememoria.ignore (30, '\n'); fflush(stdin); lememoria.get(Amigo[i].estado,3); lememoria.ignore (3, '\n'); fflush(stdin); lememoria.get(Amigo[i].dia,3); lememoria.ignore (3, '\n'); fflush(stdin); lememoria.get(Amigo[i].mes,3); lememoria.ignore (3, '\n'); fflush(stdin); lememoria.get(Amigo[i].ano,3); lememoria.ignore (3, '\n'); fflush(stdin); lememoria.get(Amigo[i].email, 35); lememoria.ignore (35, '\n'); fflush(stdin); } } x = 9; } if (x == 7 ){//Ordem alfabetica system ("COLOR F4"); system ("CLS"); for (i = 0 ; i < n -1 ; i++) { if( strcmp(Amigo[i].nome, Amigo[i+1].nome ) > 0 ) { RegCopy(Amigo[i], Aux); RegCopy(Amigo[i+1], Amigo[i]); RegCopy(Aux, Amigo[i+1]); } } cout << "Sua agenda foi ordenada em alfabeticamente. Voce pode salva-la novamente caso deseje. Para continuar, digite 9. \n" ; gets (Temp); x=atoi(Temp); } if (x == 8 ){//Finalizar o programa system ("CLS"); cout << "Deseja salvar sua agenda antes de sair? Digite 1 para SIM e 2 para NAO:\n" ; gets(Temp); opcao = atoi(Temp); if (opcao == 1) { ofstream salvar("agenda.txt"); ofstream agendamemoria("memoria.txt"); ofstream nmaximodecontatos("maxcontatos.txt"); for (i=0; i<n ; i++) { salvar << i + 1 << " ) " << Amigo[i].nome << "\n"; salvar << "Telefone: " << Amigo[i].telefone << "\n"; salvar << "Logradouro: " << Amigo[i].logradouro << "\n"; salvar << "Numero: " << Amigo[i].numero; salvar << "Apto: " << Amigo[i].apto << "\n"; salvar << "CEP: " << Amigo[i].CEP << "\n"; salvar << "Bairro: " << Amigo[i].bairro << "\n"; salvar << "Cidade: " <<Amigo[i].cidade ; salvar << " / " << Amigo[i].estado << "\n"; salvar << "Data de nascimento(dd/mm/aa): " << Amigo[i].dia; salvar << " / " << Amigo[i].mes ; salvar << " / " << Amigo[i].ano << "\n"; salvar << "Email: " << Amigo[i].email ; salvar << "\n \n \n"; agendamemoria << Amigo[i].nome << "\n"; agendamemoria << Amigo[i].telefone << "\n"; agendamemoria << Amigo[i].logradouro << "\n"; agendamemoria << Amigo[i].numero << "\n"; agendamemoria << Amigo[i].apto << "\n"; agendamemoria << Amigo[i].CEP << "\n"; agendamemoria << Amigo[i].bairro << "\n"; agendamemoria << Amigo[i].cidade << "\n"; agendamemoria << Amigo[i].estado << "\n"; agendamemoria << Amigo[i].dia << "\n"; agendamemoria << Amigo[i].mes << "\n"; agendamemoria << Amigo[i].ano << "\n"; agendamemoria << Amigo[i].email << "\n"; nmaximodecontatos << n; } } x = 10; } } system( "PAUSE" ); return EXIT_SUCCESS; }