Program to implement Simpson method

Write C program to implement Simpson method

#include<stdio.h>
#include<conio.h>
#include<math.h>

char postfix[80];
float stack[80];
char stack1[80];
int top=-1,top1=-1;
float eval(char postfix[], float x1);
void infix_postfix(char infix[]);

main()
{
          float x0, xn, h, s,e1,e2, e3;
          char exp[80], arr[80];
          int i,n,l=0;
          clrscr();
          printf(“\nEnter an expression: “);
          gets(exp);
          puts(“Enter x0, xn and number of sub-intervals: “);
          scanf(“%f%f%d”, &x0, &xn, &n);
          h=(xn-x0)/n;
          if(exp[0]==’l'&& exp[1]==’o'&& exp[2]==’g')
          {
                   l=strlen(exp);
                   for(i=0;i<l-3; i++)
                             arr[0]=exp[i+3];
                   arr[i]=”;
                   infix_postfix(arr);
                   e1=eval(postfix,x0);
                   e2=eval(postfix,xn);
                   e3=4*eval(postfix, x0+h);
                   s=log(e1)+log(e2)+log(e3);
                   for (i=3;i<=n-1;i+=2)
                             s+=4*eval(postfix,x0+i*h)+2*eval(postfix, x0+(i-1)*h);
          }
          else
          {
                   infix_postfix(exp);
                   s=eval(postfix,x0)+eval(postfix,xn)+4*eval(postfix, x0+h);
                   for (i=3;i<=n-1;i+=2)
                             s+=4*eval(postfix,x0+i*h)+2*eval(postfix, x0+(i-1)*h);
          }
          printf(“The value of integral is %6.3f\n”,(h/3)*s);
          return(0);
}

/*Inserting the operands in a stack. */
void push(float item)
{
          if(top==99)
          {
                   printf(“\n\tThe stack is full”);
                   getch();
                   exit(0);
          }
          else
          {
                   top++;
                   stack[top]=item;
          }
          return;
}

/*Removing the operands from a stack. */
float pop()
{
          float item;
          if(top==-1)
          {
                   printf(“\n\tThe stack is empty\n\t”);
                   getch();
          }
          item=stack[top];
          top–;
          return (item);
}

void push1(char item)
{
          if(top1==79)
          {
                   printf(“\n\tThe stack is full”);
                   getch();
                   exit(0);
          }
          else
          {
                   top1++;
                   stack1[top1]=item;
          }
          return;
}

/*Removing the operands from a stack. */
char pop1()
{
          char item;
          if(top1==-1)
          {
                   printf(“\n\tThe stack1 is empty\n\t”);
                   getch();
          }
          item=stack1[top1];
          top1–;
          return (item);
}

/*Converting an infix expression to a postfix expression. */
void infix_postfix(char infix[])
{
          int i=0,j=0,k;
          char ch;
          char token;
          for(i=0;i<79;i++)
                   postfix[i]=’ ‘;
          push1(‘?’);
          i=0;
          token=infix[i];
          while(token!=”)
          {
                   if(isalnum(token))
                   {
                             postfix[j]=token;
                             j++;
                   }
                   else if(token==’(‘)
                   {
                             push1(‘(‘);
                   }
                   else if(token==’)')
                   {
                             while(stack1[top1]!=’(‘)
                             {
                                      ch=pop1();
                                      postfix[j]=ch;
                                      j++;
                             }
                             ch=pop1();
                   }
                   else
                   {
                             while(ISPriority(stack1[top1])>=ICP(token))
                             {
                                      ch=pop1();
                                      postfix[j]=ch;
                                      j++;  
                             }
                             push1(token);
                   }
                   i++;
                   token=infix[i];
          }
          while(top1!=0)
          {
                   ch=pop1();
                   postfix[j]=ch;
                   j++;
          }
          postfix[j]=”;
}
         
/*Determining the priority of elements that are placed inside the stack. */
int ISPriority(char token)
{
          switch(token)
          {
                   case ‘(‘:return (0);
                   case ‘)’:return (9);
                   case ‘+’:return (7);
                   case ‘-’:return (7);
                   case ‘*’:return (8);
                   case ‘/’:return (8);
                   case ‘?’:return (0);
                   default: printf(“Invalid expression”);
          }
          return 0;
}

/*Determining the priority of elements that are approaching towards the stack. */
int ICP(char token)
{
          switch(token)
          {
                   case ‘(‘:return (10);
                   case ‘)’:return (9);
                   case ‘+’:return (7);
                   case ‘-’:return (7);
                   case ‘*’:return (8);
                   case ‘/’:return (8);
                   case ”:return (0);
                   default: printf(“Invalid expression”);
          }
          return 0;
}

/*Calculating the result of expression, which is converted in postfix notation. */
float eval(char p[], float x1)
{
          float t1,t2,k,r;
          int i=0,l;
          l=strlen(p);
          while(i<l)
          {
                   if(p[i]==’x')
                             push(x1);
                   else
                             if(isdigit(p[i]))
                             {
                                      k=p[i]-’0′;
                                      push(k);
                             }
                   else
                   {
                             t1=pop();
                             t2=pop();
                             switch(p[i])
                             {
                                      case ‘+’:k=t2+t1;
                                      break;
                                      case ‘-’:k=t2-t1;
                                      break;
                                      case ‘*’:k=t2*t1;
                                      break;
                                      case ‘/’:k=t2/t1;
                                      break;
                                      default: printf(“\n\tInvalid expression”);
                             }
                             push(k);
                   }
                   i++;
          }
          if(top>0)
          {
                   printf(“You have entered the operands more than the operators”);
                   exit(0);
          }
          else
          {
                   r=pop();
                   return (r);
          }
          return 0;
}


Post a Comment