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



  • 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.



  • Original erstellt von volkard:
    klar geht das.

    wie? (/me ist jetz im believe-until-impossible modus)



  • #include <iostream>
    using namespace std;
    
    int sgn(int x)
    {
        return (x>>31)-(-x>>31);
    }
    
    int main()
    {
        for(int i=-10;i<=10;++i)
            cout<<i<<' '<<sgn(i)<<endl;
        return 0;
    }
    


  • irgendwie hast du recht. ich könnte jetzt sagen, ich hätte das nur gesagt, weil ich wissen wollte, ob jemand die lösung findet, aber so ein schlechter verlierer bin ich auch wieder nich *g*.



  • Original erstellt von Mr. N:
    irgendwie hast du recht. ich könnte jetzt sagen, ich hätte das nur gesagt, weil ich wissen wollte, ob jemand die lösung findet, aber so ein schlechter verlierer bin ich auch wieder nich *g*.

    andere frage:
    kann man jede funktion von int auf int nur mit >>, <<, &, | und ~ ausdrücken?
    edit: nehmen wir noch + und - dazu.

    [ Dieser Beitrag wurde am 27.04.2003 um 15:10 Uhr von volkard editiert. ]



  • Original erstellt von volkard:
    **```cpp
    int sgn(int x)
    {
    return (x>>31)-(-x>>31);
    }

    Einmal mit INT_MIN und ohne fixierte Integerbreite, aber ohne Zweierkomplement bitte :->.



  • Original erstellt von Daniel E.:
    Einmal mit INT_MIN und ohne fixierte Integerbreite, aber ohne Zweierkomplement bitte :->.

    hä? naja, ich hätte, wenn ich portabilität wollte sizeof(int)*8 genommen


Anmelden zum Antworten