Für Anfänger bzw. Advanced Coders - Ein kleiner Buchtip ! {



  • hmm...:

    int f(int x) {
      return x / abs(x);
    }
    

    .oO(meisterleistung :D)

    EDIT: ups *g*

    int f(int x) {
      return x/(abs(x)+!x);
    }
    

    muss es natürlich heißen

    [ Dieser Beitrag wurde am 27.04.2003 um 03:16 Uhr von Mr. N editiert. ]



  • oder:

    int f(int x) {
      return -1 + (x >= 0) + (x > 0);
    }
    


  • Original erstellt von DrGreenthumb:
    **
    /* Kann man denn eigentlich davon ausgehen, das int(true) auch wirklich 1 ergibt? /*

    JA



  • Ach man hat ein Größer bzw. Kleiner? Ich dachte solche Vergleiche sind wie genau wie if verboten. Naja, dann ist es ja langweilig.



  • Ein sinnloses Beispiel ohne praktischen Bezug wie soll das beim C++ lernen helfen?



  • Original erstellt von Lars:
    Ein sinnloses Beispiel ohne praktischen Bezug wie soll das beim C++ lernen helfen?

    falsche Denkweise *g*
    Meine Philosophie:
    "Scheiss auf den Sinn, nichts hat einen."



  • Die meisten Dinge, die man zum Lernen programmiert, haben keinen praktischen Bezug.



  • Original erstellt von Bashar:
    Die meisten Dinge, die man zum Lernen programmiert, haben keinen praktischen Bezug.

    Rult aber! 😃



  • Original erstellt von HumeSikkins:
    Ach man hat ein Größer bzw. Kleiner? Ich dachte solche Vergleiche sind wie genau wie if verboten. Naja, dann ist es ja langweilig.

    int func(int n)
    {
        return (n && 1) | ( n & INT_MIN) / (INT_MAX-1);
    }
    

    enthält übrigens auch einen vergleich: (n && 1) ist ja if (n) if (1) return 1; ... und da wird n mit 0 verglichen. aber das nur am rande.



  • Original erstellt von Bashar:
    Die meisten Dinge, die man zum Lernen programmiert, haben keinen praktischen Bezug.

    ojeh .. echt?
    😉



  • Original erstellt von Bashar:
    Die meisten Dinge, die man zum Lernen programmiert, haben keinen praktischen Bezug.

    Gut aber das ist echt sinnlos! Demnächst wird in C++ Büchern erklärt wie man mit goto objektorientiert programmiert 😮



  • Original erstellt von Lars:
    Gut aber das ist echt sinnlos! Demnächst wird in C++ Büchern erklärt wie man mit goto objektorientiert programmiert 😮

    Nee. Man muss auch mal um die Ecke denken können. _Darum_ gehts doch eigentlich beim Programmieren.



  • @Mr.N.
    Habe ich nicht ziemlich eindeutig geschrieben, dass ich in solchen Sachen keine Leuchte bin und das ich meine Lösung als nicht-gut betrachte? Was hilft es also, wenn du neun-mal-klug an meiner Lösung rumnörgelst? Und das auch noch mit einer Arroganz die fast schon weh tut.
    In meiner Arroganz beantworte ich meine Frage gleich mal selbst: Es hilft absolut nichts.
    Was helfen würde wäre das Posten einer schönen Lösung.



  • @HumeSikkins: Du hast es geschrieben. Meine größte Schwäche ist meine Arroganz :D. Ich habe übrigens nicht genörgelt sondern "nur" neunmal-klug korrigiert. Aber das ist hier noch mehr OT als das ganze sinnlos.

    PS: Du willst eine schöne Lösung? Ohne Vergleich oder mathematische Funktion geht es bestimmt nicht:

    int f(int x) {
      return x / (int) sqrt(x * x);
    }
    

    [ Dieser Beitrag wurde am 27.04.2003 um 12:35 Uhr von Mr. N editiert. ]



  • Klingt doch intressant der Schinken!
    Aber wer hat schon 25EUR fuer sowas 😉
    Kleiner Tipp:
    Also ab zu EBay! habs grad fuer 9EUR inkl. Versand sofortkauf eingesackt.



  • Original erstellt von Mr. N:
    **```cpp
    int f(int x) {
    return x / (int) sqrt(x * x);
    }

    
    ]**
    

    Schlecht, weil 0.
    Bibliotheksaufrufe sind übrigens plöt:

    int f(int n)
    {
         char b[sizeof 2 * CHAR_BIT + 2];
         int a[] = { 1, 0, -1 };
         sprintf(b, "%d", n);
    
         return a[(!strncmp(b, "-", 1)) * 2 + (!strncmp(b, "0", 1))];
    }
    

    Haha, das will man nicht.

    Es ginge auch mit Fließkommazahlen:

    int f(int n)
    {
         double res = sin(n / (double)INT_MAX) * 1.9;
         double a = ceil(res);
         double b = floor(res);
    
         return a+b;
    }
    

    Lösungen ohne Bibliothek sollten auch gehen:
    + über Lookuptabellen (mit Arrays ist das platzraubend; man wird also mit Integerbits rumspielen)
    + ausrollen (und approximieren) von den Standardfunktionen (bei ceil/floor/sin sollte man das hinbekommen)

    Mehr fällt mir gerade nicht ein.

    [ Dieser Beitrag wurde am 27.04.2003 um 13:44 Uhr von Daniel E. editiert. ]



  • Folgender Code funktioniert:

    int f(int x) {
    return (int) round(x / (abs(x) + 1.0));
    }



  • round?



  • Original erstellt von <J_Red>:
    **Folgender Code funktioniert:

    int f(int x) {
    return (int) round(x / (abs(x) + 1.0));
    }**

    int f(int x) {
      return x/(abs(x)+!x);
    }
    

    auch.
    ich behaupte (um es maschinennäher auszudrücken): eine lösung enhält _mindestens_ 1 vergleichende instruktion (die auch ausgewertet wird) oder funktioniert mit gleitkomma-funktionen. mal schaun wie sich ceil implementieren lässt:

    int ceil(int x) {
      return x + Z;
    }
    

    wobei Z=größte zahl kleiner null. -2.1 wäre dann: int(-2.1 + 0.99)=-1 ... nicht wirklich. ich wage also zu behaupten, dass die aufgabenstellung ohne (impliziten) vergleichsoperator nicht zu lösen ist.



  • klar geht das.


Anmelden zum Antworten