3 variablen kleinste zahl



  • Tim06TR schrieb:

    Ich will jetzt niemand verwirren...
    ...aber ich mag halt sinnlos komplizierte Lösungen 😃

    int main()
    {
        int a = 35;
        int b = 0;
        int c = 12;
        
        int d = (a < b || b == a) ? ( ( a < c ) ? (a) : (c) ) : ( ( b < c ) ? (b) : (c));
        cout << d;   
        return 0;
    }
    

    Christian Ivicevic schrieb:

    Es mag zwar lustig sein, sinnlos komplizierte Lösungen zu finden, aber es ist redundant bzw. ineffizient. Ich rate dir stark davon ab, weil es einen recht leicht beeinflussen kann und man später einfache offensichtliche Lösungen nicht mehr korrekt formulieren kann!

    Ich kann nichts sinnloses und auch nichts kompliziertes erkennen. Letztendlich wird genau das gleiche gemacht wie bei min(min(a,b),c) - nämlich die Verwendung von operator< und des tern. operators.
    Sinnlos ist evtl er Test auf Gleichheit (b==a).
    Was soll daran redundant oder ineffizient sein?



  • inter2k3 schrieb:

    Ich kann nichts sinnloses und auch nichts kompliziertes erkennen. Letztendlich wird genau das gleiche gemacht wie bei min(min(a,b),c)

    Nein. Er hat drei Verzweigungen. min(min(a,b),c) hat aber nur zwei Verzweigungen. Der Unterschied ist der, dass Tim zusätzlich ausrechnet, welche Variable den kleinsten Wert speichert, wohingegen min(min(a,b),c) nur den kleinsten Wert zurückgibt -- zumindest, wenn man std::min benutzt und nicht irgendein Makro.

    In einem Code-Review würde ich Tim's "Lösung" aber schon allein wegen der schlechten Lesbarkeit ankreiden. Du kannst mir jetzt nicht erzählen, dass der lange Ausdruck mit 3 ?: in einer Zeile genauso einfach zu lesen ist wie min(min(a,b),c). "Redundanz" im Sinne eines unnötig aufgeblähten Quelltextes.



  • Ich hätte das mit der Lesbarkeit nennen sollen 😛
    Aber weiterhin sollte man einfach nicht das Rad neu erfinden, sondern schon vorhandenes nehmen. So auch eine der einfachen Funktionen, die eigentlich in allen Sprachen schon definiert ist.



  • Das ist deutlich komplizierter als die Realisierung mit zwei min-Aufrufen, da dort eine implizite Hilfsvariable verwendet wird, da das Ergebnis des ersten min() als Zwischenwert auf dem Stack liegt und für den zweiten Aufruf verwendet wird. Damit wird aus:

    int d = (a < b || b == a) ? ( ( a < c ) ? (a) : (c) ) : ( ( b < c ) ? (b) : (c));
    

    das:

    int h = (a<b) ? a : b;
    int d = (c<h) ? c : h;
    

    Deswegen sind so komplizierte Lösungen meistens wenig hilfreich und allzu oft schädlich.



  • inter2k3 schrieb:

    Tim06TR schrieb:

    Ich will jetzt niemand verwirren...
    ...aber ich mag halt sinnlos komplizierte Lösungen 😃

    int main()
    {
        int a = 35;
        int b = 0;
        int c = 12;
        
        int d = (a < b || b == a) ? ( ( a < c ) ? (a) : (c) ) : ( ( b < c ) ? (b) : (c));
        cout << d;   
        return 0;
    }
    

    Christian Ivicevic schrieb:

    Es mag zwar lustig sein, sinnlos komplizierte Lösungen zu finden, aber es ist redundant bzw. ineffizient. Ich rate dir stark davon ab, weil es einen recht leicht beeinflussen kann und man später einfache offensichtliche Lösungen nicht mehr korrekt formulieren kann!

    Ich kann nichts sinnloses und auch nichts kompliziertes erkennen. Letztendlich wird genau das gleiche gemacht wie bei min(min(a,b),c) - nämlich die Verwendung von operator< und des tern. operators.
    Sinnlos ist evtl er Test auf Gleichheit (b==a).
    Was soll daran redundant oder ineffizient sein?

    An dem Code von Tim06TR ist fast alles verkehrt was nur bei Code nur verkehrt sein kann. Also abgesehen davon dass der Code (vermutlich) "korrekt" ist. Und genau darum geht's auch: er macht etwas VIEL zu unleserlich, das ist der "sinnlos" Teil. Er macht etwas "zu fuss" wozu es gute Hilfsfunktionen gibt, das ist der "redundant" Teil (+ nochmal "sinnlos").

    Dein Beitrag ist im übrigen auch "sinnlos", denn du wirst wohl recht genau gewusst haben was gemeint war bzw. was an dem Code übel ist.

    ----

    Tim06TR, bitte nicht als Angriff verstehen, aber wenn ich sowas in einem echten Programm sehe bekomme ich nen Schreikrampf.

    ps: im Übrigen kann ich mich nur dem anschliessen was Christian Ivicevic schon geschrieben hat. Gewöhn dir den Scheiss ab. Lern lieber einfachen, verständlichen, wartbaren Code zu schreiben, und gewöhn dir an so zu programmieren.



  • War doch nur ein gag 😃
    (Wieso wusste ich, dass das debattiert wird, ich habe ja auch das "sinnlos" hingewiesen, sry das nächste mal drücke ich mich deutlicher aus, FALLS es noch mal zu einem Witz kommen solllltteee 🤡 )



  • min(min(a, b), c)) hab des ganze mal mit so probiert:

    minn=min(min(min(a, b), c),d));

    wobei minn die kleinste zahl ist

    des klappt aber irgendwie nich woran kann des liegen?

    danke schon ma im vorraus 🙂



  • alex_xD schrieb:

    des klappt aber irgendwie nich woran kann des liegen?

    http://www.c-plusplus.net/forum/200753 : Stell deine Fragen präzise. Halte dich aber auch nicht zu kurz, denn ein "funktioniert nicht" wird hier meist mit Hinweisen auf die defekte Glaskugel geahndet - wir sind alle keine Wahrsager.

    minn=min(min(min(a, b), c),d));
    

    Meine Kristallkugel sagt mir, du hast eine rechte Klammer zu viel.



  • Nur so als Gag: die STL auf meinem Rechner enthält folgende (interne) Funktion:

    /**
       *  @brief Find the median of three values using a predicate for comparison.
       *  @param  a     A value.
       *  @param  b     A value.
       *  @param  c     A value.
       *  @param  comp  A binary predicate.
       *  @return One of @p a, @p b or @p c.
       *
       *  If @c {l,m,n} is some convolution of @p {a,b,c} such that @p comp(l,m)
       *  and @p comp(m,n) are both true then the value returned will be @c m.
       *  This is an SGI extension.
       *  @ingroup SGIextensions
      */
      template<typename _Tp, typename _Compare>
        inline const _Tp&
        __median(const _Tp& __a, const _Tp& __b, const _Tp& __c, _Compare __comp)
        {
          // concept requirements
          __glibcxx_function_requires(_BinaryFunctionConcept<_Compare, bool,
    				                         _Tp, _Tp>)
          if (__comp(__a, __b))
    	if (__comp(__b, __c))
    	  return __b;
    	else if (__comp(__a, __c))
    	  return __c;
    	else
    	  return __a;
          else if (__comp(__a, __c))
    	return __a;
          else if (__comp(__b, __c))
    	return __c;
          else
    	return __b;
        }
    


  • Wahrsager schrieb:

    alex_xD schrieb:

    des klappt aber irgendwie nich woran kann des liegen?

    http://www.c-plusplus.net/forum/200753 : Stell deine Fragen präzise. Halte dich aber auch nicht zu kurz, denn ein "funktioniert nicht" wird hier meist mit Hinweisen auf die defekte Glaskugel geahndet - wir sind alle keine Wahrsager.

    minn=min(min(min(a, b), c),d));
    

    Meine Kristallkugel sagt mir, du hast eine rechte Klammer zu viel.

    oh des mit der klammer stimmt ^^ aber des is es nich weil des programm wird ja ausgeführt aber er zeigt die zahl einfach nich an

    kann des sein, dass int variablen keine 0.01 erkennt?

    frage zurückgezogen (die war echt blöd) 🙂



  • int max = (a>b?(a>c?a:c):(b>c?b:c));
    

    Na?



  • Warum nicht mal eine Methode ohne ternären Operator/Branching?

    int a,b,c;
    min = (c ^ (((a ^ ((b ^ a) & -(b < a))) ^ c) & -((a ^ ((b ^ a) & -(b < a))) < c)));
    

    Oder für die Minimalsten:

    min = (c + (((a + ((b - a) & ((b - a) >> (sizeof(int) * CHAR_BIT - 1)))) - c) & (((a + ((b - a) & ((b - a) >> (sizeof(int) * CHAR_BIT - 1)))) - c) >> (sizeof(int) * CHAR_BIT - 1))));
    


  • EndlichSchnell schrieb:

    Warum nicht mal eine Methode ohne ternären Operator/Branching?

    int a,b,c;
    min = (c ^ (((a ^ ((b ^ a) & -(b < a))) ^ c) & -((a ^ ((b ^ a) & -(b < a))) < c)));
    

    Oder für die Minimalsten:

    min = (c + (((a + ((b - a) & ((b - a) >> (sizeof(int) * CHAR_BIT - 1)))) - c) & (((a + ((b - a) & ((b - a) >> (sizeof(int) * CHAR_BIT - 1)))) - c) >> (sizeof(int) * CHAR_BIT - 1))));
    

    The root of all evil.



  • Werden diese Funktionen der STL eigentlich mit Variadic Templates auf n Parameter ausgeweitet?



  • EndlichSchnell schrieb:

    ...

    Das ist nicht 100% portabel. Bit-Operationen auf negativen Zahlen sind "implementation-defined".


Anmelden zum Antworten