You are on page 1of 5

Exerccio Programa 1 - MAC0122 Princpios de

Desenvolvimento de Algoritmos - POLI


Prof. Ronaldo Fumio Hashimoto

1 Descrio do Exerccio Programa


Neste Exerccio Programa (EP), voc dever implementar um pacote de aritm-
tica racional e um programa cliente que usa esse pacote (package) para computar
a aproximao racional do e (nmero de Euler) e de razes quadradas. A pro-
posta do EP o aprendizado dos conceitos de definies de tipos, empacotamento
de interfaces, implementao, compilao separada e transbordamento aritm-
tico (arithmetic overflow ). Este exerccio fortemente baseado no Programming
Assignment - Rational Arithmetic [1].

2 Aritmtica Racional
Nmeros racionais so nmeros que podem ser representados como a razo de
dois inteiros, i.e. qualquer nmero p/q onde p e q so inteiros um nmero raci-
onal. A linguagem C aproxima nmeros no-inteiros racionais usando nmeros
de ponto-flutuante (floats e doubles), mas esses tipos so representaes impre-
cisas. Para esse EP, voc representar nmeros racionais com uma estrutura
com dois inteiros:

struct { unsigned long num; unsigned long den; }

Essa estrutura representa um nmero racional com um numerador num e


denominador den. Quando um tipo da linguagem C usado repetidamente
para representar um outro tipo, mais abstrato, convencional especificar um
novo nome para esse tipo por meio de uma definio de tipo conforme mostrado
abaixo:

typedef struct {
unsigned long num;
unsigned long den;
} Rational;

Essa diretiva nos permite usar nmeros racionais em programas em C de


maneira semelhante a outros tipos, conforme exibido no cdigo de exemplo
abaixo:

1
Rational a, b, c;
a = RATinit(1,3);
b = RATinit(1,4);
c = RATadd(a, b);
RATshow(c);

Neste EP, voc ir aprender a importncia do mtodo geral para implemen-


tao e uso de novos tipos de dados e suas funes associadas. Para tanto,
primeiramente crie o arquivo RAT.h com o seguinte cdigo:

typedef struct {
unsigned long num;
unsigned long den;
} Rational;

Rational RATinit(unsigned long numerator,


unsigned long denominator);
void RATshow(Rational r);
Rational RATadd(Rational r1, Rational r2);
Rational RATmul(Rational r1, Rational r2);
Rational RATdiv(Rational r1, Rational r2);

Este arquivo chamado de interface. Sua proposta especificar precisamente


qual ser o tipo de dado usado (os possveis tipos de variveis e as funes que
as manipulam). Neste caso, o tipo de dado Rational um par de inteiros, e
temos funes para: inicializ-lo; mostr-lo (imprim-lo); adicionar dois deles e
colocar o resultado em um terceiro Rational; multiplicar dois deles, colocando o
resultado em um terceiro; e dividir um nmero racional por outro, armeazenando
o resultado em um terceiro.

3 Passos a seguir para a resoluo do EP


Passo 1
Crie um arquivo rat.c e escreva a implementao para cada funo. A primeira
linha deste arquivo deve incluir a interface como mostrado abaixo:

#include "RAT.h"

Esta linha de cdigo inclui as declaraes de tipos de dados e suas opera-


es (funes) disponibilizadas pelo arquivo RAT.h. Permitindo assim que suas
implementaes tenham acesso a todas as funes a serem implementadas in-
dependente da ordem que voc as desenvolvam. Este arquivo chamado de
implementao do tipo de dado.

2
Passo 2
Escreva um programa e.c que usa as implementaes das funes do Rational
para calcular uma aproximao racional para e (nmero de Euler), usando a
expanso da srie de Taylor
1 1 1 1 1 1
e= + + + + + + ...
0! 1! 2! 3! 4! 5!
.
Leia um inteiro n da entrada padro usando scanf() e imprima as n pri-
meiras aproximaes. Por exemplo, a sada para n = 6 :

1/1 2/1 5/2 32/12 780/288 93888/34560

No contexto atual, estamos interessados neste programa como um exemplo


de cliente: um programa que usa o tipo de dado, mas implementado sepa-
radamente. Para usar o tipo Rational no arquivo e.c, antes de seu cdigo
adicione

#include "RAT.h"

Agora, voc pode usar variveis do tipo Rational no seu programa cliente,
mas certifique-se de manipular seu tipo de dado apenas atravs das
funes definidas na interface. Lembre-se de adicionar o arquivo rat.c em
seu processo de compilao.

