Primeiro Exercício-Programa

Entrega: 5 de abril

Este EP pode ser feito em dupla.

Manipulação de Polinômios Esparsos

Polinômios esparsos podem ser representados eficientemente por meio de listas ligadas. Neste exercício-programa, você terá que escrever uma biblioteca que dê suporte a esse tipo abstrato de dados. A interface da sua biblioteca é a seguinte:
#include ‹stdlib.h›

typedef struct monomio *apont;

struct monomio { double coef; int exp; apont prox; };

apont livre = NULL;

void soma (apont p, apont q);

void subtrai (apont p, apont q);

void multiplica (apont p, apont q);

void deriva (apont p);

int grau (apont p);

double calcula (apont p, double x);

apont copia (apont p);

void imprime (apont p);

apont le (FILE *arq);
A sua implementação deve manter uma lista livre, com os struct monomio alocados mas disponíveis no momento. O apontador livre aponta para o início dessa lista. Um novo struct monomio deve ser alocado através da rotina malloc apenas quando a lista livre estiver vazia. Implemente, além das rotinas acima, as duas rotinas de manipulação da lista livre: apont novo_monomio (double coef, int exp) que devolve um apontador para um monômio disponível, já preenchido com coef, exp e NULL, e void libera_monomio (apont p), que insere na lista livre o monômio apontado por p.

Cada polinômio é armazenado em uma lista ligada com cabeça de lista (para facilitar a manipulação). Cada célula da lista é do tipo struct monomio e armazema os dados de um dos monômios do polinômio: o coeficiente e o expoente, além do apontador para o próximo monômio. Apenas monômios com coeficiente não-nulo devem estar na lista e, para que a manipulação seja mais eficiente, os monômios devem estar ordenados na lista em ordem crescente do expoente.

Exemplo: O polinômio p(x)=-x5+2x3+5x2-7 ficaria armazenado em uma lista de acordo com a seguinte figura.


prox
-7 0 prox
5 2 prox
2 3 prox
-1 5 NULL

onde prox representa um apontador para a célula seguinte na figura e a primeira célula é a cabeça da lista. Note a ausência dos monômios correspondendo a x4 e x, que têm coeficiente nulo neste polinômio.

Abaixo descrevemos o que deve fazer cada uma das funções da biblioteca:

O seu programa deve conter, além da implementação das rotinas acima, um programa principal que teste essas rotinas. O programa principal deve ler de um arquivo uma seqüência de polinômios e operações e mostrar o resultado da execução de cada uma destas operações sobre os polinômios dados.

Não deixe o seu programa vazar memória, ou seja, inclua na lista livre todos os monômios que não estiverem em um polinômio no momento.

As operações de soma, subtração, multiplicação, derivação, grau, cópia e calcula são codificadas por '+', '-', '*', 'd', 'g', 'c' e 'v' respectivamente. Cada linha do arquivo contem ou um polinômio, dado por um inteiro k e uma seqüência de k pares de números (cada par representando um monômio), ou uma operação. No caso do polinômio, assuma que os monômios são dados em ordem crescente de expoente, para facilitar. No caso da operação calcula, a letra 'v' vem seguida de um valor real. Uma operação se refere sempre ao último polinômio manipulado e, caso a operação seja binária, ao próximo polinômio no arquivo. Tome cuidado com a manipulação do arquivo de entrada. Em C, vários problemas podem acontecer na leitura. Assim, numa primeira etapa, escreva apenas a função de leitura dos dados e impressão de um polinômio. Apenas depois que esta parte estiver funcionando bem, passe a escrever e testar as funções de manipulação dos polinômios propriamente. Teste cada rotina separadamente, para não se atrapalhar.

Após a leitura de cada polinômio do arquivo de entrada, o seu programa deve imprimir o polinômio lido. Também após o processamento de cada operação, o seu programa deve imprimir o resultado da operação.

Abaixo mostramos um exemplo de arquivo de entrada.

3 1 2 -1 3 4 5
+
4 -1 0 2 2 1 3 3 4
g
-
4 -1 0 2 2 1 3 3 4
*
1 1 1
d
*
2 1 1 -1 2

A saída para tal exemplo poderia ser algo como:

(x^2-x^3+4x^5) + (-1+2x^2+x^3+3x^4) = -1+3x^2+3x^4+4x^5 
O grau de -1+3x^2+3x^4+4x^5 e' 5.
(-1+3x^2+3x^4+4x^5) - (-1+2x^2+x^3+3x^4) = x^2-x^3+4x^5
(x^2-x^3+4x^5) * (x) = x^3-x^4+4x^6
A derivada de x^3-x^4+4x^6 e' 3x^2-4x^3+24x^5.
(3x^2-4x^3+24x^5) * (x-x^2) = 3x^3-7x^4+4x^5+24x^6-24x^7

Avisos:


Last modified: Fri Mar 22 19:58:25 EST 2002