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