====== Números racionais - ponteiros ====== {{ homer-computer.png?250|}}:!: Este projeto foi originalmente proposto pelo prof. [[https://www.inf.ufpr.br/marcos/|Marcos Castilho]] para a disciplina de Programação 1 (CI1001). Este trabalho visa modificar o módulo de [[números racionais]] desenvolvido anteriormente para usar [[ponteiros]] e funções com passagem de parâmetros por referência. ===== Atividade ===== Você deve implementar um programa que manipule números racionais, que são números da forma a/b, onde //a// e //b// são números inteiros. Nesta versão, as funções que manipulam racionais usam passagem de parâmetros por referência. Você deve baixar {{tp2.tgz|este arquivo}} e abri-lo para poder fazer o trabalho, pois irá precisar de todos os arquivos ali contidos: * ''racional.h'': arquivo de cabeçalho com os protótipos das funções (**não deve ser alterado**). * ''racional.c'': arquivo que implementa as operações sobre números racionais ("esqueleto" a completar). * ''tp2.c'': código que usa a biblioteca de racionais ("esqueleto" a completar). * ''makefile'': arquivo do utilitário "make" para compilar seu código. * ''entrada*.txt'': dados de entrada para testes. No arquivo ''racional.h'' foi definida uma estrutura (//struct//) para o tipo abstrato de dados //racional// e os protótipos das funções que permitem manipular essa estrutura. Você deve implementar essas funções no arquivo ''racional.c''. ==== Programa principal ==== O programa principal (''tp2.c'') contém a função ''main''. Ele deve incluir o //header// ''racional.h'' e implementar corretamente o seguinte pseudocódigo: defina um vetor para até 100 números racionais leia um valor n tal que 0 < n < 100 preencha o vetor com n números racionais lidos da entrada (leia o numerador e o denominador de cada racional) imprima "VETOR = " e o conteúdo do vetor lido elimine deste vetor os elementos inválidos imprima "VETOR = " e o conteúdo do vetor resultante ordene este vetor imprima "VETOR = " e o conteúdo do vetor resultante calcule a soma de todos os elementos do vetor imprima "SOMA = " e a soma calculada acima nova linha retorne 0 O acrônimo **NaN** significa [[https://pt.wikipedia.org/wiki/NaN|"Not a Number"]]. Ele é um padrão da IEEE usado em muitas linguagens de programação para imprimir números indefinidos ou inválidos. Ajuste sua função ''imprime_r'' para imprimir ''NaN'' em vez de ''INVALIDO''. ==== Exemplo de funcionamento ==== Considerando que o usuário digitou a seguinte entrada (que está no arquivo ''entrada1.txt''): 15 -1 3 5 0 2 7 1 9 9 0 8 -5 -7 0 0 8 6 11 7 -17 1 0 12 36 -5 1 4 9 5 0 A saída correspondente deve ser: VETOR = -1/3 NaN 2/7 1/9 NaN -8/5 NaN 0 6/11 -7/17 NaN 1/3 -5 4/9 NaN VETOR = -1/3 4/9 2/7 1/9 -5 -8/5 1/3 0 6/11 -7/17 VETOR = -5 -8/5 -7/17 -1/3 0 1/9 2/7 1/3 4/9 6/11 SOMA = -331343/58905 Para a entrada de dados contida no arquivo ''entrada2.txt'', a saída deve ser: VETOR = NaN NaN VETOR = VETOR = SOMA = 0 Para a entrada de dados contida no arquivo ''entrada3.txt'', a saída deve ser: VETOR = 19/3 16/3 2/9 11/16 -9 -7/19 15/16 1/13 -7/18 13/20 11/9 16/15 -17/15 2/7 7/4 5/6 -9/10 NaN 1/12 3/2 -17/12 8/3 5/3 14/13 -9 2/9 1/9 18/19 -13/10 -7 -11/17 17/20 -1/14 1/6 NaN -12/7 0 4/7 -2/7 -7/15 1/11 11/2 8/3 19/11 19/2 2/7 8/19 -1 -1 -3/11 VETOR = 19/3 16/3 2/9 11/16 -9 -7/19 15/16 1/13 -7/18 13/20 11/9 16/15 -17/15 2/7 7/4 5/6 -9/10 -3/11 1/12 3/2 -17/12 8/3 5/3 14/13 -9 2/9 1/9 18/19 -13/10 -7 -11/17 17/20 -1/14 1/6 -1 -12/7 0 4/7 -2/7 -7/15 1/11 11/2 8/3 19/11 19/2 2/7 8/19 -1 VETOR = -9 -9 -7 -12/7 -17/12 -13/10 -17/15 -1 -1 -9/10 -11/17 -7/15 -7/18 -7/19 -2/7 -3/11 -1/14 0 1/13 1/12 1/11 1/9 1/6 2/9 2/9 2/7 2/7 8/19 4/7 13/20 11/16 5/6 17/20 15/16 18/19 16/15 14/13 11/9 3/2 5/3 19/11 7/4 8/3 8/3 16/3 11/2 19/3 19/2 SOMA = 82626407/6126120 ===== Entregáveis ===== Entregue um único arquivo ''tp2.tgz'' que contenha por sua vez os seguintes arquivos: * ''racional.h'': o mesmo arquivo fornecido, não o modifique * ''racional.c'': sua implementação das funções definidas em ''racional.h'' * ''tp2.c'': contém a função ''main'' que usa os racionais * ''makefile''