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

#include "gnuplot_i.h"


/* --------------------------------*/

void Integralexp(double *x, double *integralselbst, double *integralstamm)
{
	double   schrittweite=0.000001, untergrenze=-2.0, summe=0.0, xaktuell;
	unsigned long  zaehler1=0, zaehler2=0;
       
	xaktuell=untergrenze+0.5*schrittweite;
	x[0]=untergrenze;
	integralselbst[0]=0.0;
	integralstamm[0]=0.0;
       
	for(zaehler1=1; zaehler1<=40; zaehler1++)
	{
	
		for(zaehler2=0; zaehler2<100000; zaehler2++)
		{	     
			summe=summe+exp(xaktuell);
			/*xaktuell=xaktuell+schrittweite;*/
			xaktuell=untergrenze+((double)((zaehler1-1)*100000+zaehler2)+1.5)*schrittweite;
		}
	   
		x[zaehler1]=untergrenze+(double)(zaehler1)*0.1;
		integralselbst[zaehler1]=summe*schrittweite;
		integralstamm[zaehler1]=exp(x[zaehler1])-exp(-2.0);	 
	 
	}
       
	return;
       
}


/* --------------------------------*/
void Integralsin(double *x, double *integralselbst, double *integralstamm)
{
	double   schrittweite=0.000001, untergrenze=0.0, summe=0.0, xaktuell;
	unsigned long  zaehler1=0, zaehler2=0;
       
	xaktuell=untergrenze+0.5*schrittweite;
	x[0]=untergrenze;
	integralselbst[0]=0.0;
	integralstamm[0]=0.0;
       
	for(zaehler1=1; zaehler1<=1000; zaehler1++)
	{
	
		for(zaehler2=0; zaehler2<100000; zaehler2++)
		{	     
			summe=summe+sin(xaktuell);
			/*xaktuell=xaktuell+schrittweite;*/
			xaktuell=untergrenze+((double)((zaehler1-1)*100000+zaehler2)+1.5)*schrittweite;
		}
	   
		x[zaehler1]=untergrenze+(double)(zaehler1)*0.1;
		integralselbst[zaehler1]=summe*schrittweite;
		integralstamm[zaehler1]=1.0-cos(x[zaehler1]);	 
	 
	}
       
	return;
       
}

/* --------------------------------*/

int main(void)
{
     /*  This software uses the gnuplot_i library written by
     N.Devillard <ndevilla@free.fr>
     If you are using gnuplot_i for a web-based
     application, you can also add a link to the gnuplot home
     page:

        http://ndevilla.free.fr/gnuplot/ */
     
	gnuplot_ctrl    *bild1, *bild2;
     

	double              x1[41] ;
	double              integralexpselbst[41] ;
	double              integralexpstamm[41] ;
	double              x2[1001] ;
	double              integralsinselbst[1001] ;
	double              integralsinstamm[1001] ;     
     
	bild1 = gnuplot_init();
	bild2 = gnuplot_init();
 
	printf("Dieses Programm visualisiert die mittels Mittelpunktregel\n\
selbstgeschriebenen Stammfunktionen von x->exp(x) auf [-2,2]\n\
und von x->sin(x) auf [0,100].\n\n"); 
 

	Integralexp(x1, integralexpselbst, integralexpstamm);
	Integralsin(x2, integralsinselbst, integralsinstamm);
     
	printf("Visualisierung Ihrer selbstgeschriebenen Stammfunktion zu x->exp(x).\n\
Wenn Sie mit der expliziten Stammfunktion vergleichen wollen, druecken Sie bitte return.\n");
     
	gnuplot_resetplot(bild1);
	gnuplot_setstyle(bild1, "points") ;
	gnuplot_plot_xy(bild1, x1, integralexpselbst, 41, "selbstgeschriebene Stammfunktion zu exp");
     
	getchar();
     
	gnuplot_plot_xy(bild1, x1, integralexpstamm, 41, "explizite Stammfunktion");
     
     
     
	printf("Wenn Sie die selbstgeschriebene Stammfunktion zu x->sin(x)\n\
sehen wollen, druecken Sie bitte return.\n");
     
	getchar();    
     
	gnuplot_resetplot(bild2);
	gnuplot_setstyle(bild2, "points") ;
	gnuplot_plot_xy(bild2, x2, integralsinselbst, 1001, "selbstgeschriebene Stammfunktion zu sin");     
     
	printf("Wenn Sie mit der expliziten Stammfunktion vergleichen wollen, druecken Sie bitte return.\n");
      
	getchar(); 
     
	gnuplot_plot_xy(bild2, x2, integralsinstamm, 1001, "explizite Stammfunktion");       
     
	printf("Wenn Sie genug gesehen haben, druecken Sie bitte return.\n");
     
	getchar();
     
	gnuplot_close(bild1);
	gnuplot_close(bild2);     
 
	return(0);
  
}

