Hallo,

habe ein Problem mit meinem C-Code. Das Programm das ich geschrieben habe berechnet mir nicht die richtigen Nullstellen aus und ich weiss jetzt nicht wo das Problem liegen könnte.

z. B.: für bei den Eingaben:
- Auswahl der Funktion: 5
- Intervallgrenze a: 0
- Intervallgrenze b: 2
- Genauigkeit: 0.001

erscheint als Ausgabe folgendes:
- Ergebnis d. ausgwaehten Funktion ist: 1.#QNAN0
- f(x0)=-2.000000
- Interationsschritte: 2293580

Würd mich freuen, falls mir mal jemand da helfen könnte.

Gruß
wodka_cheery

Hier mal den Code:


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

// TA a)

int fn;            //globale Variable

double f(double x)      //Funktion f mit reellen Parameter x 
{         
    double ergebnis;
           
           switch (fn)
           {
                  case 1: ergebnis = sin(x);
                          break;
                          
                  case 2: ergebnis = ((double)exp(x))-(5*x)+1;
                          break;
                          
                  case 3: ergebnis = (x*x)-2;
                          break;
                          
                  case 4: ergebnis = (1/7)+(1/x);
                          break;
                          
                  case 5: ergebnis = (2*x)-2;
                          break;
                          
                 default: printf("Fehler bei der Eingabe.\n");
                          break;
           }     
return ergebnis;
}

// TA b)

double nullstelle(double a, double b, double g)  
{ 
       //Rueckgabeparameter
       int anzit=0;     //anzit steht für die Ausgabe der Iterationschritte
       int ok=1;     //Variable für Wahrheitswerte true and false
       double x0;    //später zur Berechnung von f(x0) falls ok = 1 ist
       
       double c=0;
       double ergebnis;
     
       do
       {
            c=(a+b)/2;
            
            if((f(a)<0 && f(b)>0) || (f(a)>0 && f(b)<0))
            {
                       if(f(c)>0)
                       {
                                 //a=a;
                                 c=b;
                       }
                       
                       if(f(c)<0)
                       {
                                //b=b;
                                c=a;          
                       }
                       
                       if(f(a)==0)
                       {
                                  c=b=a; //x0=a 
                                  ok==1;                                      
                       }
                       
                       if(f(b)==0)
                       {
                                  c=a=b; //x0=b  
                                  ok==1;                                 
                       }
            }                       
       }
       while(((f(a)-f(b))>(g)) && (ok!=1));       
       anzit++;
       x0=c;

}

// TA c)

int main (void)
{
    double x0, x;
    double a, b, g;
    int anzit;      //Anzahl der Iterationsschritte
    
    
    printf("Zur Auswahl einer Funktion f, geben Sie bitte eine Zahl zwischen 1 und 5 ein.\n");
	scanf("%d", &fn);

	printf("Geben Sie die Intervallgrenze a ein: ");
	scanf("%lf", &a);

	printf("Geben Sie die Intervallgrenze b ein: ");
	scanf("%lf", &b);

	printf("Geben Sie die Genauigkeit an: ");
	scanf("%lf", &g);

    // Ergebnis:
    x=nullstelle(a, b, g); //Funktionsaufruf
    
       printf("Ergebnis der ausgewaehlten Funktion ist: %lf\n", f(x));
       printf("f(x0) = %lf\n", f(x0));
       printf("Anzahl der Iterationsschritte: %d\n", &anzit);
    
	system ("pause");
	return 0;
}