nan Ausgabe bei Berechnung einer Fläche



  • Hallo Zusammen. Ich bin recht neu im Gebiet und bräuchte eure Unterschützung.
    Für eine Aufgabenstellung Flächenberechnung eines Dreiecke mit dem Satz des Heron bekomme ich in meinem Programmcode nur die Endausgabe nan. Nach erfolgloser Suche komm ich nun nicht weiter.
    Mir ist aufgefallen, wenn ich meine Variablen feste Werte zuweise bekomme ich eine berechnete Ausgabe. Wo liegt mein Fehler Danke für eure Hilfe.

    #include <iostream>
    #include <cmath>
    using namespace std;

    int main()
    {

    float a;
    float b;
    float c;
    float s = (a + b + c) / 2;
    float flaeche;
    // float flaeche2;

    cout << "Bitte gib Seite a ein" << endl;
    cin >> a;

    cout << "Bitte gib Seite b ein" << endl;
    cin >> b;

    cout << "Bitte gib Seite c ein" << endl;
    cin >> c;

    if (a + b > c)
    {

    flaeche = sqrt (s * (s - a) * (s - b) * (s-c));
    // Möglichkeit 2
    // flaeche2 = sqrt (flaeche);

    cout << flaeche << endl;
    }
    else
    {
    cout << "falsche Maße" << endl;
    }
    system("PAUSE");
    return EXIT_SUCCESS;
    }



  • @steven-w sagte in nan Ausgabe bei Berechnung einer Fläche:

    int main()
    {
    float a;
    float b;
    float c;
    float s = (a + b + c) / 2;

    Weder a, b noch c haben einen definierten Wert. Du darfst hier noch nicht mit diesen Variablen rechnen (das ist undefiniertes Verhalten).
    Der Wert von s wird IN DIESER ZEILE berechnet, also BEVOR du den Benutzer die Werte eingeben lässt. Diese Zuweisung passiert an dieser Stelle EINMALIG und hängt nicht davon ab, was später in a, b oder c steht.

    TLDR: Verschiebe die Zuweisung von s soweit nach hinten, dass dort schon gültige Werte in a, b und c stehen.

    WICHTIGER Ratschlag: AKTIVIERE COMPILERWARNUNGEN! (in all-Caps, weil so wichtig). Dann sagt dir dein Compiler sowas wie

    warning: variable 'a' is uninitialized when used here [-Wuninitialized]
    float s = (a + b + c) / 2;
               ^
    


  • float s = (a + b + c) / 2; berechnest du zu früh - lass dir den Wert von s mal ausgeben (dies ist dann übrigens UB, d.h. es kann jeder mögliche Wert herauskommen).

    Erst nach der Eingabe von den 3 Werten kannst du s berechnen lassen.



  • Super danke für eure Hilfe, es hat funktioniert und ich habs verstanden. 👦



  • @wob sagte in nan Ausgabe bei Berechnung einer Fläche:

    WICHTIGER Ratschlag: AKTIVIERE COMPILERWARNUNGEN!

    Und beachte die Warnungen und beseitige deren Ursache.

    Wenn du den Grund der Warnung (noch) nicht verstehst, kannst du gerne im Forum fragen.



  • Könnt ihr mir sagen, wo ich in codeblocks compilerwarnungen aktiviere?



  • @steven-w sagte in nan Ausgabe bei Berechnung einer Fläche:

    Könnt ihr mir sagen, wo ich in codeblocks compilerwarnungen aktiviere?

    Menüpunkt "Project"->"Build Options"
    Reiter "Compiler Settings" und da "Compiler Flags" im Bereich "Warnings" (etwas runter scrollen)

    Wie der Schalter konkret heißt, hängt vom Compiler ab -Code::Blocks kann mit vielen Compilern umgehen.

    Beim gcc wäre das -Wall (war bei Neuinstallation und neuem Projekt schon ausgewählt)
    -Wextra und -Wpedantic kannst du auch nehmen - das gibt noch mehr Warnungen, denn -Wall hat doch nicht alle.

    Weiter unten kannst du auch die Optimierungsstufe einstellen, weiter oben den Sprachstandard.


Log in to reply