Advertisement
madalinaradu

FAI p8 operatii polinoame

Dec 16th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.00 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #include<process.h>
  4. #include<ctype.h>
  5. #include<conio.h>
  6. #include <assert.h>
  7. #define MAX 100
  8.  
  9. typedef struct {
  10.     int grad;
  11.     float coef[MAX];
  12. } polinom;
  13.  
  14. void citirePolinom(polinom *pol) {
  15.     int i;
  16.     printf("gradul polinomului:");
  17.     scanf("%d",&(*pol).grad);
  18.  
  19.     for (i=0; i<=(*pol).grad; i++) {
  20.  
  21.         printf("a[%d]=",i);
  22.         scanf("%f",&(*pol).coef[i]);
  23.     }
  24.  
  25. }
  26.  
  27. void afisarePolinom(polinom p) {
  28.     int i;
  29.  
  30.     for (i=p.grad; i>=0; i--) {
  31.         printf("%+g*X^%d",p.coef[i],i);
  32.     }
  33.  
  34.     printf("\n");
  35. }
  36.  
  37.  
  38. int max(int a, int b) {
  39.     if(a>b)
  40.         return a;
  41.     else
  42.         return b;
  43. }
  44. void copierePolinom(polinom p,polinom *q) {
  45.     int i;
  46.     q->grad = p.grad;
  47.  
  48.     for(i=0; i<=q->grad; i++) {
  49.         q->coef[i]=p.coef[i];
  50.     }
  51. }
  52.  
  53.  
  54. void suma(polinom p, polinom q, polinom *r) {
  55.     int i;
  56.     if(q.grad!=p.grad) {
  57.  
  58.         r->grad=max(q.grad,p.grad);//determinam daca nu au acelasi grad
  59.  
  60.         //determinam polinomul cu gradul cel mai mic
  61.         if(p.grad<q.grad) {
  62.             for (i=0; i<=q.grad; i++) {
  63.  
  64.                 if (i<=p.grad)
  65.                     r->coef[i]=p.coef[i]+q.coef[i];
  66.                 else
  67.                     r->coef[i]=q.coef[i];
  68.             }
  69.         } else {
  70.             for(i=0; i<=p.grad; i++) {
  71.                 if(i<=q.grad)
  72.                     r->coef[i]=p.coef[i]+q.coef[i];
  73.                 else
  74.                     r->coef[i]=p.coef[i];
  75.  
  76.  
  77.             }
  78.  
  79.         }
  80.     }
  81.     //polinoamele au grade egale
  82.     else {
  83.         i=p.grad;
  84.         while(i>0&&p.coef[i]+q.coef[i]==0) {
  85.             i--;
  86.         }
  87.         r->grad=i;
  88.  
  89.         for(i=0; i<=r->grad; i++)
  90.             r->coef[i]=p.coef[i]+q.coef[i];
  91.  
  92.     }
  93.  
  94. }
  95.  
  96. void produs(polinom p,polinom q, polinom *r) {
  97.     int i,j;
  98.     r->grad=p.grad+q.grad;
  99.  
  100.     for(i=0; i<=r->grad; i++) {
  101.         r->coef[i]=0;
  102.     }
  103.     for(i=0; i<=p.grad; i++) {
  104.         for(j=0; j<=q.grad; j++) {
  105.             r->coef[i+j]=r->coef[i+j]+p.coef[i]*q.coef[j];
  106.         }
  107.     }
  108.  
  109. }
  110.  
  111. //catul si restul impartirii polinomului p la q, rezultatul se retine in c si r.
  112.  
  113. void impartire(polinom p, polinom q, polinom *c, polinom *r) {
  114.     polinom psave;
  115.     int i,j,k;
  116.     if(p.grad<q.grad) {
  117.         c->grad = 0;
  118.         c->coef[0] = 0;
  119.  
  120.         r->grad = q.grad;
  121.  
  122.         for(i=0; i<=r->grad; i++)
  123.             r->coef[i] = q.coef[i];
  124.     } else {
  125.         c->grad=p.grad - q.grad;
  126.         r->grad=q.grad - 1;
  127.         for(i=p.grad-q.grad,j=p.grad; i>=0; i--,j--) {
  128.             c->coef[i] = p.coef[j]/q.coef[q.grad];
  129.             for(k=q.grad; k>=0; k--) {
  130.                 p.coef[i+k] =  p.coef[i+k] - c->coef[i]*q.coef[k];
  131.             }
  132.             p.coef[j]=0;
  133.         }
  134.  
  135.         for(i=0; i<=q.grad-1; i++)
  136.             r->coef[i] = p.coef[i];
  137.     }
  138. }
  139.  
  140.  
  141. //testeaza daca p este divizibil cu q.
  142. int esteDivizibil(polinom p, polinom q) {
  143.     int i;
  144.     int esteDivizor =1; //presupun ca q e divizior al lui p.
  145.     polinom c,r;
  146.     impartire(p,q,&c,&r);
  147.     //Verific daca restul e 0.
  148.     for(i=0; i<r.grad; i++) {
  149.         if(r.coef[i]!=0) {
  150.             esteDivizor = 0;
  151.             break;
  152.         }
  153.     }
  154.     return esteDivizor;
  155.  
  156. }
  157.  
  158. void main() {
  159.     polinom p,q,c,r;
  160.     printf("Introduceti primul polinom:");
  161.     citirePolinom(&p);
  162.     printf("Introduceti al doilea polinom:");
  163.     citirePolinom(&q);
  164.     printf("p=");
  165.     afisarePolinom(p);
  166.     printf("q=");
  167.     afisarePolinom(q);
  168.  
  169.     printf("Suma polinoamelor este:");
  170.     suma(p,q,&r);
  171.     afisarePolinom(r);
  172.     printf("Produsul polinoamelor este:");
  173.     produs(p,q,&r);
  174.     afisarePolinom(r);
  175.  
  176.     printf("Catul impartirii polinoamelor este:");
  177.     impartire(p,q,&c,&r);
  178.     afisarePolinom(c);
  179.     printf("Restul impartirii polinoamelor este:");
  180.     afisarePolinom(r);
  181.  
  182.     if(esteDivizibil(p,q)) {
  183.         printf("p este divizibil cu q\n");
  184.     }
  185.     if(esteDivizibil(q,p)) {
  186.         printf("q este divizibil cu p\n");
  187.     }
  188.  
  189.  
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement