Exercícios de Técnicas de Programação LISTAS LIGADAS 1. Pretende-se desenvolver uma aplicação capaz de armazenar a informação relativa a todos os sócios de um Clube de Futebol, utilizando para o efeito uma lista ligada simples. a) Comece por definir o tipo de nodo a usar na lista, uma estrutura que permita representar a informação referente a um único sócio, concretamente o nome, número e valor da quota a pagar. Considere que os nodos da lista devem estar ordenados pelo nome do sócio. b) Escreva uma função que lhe permita acrescentar um novo sócio. c) Escreva uma função que lhe permita listar a informação referente a todos os sócios. d) Escreva uma função que lhe permita remover um sócio, a partir do seu nome. e) Escreva uma função que lhe permita armazenar a lista num ficheiro designado por “socios.bin”. 2. O Dr. Sampaio, médico de clínica geral, foi destacado para se deslocar às Terças e Sextas Feiras à freguesia de Outeiro para aí atender a alguns pacientes. Até aqui o historial de cada paciente tem sido mantido, pelos vários médicos que se deslocam a Outeiro, em fichas de papel. No entanto esta solução tem levantado alguns problemas: é que o acesso à informação é lento, as fichas de papel tendem a deteriorar-se e alguns dos médicos têm uma letra ilegível. Por estes e outros motivos o Dr. Sampaio pediu à junta de freguesia para ver se seria possível instalar um computador com um programa de gestão de pacientes, de preferência nada de muito complicado, bastando que permita guardar o nome, a data de nascimento e o historial médico de cada paciente. Cabe-lhe a si implementar tal programa (não se esqueça, são necessárias as rotinas para inserir, remover, alterar, consultar, salvaguardar/aceder, listar, ...). LISTAS DUPLAMENTE LIGADAS 3. Pretende-se implementar um programa para gerir a informação referente aos funcionários de uma Câmara Municipal, utilizando para tal uma lista duplamente ligada. A informação a reter para cada funcionário consiste no número do bilhete de identidade, nome e vencimento. Suponha que os funcionários se encontram ordenados pelo número do bilhete de identidade. 1 a) Comece por definir o tipo de nodo a usar na lista, contendo toda a informação necessária. b) Desenvolva uma função que lhe permita inserir um novo funcionário na lista. c) Desenvolva uma função que lhe permita pesquisar um funcionário pelo seu número de bilhete de identidade. d) Desenvolva uma função que lhe permita listar todos os funcionários existentes na lista. e) Desenvolva uma função que lhe permita gravar e ler para/do ficheiro. LISTAS CIRCULARES SIMPLES 4. A Comissão Nacional de Eleições pretende adquirir uma aplicação para gerir a informação de todos os eleitores existentes em Portugal. A informação a reter para cada eleitor consiste no número, nome, data de nascimento e residência. Pretende-se utilizar uma lista circular simples ordenada pelo número de eleitor. a) Comece por definir o tipo de nodo a usar na lista, contendo toda a informação necessária. b) Escreva uma função que lhe permita inserir um novo eleitor na lista. c) Escreva uma função que lhe permita remover um eleitor da lista. d) Escreva uma função que lhe permita listar todos os eleitores com idade superior ou igual a 50 anos. e) Escreva uma função que lhe permita armazenar a lista num ficheiro designado por “eleitores.bin”. STACK’s 5. Pretende-se que desenvolva um programa que transforme uma expressão matemática em notação infixa para notação sufixa (notação Polaca). Para efectuar esta transformação deverá ter em atenção as seguintes regras: − um operador é sempre empilhado; − um operador no topo é desempilhado quando chega outro operador de menor ou igual prioridade; − um parêntesis de abertura é sempre empilhado; − um parêntesis de fecho faz desempilhar até ao parêntesis de abertura. Exemplos: 2*(3+4) → 234+* (1+5)*(8-(4-1)) → 15+841--* 2+4*5 → 245*+ 2 QUEUE’s 6. A oficina de automóveis “A Ribeira” utilizando as novas tecnologias pretende dar uma resposta cabal ao aumento crescente dos seus clientes. Assim, os clientes ao chegarem à oficina, dirigem-se à recepção, onde preenchem uma ficha, que para além de conter a informação pessoal, serve para determinar a ordem de atendimento. Pretende-se que implemente um programa com base numa queue estática que realize as seguintes operações: a) Escreva uma função que lhe permita inserir um novo cliente na fila. b) Escreva uma função que lhe permita atender um cliente. c) Escreva uma função que lhe permita gravar num ficheiro todos os clientes existentes em fila de espera. d) Escreva uma função que lhe permita ler do ficheiro criado na alínea anterior todos os clientes. 7. A secção de consultas sem marcação do Centro de Saúde de Bragança deparava-se com algumas dificuldades no atendimento dos pacientes, os quais tinham a tendência natural para "dar o golpe", acumulando-se às portas dos consultórios, dificultando o trabalho dos médicos, enfermeiros e paramédicos. O director do centro de saúde decidiu pôr ordem à situação, mandando implementar um sistema que garantisse o atendimento ordenado dos pacientes. A solução encontrada consistiu em instalar um leitor de código de barras no qual os pacientes, logo que chegam ao centro de saúde, passam o cartão de utente ficando imediatamente inseridos numa fila de espera informatizada, que trata de chamar cada um na sua vez. Cabe-lhe a si implementar a parte informática de tal sistema sabendo que através da leitura do cartão é possível saber o nome, data de nascimento, número de beneficiário e historial médico do paciente (não se esqueça, são necessárias as rotinas para inserir, remover, salvaguardar/aceder, ...). TABELAS DE HASH 8. A Câmara Municipal de Bragança pretende manter um registo de todos os moradores guardando para cada um deles informação sobre a freguesia onde reside, morada e telefone. Cada morador é identificado pelo número do BI e é também guardado o seu nome e número de contribuinte. Implemente em C um programa que permita gerir esta informação (adicionar novo morador, remover morador, alterar e consultar informações). Após cada utilização devem ser gravadas as alterações para posterior entrada no sistema. NOTA: Use tabelas de hash com “listas de colisões”. 3 9. Crie mais duas funções no âmbito do problema do exercício anterior: uma função em C que determine o número de colisões para cada uma das posições na tabela; e uma outra que permita pesquisar determinada informação na tabela, tendo como parâmetro um campo da estrutura que não é chave. 10. Considere que se pretende alterar o programa anterior de forma a que: • cada chave representa o n.º BI do chefe de família e portanto deve-lhe estar associada não apenas a informação do chefe mas de todo o agregado familiar • considera-se um agregado familiar um conjunto de pessoas que partilham a mesma freguesia, morada e telefone. Altere o exercício anterior usando uma tabela de hash (com “listas de colisões”) onde cada nodo tem pendurada uma lista do agregado familiar 11. Crie um programa de gestão para o problema dos exercícios anteriores usando uma tabela de hash com “linear probing”. 12. Hospital Distrital de Bragança mantém um registo de todos os pacientes que já atendeu. Assim quando alguém dá entrada pela primeira vez é criada uma ficha com o número do bilhete de identidade e nome do paciente, guarda-se também o número de contribuinte para emitir os recibos das taxas moderadoras. Sempre que o paciente dá novamente entrada no hospital é identificado pelo número do bilhete de identidade. NOTA: O historial médico é obtido através do sistema central do ministério da saúde. Pede-se que implemente um programa capaz de informatizar a gestão dos pacientes do Hospital Distrital de Bragança (não se esqueça, são necessárias as rotinas para inserir, remover, alterar, consultar, salvaguardar/aceder, ...). ÁRVORES 13. Defina, em C, as estruturas necessárias para representar uma árvore binária de pesquisa, em que a chave é constituída por um número inteiro e a restante informação consiste nesse número escrito por extenso. Para essas estruturas, construa: a) uma função que, dado um apontador para a raiz de uma árvore binária de pesquisa, juntamente com a chave e a informação de um nodo a inserir, permita inserir esse nodo na árvore, retornando um apontador para a árvore resultado obtida; b) uma função que permita fazer a travessia de uma árvore binária de pesquisa em in-ordem, imprimindo desta forma os nodos por ordem crescente da chave; c) uma função de inserção de nodos numa árvore binária de pesquisa que receba um duplo apontador para a raiz da árvore, juntamente com a chave e a 4 informação de um nodo a inserir, e retorne um valor booleano que indique insucesso sempre que o nodo a inserir já exista na árvore. 14. Escreva uma função que conte o número de nodos de uma árvore binária. 15. Escreva uma função que conte o número de folhas de uma árvore binária. 16. Pretende-se converter um texto numa árvore binária de pesquisa contendo todas as palavras, mas sem repetições na árvore. Cada nodo deverá conter, além da palavra, o total de ocorrências da palavra no texto. Construa as funções necessárias a tal tarefa de forma modular, isto é, funções para inserir nodos na árvore, para tratar o texto e para visualizar a árvore no final. 17. Escreva uma função que permita “espelhar” uma árvore binária, isto é, para cada nodo troca os seus filhos esquerdo e direito. 18. Escreva uma função que permita construir uma árvore de execução a partir de uma expressão matemática parentisada, para depois a imprimir em “notação polaca” (sufixa ou pós-ordem). Por exemplo: Expressão matemática parentisada: ((((a + b) * c)-(d / f)) + g) Árvore de execução: + - g * + a / c d f b Notação polaca: a b + c * d f / - g + 20. Pretende-se gerir, usando estruturas dinâmicas, o sistema de acessos dos utilizadores a uma máquina Unix. Para isso, projectou-se usar uma árvore binária de pesquisa que guarde a informação relevante do utilizador (nome, login e password). Para cada utilizador, pretendem-se guardar ainda as datas e horas de acesso ao sistema. Implemente as seguintes funcionalidades: a) inserir utilizadores b) fazer o login de um utilizador, verificando a sua password c) eliminar um utilizador do sistema 5 21. A clínica privada SóComSaúde funciona no centro de Bragança e apenas admite sócios. Estes para darem entrada na clínica apresentam o cartão de sócio e só são atendidos após a recepcionista confirmar se as cotas estão pagas. Este sistema guarda o nome, a data de nascimento, o historial médico e a data até à qual as cotas estão pagas. Pede-se que implemente um programa que permita informatizar o sistema de gestão de pacientes da clínica SóComSaude (não se esqueça, são necessárias as rotinas para inserir, remover, alterar, consultar, salvaguardar/aceder, listar, ...). GRAFOS 22. Defina, em C, as estruturas necessárias para representar o grafo da seguinte figura, usando listas de adjacências, sabendo que a informação a reter para cada vértice é o nome da cidade e o número de habitantes, e para cada ligação é a designação da estrada e a distância. 23. Construa funções que permitam, para o grafo definido no exercício anterior: a) visualizar de alguma forma o grafo b) adicionar vértices c) remover vértices d) adicionar ligações e) remover ligações 24. Construa uma função que permita determinar os sucessores de um dado vértice. 25. Construa uma função que permita determinar os antecessores de um dado vértice. 26. Construa uma função que permita verificar se há caminho entre dois vértices dados. 6 27. Construa uma função que permita determinar um caminho entre dois vértices dados. 28. Construa uma função que permita determinar todos os vértices alcançáveis a partir de um dado vértice. 29. Construa uma função que permita determinar todos os vértices que alcançam um dado vértice. 30. Construa uma função que permita determinar o fecho transitivo do grafo. 31. Construa uma função que permita determinar o menor caminho (com menor número de vértices) entre dois vértices dados. 32. Construa uma função que permita determinar o caminho de menor custo entre dois vértices dados. ALGORITMOS DE ORDENAÇÃO 33. Crie e inicialize um array de inteiros não ordenado e aplique o processo de ordenação “Bubble Sort” para posicionar os números por ordem descendente. 34. Crie e inicialize um array de inteiros não ordenado e aplique dois ou três processos de ordenação (Insert Sort, Selection Sort, Bubble Sort, Merge Sort ou Quick Sort) e compare-os em termos de número de trocas e número de comparações. 35. Considere que a pauta de classificações da disciplina de Técnicas de Programação (Nº Mecanográfico, Nome, Classificação) não aparecerá, este ano, por ordem alfabética dos nomes dos alunos mas sim por ordem descendente de classificações. Dentro da mesma classificação deverão aparecer então os nomes por ordem alfabética. Sugestão: Preencha uma estrutura (array ou lista ligada) com alguns nomes e classificações para testar o algoritmo. 7