Passo 3
Uma implementao ingnua da interface de aritmtica de racionais possui um
problema chamado de transbordamento aritmtico (arithmetic overflow ) que
ocorre quando uma operao aritmtica de inteiros produz um nmero que ne-
cessita de mais bits (i.e. um nmero com muitos dgitos) para ser representado
do que o computador est utilizando para armazen-lo . impossvel evitar o
transbordamento aritmtico, mas possvel reduzir sua ocorrncia. Por exem-
plo, no quarto termo do exemplo acima, tanto o numerador quanto o denomi-
nador so divisveis por 4, ento podemos simplificar o termo 32 8
12 para 3 , que
possui nmeros que necessitam de menos bits para serem representados.
Desenvolva uma implementao melhorada ratbetter.c que minimiza trans-
bordamento (overflow ) aritmtico atravs do algoritmo de Euclides [2], usando-o
para modificar sua implementao para aderir conveno que funes somente
retornam nmeros racionais cujos numeradores e denominadores so relativa-
mente primos.
Obs: mesmo com a simplificao das fraes, o problema de transborda-
mento aritmtico ainda pode ocorrer mesmo em casos que as fraes simplifi-
cadas podem ser armazenadas. Isso ocorre porque tanto as somas quanto os
produtos obtidos pelas funes de aritmtica racional podem transbordar, ge-
rando resultados errados. Por exemplo, ab dc igual ao valor reduzido de acbd ,

3
mas tanto ac quanto bd podem transbordar antes da reduo, mesmo que a res-
posta reduzida possa ser representada sem problemas (por exemplo, o mtodo
40 26
direto de calcular 2325 3241 = 32 transbordaria, pois as duas fraes sendo multi-
plicadas j esto em sua forma simplificada e os valores de 240 326 e 325 241
ultrapassam o valores mximo do tipo unsigned long). Similarmente, ab + dc
igual ao valor reduzido de (ad+bc)
bd , mas tanto ad + bc quanto bd podem trans-
bordar antes da reduo, mesmo que a resposta reduzida possa ser armazenada
sem problemas. possvel otimizar as operaes para contornar este tipo de
problema mas, para este EP, tal otimizao pode ser ignorada.

Passo 4
Escreva um programa cliente sqrt.c que calcule uma aproximao racional da
raiz quadrada de um nmero S utilizando o metdo babilnico [3] conforme
mostrado abaixo:
(  
xn = 21 xn1 + xn1
S
, se n > 0
S
x0 , se n = 0
Seu programa deve ler um valor inteiro S 0, um valor inteiro n 0 e um
chute inicial racional
x0 0 para a aproximao e calcular o valor racional
aproximado de S utilizando o metdo acima. Por exemplo, para S = 2, n = 4
e x0 = 11 , sua sada deve ser:
665857/470832

4 Compilao e Submisso
Use os seguintes parmetros para compilar seu cdigo:

-Wall -ansi -pedantic -O2

H um link no PACA [4] explicando a utilidade destes parmetros e como


configurar o codeblocks para incluir estas opes na hora de compilar seu pro-
grama. Procure entregar seu exerccio programa sem mensagens de alerta do
compilador (warnings).
Para submeter seu EP, envie um arquivo compactado contendo os arquivos:
readme.txt, rat.c, ratbetter.c, e.c e sqrt.c. Se voc utilizou o codeblocks
envie os arquivos de projetos tambm (.cbp). Voc no deve alterar o ar-
quivo RAT.h. Seus programas clientes e.c e sqrt.c devem funcionar com as
duas implementaes rat.c e ratbetter.c. esperado que seus programas
clientes obtenham respostas mais precisas com a utilizao da implementao
ratbetter.c.
O arquivo de readme.txt deve ter instrues de compilao e de uso dos
seus programas desenvolvidos, alm de conter explicaes das melhorias obtidas
comparando o rat.c com o ratbetter.c.

4
Referncias
[1] R. Sedgewick, Programming Assignments - Rational Arithmetic.
http://www.cs.princeton.edu/courses/archive/spr03/cs126/
assignments/rat.html, 1999. [Online; acessado dia 21 de maro de
2017].
[2] Wikipedia, Euclidean algorithm . https://en.wikipedia.org/wiki/
Euclidean_algorithm#Implementations. [Online; acessado dia 29 de
maro de 2017].
[3] Methods of computing square roots. https://en.wikipedia.org/wiki/
Methods_of_computing_square_roots. [Online; acessado dia 21 de maro
de 2017].
[4] Perguntas e Respostas mais Frequentes sobre Compilao . http:
//vision.ime.usp.br/~ronaldo/mac0122-2017/compilacao/. [Online;
acessado dia 29 de maro de 2017].

You might also like