PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem: Unterprogramme mit Nullstellensuche



wodka_cheery
10.12.2007, 19:14
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:




# 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;
}

roboterheld
10.12.2007, 19:25
welcher compiler, welches system, wie sieht die make aus, welche optimierung hast du eingschaltet?

wodka_cheery
10.12.2007, 20:09
benutze einen Bloodshed C/C++ compiler, BS Windows XP

fluchtpunkt
11.12.2007, 15:03
schnapp dir endlich mal ein Buch ueber die Grundlagen von C, und lese insbesondere die Kapitel ueber die Gueltigkeit von Variablen, lokalen Variablen und globalen Variablen.
Und wenn du schon dabei bist und deine naechste Frage sein wird wie du x0 und anzit aus der Funktion wieder herausbekommst lese am besten gleich die Kapitel ueber Zeiger (da findest du dann auch gleich die Erklaerung was das & eigentlich macht bzw in deinem Code nicht macht) und/oder structs gleich mit. Oder les am besten das ganze Buch von Seite 1 an.
Und weil wir schon dabei sind, es ist oft unsinnig x=foo(); zu schreiben wenn in foo() nichts per return zurueckgegeben wird.
Das sollten erstmal die groebsten "Syntax"-Fehler sein die mir beim ueberfliegen aufgefallen sind.


Hier mal ein auch fuer dich verstaendliches Stueck Code um das ganze zu demonstrieren.



#include <stdio.h>

void test(void)
{
int a,b;
a = 1;
b = 2;
printf("In der Funktion test a = %d, b = %d.\n",a,b);
}

int main(void)
{
int a,b;
a = 111;
b = 222;
printf("vor dem Aufruf von test a = %d, b = %d.\n",a,b);
test();
printf("Nach dem Ablauf von test a = %d, b = %d.\n",a,b);
}

Und die Ausgabe dazu:

vor dem Aufruf von test a = 111, b = 222.
In der Funktion test a = 1, b = 2.
Nach dem Ablauf von test a = 111, b = 222.

Kiraminh
11.12.2007, 18:08
Du bekommst zusaetzlich noch falsche Ergebnisse, da die Funktion nullstelle nichts zurueck gibt. Ich habe zumindest kein Return gefunden ...

MfG,
Kiraminh

wodka_cheery
11.12.2007, 22:34
Hab die Lösung auf das Problem schon gefunden.:)

Gruß
wodka_cheery