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

/* Uitwerking paragraaf 9.8 opdracht 8 */

int main(void) {
    double fun1(double x);
    double fun2(double x); 
    double bepaalNulpunt(double (*f)(double), double a, double b);
    double x;

    x = bepaalNulpunt(fun1, -3.0, -2.0);
    printf("De benadering van het nulpunt van fun1 is: %.6lf\n", x);
    printf("De waarde van de functie fun1 is dan: %.6lf\n", fun1(x));
    x = bepaalNulpunt(fun2, 0.0, 5.0);
    printf("De benadering van het nulpunt van fun2 is: %.6lf\n", x);
    printf("De waarde van de functie fun2 is dan: %.6lf\n", fun2(x));
    getchar();
    return 0;
}

double bepaalNulpunt(double (*f)(double), double a, double b) {
    double m = (a + b) / 2;
    assert(f(a) < 0 && f(b) > 0 || f(a) > 0 && f(b) < 0);
    while (fabs(f(m)) > 0.5e-6) {
        if (f(a) > 0 && f(m) < 0 || f(a) < 0 && f(m) > 0) {
            b = m;
        }    
        else {
            a = m;
        }    
        m = (a + b) / 2;
    }
    return m;
}

double fun1(double x) {
    return x * x * x - 2 * x + 5;
}

double fun2(double x) {
    return x * x + x - 6;
}

/*
Uitvoer:
De benadering van het nulpunt van fun1 is: -2.094551
De waarde van de functie fun1 is dan: 0.000000
De benadering van het nulpunt van fun2 is: 2.000000
De waarde van de functie fun2 is dan: 0.000000
*/

