Mar 31, 2012

C Program to implement Simpson method.

Write a C Program to implement Simpson method.
Simpson method is used for approximating integral of the function.
Simpson's rule also corresponds to the 3-point Newton-Cotes quadrature rule.
In this program, We use the stack to implement the Simpson method. Read more about C Programming Language .

/***********************************************************
* You can use all the programs on  www.c-program-example.com
* for personal and learning purposes. For permissions to use the
* programs for commercial purposes,
* contact info@c-program-example.com
* To find more C programs, do visit www.c-program-example.com
* and browse!
* 
*                      Happy Coding
***********************************************************/

#include<stdio.h>

#include<conio.h>

#include<math.h>

char post_fix[80];

float stack[80];

char stack1[80];

int top=-1,top1=-1;

float eval(char post_fix[], float x1);

void infix_post_fix(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: \n\n");
    
    gets(exp);
    
    puts("\n\nEnter x0, xn and number of sub-intervals: \n\n");
    
    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_post_fix(arr);
        
        e1=eval(post_fix,x0);
        
        e2=eval(post_fix,xn);
        
        e3=4*eval(post_fix, x0+h);
        
        s=log(e1)+log(e2)+log(e3);
        
        for (i=3;i<=n-1;i+=2)
        
        s+=4*eval(post_fix,x0+i*h)+2*eval(post_fix, x0+(i-1)*h);
        
    }
    
    else
    
    {
        
        infix_post_fix(exp);
        
        s=eval(post_fix,x0)+eval(post_fix,xn)+4*eval(post_fix, x0+h);
        
        for (i=3;i<=n-1;i+=2)
        
        s+=4*eval(post_fix,x0+i*h)+2*eval(post_fix, x0+(i-1)*h);
        
    }
    
    printf("\n\nThe value of integral is %6.3fn",(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 emptynt");
        
        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_post_fix(char infix[])

{
    
    int i=0,j=0,k;
    
    char ch;
    
    char token;
    
    for(i=0;i<79;i++)
    
    post_fix[i]=' ';
    
    push1('?');
    
    i=0;
    
    token=infix[i];
    
    while(token!=")
    
    {
        
        if(isalnum(token))
        
        {
            
            post_fix[j]=token;
            
            j++;
            
        }
        
        else if(token=='(')
        
        {
            
            push1('(');
            
        }
        
        else if(token==')')
        
        {
            
            while(stack1[top1]!='(')
            
            {
                
                ch=pop1();
                
                post_fix[j]=ch;
                
                j++;
                
            }
            
            ch=pop1();
            
        }
        
        else
        
        {
            
            while(ISPriority(stack1[top1])>=ICP(token))
            
            {
                
                ch=pop1();
                
                post_fix[j]=ch;
                
                j++;
                
            }
            
            push1(token);
            
        }
        
        i++;
        
        token=infix[i];
        
    }
    
    while(top1!=0)
    
    {
        
        ch=pop1();
        
        post_fix[j]=ch;
        
        j++;
        
    }
    
    post_fix[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("\n\nInvalid 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("\n\nInvalid 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\n\n");
        
        exit(0);
        
    }
    
    else
    
    {
        
        r=pop();
        
        return (r);
        
    }
    
    return 0;
    
}

Read more Similar C Programs
Data Structures

Learn C Programming
You can easily select the code by double clicking on the code area above.

To get regular updates on new C programs, you can

You can discuss these programs on our Facebook Page. Start a discussion right now,

our page!

Share this program with your Facebook friends now! by liking it


(you can send this program to your friend using this button)

Like to get updates right inside your feed reader? Grab our feed!

To browse more C Programs visit this link

K & R C Chapter 2 Exercise Solutions

We have already provided solutions to all the exercises in the book "C Programming Language (2nd Edition)" popularly known as K & R C book.

In this blog post I will give links to all the exercises from Chapter 2 of the book for easy reference.

Chapter 2: Types, Operators and Expressions

  1. Exercise 2-1.Write a program to determine the ranges of char , short , int , and long variables, both signed and unsigned , by printing appropriate values from standard headers and by direct computation. Harder if you compute them: determine the ranges of the various floating-point types.
    Solution to Exercise 2-1.

  2. Exercise 2-2.Write a loop equivalent to the for loop above without using && or || .
    Solution to Exercise 2-2.

  3. Exercise 2-3.Write the function htoi(s) , which converts a string of hexadecimal digits (including an optional 0x or 0X) into its equivalent integer value. The allowable digits are 0 through 9, a through f, and A through F .
    Solution to Exercise 2-3.

  4. Exercise 2-4.Write an alternate version of squeeze(s1,s2) that deletes each character in the string s1 that matches any character in the string s2 .
    Solution to Exercise 2-4.

  5. Exercise 2-5.Write the function any(s1,s2) , which returns the first location in the string s1 where any character from the string s2 occurs, or -1 if s1 contains no characters from s2 . (The standard library function strpbrk does the same job but returns a pointer to the location.)
    Solution to Exercise 2-5.

  6. Exercise 2-6.Write a function setbits(x,p,n,y) that returns x with the n bits that begin at position p set to the rightmost n bits of y, leaving the other bits unchanged.
    Solution to Exercise 2-6.

  7. Exercise 2-7.Write a function invert(x,p,n) that returns x with the n bits that begin at position p inverted (i.e., 1 changed into 0 and vice versa), leaving the others unchanged.
    Solution to Exercise 2-7.

  8. Exercise 2-8.Write a function rightrot(x,n) that returns the value of the integer x rotated to the right by n bit positions.
    Solution to Exercise 2-8.

  9. Exercise 2-9.In a two's complement number system, x &= (x-1) deletes the rightmost 1-bit in x . Explain why. Use this observation to write a faster version of bitcount .
    Solution to Exercise 2-9.

  10. Exercise 2-10.Rewrite the function lower, which converts upper case letters to lower case, with a conditional expression instead of if-else .
    Solution to Exercise 2-10.
You can purchase the book from here or here.

To get regular updates on new C programs, you can

You can discuss these programs on our Facebook Page. Start a discussion right now,

our page!

Like to get updates right inside your feed reader? Grab our feed!

To browse more C Programs visit this link