Keine Rückgabe



  • Hallo liebe Community,
    wie ihr wahrscheinlich unschwer erkennen könnt, habe ich vor Kurzem erst mit dem Programmieren begonnen. Die ersten Aufgaben liefen alle gut und ich konnte sie problemlos meistern. Jetzt allerdings stehe ich seit Tagen vor einer neuen Übung und ich komme einfach nicht weiter. Mein ungeschultes Auge findet den/die Fehler nicht. Ich habe nach meinem Wissensstand alles probiert, habe gegoogelt, Youtube Videos geschaut aber leider hat nichts weitergeholfen. Ich wäre Euch sehr dankbar, wenn ihr euch mal mein Programm anschauen und mir weiterhelfen könnt.

    [Aufgabenstellung] (http://prntscr.com/lrnwg7)

    #include <stdio.h>    
    #include <stdlib.h>    
    #include <math.h>    
     
    double fct (int fn, double x)
    {
        double y;
    
        switch (fn)
        {
        case 1: y = 2*x - 4; break;
        case 2: y = 1/3 + 1/x; break;
        case 3: y = exp(x) - 2*x - 3; break;
        case 4: y = (x - 2) * (x - 2) * (x - 2) + 2; break;
        case 5: y = sin(2*x); break;
        default: y = 0.0;
        }
        return y;
    }
    
    
    
    void nullstelle (int fn, double a, double b, double g)
    {
        double fa, fb, fm, m, x0; int anzit;
    
        fa = fct (fn, a); fb = fct (fn, b);
    
        while ((a*b)/2 > g)
        {
            m = (a+b) / 2; fm = fct (fn, m);
    
            if ((fa*fm) > 0)
            {
                a = m; fa = fm;
            }   
            if ((fb*fm) > 0)
            {
                b = m; fb = fm;
            }
            anzit ++;
        }
        x0 = m;
    }
    
    
    
    int main()
    {
        int fn, anzit; double a, b, g; float x0;
    
        printf ("1\t f(x) = 2x - 4 \n");
        printf ("2\t f(x) = 1/3 + 1/x \n");
        printf ("3\t f(x) = e^x - 2x - 3 \n");
        printf ("4\t f(x) = (x - 2)^3 + 2 \n");
        printf ("5\t f(x) = sin(2x) \n");
        printf ("sonst\t f(x) = 0 \n");
    
        while(1)
        {
            printf ("\n\nBitte geben Sie die Nummer der zu untersuchenden Funktion ein: "); scanf ("%d", &fn);
            printf ("\nBitte geben Sie ihre untere Intervallgrenze a ein: "); scanf ("%lf", &a);
            printf ("\nBitte geben Sie ihre obere Intervallgrenze b ein: "); scanf ("%lf", &b);
    
            while (fct (fn, a) * fct (fn, b) > 0)
            {
                printf ("\nf(a) und f(b) haben gleiches Vorzeichen, bitte andere Grenzen eingeben!");
                printf ("\nBitte geben Sie ihre untere Intervallgrenze a ein: "); scanf ("%lf", &a);
                printf ("\nBitte geben Sie ihre obere Intervallgrenze b ein: "); scanf ("%lf", &b);
            }
    
            printf ("\nBitte geben Sie die absolute Genauigkeit g ein, mit der die Nullstelle berechnet werden soll: "); scanf ("%lf", &g);
    
            nullstelle (fn, a, b, g);
    
            printf ("%f, %f, %d", x0, fct (fn, x0), anzit);
        }
    }


  • noch eine kleine Hilfreiche Zeichnung, wie das Programm arbeiten sollte

    [Zeichnung] (http://prntscr.com/lrnyyc)



  • @Daniel99
    wo soll denn der Wert für x0 in main herkommen?
    Das x0 in nullstelle ist eine lokale Variable

    Was der Rückgabewert einer Funktion ist, ist dir doch bekannt.



  • @Daniel99 sagte in Keine Rückgabe:

    case 2: y = 1/3 + 1/x; break;

    Beachte auch noch, dass 1/3 == 0 ist, wohingegen 1./3. == 0.333333... ist.

    Außerdem: wann willst du abbrechen?
    Wenn ich a = 0.1, b = 0.2 eingebe und eine Genauigkeit von 0,02 wünsche, ist a*b/2 = 0,01 gleich von Anfang an kleiner als g, d.h. deine while-Schleife läuft dann nie durch...



  • @DirkB

    wie bekomme ich dann den Wert der Nullstelle in main ausgegeben?



  • @wob

    diese Eingabe wird aber durch eine andere abfrage (Zeile 65) abgefangen, da in dem Bereich kein Vorzeichenwechsel stattfindet (z.B. bei 2x-4)
    aber trotzdem danke für den Hinweis. Hast du andere Fehler entdeckt die dafür sorgen dass mein Programm nicht funktioniert?



  • @Daniel99 sagte in Keine Rückgabe:

    @DirkB

    wie bekomme ich dann den Wert der Nullstelle in main ausgegeben?

    Wie bekommst du den Wert aus fct raus?



  • @Daniel99 sagte in Keine Rückgabe:

    diese Eingabe wird aber durch eine andere abfrage (Zeile 65) abgefangen, da in dem Bereich kein Vorzeichenwechsel stattfindet

    Ok, wenn du meinst...

    Deine Zeile 65 stellt sicher, dass f(a) und f(b) unterschiedliche VZ haben sollen.
    Die Zeile while ((a*b)/2 > g) soll genau was testen? Was für Einheiten haben a, b und g?

    Stell dir doch mal eine einfache lineare Funktion vor mit f(0.1) = -1 und f(0.2) = +1. Diese käme problemlos durch den Check in Zeile 65...



  • @wob

    wenn f(a) * f(b) < 0 findet ein Vorzeichenwechsel statt, also liegt zwischen a und b eine Nullstelle.

    ehrlich gesagt weiß ich nicht warum das die Abbruchbedingung ist... Die hat uns unser Dozent als Tipp vorgegeben... so wie es aussieht werde ich da wohl nochmal nachfragen müssen

    in diesem Programm werden nur die Werte für a, b und g eingegeben, f(a) und f(b) berechnen sich daraus, je nach dem welche von den 5 vorgegebenen Funktionen verwendet werden soll und eben welches a und b eingegeben wurde



  • @DirkB

    oh🤦🏼♂ 🤦🏼♂ 🤦🏼♂

    jetzt bekomme ich wenigstens Werte, sind zwar noch falsch, aber du hast mich ein Stück weitergebracht, Danke! Dass ich darauf nicht selbst gekommen bin... 😃


Anmelden zum Antworten