#include <stdio.h>

/* © 2012 Harry Broeders */
/* benader cos(x) met de volgende formule cos(x) = 1 - x^2/2! + x^4/4! - x^6/6! + ... */
/* in deze formule betekent x^4: x tot de macht 4. Dat werkt niet in C. */
/* in deze formule betekent 4!: 4 faculteit. Dat werkt niet in C. */
/* stap 0; formule herschrijven cos(x) = x^0/0! - x^2/2! + x^4/4! - x^6/6! + ... */
/* waarbij x de hoek in radialen is */
/* aantal termen is een variabele die moet worden ingelezen */

int main(void) {
    /* stap 1: lees x (floating point getal waarvan de cos bepaald moet worden) */
    /* stap 2: lees aantal termen in (geheel getal > 0) */
    /* stap 3: bepaal nummer voor elke term: 0, 1, 2, 3, ..., aantalTermen-1 */
    /* stap 4: bepaal constante voor elke term: 0, 2, 4, 6, ... */
    /* stap 5: bepaal teller van elke term: x^0, x^2, x^4, x^6, ... */
    /* stap 6: bepaal noemer van elke term: 0!, 2!, 4!, 6!, ... */
        /* gebruik als type double omdat faculteit erg snel groeit */
    /* stap 7: bepaal teken van elke term: +1, -1, +1, -1, ... */
    /* stap 8: bepaal elke term: +1*x^0/0!, -1*x^2/2!, +1*x^4/4!, -1*x^6/6!, ... */
    /* stap 9: tel de termen bij elkaar op */

    double x, termTeller, termNoemer, term, cos;
    int aantalTermen, termNummer, termConstante, termTeken;
    
    printf("Geef x: ");
    scanf("%lf", &x);

    do {
        printf("Geef het aantal termen: ");
        scanf("%d", &aantalTermen);
    } while (aantalTermen <= 0);

    termTeller = 1;
    termNoemer = 1;
    termTeken = 1;
    cos = 0;
    for (termNummer = 0; termNummer < aantalTermen; termNummer = termNummer + 1) {
        termConstante = termNummer * 2;
        term = termTeken * termTeller / termNoemer;
        cos = cos + term;
        /* bereken volgende termTeller */
        termTeller = termTeller * x * x;		
        /* bereken volgende termNoemer */
        termNoemer = termNoemer * (termConstante + 1) * (termConstante + 2);
        /* bereken volgende termTeken */
        termTeken = termTeken * -1;
    }

    printf("cos(%f) benaderd met %d termen = %f\n", x, aantalTermen, cos);

    fflush(stdin);
    getchar();
    return 0;
}