Zum Inhalt springen

Anfänger hat ein Problem mit Funktionen


Empfohlene Beiträge

Geschrieben

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

Geschrieben
#define e = 2,71828183
Das = 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; //Zwischenwert

Globale 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.
Geschrieben
#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.

Geschrieben (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!! :D

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! :D

Bearbeitet von Klotzkopp
Code-Tags hinzugefügt
Geschrieben
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.

Geschrieben

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?

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...