All pastes #65081 Raw Edit

blah

public text v1 · immutable
#65081 ·published 2006-06-13 11:21 UTC
rendered paste body
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>

int fn;      //Funktionsnummer GLOBAL

double f(double,int);
int nullstelle(double a,double b,double g,int *ok,double *x0,int fn);

int main(void)
{
    //Definitionen
    char *eingabe;
    double x;    //Funktionswert
    double a,b;     //Intervallgrenzen
    double g;        //Genauigkeit
    int anzit,ok;    // Übergabe der Interationen aus Funktion nullstelle
    double x0;        //Rückgabewert
    
    //Deklarationen
    x=0;
    fn=0;
    a=b=0;
    g=0;
    
    //Main
    printf("Aufgabe 4: Nullstellensuche\n");
    printf("Bitte die gewuenschte Funktion auswaehlen:\n");
    printf("  1) sin(x)\n");
    printf("  2) e^x-5x+1\n");
    printf("  3) x^2-2\n");
    printf("  4) 1/7+1/x\n");
    printf("  5) 2x-2\n\n");
    printf("Bitte waehlen:");
    scanf("%d",&fn);  //einlesen der funktionsnummer
    
    
    if ((fn<1)||(fn>5)){printf("Ungueltige Fkt., Standard gewaehlt.\n");fn=1;} // Falls keine Gültige eingabe FN 1 gewählt
    fflush(stdin);
    
    
    printf("\n\nFunktion erfolgreich gewaehlt...\n\n");
    printf("Intervallsgrenzen waehlen:\n");
    printf(" untere Grenze a: ");
    scanf("%lf",&a);
    printf("\n obere Grenze b: ");
    scanf("%lf",&b);






   
    printf("\n absolute Genauigkeit g: ");
    scanf("%lf",&g);
    
    if ((g<=0)){printf("Ungueltiger oder unsinniger Wert, Standard gewaehlt.\n");g=0.1;}
    fflush(stdin);
    
    printf("\n\nSie haben a:%lf, b:%lf, g:%lf gewaehlt.\n\n",a,b,g);
    
    anzit=nullstelle(a,b,g,&ok,&x0,fn); // Aufruf der funktion Nullstelle mit Werten von a b g und adressen von ok x0 fn
    if (ok==1)
    {
        printf("Berechnung erfolgreich, Nullstelle bei x=%.10lf\n",x0);
        printf("Anzahl der benoetigten Iterationsschritte: %d\n\n",anzit);
        printf("Zur Kontrolle: f(x0)=%.10lf",f(x0,fn));
    }
    else
    {
        printf("Berechnung nicht erfolgreich, keine Nullstelle\n");
        printf("Wird beendet...\n\n");
    }    
    getch();
    return 0;




}

double f(double x,int fn)      //Funktion zur auswahl der Rechenfunktion mittles übergebenene Wertes fn
{
    switch (fn)
    {
        case 1:
            return sin(x);
            break;
        case 2:
            return exp(x)-5*x+1;
            break;
        case 3:
            return x*x-2;
            break; 
        case 4:   
            if (x=0);
            return 1/7+1/x;
            break;
        case 5:
            return 2*x-2;
            break;
        default:
            printf("Ungueltige Funktion!\n\n");
            break;
    }
}                

int nullstelle(double a, double b, double g, int *ok, double *x0, int fn)   // Funktion Nullstelle einlesen der parameter a,b Genauigkeit g  etc.
{
    double mittel;
    double unten, oben;
    int iterationen;
    double temp;
    
    temp=0;
    unten=a;
    oben=b;
    iterationen=0;
    
        while ((oben-unten)>g) //Solange oben - unten grosser genauigkeit mache -->
        {
            iterationen++;   // Erhöhung interationen
            mittel=(unten+oben)/2;  // Mittel ausrechnen oben und unten durch 2
            printf("Untere Grenze: %3.5lf      Mittelwert: %3.5lf         Obere Grenze: %3.5lf",unten,mittel,oben);
            if (f(unten,fn)*f(mittel,fn)<0) // Formel zum berechnen der Nullstelle
            {
                printf(" (*)\n");
                oben=mittel;
            }
            else if ((f(unten,fn)*f(mittel,fn)==0))
            {//printf("Nullstelle gefunden");
            break;
            }    
            
            else
            {
                printf("\n");
                unten=mittel;
            }
        }    
        if ((f(unten,fn)*f(oben,fn))<0)
        {
            *ok=1; //Übergabe der 1 an die Adresse des Pointers
            
            //ohne Interpolation:*x0=mittel;
            //mit Interpolation:
            
            mittel=(unten+oben)/2;            //Berechnung ohne Interpolation
            printf("\nohne Interpolation: %.10lf, Abweichung %.10lf\n",mittel,f(mittel,fn));
            
            //      a - f (a)     * ( b - a    / f (b)     - f(a))          // Interpolations Formel   
            temp=unten-f(unten,fn)*(oben-unten)/(f(oben,fn)-f(unten,fn));  // Berechnung mit Interpolation
            *x0=temp;                                                      // Übergabe des Wertes temp an die adresse des Pointer
            printf("mit Interpolation:  %.10lf, Abweichung %.10lf\n\n",temp,f(temp,fn));
            return iterationen;
        }
        else
        {
            *ok=0;
            *x0=0;
            return iterationen;
        }    
system("PAUSE");
}    

// NULLSTELLEN PRUEFEN