Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
Ambos lados da revisão anterior Revisão anterior | |||
c:numeros_racionais [2024/09/19 13:57] – [Atividade] maziero | c:numeros_racionais [2024/09/19 13:58] (atual) – [Atividade] maziero | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== Números racionais ====== | ||
+ | |||
+ | {{ fraction-bart.png? | ||
+ | |||
+ | Este trabalho tem como objetivo a implementação de um **Tipo Abstrato de Dados** (TAD) para números racionais, além de praticar o desenvolvimento de programas na linguagem C. A partir deste trabalho passaremos a entender como escrever programas que usam mais de um arquivo fonte. | ||
+ | |||
+ | ===== Tipos Abstratos de Dados ===== | ||
+ | |||
+ | Conceitualmente, | ||
+ | |||
+ | A principal característica de um TAD é que a maneira como se armazena o dado na memória não é relevante para que se possa manipular os dados. Em outras palavras, basta conhecer a abstração e ter disponível um conjunto de funções que manipulam os dados abstratamente. No caso de números racionais, seriam funções para: | ||
+ | |||
+ | * construir um número racional < | ||
+ | * simplificar um racional | ||
+ | * fazer operações aritméticas com racionais (+ - × ÷) | ||
+ | * comparar dois racionais (= < >) | ||
+ | * imprimir um racional | ||
+ | * ... | ||
+ | |||
+ | Na linguagem C é possível implementar este conceito de maneira elegante pela construção de um módulo escrito em arquivos separados que definem concretamente como um racional é implementado e que também contém as funções que manipulam efetivamente estes dados. | ||
+ | |||
+ | Uma vez que o módulo está pronto, é possível construir programas que usem este módulo e nos quais o dado está abstraído. Isto é, quem constrói o programa principal (//main//) não precisa (nem deve) conhecer a implementação concreta. Em outras palavras, se o módulo define que um número racional é uma //struct// com este ou aquele campo, quem implementa o programa principal não deve acessar os campos da estrutura, mas apenas usar as funções que a manipulam. | ||
+ | |||
+ | Consulte a página sobre [[organização de código]] para uma explicação com exemplos. | ||
+ | |||
+ | ===== Atividade ===== | ||
+ | |||
+ | Você deve implementar um programa que manipule números racionais, que são números da forma < | ||
+ | |||
+ | Você deve baixar {{tp1.tgz|este arquivo}} e abri-lo para poder fazer o trabalho, pois irá precisar de todos os arquivos ali contidos: | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | No arquivo '' | ||
+ | |||
+ | Este {{tp1.pdf |enunciado}} foi produzido pelo prof. Castilho para este projeto em sua versão inicial. | ||
+ | |||
+ | ==== Números aleatórios ==== | ||
+ | |||
+ | Em C, a geração de números aleatórios é usualmente feita usando as funções '' | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | |||
+ | int main () | ||
+ | { | ||
+ | int x ; | ||
+ | |||
+ | srand (0) ; // inicia a semente do gerador de aleatórios com 0 | ||
+ | |||
+ | ... | ||
+ | x = rand () % 1000 ; // gera um aleatório entre 0 e 999 | ||
+ | ... | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | Neste projeto, a função '' | ||
+ | |||
+ | ==== Programa principal ==== | ||
+ | |||
+ | O programa principal ('' | ||
+ | |||
+ | < | ||
+ | inicialize a semente aleatória (uma única vez em todo o código) | ||
+ | - sugestão: use "srand (0)" para facilitar os testes | ||
+ | |||
+ | leia um valor n tal que 0 < n < 100 | ||
+ | leia um valor max tal que 0 < max < 30 | ||
+ | |||
+ | para todo i de 1 até n faça | ||
+ | /* use um único espaço em branco separando números na mesma linha */ | ||
+ | imprima o valor de i seguido de um ":" | ||
+ | |||
+ | sortear dois racionais r1 e r2 | ||
+ | - os numeradores e denominadores devem estar entre -max e +max | ||
+ | |||
+ | imprima r1 e r2, na mesma linha e não mude de linha | ||
+ | |||
+ | se r1 ou r2 for inválido, então | ||
+ | imprima " | ||
+ | retorne 1 | ||
+ | fim se | ||
+ | |||
+ | calcule r1 + r2 | ||
+ | calcule r1 - r2 | ||
+ | calcule r1 * r2 | ||
+ | calcule r1 / r2 | ||
+ | |||
+ | se a divisão for invalida, então: | ||
+ | imprima " | ||
+ | retorne 1 | ||
+ | fim se | ||
+ | | ||
+ | imprima na mesma linha r1 + r2 | ||
+ | imprima na mesma linha r1 - r2 | ||
+ | imprima na mesma linha r1 * r2 | ||
+ | imprima na mesma linha r1 / r2 | ||
+ | mude de linha | ||
+ | | ||
+ | fim para | ||
+ | |||
+ | retorne 0 | ||
+ | </ | ||
+ | |||
+ | <note warning> | ||
+ | Para usar corretamente o conceito de TAD, o programa principal **NÃO DEVE ACESSAR** os campos internos do '' | ||
+ | </ | ||
+ | |||
+ | ==== Exemplos de funcionamento ==== | ||
+ | |||
+ | O fluxo de execução e a saída do programa variam em função dos dados de entrada ('' | ||
+ | |||
+ | === a) Todos os passos do algoritmo === | ||
+ | |||
+ | Considerando '' | ||
+ | |||
+ | < | ||
+ | 10 6 | ||
+ | 1: -2 -5/2 -9/2 1/2 5 4/5 | ||
+ | 2: 1 -2 -1 3 -2 -1/2 | ||
+ | 3: -5 4/3 -11/3 -19/3 -20/3 -15/4 | ||
+ | 4: 3 -6/5 9/5 21/5 -18/5 -5/2 | ||
+ | 5: 3/4 4/5 31/20 -1/20 3/5 15/16 | ||
+ | 6: 1/2 1 3/2 -1/2 1/2 1/2 | ||
+ | 7: 3 4/3 13/3 5/3 4 9/4 | ||
+ | 8: -2 1/2 -3/2 -5/2 -1 -4 | ||
+ | 9: -5/3 1/2 -7/6 -13/6 -5/6 -10/3 | ||
+ | 10: -4 3/5 -17/5 -23/5 -12/5 -20/3 | ||
+ | </ | ||
+ | |||
+ | Observações: | ||
+ | - observe, por exemplo, as iterações 2 e 8, onde há números racionais que foram simplificados no formato '' | ||
+ | - consulte o arquivo '' | ||
+ | |||
+ | === b) Fim antecipado 1 === | ||
+ | |||
+ | Nesta execução, com '' | ||
+ | |||
+ | < | ||
+ | 10 11 | ||
+ | 1: 0 5/9 5/9 -5/9 0 0 | ||
+ | 2: 5/11 -3/10 17/110 83/110 -3/22 -50/33 | ||
+ | 3: 0 6/5 6/5 -6/5 0 0 | ||
+ | 4: -5/6 -1/3 -7/6 -1/2 5/18 5/2 | ||
+ | 5: -4 -3 -7 -1 12 4/3 | ||
+ | 6: INVALIDO 9/8 NUMERO INVALIDO | ||
+ | </ | ||
+ | |||
+ | Observações: | ||
+ | - na sexta iteração, '' | ||
+ | - não confundir a mensagem '' | ||
+ | - consulte o arquivo '' | ||
+ | |||
+ | === c) Fim antecipado 2 === | ||
+ | |||
+ | Nesta execução, com '' | ||
+ | |||
+ | < | ||
+ | 10 5 | ||
+ | 1: 1/5 -1/3 -2/15 8/15 -1/15 -3/5 | ||
+ | 2: 4 -5 -1 9 -20 -4/5 | ||
+ | 3: 1/2 3/2 2 -1 3/4 1/3 | ||
+ | 4: 0 -2 -2 2 0 0 | ||
+ | 5: 4/5 3/5 7/5 1/5 12/25 4/3 | ||
+ | 6: 5/3 0 DIVISAO INVALIDA | ||
+ | </ | ||
+ | |||
+ | ===== Entregáveis ===== | ||
+ | |||
+ | Entregue um único arquivo '' | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Importante: | ||
+ | |||
+ | * Use boas práticas de programação, | ||
+ | * Na dúvida, não tome decisões sobre a especificação, | ||
+ | * Dúvidas podem e devem ser resolvidas durante as aulas. | ||
+ | * Dúvidas com relação a este enunciado devem ser solucionadas via e-mail para '' | ||