Anel Geschrieben 30. November 2010 Teilen Geschrieben 30. November 2010 Hallo! ich bin ein Anfänger in Sachen Programmierung und habe folgende Aufgabenstellung: Schreiben Sie eine C-Funktion "fct" mit einem reellen Parameter "x", die in ihrem Rumpf den Funktionswert "f(x)" verschiedener reellwertiger Funktionen "f" berechnet und diesen Wert an einen Aufrufer zurückgibt. Ein zweiter Parameter "fn" der C-Funktion bestimmt, welche reellwertige Funktion "f" zu verwenden ist: fn = 1: f(x) = sin(x) fn = 2: f(x) = e^x -5x + 1 ... sonst: f(x) = 0 Wenn ich das ganze ohne die Funktion fct schreibe, funktioniert es, aber wenn ich die Funktion reinschreibe, bekomme ich falsche Ergebnisse. :confused: :eek Sieht da jemand den Fehler? Ich sitze schon seit Tagen an diesem Problem. Also ich habe folgenden Code (mit der Funktion fct) geschrieben: #include <stdio.h> #include <math.h> #define e = 2,71828183 int fn; //Funktionsart float x; //x-Wert float y; //y-Wert float z; //Zwischenwert float eingabe_fn(void) { fn = 0; printf("Bitte geben Sie die Funktionsart an. "); scanf("%i", &fn); return(fn); } float eingabe_x(void) { x = 0; printf("Bitte den x-Wert eingeben."); scanf("%f", &x); return(x); } float fct(fn, x) //Berechnet Funktionswert f(x) { switch (fn) { case 1: {y = sin(x); break;} case 2: {z = pow(2.71828183,x); y = z - (5*x) +1; break;} case 3: {y = pow(x,2)-2; break;} case 4: {y = (1/7)+(1/x); break;} case 5: {y = (2*x)-2; break;} default: {y = 0; break;} } return (y); } int main(void) { fn = eingabe_fn(); x = eingabe_x(); y = fct(fn, x); printf("fn = %i\n ", fn); printf("x = %f\n ", x); printf("y = %f\n ", y); return 0; } Wäre super, wenn jemand den Fehler finden würde. MfG Anel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 30. November 2010 Teilen Geschrieben 30. November 2010 #define e = 2,71828183Das = muss da weg, das Komma muss ein Punkt sein. Das Define-Symbol verwendest du allerdings gar nicht, insofern ist es egal. int fn; //Funktionsart float x; //x-Wert float y; //y-Wert float z; //ZwischenwertGlobale Variablen sind ganz schlechter Stil. Du brauchst sie nicht und solltest sie schleunigst durch lokale Variablen ersetzen. Ansonsten kannst du dir die Parameter und Rückgabewerte im Programm auch sparen, weil du damit nur Werte herumreichst, die sowieso global verfügbar sind. float eingabe_fn(void)Warum hat diese Funktion den Rückgabetyp float, wenn sie einen int einliest? return(fn);Return ist keine Funktion, lass die Klammern weg. Nur eine Stilfrage, kein Fehler. float fct(fn, x) //Berechnet Funktionswert f(x)Hier fehlen die Typen der Parameter. C89 geht in diesem Fall von int aus, und das ist hier das Hauptproblem. case 4: {y = (1/7)+(1/x);1/7 ist 0, weil hier eine Ganzzahldivision stattfindet. Nimm 1.0/7 oder so etwas, damit eine Fließkommadivision passiert. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Schandfleck Geschrieben 30. November 2010 Teilen Geschrieben 30. November 2010 #include <stdio.h> #include <math.h> #define e = 2,71828183 Die Zahl e ist in math.h schon definiert und heißt M_E. case 2: {z = pow(2.71828183,x); y = z - (5*x) +1; Anstatt pow(2.71828183,x), bzw. pow(M_E, x) kannst Du auch exp(x) verwenden. Genereller Tipp: Achte auf die Einrückungen von Funktionen und Schleifen, schreibe öffnende und die zugehörige schliessende geschweifte Klammern untereinander. Das erhöht die Übersichtlichkeit. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Anel Geschrieben 1. Dezember 2010 Autor Teilen Geschrieben 1. Dezember 2010 (bearbeitet) Vielen Dank an euch zwei! Ihr seid echt super! Darauf wäre ich nie gekommen! :uli Ich hab den Code also so verändert, wie ihr gesagt habt und es funktioniert!! Also der sieht jetzt so aus: #include <stdio.h> #include <math.h> int eingabe_fn(void) { int fn; //Funktionsart fn = 0; printf("Bitte geben Sie die Funktionsart an. "); scanf("%i", &fn); return fn; } int eingabe_x(void) { float x; //x-Wert x = 0; printf("Bitte den x-Wert eingeben."); scanf("%f", &x); return x; } float fct(int fn, int x) //Berechnet Funktionswert f(x) { float y; //y-Wert float z; //Zwischenwert switch (fn) { case 1: { y = sin(x); break; } case 2: { z = exp(x); y = z - (5*x) +1; break; } case 3: { y = pow(x,2)-2; break; } case 4: { y = (1.0/7)+(1/x); break; } case 5: { y = (2*x)-2; break; } default: { y = 0; break; } } return y; } int main(void) { float x; //x-Wert int fn; //Funktionsart float y; //y-Wert fn = eingabe_fn(); x = eingabe_x(); y = fct(fn, x); printf("fn = %i\n ", fn); //printf("a = %f", a); //printf("b = %f", ; //printf("g = %f", g); printf("x = %f\n ", x); printf("y = %f\n ", y); return 0; }[/code] Vielen Dank nochmal! Bearbeitet 1. Dezember 2010 von Klotzkopp Code-Tags hinzugefügt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Schandfleck Geschrieben 1. Dezember 2010 Teilen Geschrieben 1. Dezember 2010 Ich hab den Code also so verändert, wie ihr gesagt habt und es funktioniert! Fast. Gib mal für x Zahlen mit und ohne Nachkommastellen (bzw. Punkt) ein: 0 0.5 1 1.2 ... Die müßten alle unterschiedliche Ergebnisse liefern, oder? Tipp: Es sind zwei Stellen im Programm zu ändern. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Anel Geschrieben 2. Dezember 2010 Autor Teilen Geschrieben 2. Dezember 2010 Ja, rein rechnerisch schon. Und ich glaube ich habe die Stellen gefunden, die du meinst, nämlich folgende (int durch float ersetzt): float eingabe_x(void) { float x; //x-Wert x = 0; printf("Bitte den x-Wert eingeben."); scanf("%f", &x); return x; } float fct(int fn, float x) //Berechnet Funktionswert f(x) { Stimmts? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Schandfleck Geschrieben 2. Dezember 2010 Teilen Geschrieben 2. Dezember 2010 Stimmts? Ja, genau. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.