====== 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''