welcher compiler, welches system, wie sieht die make aus, welche optimierung hast du eingschaltet?
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; }
welcher compiler, welches system, wie sieht die make aus, welche optimierung hast du eingschaltet?
benutze einen Bloodshed C/C++ compiler, BS Windows XP
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.
[EDIT]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.[/EDIT]
Hier mal ein auch fuer dich verstaendliches Stueck Code um das ganze zu demonstrieren.
Und die Ausgabe dazu:Code:#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); }
Code: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.
Du bekommst zusaetzlich noch falsche Ergebnisse, da die Funktion nullstelle nichts zurueck gibt. Ich habe zumindest kein Return gefunden ...
MfG,
Kiraminh
Hab die Lösung auf das Problem schon gefunden.
Gruß
wodka_cheery
Lesezeichen