/* Approximating area under sqrt(4-x^2) on [0, 2] using the Trapezoidal Rule.*
 * Version 2:  A function performs the area computation.                     */

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

const int n = 50;          /* number of subintervals to be used */

/* function to be used in the area approximation
 *  Preconditions: x*x does not underflow or overflow
 *  Postconditions: f(x) = sqrt(4-x^2) 
 */
double f(double x);     

/* Approximation of area under f(x) on [a, b] using the Trapezoidal Rule
 * 
 * Preconditions: 
 *  b > a
 *  numInt > 0
 *
 * Postconditions:
 *  Returns area under f(x) over range [a,b]  by the trapezoid rule
 */
double area(double a, double b, int numInt);

/* main: runs trapezoid approximation for semicircle of radius 2 centered at
 * origin over [0,2] 
 * 
 * Preconditions: 
 *  f(x) is defined
 *  area(a,b,n) is defined
 *
 * Postconditions: 
 *  Prints the area to terminal
 *  returns 0
 */
int main (void)
{
  printf ("Program approximates the area under a function using the ");
  printf ("Trapezoidal Rule, based on %d intervals.\n", n);
  printf ("The approximate area is %7.4f\n", area (0.0, 2.0, n));
  return 0;
}

/* function to be used in the area approximation
 *  Preconditions: x*x does not underflow or overflow
 *  Postconditions: f(x) = sqrt(4-x^2) 
 */
double f(double x) 
{
  return sqrt(4.0 - x*x);
}

/* Approximation of area under f(x) on [a, b] using the Trapezoidal Rule
 * 
 * Preconditions: 
 *  b > a
 *  numInt > 0
 *
 * Postconditions:
 *  Returns area under f(x) over range [a,b]  by the trapezoid rule
 */
double area (double a, double b, int numInt)
{
  double width = (b - a) / numInt; 
  double sum = (f(a) + f(b)) / 2.0;   /* first and last terms in sum */
  double xvalue;
  
  for (xvalue = a + width; xvalue < b; xvalue += width)
    sum += f(xvalue);

  return sum * width;
}
