#include ‹stdlib.h› typedef struct monomio *apont; struct monomio { double coef; int exp; apont prox; }; 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); /* Interface da lista livre */ apont livre = NULL; apont novo_monomio (double coef, int exp); void libera_monomio (apont p);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. A rotina apont novo_monomio (double coef, int exp) devolve um apontador para um monômio disponível, já preenchido com coef, exp e NULL, e a rotina void libera_monomio (apont p) 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.
|
|
|
|
|
Abaixo descrevemos o que deve fazer cada uma das funções da biblioteca:
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:
/********************************************************/ /* Fulano de Tal */ /* Exercicio-Programa xx */ /* Disciplina yy Professor: Ciclano de Tal */ /********************************************************/