C-Strings vergleichen



  • //Währungsrechner
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    
    using namespace std;
    
    int main()
    {
        double bbetrag, ergebnis;//Zu früh definiert. 
        //"Mache Variablen so lokal wie möglich" wäre C++. 
        //Das hier ist C. Man lernt hier also veralteten Stil. 
        char betrag[5], waehrung[6], zielwaehrung[6];//Die Größen sind recht knapp. Und 
        //für sowas nimmt man wirklich nur std::string. Also einfach ein schlechtes 
        //Beispiel. Außerdem wieder zu früh definiert. 
        char USD[] = "USD", EUR[] = "EUR";//Erstens, warum fehlt das const? Zweitens WOZU???
        int control1, controll2;//Nicht benutzt.
        //int i = 1;
        cout << "****Waehrungsrechner****\n";
        cout << "Umrechnungen fuer USD und EUR \n\n";
        cout << "Bitte Betrag eingeben: ";
        cin >> betrag;
        cout << "\n";
        cout << "Bitte aktuelle Waehrung eingeben: ";
        cin >> waehrung;
        cout << "\n";
        cout << "Bitte Zielwaehrung eingeben: ";
        cin >> zielwaehrung;
        cout << "\n\n";
    
        bbetrag = atof(betrag);//Ähm, bbetrag, um's von betrag zu unterscheiden?
        //atof sieht man auch nur in C. Wieder schlechtes Beispiel. Warum nicht 
        //gleich einen double einlesen? 
    
        cout << "das Ergebnis wird berechnet." << "\n";//Warum hier den Umbruch 
        //drangehängt, während oben drin?
    
        cout << strcmp(waehrung, USD) << " : " << strcmp(zielwaehrung, EUR) << "\n";//OK, 
        //Debugausgabe halt. 
    
        if(strcmp(waehrung, USD) == 0)//Was ist an USD besser als an "USD"?
        {
            ergebnis = bbetrag * 1.3912;
            cout << bbetrag << " " << waehrung << " ist " << ergebnis << " " << zielwaehrung;//A
        }
        if(strcmp(zielwaehrung, EUR) == 0)
        {
            ergebnis = bbetrag * 0.7188;
            cout  << bbetrag << " " << waehrung << " ist " << ergebnis << " " << zielwaehrung;//B
        }
        //Hier gehören A und B hin. Man schreibt nicht ohne Not zwei völlig identische Zeilen. 
    
        return 0;
    }
    


  • volkard schrieb:

    //Währungsrechner
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    
    using namespace std;
    
    int main()
    {
        double bbetrag, ergebnis;//Zu früh definiert. 
        //"Mache Variablen so lokal wie möglich" wäre C++. 
        //Das hier ist C. Man lernt hier also veralteten Stil.
        //-> Ich weiß nich, was am alten C Stil auszusetzen ist,
        //-> ist immerhin ein sehr sauberer Stil.  
        char betrag[5], waehrung[6], zielwaehrung[6];//Die Größen sind recht knapp. Und 
        //für sowas nimmt man wirklich nur std::string. Also einfach ein schlechtes 
        //Beispiel. Außerdem wieder zu früh definiert.
        //-> Ob std::string oder c-Arrays ist wohl Geschmackssache
        //-> Die recht knappen Größen stammen vom TE und sind zwecksgemäß
        //-> gewählt, nehme ich mal an  
        char USD[] = "USD", EUR[] = "EUR";//Erstens, warum fehlt das const? Zweitens WOZU???
        //-> Das macht natürlich wirklich wenig Sinn, aber so hat es 
        //-> J.W. auch nicht gemacht, stammt vom TE  
        int control1, controll2;//Nicht benutzt. -> Stammt vom TE
        //int i = 1;
        cout << "****Waehrungsrechner****\n";
        cout << "Umrechnungen fuer USD und EUR \n\n";
        cout << "Bitte Betrag eingeben: ";
        cin >> betrag;
        cout << "\n";
        cout << "Bitte aktuelle Waehrung eingeben: ";
        cin >> waehrung;
        cout << "\n";
        cout << "Bitte Zielwaehrung eingeben: ";
        cin >> zielwaehrung;
        cout << "\n\n";
    
        bbetrag = atof(betrag);//Ähm, bbetrag, um's von betrag zu unterscheiden?
        //atof sieht man auch nur in C. Wieder schlechtes Beispiel. Warum nicht 
        //gleich einen double einlesen? 
        // -> Stammt ebenfalls vom TE, atof wird im C++Buch nie erwähnt
        
    
        cout << "das Ergebnis wird berechnet." << "\n";//Warum hier den Umbruch 
        //drangehängt, während oben drin?
        //-> TE
        cout << strcmp(waehrung, USD) << " : " << strcmp(zielwaehrung, EUR) << "\n";//OK, 
        //Debugausgabe halt. 
    
        if(strcmp(waehrung, USD) == 0)//Was ist an USD besser als an "USD"? -> TE
        {
            ergebnis = bbetrag * 1.3912;
            cout << bbetrag << " " << waehrung << " ist " << ergebnis << " " << zielwaehrung;//A
        }
        if(strcmp(zielwaehrung, EUR) == 0)
        {
            ergebnis = bbetrag * 0.7188;
            cout  << bbetrag << " " << waehrung << " ist " << ergebnis << " " << zielwaehrung;//B
        }
        //Hier gehören A und B hin. Man schreibt nicht ohne Not zwei völlig identische Zeilen. 
        //-> Das stimmt natürlich richtig, sind aber zwecksgemäß einfach gehaltene
        //-> Beispielcodes für den Anfang, später vermeidet er sowas. 
        return 0;
    }
    


  • Also gut, ich hab mal etwas in der Jauchegrube nach Brocken gefischt. Ein paar

    ~Edit vom gemeinen Volkard: konkrete Fehlermeldungen weggemacht und nur die Anzahl gelassen.
    ~

    C von A-Z
    Fehler: 5

    Grundkurs C
    Fehler: 1

    "C++ von A bis Z" ist voll mit Syntaxfehlern. In der Leseprobe gibt es kein Codebeispiel mit Klassen, das ein Compiler akzeptieren würde (fehlende Semikola). Die für ein Lehrbuch notwendige Sorgfältigkeit lässt dies vermissen. Ferner kann ich über die Absätze zu Casts nur den Kopf schütteln; was hier eigentlich passiert, scheint dem Autor völlig unbekannt zu sein. Ich wette einiges, dass er über die Ausgabe von

    #include <iostream>
    
    struct A {
      A() { }
      A(A const &) { std::cout << "A(A const &)" << std::endl; }
    };
    struct B : A { };
    
    int main() {
      B b;
      static_cast<A>(b);
    }
    

    höchst erstaunt wäre.

    Diese Bücher sind mit Halbwissen und Raterei zusammengeschlampt und nicht dazu geeignet, irgendjemandem irgendetwas beizubringen. Es macht auf mich den Eindruck, als habe das nicht mal jemand korrekturgelesen.



  • Felixxx schrieb:

    //-> Ich weiß nich, was am alten C Stil auszusetzen ist,
    //-> ist immerhin ein sehr sauberer Stil.

    Der Stil muß doch zur Sprache passen. In einem C++-Programm hat das nichts zu suchen. Wäre das ein C-Programm, mit scanf/printf statt cin/cout wäre alles in Ordnung. Ich fürchte, es war mal ein C-Programm, es war einfach mal ein C-Buch und wurde in einer Nacht-Und-Nebel-Aktion um ein paar Kapitel C++ erweitert und Programme wurden in Richtung C++ oberflächlich angestrichen, wobei so ein Pseudo-C-- rauskommt. Ein C-Programm mit cin und cout.
    Du bist nicht zufällig dieser J.W. selber?



  • seldon schrieb:

    Also gut, ich hab mal etwas in der Jauchegrube nach Brocken gefischt. Ein paar Beispiele:

    Nicht zu viel Fehler konkret nennen.
    Er soll uns nicht provozieren, daß wir ihm kostenlos sein Buch reparieren.
    Er kann soll jemanden zu einem angemessenen Stundensatz buchen.
    (Ich würde das Posting an Deiner Stelle sogar deswegen wieder rausnehmen.)



  • @ Seldon :
    Gut, das C-Buch habe ich nie gelesen, also kann ich das schlecht navollziehen.
    Ich bin mir aber sicher, dass es in fast jedem Buch Fehler gibt.
    Ich weiß nicht welche Fassung du von dem C++ Buch gelesen hast, aber die kostenpflichtige ist vollkommen richtig, also vom Syntax her.

    @ volkard : Dass der Stil zur Sprache passen sollte stimmt natürlich auf der einen Seite, auf der anderen Seite warum sollte man Gutes weg/verwerfen?



  • Felixxx schrieb:

    Ich weiß nicht welche Fassung du von dem C++ Buch gelesen hast, aber die kostenpflichtige ist vollkommen richtig, also vom Syntax her.

    Behauptung zur Kenntnis genommen und schlicht nicht geglaubt. Und ich werde es nicht kostenlos reparieren, ätsch.



  • volkard schrieb:

    Nicht zu viel Fehler konkret nennen.
    Er soll uns nicht provozieren, daß wir ihm kostenlos sein Buch reparieren.
    Er kann soll jemanden zu einem angemessenen Stundensatz buchen.
    (Ich würde das Posting an Deiner Stelle sogar deswegen wieder rausnehmen.)

    Kann ich nicht; unregistriert. Du als Moderator kannst es aber meinetwegen mit einer entsprechenden Notiz ersetzen.

    Ansonsten werde ich einen Teufel tun und für diesen Schund Geld zum Fenster rauswerfen. Syntaxfehler hin oder her, Jürgen Wolf hat weder von C noch von C++ genug verstanden, um Bücher darüber zu schreiben. Wenn er ein paar Jahre damit verbringt, Programmierung tatsächlich zu lernen, können wir vielleicht noch mal darüber reden, aber bis dahin sehe ich ihn als ein Musterbeispiel des Dunning-Kruger-Effekts.



  • Naja, es ist halt einfach Fakt. Es fehlt kein einziges Semikolon.
    Es hat keiner von Dir verlangt irgendwas zu reparieren; man kann ja auch nichts reparieren, was nicht kaputt ist, nicht wahr ? 🙂



  • Felixxx schrieb:

    @ volkard : Dass der Stil zur Sprache passen sollte stimmt natürlich auf der einen Seite, auf der anderen Seite warum sollte man Gutes weg/verwerfen?

    Warum sollte man mit einem Auto anders fahren als mit einem Fahrrad?
    Warum sollte man eine Gabel anders bewegen als einen Löffel?
    Warum sollte man Atombomben anders lagern als Dynamit?



  • Felixxx schrieb:

    Naja, es ist halt einfach Fakt. Es fehlt kein einziges Semikolon.

    Doch. Hab jetzt auch lesegeprobt und sie fehlen.
    Aber ich verrate nicht, wo.
    Jedem, der ein wenig C++ kann, wird es aber auch auffallen.



  • Weil es sonst gravierende Folgen nach sich ziehen würde bzw. im Hinblick auf das Beispiel mit der Gabel die Funktinalität nicht erfüllt werden würde. Trifft das auf die verschiedenen Programmierstile auch zu ? Ich denke nicht.
    C++ ist OOP, C nicht, daran ändert die Tatsache, dass man beim C++ Programmieren C- Stil verwendet wohl kaum etwas.



  • volkard schrieb:

    Felixxx schrieb:

    Naja, es ist halt einfach Fakt. Es fehlt kein einziges Semikolon.

    Doch. Hab jetzt auch lesegeprobt und sie fehlen.
    Aber ich verrate nicht, wo.
    Jedem, der ein wenig C++ kann, wird es aber auch auffallen.

    "Ich habe Buch XY gelesen und habe dabei etliche Fehler gefunden. Ich werde aber nicht sagen wo.
    Jeder der ein bisschen Sprache xyz versteht wird es sofort bemerken."



  • Felixxx schrieb:

    Trifft das auf die verschiedenen Programmierstile auch zu ? Ich denke nicht.

    Lies den Meyers, denke ein wenig nach, und lerne.



  • seldon schrieb:

    Edit vom gemeinen Volkard: konkrete Fehlermeldungen weggemacht und nur die Anzahl gelassen.

    Wollte mir schon ein Bookmark machen für die nächsten 20 uneinsichtigen Wolf-Opfer 😞



  • Nachschlag:

    C++ von A bis Z, 3.2.1 schrieb:

    namespace meinBereich {
        int iwert;
        float fwert;
        // Definition von funktion()
        void funktion ( void ) {
         // Anweisungen von funktion()
      }
      // Definition von eineKlasse
      class eineKlasse {
          // Anweisungen für eineKlasse
      }
    }
    
    namespace meinBereich {
       int iwert;
       float fwert;
       // Deklaration von funktion()
       void funktion ( void );
       // Deklaration von eineKlasse
       class eineKlasse;
    }
    // Definition von funktion()
    void meinBereich::funktion( void ) {
       // Anweisungen von funktion()
    }
    // Definition von eineKlasse
    class meinBereich::eineKlasse {
       // Anweisungen für eineKlasse
    }
    
    namespace meinBereich {
          int iwert;
          float fwert;
          // Deklaration von funktion()
          void funktion ( void );
          // Deklaration von eineKlasse
          class eineKlasse;
      }
      // Erneut im Namensbereich meinBereich
      namespace meinBereich {
          // Definition von meinBereich::funktion( void )
          void funktion( void ) {
              // Anweisungen von funktion()
          }
      }
      // Definition von eineKlasse
      class meinBereich::eineKlasse {
          // Anweisungen für eineKlasse
      }
    

    C++ von A bis Z, 3.2.6 schrieb:

    namespace neuerName alterName;
    
    namespace einBereich ersterBereich::ersterBereich_innen;
    

    C++ von A bis Z, 3.3.1 schrieb:

    extern "C" typ funktion( parameter );
    

    Damit teilen Sie dem C++-Compiler mit, dass die Funktion »funktion()« mit
    einem C-Compiler übersetzt wurde.



  • Michael E. schrieb:

    seldon schrieb:

    Edit vom gemeinen Volkard: konkrete Fehlermeldungen weggemacht und nur die Anzahl gelassen.

    Wollte mir schon ein Bookmark machen für die nächsten 20 uneinsichtigen Wolf-Opfer 😞

    Umpf, ja, da gibts ärmere Leute auf der Welt, um die Du Dich gerne kümmern kannst.

    Vllt. wollt Ihr mal ein Buch nennen, was Eurer Meinung nach das genau Gegenteil zu dem von J.W. ist bzw. das, das Ihr einfach empfehlen würdet?



  • Mit Entschuldigung an Volkard. Lass es ne Stunde stehen oder so, damit er sich das durchlesen kann, dann kann das aus dem selben Grund gern den Weg der vorherigen Jauchebrocken gehen.



  • seldon schrieb:

    C++ von A bis Z, 3.3.1 schrieb:

    extern "C" typ funktion( parameter );
    

    Damit teilen Sie dem C++-Compiler mit, dass die Funktion »funktion()« mit
    einem C-Compiler übersetzt wurde.

    Der ist gut 🤡



  • Felixxx schrieb:

    Vllt. wollt Ihr mal ein Buch nennen, was Eurer Meinung nach das genau Gegenteil zu dem von J.W. ist bzw. das, das Ihr einfach empfehlen würdet?

    Ich empfehle dann mal den Breymann.


Anmelden zum Antworten