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



  • Titel: Workshop C++
    Autor: Andre Willms
    Verlag:Addison-Wesley
    ISBN: 3-873-1662-0
    Preis: DM 49.90 (€ ~25)
    Seiten: ~ 310

    Dieses Buch beinhaltet eine (sehr schwache) Einführung in die Programmiersprache C++.
    Allerdings sind sehr viele (meiner meinung nach gute und raffinierte) beispiele und aufgaben enthalten, wie zb
    "es wird ein integer an eine funktion übergeben. diese funktion soll -1 zurückgeben, wenn der integer kleiner ist als 0 , sie soll 0 zurückgeben, wenn der integer 0 ist , andernfalls 1 -- und das ganze ohne if bzw ?-operator"
    das ganze aber gleich in kapitel 2 - auf seite 30 oder so... da hilft nur eins ------ (kein ouuzo) aber eine sehr raffinierte formel. !

    ich habe das buch heute nach längerer zeit zufällig wieder gefunden, und möchte es leuten, welche vorhaben sich die sprache anzueignen, als selbsttest ans herz zu legen.

    ich hoffe ev. einen kleinen beitrag zur vergrösserung bzw. zur verbesserung der c++-family beigetragen zu haben !



  • es wird ein integer an eine funktion übergeben. diese funktion soll -1 zurückgeben, wenn der integer kleiner ist als 0 , sie soll 0 zurückgeben, wenn der integer 0 ist , andernfalls 1 -- und das ganze ohne if bzw ?-operator

    Wäre cool, wenn du die Funktion mal posten könntest. Ich bin in solchen Sachen leider die totale Niete. Habe jetzt über eine Stunde drüber nachgedacht und bin nur auf folgende Lösung gekommen:

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

    Das scheint mir aber irgendwie zu kompliziert zu sein.

    Alternativ ist mir auch noch die folgende (unportable) Variante eingefallen:

    return (n && 1) | ((n & ~0) >> 31);
    

    [ Dieser Beitrag wurde am 27.04.2003 um 01:56 Uhr von HumeSikkins editiert. ]



  • ich auch will

    int func(int n)
    {
        int i = -1;
        i += int(n == 0);
        i += int(n > 0);
        return i;
    }
    


  • Original erstellt von Dimah:
    **ich auch will

    int func(int n)
    {
        int i = -1;
        i += int(n == 0);
        i += int(n > 0);
        return i;
    }
    ```**
    

    Nee, bei n>0 ist n!=0 und somit i==0.

    /* Kann man denn eigentlich davon ausgehen, das int(true) auch wirklich 1 ergibt? */

    [ Dieser Beitrag wurde am 27.04.2003 um 02:18 Uhr von DrGreenthumb editiert. ]



  • ups
    dann

    int func(int n)
    {
        int i = -1;
        i += int(n == 0);
        i += int(n > 0) * 2;
        return i;
    }
    


  • oder

    int func(int n)
    {
        while(n < 0) return -1;
        while(n == 0) return 0;
        while(n > 0) return 1;
    }
    


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


Anmelden zum Antworten