MC 102 – Algoritmos e Programação de Computadores TURMAS I e J Prof. Jefersson Alex dos Santos Lista de Exercícios III (Data de entrega: 24/06/2009) Atenção: A lista deverá ser entregue em formato digital (por email) em código C. O nome do arquivo de cada exercício deve ser o número do exercício (exemplos: 00.c, 01.c, 03.c, etc); Todos os alunos devem entregar 6 exercícios (o exercício 00 , e mais 5 que serão indicados por ele). Coloque os arquivos em um arquivo compactado com o seu RA (<seu ra>.zip). Exemplo: 067925.zip Envie o email com o assunto [MC102] Lista 4 Verifique se tudo foi enviado corretamente: trabalhos fora do prazo não serão aceitos! 00 – Crie um programa que mostre quais exercícios um aluno deverá fazer nessa lista. O programa deverá ler um RA (inteiro) e retornar o número de 5 exercícios a serem feitos. O programa deverá implementar uma função recursiva de modo a preencher um vetor V de números inteiros com 5 posições tal que V[i]=(V[i-1]+ra[i])%4, em que ra[i] é o i-ésimo dígito do RA (i=0 é o dígito das unidades) e V[0]=ra[0]. Por exemplo, se RA= 078572, V={2, 1, 2, 2, 1} Então, para saber o n-ésimo exercício a ser feito utilize o seguinte cálculo: 4*n-3+V[n]. Para os números do exemplo, os exercícios a serem feitos seriam: 03, 06, 11, 15, 18. 01 – Faça um programa que contêm uma função recursiva que calcula o valor de m a partir de um vetor de números reais V com tamanho N e um valor λ . Assuma 0 < λ < 1 . N −1 m = ∑ λ( N −i )Vt t =0 02 – Faça um programa que contêm uma função recursiva que calcula a média aritmética dos elementos de um vetor de números reais V com tamanho N. 03 - Faça um programa que contêm uma função recursiva que determina o maior e o menor elemento de um vetor de inteiros V de tamanho N. 04 - Faça um programa que contêm uma função recursiva que imprime uma string com as letras em ordem invertida. Entrada: Bom dia Saída: aid moB 05– Dados três vetores ordenados, implemente uma função que intercala e retorne o vetor resultante ordenado. Implemente uma função merge3_sort, que faça ordenação em um vetor utilizando a sua função de intercalação (sugestão: se baseie no algoritmo do merge-sort original). 06– Considere a seguinte estrutura: typedef struct _pessoa_ { unsigned int RA; float Nota; } Aluno; Faça uma função que, dado um valor inteiro N positivo, aloque dinâmicamente um vetor de Aluno, leia do teclado os N pares de valores (RA, Nota) e retorne o vetor alocado. Imprima, ao final do programa, a lista dos alunos ordenada por nota final (use algum algoritmo recursivo de ordenação dado em aula). 07- Faça um programa que leia n nomes e ordene-os pelo tamanho utilizando o algoritmo mergesort. No final, o algoritmo deve mostrar todos os nomes ordenados. 08– Crie um programa que dado uma string, coloque as letras dela em ordem crescente pelo algoritmo quick-sort. Instruções para os exercícios 09 a 12: Os exercícios 09 a 12 requerem que sejam implementados cadastros de variados tipos e que os programas sejam capazes de armazenar ou recuperar os dados cadastrados com o uso de arquivos. A implementação deverá ser feita por meio de 2 programas diferentes. O primeiro deverá conter as seguintes funções: le_dados_do_teclado(): recebe do teclado os dados requeridos pelo cadastro e os armazena em um arquivo em formato de texto. O número de elementos cadastrados não deve ser armazenado no arquivo. escreve_dados_na_tela() : lê o conjunto de dados armazenados em um arquivo de texto e lista as informações do cadastro na tela do computador. Dica: Utilize as funções fscanf, fprintf e feof. O segundo programa deverá conter as seguintes funções: le_dados_do_teclado_bin() :recebe do teclado os dados requeridos pelo cadastro e os armazena em um arquivo em formato binário (utilize registros). O número de elementos cadastrados não deve ser armazenado no arquivo. escreve_dados_na_tela_bin() : lê o conjunto de dados armazenados em um arquivo binário e lista as informações do cadastro na tela do computador. escreve_dados_n_esimo_bin(int n) : mostra na tela do computador os dados do nésimo elemento do cadastro armazenado no arquivo binário. Caso a posição não exista o programa deverá escrever uma mensagem de erro na tela. Dica: Utilize as funções fread, fwrite, feof e fseek. 09 – Com o uso das funções descritas previamente, faça um programa que faz o cadastro dos produtos de um supermercado por código, preço e nome. Utilize se necessário: struct produto{ int codigo; float preco; char nome[100]; }; 10 – Com o uso das funções descritas previamente, faça um programa que faz o cadastro dos alunos de uma classe por RA, nome e nota da primeira prova. Utilize se necessário: struct aluno{ int RA; char nome[100]; float p1; }; 11 – Com o uso das funções descritas previamente, faça um programa que faz o cadastro dos atletas de uma equipe por nome, peso e altura. Utilize se necessário: struct atleta{ char nome[100]; float peso; float altura; }; 12 – Com o uso das funções descritas previamente, faça um programa que faz o cadastro dos times de futebol por nome, ano de fundação e número de torcedores. Utilize se necessário: struct time{ char nome[100]; int fundacao int torcida; }; 13– Considere uma estrutura chamada Ponto (composta por valores x e y) e uma estrutura chamada LINHA (composta por uma lista ligada de pontos). Faça um programa que leia do teclado uma sequência de pontos enquanto o usuário não digitar os valores -99 e -99 para x e y, e calcule o comprimento dessa linha. Obs: para isso você deverá criar uma função que calcula a distância entre dois pontos. 14 - Considere uma estrutura chamada STRING composta por uma lista ligada de caracteres (char). Crie: Uma função que leia uma STRING digitada pelo usuário (dica: utilize a função getchar() para ler caractere por caractere até o usuário digitar ENTER). Uma função que imprime uma STRING na tela. 15 – Considere uma estrutura chamada Ponto (composta por valores x e y) e uma estrutura chamada POLIGONO (composta por uma lista ligada de pontos). Faça uma função que leia um poligono do teclado e outra que dado um polígono, classifique-o de acordo com o número de pontos que ele contém: triângulo, quadrilátero, pentágono, hexágono, heptágono, octógono, eneágono, decágono ou outro para mais de 10 lados. 16 – Implemente um programa que, dado um texto, armazene as palavras desse texto em uma lista ligada (ou seja, uma FRASE é uma lista ligada de palavras). Crie: Uma função que converta uma cadeia de caracteres em uma lista de palavras; Uma função que, dada uma FRASE, retorne o número de palavras que ela contem. Uma função que, dada uma FRASE, imprima todo o seu conteúdo na tela. OBS: Considere apenas letras e números como entrada. 17 – Pilhas são listas de elementos onde o elemento removido é sempre aquele que foi inserido mais recentemente. Escreva duas funcões que manipulam (utilizando listas ligadas): ae pilhas void insere_pilha(int n): insere o elemento n no topo da pilha; int remove_pilha(): remove um elemento do topo da pilha e retorna -1 se a lista estiver vazia. Texto para os exercícios 18, 19 e 20: Lista ligada de vetores. Embora pareca eficiente, alocar um elemento de memória para cada inteiro pode tornar um programa extremamente lento, devido a forma como o acesso a memória é feito internamente no computador. Uma solução é criar listas ligadas de vetores. Quando precisamos inserir um elemento, verificamos se o vetor do topo da lista ligada ainda possui espaco. Se possuir, inserimos o elemento nesse espaco, caso contrário, alocamos um novo na memória e inserimos o novo elemento no início do vetor alocado. A remocão utiliza um procedimento análogo. Para remover um elemento, removemos o elemento do vetor. Se ele ficar vazio, desalo camos o vetor e rearranjamos os ponteiros de forma a criar novamente a lista ligada. Marcamos as posicões não utilizadas com -1, para diferenciar de posic˜es que contenham valores reais. 18 – Escreva duas funcões de manipulacão de listas ligadas: insere_elemento, que insere o elemento n na primeira posicão vaga da lista ligada de vetores, e remove_elemento, que remove o primeiro elemento da lista ligada cujo valor seja igual a n, retornando 1, ou 0 caso esse elemento não exista na lista ligada. Crie também uma função tamanho que retorna quantos elementos uma lista possui. 19 – Escreva a funcão compacta_lista, que pega uma lista ligada de vetores e remove todos os espacos não utilizados, substituindo por elementos válidos, e reduzindo o espaço total que a lista ocupa. 20 – Escreva a funcão ordena_lista, que pega uma lista ligada de vetores previamente compactada e ordena os seus elementos. Utilize o algoritmo de ordenacão que achar mais conveniente (sugestão: merge_sort).