consolenausgabe macht zahlen anstatt einen "ball"



  • Hallo
    ich versuche mir anhand des buches "C++ Lernen und professionell anwenden"
    das programmieren mit c++ beizubringen

    ich bin jetzt in dem buch zu einem beispiel gekommen das einen ball darstellen soll der in der console hin und her springt, das macht er aber nicht 😞
    stattdessen kommen irgentwelche zahlen
    den quellcode habe ich 100% richtig ( er ist auf einer beigelegten cd 😉 )

    //  ball1.cpp
    //  Simuliert einen springenden Ball
    //  Hinweis: Programm mit Strg+C beenden.
    //  --------------------------------------------------
    //  Statt der ANSI-Bildschirmsteuerzeichen werden hier
    //  die systemabhängigen Funktionen der Windows-API 
    //  (API == Application Programming Interface) verwendet.
    // ----------------------------------------------------- 
    
    #include <iostream>
    #include <string>
    using namespace std;
    
    #include "..\..\console\console.h"       // Win32 Konsolenfunktionen
    
    #define  CLS          cls()              // Bildschirm loeschen
    #define  LOCATE(z,s)  setCursor(z-1,s-1) // Cursor in Zeile z, 
                                             // Spalte s positionieren.
    #define DELAY  50000000L                 // Verzögerung
    
    void main()
    {
       int x = 2, y = 3, dx = 1, geschw = 0;
       string boden(79, '-'),
              header = "****  SPRINGENDER BALL  ****";
    
       CLS;
       LOCATE(1,25);  cout << header;
       LOCATE(25,1);  cout << boden;
    
       while(true)      // Ball "immer" springen lassen
       {
         LOCATE(y,x);
         cout << 'o' << endl;              // Ball anzeigen
         for( long warten = 0; warten < DELAY; ++warten)
           ;
    
         if(x == 1 || x == 79) dx = -dx;   // An einer Wand?
         if( y == 24 )                     // Am Boden?
         {
           geschw = - geschw;
           if( geschw == 0 ) geschw = -7;  // Neu anstossen
         }
         geschw += 1;                 // Beschleunigung = 1
    
         LOCATE(y,x); cout <<  ' ';   // Anzeige löschen
         y += geschw;  x += dx;       // Neue Position
       }
    }
    

    Auf dem bild (URL) kann man sehen was ausgegeben wird,
    unten auf der seite steht noch etwas von ANSI.SYS treiber.
    Allerdings finde ich in google nichts was mir da weiter hilft
    http://nostaria.de/c/consolenball.png

    MFG Rarebit



  • Rarebit schrieb:

    ich versuche mir anhand des buches "C++ Lernen und professionell anwenden"
    das programmieren mit c++ beizubringen
    [...]
    den quellcode habe ich 100% richtig ( er ist auf einer beigelegten cd 😉 )

    Oje, lege das Buch ganz schnell auf die Seite und kauf dir ein neues.

    Der Code sieht aus wie vor 20 Jahren, mit falschen Includes, mit Makros, mit Schreibfehlern, mit Variablendeklarationen wie in C und schwer verständlich.



  • warum das ich habe mir das buch grade gekauft -.- die auflage ist von 2012

    das habe ich sogar aus dem forum http://www.c-plusplus.net/forum/309739



  • Das Ding gabs hier schon mal ...
    Sieh mal hier - da ich Deine console.h nicht habe, habe ich zum Bildschim löschen und zum Cursor positionieren eigene Funktionen geschrieben:

    //  ball1.cpp
    //  Simuliert einen springenden Ball
    //  Hinweis: Programm mit Strg+C beenden.
    //  --------------------------------------------------
    //  Damit die Steuerzeichen wirksam sind, muß ein
    //  entsprechender Bildschirmtreiber geladen sein.
    //  Unter Windows 9x geschieht dies durch folgende
    //  Zeile in der Datei CONFIG.SYS:
    //         DEVICE = C:\Windows\Command\Ansi.sys
    // ---------------------------------------------------
    
    #include <windows.h>
    #include <iostream>
    #include <string>
    using namespace std;
    
    #define DELAY  10000000L             // Verzögerung
    #define CLS   clearScreen()    // Bildschirm löschen
    // #define LOCATE(z,s) (cout <<"\033["<< z <<';'<< s <<'H')
            // Cursor in Zeile z und Spalte s positionieren
    
    void clearScreen(WORD attribute = 7)
    {
        CONSOLE_SCREEN_BUFFER_INFO csbi;
        COORD target = {0, 0};
        DWORD written;
    
        GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
        FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), ' ',
                                                csbi.dwSize.X * csbi.dwSize.Y,
                                                target, &written);
        FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), attribute,
                                                csbi.dwSize.X * csbi.dwSize.Y,
                                                target, &written);
    }
    
    void LOCATE(int z, int s)
    {
        COORD pos = {s, z};
    
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
    }
    
    int main()
    {
       int x = 2, y = 3, dx = 1, geschw = 0;
       string boden(79, '-'),
              header = "****  SPRINGENDER BALL  ****";
    
       CLS;
       LOCATE(1,25);  cout << header;
       LOCATE(25,1);  cout << boden;
    
       while(true)      // Ball "immer" springen lassen
       {
         LOCATE(y,x);
         cout << 'o' << endl;              // Ball anzeigen
         for( long warten = 0; warten < DELAY; ++warten)
           ;
         if(x == 1 || x == 79) dx = -dx;   // An einer Wand?
         if( y == 24 )                     // Am Boden?
         {
           geschw = - geschw;
           if( geschw == 0 ) geschw = -7;  // Neu anstossen
         }
         geschw += 1;                 // Beschleunigung = 1
    
         LOCATE(y,x); cout <<  ' ';   // Anzeige löschen
         y += geschw;  x += dx;       // Neue Position
       }
    }
    


  • Ich habe bereits nach

    using namespace std;
    
    #include "..\..\console\console.h"       // Win32 Konsolenfunktionen
    

    aufgehört zu lesen. Das soll professionell sein 😕 . Das ist eventuell noch akzeptabel in der Computer-AG in der Mittelstufe aber schon in der Oberstufe wird es inakzeptabel. Und von da ist es noch weit bis zur Professionalität. Ich kann mich der Empfehlung nur anschließen: weg mit dem Buch ⚠ !



  • Evtl. ist es etwas harsch, ein gesamtes Buch nach einem Listing zu bewerten, aber das ist schon unverschämter Programmcode in einem Werk für immerhin EUR 45,00.

    Eigentlich ein Sachmangel für das Gewährleistungsrecht. Und die Autoren sollten sich schämen Ihr Buch nicht ordentlich zu pflegen und stetig zu verbessern!

    Hoffentlich biegt Bellis Code das jetzt erstmal hin.

    Stinksauer,
    FW



  • Furble Wurble schrieb:

    Eigentlich ein Sachmangel für das Gewährleistungsrecht. Und die Autoren sollten sich schämen Ihr Buch nicht ordentlich zu pflegen und stetig zu verbessern!

    Was mich aufregt ist diese Rezension Rezession: http://www.c-plusplus.net/forum/309739

    Die beiden Autoren lehren keine Mischung aus C und etwas Objektorientierung, konsequent wird auf die C++-Standardbibliothek zurückgegriffen und ohne Rückgriff auf Altlasten modernes C++ vorgelebt.

    Was so voll das Gegenteil vom Listing ist.



  • Also ich habe C++ auch von dem Buch gelernt. Ich finde es grundsätzlich nicht schlecht (ist aber auch wirklich lange her, dass ich das las), nur gibt es halt hin und wieder so Klöppse.

    Die Konsolenausgabe wird ja hier explizit angesprochen, das dürfte man also vernachlässigen. Was die Makros sollen, weiß ich nicht, vielleicht verzweifelte Beispiele dafür zu zeigen, wie diese funktionieren (sind keine tollen Beispiele, aber es kommt eben auf den Context an).

    Am meisten stört mich das DELAY-define, das geht wirklich gar nicht.



  • Rarebit schrieb:

    //  ball1.cpp
    #define  CLS          cls()              // Bildschirm loeschen
    

    löl, das war schon 1988 out. Und jetzt ist 2013.
    Buch sofort wegwerfen, ist giftig.



  • erstmal danke für die antworten mit dem code von belli bekomme ich genau das was ich wollte danke dir 👍

    und nein ich bin in keiner computer ag 😃 ich mache das einfach weil mich das interessiert und habe mir da halt dieses buch zugelegt, was anscheident anhand der reaktionen ein fehler war 😞



  • Hmm, also ich bin auch noch ein relativer C++-Neuling und habe mir dieses Buch auch vor 2 Wochen gekauft. Ich habe mir extra nicht Jürgen Wolf zugelegt, da von diesem ja explizit abgeraten wurde.
    Ich habe mich natürlich vorher informiert und habe vor allem hier im Forum hauptsächlich Gutes über das Buch gelesen. Ich habe auch das Gefühl, dass es das Wissen recht gut vermittelt. Aber wenn es so schlecht ist - sollte ich damit weitermachen oder mir ein neues zulegen (bin jetzt bei Klassen, Kapitel 13)? Hat immerhin 45€ gekostet...



  • Ich kenne es nicht. Ich selbst habe zum Beispiel zwei Wolf-Bücher und finde sie jetzt nicht sooooooo schlecht, wie sie hier immer gemacht haben. Edit: 'werden' natürlich ...
    Wenn man hier den Forenmeinungen folgt, dann bleiben auch nicht viele deutschsprachige Bücher übrig, an denen es hier nix zu meckern gibt.

    Meine Meinung:
    Die 45 Euro wären für mich genug Argument, mit dem Buch weiterzumachen. Du wirst nach dem Buch sowieso nicht aufhören zu lernen (wenn Du Dich weiter mit C++ beschäftigen willst). Du wirst später einige Dinge aus anderen Blickwinkeln betrachten und mit der Zeit selbst erkennen, was in dem Buch gut und was vielleicht nicht so gut war.
    Und mit der Mehrzahl der anderen Bücher würde es Dir wahrscheinlich ähnlich ergehen.

    Just my 2 Cents ...



  • Anonymus42 schrieb:

    Ich habe mich natürlich vorher informiert und habe vor allem hier im Forum hauptsächlich Gutes über das Buch gelesen. Ich habe auch das Gefühl, dass es das Wissen recht gut vermittelt.

    Ich meine mich zu erinnern, vor leeren Schleifen zu Verzoegerung schon in den 1980er(!) Jahren gewarnt worden zu sein.
    Das Listing ist ein echtes Ärgernis. Es und alles was dazu gehoert (Konsolengrafik) gehoert getilgt. Seitenanzahl und Qualität bei Büchern sind bekanntlich entkoppelt.

    Aber wenn Du mit dem Buch ansonsten zurechtkommst, kann es ja ansonsten so schlecht nicht sein. 🙂


Anmelden zum Antworten