Minimum berechnen



  • Hallo zusammen,

    ich würde mir gerne das Minimum aus 4 verschiedenen integer Variablen berechnen lassen.
    Für 2 oder 3 dieser Variablen funktioniert das mit std::min noch recht gut, für 4 Variablen allerdings nicht mehr... Gibt es etwas ähnliches zu std::min, was mir das Minimum für mehrere Zahlen berechnet??

    Viele Grüße und Danke vorab!



  • std::min_element



  • wie wäre es einfach mit ner schleife und einer if?
    in etwa so:

    int zahlen[4]={1,2,3,4};
    int array_gr=sizeof(zahlen)/sizeof(int);
    
    for(int x=0;x<array_gr;x++)
    {
    
     if(min<zahlen[x])
     {
       min = zahlen[x];
     }
    
    }
    

    🙄



  • Hallo Calcio24,

    das geht mit beliebig vielen Variablen (wenn du es richtig verschachtelst):

    int minimum = std::min( std::min( std::min(a, b), c), d);
    


  • MfG schrieb:

    int zahlen[4]={1,2,3,4};
    int array_gr=sizeof(zahlen)/sizeof(int);
    
    for(int x=0;x<array_gr;x++)
    {
    
     if(min<zahlen[x])
     {
       min = zahlen[x];
     }
    
    }
    

    replace("min", "max");



  • Verschachteln funktioniert super!

    Danke 🙂



  • hardware schrieb:

    MfG schrieb:

    int zahlen[4]={1,2,3,4};
    int array_gr=sizeof(zahlen)/sizeof(int);
    
    for(int x=0;x<array_gr;x++)
    {
    
     if(min<zahlen[x])
     {
       min = zahlen[x];
     }
    
    }
    

    replace("min", "max");

    wieso replace(min,max) - was willst du damit aussagen?
    min enthält das minium der werte im array...!
    was willst du da noch mit replace? -> das ist soweit ich weiß eh eine string funktion... 🙄



  • MfG schrieb:

    wie wäre es einfach mit ner schleife und einer if?
    in etwa so:

    int zahlen[4]={1,2,3,4};
    int array_gr=sizeof(zahlen)/sizeof(int);
    
    for(int x=0;x<array_gr;x++)
    {
    
     if(min<zahlen[x])
     {
       min = zahlen[x];
     }
    
    }
    

    🙄

    Der Vergleich bei if ist falsch (Argumente vertauscht). min muss anfangs entweder auf den Wert des ersten Array-Elementes oder auf den grössten möglichen Wert des Datenttypen gesetzt werden. Wieso du array_gr variabel machen möchtest und wieso du es überhaupt eine Variable dafür benutzt ist mir schleierhaft. Ausserdem ist es oftmals gewünscht, einen Zeiger auf das kleinste Element zu haben, nicht nur den Wert des Elements selbst (damit lässt sich ja nichts verändern).

    MfG schrieb:

    wieso replace(min,max) - was willst du damit aussagen?
    min enthält das minium der werte im array...!
    was willst du da noch mit replace? -> das ist soweit ich weiß eh eine string funktion... 🙄

    Damit meint er dass dein Code falsch ist und dass du damit eigentlich das grösste ( max ) Element bestimmst.



  • asfdlol schrieb:

    MfG schrieb:

    wie wäre es einfach mit ner schleife und einer if?
    in etwa so:

    int zahlen[4]={1,2,3,4};
    int array_gr=sizeof(zahlen)/sizeof(int);
    
    for(int x=0;x<array_gr;x++)
    {
    
     if(min<zahlen[x])
     {
       min = zahlen[x];
     }
    
    }
    

    🙄

    Der Vergleich bei if ist falsch (Argumente vertauscht). min muss anfangs entweder auf den Wert des ersten Array-Elementes oder auf den grössten möglichen Wert des Datenttypen gesetzt werden. Wieso du array_gr variabel machen möchtest und wieso du es überhaupt eine Variable dafür benutzt ist mir schleierhaft. Ausserdem ist es oftmals gewünscht, einen Zeiger auf das kleinste Element zu haben, nicht nur den Wert des Elements selbst (damit lässt sich ja nichts verändern).

    MfG schrieb:

    wieso replace(min,max) - was willst du damit aussagen?
    min enthält das minium der werte im array...!
    was willst du da noch mit replace? -> das ist soweit ich weiß eh eine string funktion... 🙄

    Damit meint er dass dein Code falsch ist und dass du damit eigentlich das grösste ( max ) Element bestimmst.

    ups, stimmt hab die argumente vertauscht sry...
    hatte ich eben erst gesehen... *schäm*
    klar gehts schöner oder anders... 🙂
    das mit sizeof-> array_gr war einfach nur zur verdeutlichung des prinzips... 😃



  • Was spricht denn gegen

    int m = std::min( std::min( a,b ), std::min( c,d ) );
    

    Ansonsten lässt sich unter C++11 mit variadic Templates bestimmt eine Funktion basteln, der man beliebig viele Argumente mitgeben kann und die den kleinsten Wert zurückgibt. Leider habe ich keinen C++11 Compiler, aber es wird bestimmt gleich jemand die C++11 Lösung posten.

    std::min_element ist nach wie vor eine gute Option, wenn die Eingabemenge irgendwie iterierbar ist.


  • Mod

    C++11 hat

    std::min({a,b,c,d});
    


  • Ich würde sortieren lassen und der erste Wert ist doch dann das Minimum, oder?



  • Citizen42 schrieb:

    Ich würde sortieren lassen und der erste Wert ist doch dann das Minimum, oder?

    Ja, das ist aber viel zu aufwändig.



  • Citizen42 schrieb:

    Ich würde sortieren lassen und der erste Wert ist doch dann das Minimum, oder?

    O(n)O(n) gegen O(nlogn)O(n \log n)...



  • Ja, ihr habt recht. Eine komplette Sortierung ist natürlich viel aufwändiger als einmal durch zu iterieren und sich das Minimum zu merken.


Log in to reply