rrrexter

poly.c

Sep 12th, 2017
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.46 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<math.h>
  3. #define MAX 20
  4. #define COMPARE(x,y) (((x)==(y))?0:((x)>(y))?1:-1)
  5. typedef struct
  6. {
  7.     float coeff;
  8.     int exp;
  9. }POLY;
  10.  
  11. POLY terms[MAX];
  12. int startA=0, finishA, startB, finishB, startD, finishD, avail=0;
  13.  
  14. void input_poly(int f, int *p)
  15. {
  16.     int i;
  17.     printf("Enter the number of terms for polynomial: ");
  18.     scanf("%d",p);
  19.  
  20.     (*p)--;
  21.  
  22.     for(i=f;i<=(*p+f);i++)
  23.     {
  24.      printf("Enter Coefficient and Exponent: ");
  25.      scanf("%f%d",&terms[i].coeff,&terms[i].exp);
  26.     }
  27.  
  28.     printf("\n\n");
  29.     //p=NULL;
  30. }
  31.  
  32. void disp_poly(int f,int l)
  33. {
  34.     int i;
  35.  
  36.     for(i=f;i<=l;i++)
  37.     {
  38.      if(terms[i].exp)
  39.       printf("+%.0fX^%d",terms[i].coeff,terms[i].exp);
  40.      else
  41.       printf("+%.0f",terms[i].coeff);
  42.     }
  43.      printf("\n\n");
  44. }
  45.  
  46. void attach(float c, int e)
  47. {
  48.     terms[avail].coeff = c;
  49.     terms[avail].exp   = e;
  50.     avail++;
  51. }
  52.  
  53. void poly_add(int startA, int startB, int finishA, int finishB, int *startD, int *finishD)
  54. {
  55.     float c;
  56.     *startD = avail;
  57.     while(startA <= finishA && startB <= finishB )
  58.     {
  59.      switch(COMPARE(terms[startA].exp,terms[startB].exp))
  60.      {
  61.  
  62.       case -1: attach( terms[startB].coeff , terms[startB].exp );
  63.            startB++;
  64.            break;
  65.  
  66.       case  0: c=terms[startA].coeff+terms[startB].coeff;
  67.            if(c!=0)
  68.            attach( c , terms[startA].exp );
  69.            startA++;
  70.            startB++;
  71.            break;
  72.  
  73.       case  1: attach( terms[startA].coeff , terms[startA].exp );
  74.            startA++;
  75.            break;
  76.  
  77.      }
  78.     }
  79.  
  80.     *finishD = avail-1;
  81. }
  82.  
  83. void poly_eval(float x,int n)
  84. {
  85.     int i;
  86.     float val=0;
  87.  
  88.     for(i=0;i<=n;i++)
  89.     val += terms[i].coeff * pow(x , terms[i].exp);
  90.  
  91.     printf("Value= %.0f\n",val);
  92. }
  93.  
  94. void main()
  95. {
  96.     int c;
  97.     float x;
  98.     printf("Menu:\n\t1. Addition of two polynomials\n\t2. Evaluation of a polynomial\nEnter your choice: ");
  99.     scanf("%d",&c);
  100.     printf("\n\n");
  101.     switch(c)
  102.     {
  103.      case  1 :
  104.            input_poly(startA,&finishA);
  105.            startB=finishA+1;
  106.            input_poly(startB,&finishB);
  107.            finishB+=startB;
  108.            avail = finishB+1;
  109.  
  110.            poly_add(startA,startB,finishA,finishB,&startD,&finishD);
  111.            printf("First  polynomial is: ");    disp_poly(startA,finishA);
  112.            printf("Second polynomial is: ");    disp_poly(startB,finishB);
  113.            printf("Addition of two polynomials is:\n");
  114.            disp_poly(startD,finishD);
  115.            break;
  116.  
  117.      case  2 : input_poly(startA,&finishA);
  118.            disp_poly(startA,finishA);
  119.            printf("Enter the value of X: ");
  120.            scanf("%f",&x);
  121.            poly_eval(x,finishA);
  122.            break;
  123.  
  124.      default : printf("Invalid case\n");
  125.     }
  126. }
Add Comment
Please, Sign In to add comment