/*Aluno: Gustavo Sverzut Barbieri RA:008849 *Prof.: Arnaldo - MC102 */ #include #include #define NEW(type) (type *) malloc(sizeof(type)) typedef struct _parcela { int expoente; float coeficiente; struct _parcela *prox; } parcela; typedef parcela* polinomio; polinomio p[10]; /* declaracoes */ void le_polinomio(int n_parcelas, polinomio *node); void imprime_polinomio(polinomio *node); void apaga_polinomio(polinomio *node); void deriva(polinomio src, polinomio *dst); float pwr(float base, int expoente); float resolve(polinomio *node, float num, float anterior); void multiplica(polinomio *dst, polinomio src, float num); void soma_polinomios(polinomio *dst, polinomio src1, polinomio src2, int tipo); /*** MAIN() ****************************************/ int main() { char opcao; int pos[3]; float num; while ((opcao=getchar()) != 'q') { switch (opcao) { case 'c': { /* Le polinomio */ scanf("%i %i\n",&pos[0],&pos[1]); le_polinomio(pos[1],&p[pos[0]-1]); } break; case 'p': { /* Imprime polinomio */ scanf("%i",&pos[0]); imprime_polinomio(&p[pos[0]-1]); } break; case 'd': { /* Deriva polinomio */ scanf("%i %i",&pos[0],&pos[1]); deriva(p[pos[1]-1],&p[pos[0]-1]); } break; case 'l': { /* Libera memoria(apaga) do polinomio */ scanf("%i",&pos[0]); apaga_polinomio(&p[pos[0]-1]); } break; case '*': { /* multiplica polinomio por escalar */ scanf("%i %i %f",&pos[0],&pos[1],&num); multiplica(&p[pos[0]-1],p[pos[1]-1],num); } break; case 'a': { /* resolve o polinomio para um num real */ scanf("%i %f",&pos[0],&num); printf("%.3f\n",resolve(&p[pos[0]-1],num,0)); } break; case '+': { /* soma polinomios */ scanf("%i %i %i",&pos[0],&pos[1],&pos[2]); soma_polinomios(&p[pos[0]-1],p[pos[1]-1],p[pos[2]-1],1); } break; case '-': { /* soma polinomios */ scanf("%i %i %i",&pos[0],&pos[1],&pos[2]); soma_polinomios(&p[pos[0]-1],p[pos[1]-1],p[pos[2]-1],2); } break; } } return 0; } /*** le_polinomio() ********************************/ void le_polinomio(int n_parcelas, polinomio *node) { if (n_parcelas == 0) { (*node) = NULL; } else { (*node) = NEW(parcela); scanf("%f %i",&(*node)->coeficiente,&(*node)->expoente); le_polinomio(n_parcelas-1,&(*node)->prox); } } /*** imprime_polinomio() ***************************/ void imprime_polinomio(polinomio *node) { if ((*node) != NULL) { printf("%.3f %i\n",(*node)->coeficiente,(*node)->expoente); imprime_polinomio(&(*node)->prox); } } /*** apaga_polinomio() *****************************/ void apaga_polinomio(polinomio *node) { if ((*node) != NULL) { apaga_polinomio(&(*node)->prox); free(*node); *node=NULL; } } /*** deriva() **************************************/ void deriva(polinomio src, polinomio *dst) { if ((src != NULL) && (src->expoente > 0)) { (*dst) = NEW(parcela); (*dst)->expoente = src->expoente-1; (*dst)->coeficiente = src->coeficiente * src->expoente; deriva(src->prox,&(*dst)->prox); } else (*dst) = NULL; } /*** pwr() *****************************************/ float pwr(float base, int expoente) { int i; float produto; produto=1; if (expoente > 0) { for (i=1;i<= expoente;i++) produto = produto*base; } return produto; } float resolve(polinomio *node, float num, float anterior) { if (*node != NULL) anterior = resolve(&(*node)->prox,num,(anterior + (*node)->coeficiente *pwr(num,(*node)->expoente))); return anterior; } void multiplica(polinomio *dst, polinomio src, float num) { if ((src != NULL) && (num != 0)) { (*dst) = NEW(parcela); (*dst)->coeficiente = src->coeficiente * num; (*dst)->expoente = src->expoente; multiplica(&(*dst)->prox,src->prox,num); } else *dst = NULL; } void soma_polinomios(polinomio *dst, polinomio src1, polinomio src2, int tipo) { float coef[2]; if ((src1 != NULL) || (src2 != NULL)) { if ((src1 != NULL) && (src2 != NULL) && (src1->expoente == src2->expoente)) { coef[0] = src1->coeficiente; coef[1] = src2->coeficiente; if (tipo != 1) coef[1]*=-1; /* subtracao */ if ((coef[0] + coef[1]) != 0) { (*dst) = NEW(parcela); (*dst)->coeficiente = coef[0]+coef[1]; (*dst)->expoente = src1->expoente; soma_polinomios(&(*dst)->prox, src1->prox, src2->prox, tipo); } else { soma_polinomios(dst, src1->prox, src2->prox, tipo); } } else if ((src1 != NULL) && ((src2 == NULL) || (src1->expoente > src2->expoente))) { (*dst) = NEW(parcela); (*dst)->coeficiente = src1->coeficiente; (*dst)->expoente = src1->expoente; soma_polinomios(&(*dst)->prox, src1->prox, src2, tipo); } else if ((src2 != NULL) && ((src1 == NULL) || (src2->expoente > src1->expoente))) { (*dst) = NEW(parcela); if (tipo == 1) { (*dst)->coeficiente = src2->coeficiente; } else { (*dst)->coeficiente = -1 *src2->coeficiente; } (*dst)->expoente = src2->expoente; soma_polinomios(&(*dst)->prox, src1, src2->prox, tipo); } } else *dst = NULL; } /* author: Gustavo Sverzut Barbieri (http://www.gustavobarbieri.com.br) */