Temperatur mit max. und min.-Wert bestimmung in einem Array



  • TIPP: wie wärs mit Bedingte Bewertung/Ausdrücke...



  • c2010 schrieb:

    TIPP: wie wärs mit Bedingte Bewertung/Ausdrücke...

    ganz schlecht.



  • Auch wenn es hier vermutlich nicht verwendet werden darf - der Vollständigkeit wegen möchte ich gerne auf std::min und std::max hinweise.



  • Du meinst wohl eher min_element und max_element...



  • daddy_felix schrieb:

    [...] der Vollständigkeit wegen möchte ich gerne auf std::min und std::max hinweise.

    Nathan schrieb:

    Du meinst wohl eher min_element und max_element...

    Oder gar minmax_element(). 🙂



  • äh... klar. War wohl doch zu früh heute Morgen...



  • Dann sollte der Vollständigkeit halber aber auch noch std::distance erwähnt werden. Irgendwie will man ja auch noch rausbekommen, an welcher Station das Minimum/Maximum gemessen wurde.



  • Das überfordert mich jetzt total 😕 😕 😮
    kann mir einer bitte meinen Quelltext überarbeiten / mich gezielt drauf hinweisen, oder Teilstücke verraten ? Wäre echt super, stecke leider total in einer gedanklichen Sackgasse 😞





  • Die offensichtliche Lösung in C++ - unter Benutzung der Standardbibliothek - sähe vielleicht so aus:

    #include <algorithm>  // minmax_element
    #include <iostream>   // cout
    
    typedef double temperature;
    const int nstations = 6;
    
    void print(const temperature *first, const temperature* last){
      int i = 1;
      while(first!=last)
        std::cout << "Temp an Station " << i++ << ": " << *first++ << "°\n";
    }
    
    int main(){
      using namespace std;
      temperature stations[nstations] = { 74., -54., 67., 0., 120.0, 42 };
      print( stations, stations+nstations );
      const auto minmax = minmax_element( stations, stations+nstations );
      cout << "Minimalwert " << *minmax.first  << "° an Station " << minmax.first-stations+1  << ".\n";
      cout << "Maximalwert " << *minmax.second << "° an Station " << minmax.second-stations+1 << ".\n";
    }
    

    Das ist aber sicher nicht Zweck des ganzen.

    Mein Ratschlag:
    erstelle eine Funktion

    const temperature* min(const temperature* first, const temperature* last);
    // Gibt einen Zeiger auf den minimalen Temperaturwert im Array [first, last) zurück.
    // Ist kein Minimum vorhanden gibt min() first zurueck.
    // Sind mehrere (gleiche) Minima vorhanden gibt min() das erste zurueck.
    

    Dann noch eine Funktion max(), die das gleiche für ein Maximum macht.

    Die Stationsnummer errechnest Du dann über Zeigerarithmetik (wie oben).

    Als Tipp noch: Du nimmst zu Beginn Deiner Funktionen an, dass der erste Wert das Minimum/Maximum ist, danach vergleicht Du alle Werte und setzt gegebenenfalls das Minimum neu.



  • Ähhm, sorry.
    Vielleicht eher so:

    const temperature* min(const temperature* first, const temperature* last);
    // Gibt einen Zeiger auf den minimalen Temperaturwert im Array [first, last) zurück.
    // Sind mehrere (gleiche) Minima vorhanden gibt min() das erste zurueck.
    // Gibt last zurueck wenn das Array leer ist
    


  • #include <algorithm>
    

    sagt mir garnicht 😮
    und der rest verwirrt mich auch total, wirkt alles sehr kompilziert.
    Ist mein Quelltext denn sooo falsch ? Da Fehlen doch eigentlich nur kleinigkeiten oder ? 😞



  • Nathan schrieb:

    Solltest du nicht eine globale Konstante benutzen für die Größe des Arrays?
    Du machst bei der Ermittlung von min und max einen Denkfehler.
    min und max werden bei jedem Durchlauf der Schleife neu erstellt. Deshalb kann man sich nicht darauf verlassen, dass sie die gleichen Werte beibehalten werden. Du musst sie außerhalb der Schleife definieren und initialisieren. Außerdem sollten sie nicht den Wert speichern, sondern den Index (Datentyp unsigned int reicht hierfür aus, du brauchst kein float).
    Dann überprüfst du für jeden Wert im Array:
    Ist er kleiner als array[min]? Wenn ja, weise min den akutellen Index zu.
    Ist er größer als array[max]? Wenn ja, weise max den aktuellen Index zu.
    Zum Schluss gibst du array[min] und array[max] aus.

    Nein, dein Quelltext ist nicht falsch.
    Er ist nur überflüssig, weil die Standardlib das bereits bietet.



  • c++neuling92 schrieb:

    #include <algorithm>
    

    sagt mir garnicht 😮
    und der rest verwirrt mich auch total, wirkt alles sehr kompilziert.
    Ist mein Quelltext denn sooo falsch ? Da Fehlen doch eigentlich nur kleinigkeiten oder ? 😞

    Glaub mir: schreib eine Funktion, die nur das Minimum bestimmt. Und sieh dann weiter. Wenn Du soweit bist ist der Rest ein Kinderspiel.

    Die Loesung Ausgabe/min/max in einer Funktion ist unübersichtlich und nicht schoen.

    Vergiss das #include <algorithm> für den Moment.



  • void eingabe(int xFeld[5]) { 
        for (int schleife = 0; schleife < 5; schleife++) { 
            int max = 1;
            cout << "Bitte die Temp der " << schleife + 1 << ". Station eingeben: "; 
            cin >> xFeld[schleife]; 
            if(!(xFeld < max))
               {
                 max = wert;
               }
    cout << max;   
     } 
        }
    

    jetzt sagt er mit aber aber "error c2446 "<" keine konvertierung von "int" in "int" [].
    Und noch vieles vieles mehr 😞



  • Habe das ganze wieder etwas abgespeckt zum testen,
    jetzt setzt der das Programm immerhin schon mal um. Aber der Max-Wert ist
    irgendeine x beliebige Zahl.

    #include <iostream> 
    
    using namespace std;
    
    void eingabe(int Feld[5]) 
    {
    	int max = Feld[1];
    	int schleife;
    	for (schleife = 0; schleife < 5; schleife++) {
    
    		cout << "Bitte die Temp der " << schleife + 1 << ". Station eingeben: ";
    		cin >> Feld[schleife];
    
    		}
    	if (max < Feld[schleife])
    	{
    			max = Feld[schleife];
    
    	}
     cout << "Der Max-Wert betraegt: " << max << endl;
    }
    
    int main()
    {
    	int zahlenFeld[5];
    	eingabe(zahlenFeld);
    	getchar();
    	getchar();
    	return 0;
    }
    


  • Du weist max eine Zufallszahl zu, liest 5 Werte ein und vergleichst max mit einer weiteren Zufallszahl. Die grössere der beiden gibst du aus. Worüber wunderst du dich?



  • Warum bestehst Du darauf, dass Deine Funktion mehrere Dinge gleichzeitig erledigt?

    Wenn Du auf die Eingabe durch den Benutzer bestehst, sehe ich die Teilprobleme:
    - Eingabe
    - Ausgabe
    - Minimum suchen / ausgeben
    - Maximum suchen / ausgeben

    Eingabe() hast Du ja quasi schon geschrieben

    void eingabe(int Feld[5])
    {
       int schleife;
       for (schleife = 0; schleife < 5; schleife++)
       {
         cout << "Bitte die Temp der " << schleife + 1 << ". Station eingeben: ";
         cin >> Feld[schleife];
       }
    }
    

    Die max() Funktion ist in Deiner Version von eingabe() auch schon versteckt und muss nur herausgelöst werden:

    void max(int Feld[5])
    {
      int max = Feld[1];  // obacht: indiziert wird mit 0 beginnend! Is' aber hier egal...
      int schleife;
      for (schleife = 0; schleife < 5; schleife++)
      {   
        if (max < Feld[schleife])
        {
          max = Feld[schleife];       
        }
      }
      cout << "Der Max-Wert betraegt: " << max << endl;
    }
    

    Das war's auch schon. Ich habe Die Funktionalitäten Deiner Funktion nur getrennt.



  • okay, cool.
    jetzt gibt er mir den max wert aus. nur wie kann ich jetzt noch die Station ermitteln wo der max wert her kommt ?



  • c++neuling92 schrieb:

    okay, cool.
    jetzt gibt er mir den max wert aus. nur wie kann ich jetzt noch die Station ermitteln wo der max wert her kommt ?

    Na komm...! Du merkst Dir in einer weiteren Variable den Index des Maximums?!


Anmelden zum Antworten