Compiler gibt falsches Ergebnis aus



  • Hey Leute,
    ich übe mich gerade in C++ und sitze momentan an einer Aufgabe in welcher ich mir die Durchschnittstemperatur ausgeben lassen möchte. Doch leider liefert der Compiler mir jedes mal ein falsches Ergebnis und ich komme einfach nicht drauf woran es liegen könnte. Vielleicht kann mir ja hier jemand helfen 🙂

    #include <iostream>
    using namespace std;
    struct wetterdaten {
        int datum;          // nur Tag, 1 für 1.Juni
        float temp;         // in Grad Celsius
        char wetter[50];    // Beschreibung des Wetters
        float niederschlag; // in mm
    };
    int main() {
        wetterdaten juni[30];
        juni[0].datum = 1;
        juni[0].temp = 22;
        juni[0].wetter[50] = 'Sonne';
        juni[0].niederschlag = 0;
        juni[1].datum = 2;
        juni[1].temp = 28;
        juni[1].wetter[50] = 'Sonne';
        juni[1].niederschlag = 0;
        juni[2].datum = 3;
        juni[2].temp = 20;
        juni[2].wetter[50] = 'Regen';
        juni[2].niederschlag = 15;
        juni[3].datum = 4;
        juni[3].temp = 23;
        juni[3].wetter[50] = 'Sonne';
        juni[3].niederschlag = 0;
        juni[4].datum = 5;
        juni[4].temp = 19;
        juni[4].wetter[50] = 'Regen';
        juni[4].niederschlag = 15;
        float dt;  //=Durchschnittstemperatur
        float sum; // Summe Temperatur
        for (int i = 0; i < 5; i++) {
            sum = 0;
            if (juni[i].wetter[50] == 'Sonne') {
                sum = sum + juni[i].temp;
                dt = sum / i;
            }
        }
        cout << "Durchschnittstempretatur an regenfreien Tagen im Juni: " << dt << endl;
        return 0;
    }
    

    wäre cool wenn mir jemand schnell helfen könnte 🙂

    Mod-Edit (camper): Code-Tags + clang-format



  • 1. Schalte die Warnungen, deines Compiler an.
    2. Initialisiere die Variable sum VOR der Schleife.
    3. Lerne den richtigen Umgang mit Arrays.

    VG Martin



  • Und was ist das falsche Ergebnis? Was wäre das richtige? Warum benutzt du keine Codetags?



  • 1. verwende für Texte den Typ std::string statt char[]:
    #include <string>

    struct ...{ ...
    std::string wetter;
    ...}

    2. String Literale (Text-Konstanten) schreibt man mit "..." und nicht mit '...':
    juni[2].wetter = "Regen";



  • manni66 schrieb:

    Und was ist das falsche Ergebnis? Was wäre das richtige? Warum benutzt du keine Codetags?

    Er gibt als Durchschnittstemp: 1,14368e+033 aus



  • kathanaa schrieb:

    manni66 schrieb:

    Und was ist das falsche Ergebnis? Was wäre das richtige? Warum benutzt du keine Codetags?

    Er gibt als Durchschnittstemp: 1,14368e+033 aus

    Beachte Punkt 2 und 3 meines Beitrags, dann wird es funktionieren.

    Noch ein Tip: Initialisere dt. Dann siehst Du möglicherweise den Mist, den Du programmiert hast.

    VG



  • Die Variable dt wird nie mit einem Wert beschrieben.

    Dein Vergleich mit 'Sonne' sollte immer falsch sein, denn C-Strings werden nicht mit == verglichen.

    Aber deine Berechnung ist auch sonst komplett falsch, denn du berechnest nicht die Durchschnittstemperatur aus den Sonnentagen.
    Am ersten Tag sollte schon ein "Division by Zero Error" kommen.



  • Da ist noch mehr im Argen:

    ...
    juni[0].wetter[50]='Sonne';
    ...
    if (juni[i].wetter[50]=='Sonne') 
    ...
    

    Das kompiliert bei mir nicht mal...
    Wenn du unbedingt C-artige Strings benutzen möchtest/musst dann benutz´ auch die String-Funktionen aus string.h bzw cstring . Ansonsten tu dir selbst einen Gefallen und benutz' std::string .


  • Mod

    DirkB schrieb:

    Am ersten Tag sollte schon ein "Division by Zero Error" kommen.

    float-Division durch 0 geht in Ordnung.



  • DocShoe schrieb:

    Da ist noch mehr im Argen:

    ...
    juni[0].wetter[50]='Sonne';
    ...
    if (juni[i].wetter[50]=='Sonne') 
    ...
    

    Das kompiliert bei mir nicht mal...
    Wenn du unbedingt C-artige Strings benutzen möchtest/musst dann benutz´ auch die String-Funktionen aus string.h bzw cstring . Ansonsten tu dir selbst einen Gefallen und benutz' std::string .

    Das wundert mich auch, daß der Compiler das übersetzt. Bin mit jetzt aber nicht sicher, ob der Standard erlaubt, Zeichenliterale mit mehr als einem Zeichen anzugeben und wie das zu bewerten ist. Da der Compiler des TE den Schmarrn übersetzt, nehme ich mal an, daß er irgendwas macht.

    Egal was, hier

    juni[0].wetter[50]='Sonne';

    wird was reingeschrieben, um es da

    juni[0].niederschlag=0;

    sofort wieder zu überschreiben.

    Deshalb wird das

    juni[i].wetter[50]=='Sonne'

    nie erfolgreich sein.

    Denn

    struct wetterdaten
    {
    int datum; //nur Tag, 1 für 1.Juni
    float temp; // in Grad Celsius
    char wetter[50]; //Beschreibung des Wetters
    float niederschlag; //in mm
    };
    

    Typischer Anfängerfehler eben.

    VG



  • mgaeckler schrieb:

    ...
    juni[0].wetter[50]='Sonne';
    ...
    if (juni[i].wetter[50]=='Sonne')
    ...
    

    Das wundert mich auch, daß der Compiler das übersetzt.

    juni[0].wetter[50] ist ein char, der auch noch außerhalb des Arrays liegt.
    'Sonne' ist ein char mit mehr als einem Zeichen. Das gibt eine Warnung.
    (Man könnte sich jetzt mit ASCII und Hextabelle ausrechnen, welcher 5-Byte-Wert das jetzt ist)

    Jedenfalls ist der in juni[0].wetter[50] abgelegte Teil von 'Sonne' ein anderer Wert als 'Sonne'

    Bei juni[0].wetter[50]= 215784379; fällt es eher auf



  • hier nen c/c++ mischmasch, der das tut, was du möchtest, aber aus vielerlei gründen nicht empfehlenswert ist 😉

    #include <iostream> 
    #include <cstring> 
    
    using namespace std; 
    
    struct wetterdaten 
    { 
      int datum; //nur Tag, 1 für 1.Juni --> dann nenn es doch tag!
      float temp; // in Grad Celsius
    
      float niederschlag; //in mm --> niederschlag_in_mm wäre doch besser?!
    
    //c++-weg: std::string wetter; -> erfordert #include <string>
    
    //c - weg:
      char wetter[50]; //Beschreibung des Wetters
    
    }; 
    
    int main() 
    {
      const unsigned ITEM_COUNT = 2;
      wetterdaten juni[ ITEM_COUNT ]; 
    
      juni[0].datum=1; 
      juni[0].temp=22; 
    //  juni[0].wetter = "Sonne"; -- so einfach gehts mit string
      std::strcpy( juni[0].wetter, "Sonne" ); 
      juni[0].niederschlag=0; 
    
      juni[1].datum=2; 
      juni[1].temp=28; 
      std::strcpy( juni[1].wetter, "Wolken" );
      juni[1].niederschlag=0; 
    
      float sum = 0; //Summe Temperatur 
      unsigned sonnige_tage = 0;
    
      for (int i=0; i != ITEM_COUNT; i++) 
      {
    //  if( juni[i].wetter == "Sonne" ) -- so einfach gehts mit string
        if(! std::strcmp(juni[i].wetter, "Sonne") ) 
        {
          ++sonnige_tage;
          sum += juni[i].temp; 
        } 
      } 
    
      cout << "Durchschnittstempretatur im Juni: " << sum / sonnige_tage << endl; 
    
      return 0;
    }
    

Log in to reply