Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Anfänger hat ein Problem mit Funktionen

Empfohlene Antworten

Veröffentlicht

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

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

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

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.

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?

Stimmts?

Ja, genau. :)

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.