Brauch hilfe! Ich habe eine Aufgabe (näheres zur Aufgabe im Blog) bekommen von meinem Lehrer und komme nicht weiter.



  • Danke erstmal das du mir zu helfen versuchst.

    Tut mir leid, wenn ich frage, aber was ist OOP?



  • OOP ist die abkürzung für Objektorientiertes Programmieren.

    Du hast wirklich ein bisschen wurschtelcode da.

    Selsbst geschrieben?



  • Ja, das hab ich alles selbst geschrieben.
    Ist der Code so schlimm geschrieben?

    Ich werde jetzt versuche ein wenig Ordnung in den Code zu bringen.



  • Oguzhan schrieb:

    ...Ist der Code so schlimm geschrieben?...

    Ja. Beginnt schon damit das man schwer Anfang und Ende eines Scopes erkennen kann. Und noch ein Tip: vor dem Kopieren in das Forum sicherstellen das Tabulatoren durch Leerzeichen ersetzt werden (Tabulatoren haben keine genormte Breite, und du mischt in deinem Code Tabulatoren und Leerzeichen).

    Eine sehr verbreitete Form für einen Übersichtlichen Programmierstil (es gibt aber mehrere Formen, ich hatte schon mehrfach in diesen Forum Beispiele gebracht, und will mich nicht wiederholen):

    Sinn ist es, das man die Verschachtelungen klar sieht, und durch identische Einzüge alle zugehörigen Teile zusammengehörend erkennt

    int main()
    { // Scope 1 Begin
        // Einzugshöhe innerhalb Scope 1
        int value;
        for(int i=0; i<10; ++i)
        { // Scope 2 Begin
            // Einzugshöhe innerhalb Scope 2
            TueIrgendwas();
        } // Scope 2 Ende
    } // Scope 1 Ende
    

    Ich verwende in der Regel einen Einzug von 4 Leerzeichen, dies ist aber eine
    Geschmackssache. Falls ich eine Zeile umbreche so setze ich diese nur leicht versetzt, da man einerseits erkennen soll das sie zu der Vorzeile gehört, zum anderen erkennen soll das sie noch nicht zu einem anderen Scope zählt:

    int main()
    {
        std::string a = "Dies ist ein langer Text der um die Lesbarkeit zu "
          "erhöhen zwar etwas eingerückt ist, aber noch nicht auf höhe eines "
          "tieferliegenden Scopes liegt ";
    
        for(int i=0; i<10; ++i)
            TueIrgendwas(); // Auch ohne Klammern kann man hier den Scope erkennen
    }
    

    Zudem solltest du dich von deinen vielen globalen Variablen verabschieden. Und sei es das du langsam anfängst. Funktionen besitzen Rückgabewerte und Übergabeparameter, diese darfst du auch verwenden 😉

    Was mich mal interessiert ist der Wissensstand den du eigentlich haben solltest. Der Aufgabe nach zu urteilen würde ich eigentlich darauf tippen das Klassen und Methoden bereits bekannt sind. Oder weißt du wenigstens unter welchen Bereich deine Aufgaben fallen (Prozedurale Programmierung, Objektorientierte Programmierun)? Je nach dem welche Mittel dir zur Verfügung stehen sind unterschiedliche Hilfestellungen sinnvoll.

    cu André



  • Ich habe noch nie zuvor programmiert.
    Ich bin also Anfänger!

    Ich bin gerade in der Ausbildung zum Fachinformatiker.
    Und bin im ersten Semester.

    Die erste sprache, die wir lernen meinte mein lehrer ist c++



  • Das ist zweifelsfrei C++, aber kein gutes. 😉 - Da könntest du gerade C programmieren.

    Einfach ausgedrückt ist der "Sinn" von C++ ist die Mächtigkeit von Klassen (und natürlich Templates). Also Obejektorientierung, die du unbedingt anfangen nutzten solltest.
    Eventuell solltest du mal ein Tutorial durchmachen oder zumindest die Teile dazu lesen, die was mit OOP zu tun haben. ( http://tutorial.schornboeck.net/inhalt.htm )



  • Ich gebe mein bestes!

    Ich werde mir das mal gleich anschauen und durch lesen!

    Danke!



  • drakon schrieb:

    DEventuell solltest du mal ein Tutorial durchmachen oder zumindest die Teile dazu lesen, die was mit OOP zu tun haben...

    Das ist jetzt nichts gegen Oguzhan, aber nach seiner scheinbaren Unsicherheit würde ich ihm ganz dringend dazu raten nicht erst mit dem OOP Bereich das Tutorial zu beginnen. Gewisse Grundlagen fehlen ihm noch, oder er ist zumindestens noch nicht sicher genug darin.

    cu André



  • hallo oguzhan, dev-c++ ist seh alt und buggy. überleg mal, ob du nicht auf die gestern frisch erschienene, freie, cross-platform-multi-compiler-entwicklungsumgebung code::blocks 8.02 umsteigen willst.
    auch wenn es hier nicht gerne gesehen ist, habe ich mal was kleines für dich vorbereitet 😉 hier ist eine möglichkeit für eine kleine grundstruktur, in der du die aufgaben (mit TODO gekennzeichnet) lösen kannst:

    #include <string>
    #include <iostream>
    #include <vector>
    #include <map>
    #include <iomanip>
    
    using namespace std;
    
    const int N_KATEGORIEN = 5;
    const string KATEGORIEN[N_KATEGORIEN] =
    {
        "1. Vorspeisen",
        "2. Salate",
        "3. Suppen",
        "4. Hauptspeisen",
        "5. Nachspeisen"
    };
    enum KATEGORIE
    {
        VORSPEISE,
        SALAT,
        SUPPE,
        HAUPTSPEISE,
        NACHSPEISE
    };
    
    ////////////////////////////////////////////////////////////////////////////////
    
    class Artikel
    {
    public:
    	Artikel(size_t nr, KATEGORIE kategorie, const string &name, float preis);
    
        size_t  zeigeNr()        const  { return m_nr; }
        string  zeigeKategorie() const  { return KATEGORIEN[m_kategorie]; }
        string  zeigeName()      const  { return m_name; }
        float   zeigePreis()     const  { return m_preis; }
    
    private:
    	size_t      m_nr;
    	KATEGORIE   m_kategorie;
    	string      m_name;
    	float       m_preis;
    };
    
    Artikel::Artikel(size_t nr, KATEGORIE kategorie, const string &name, float preis)
        : m_nr(nr), m_kategorie(kategorie), m_name(name), m_preis(preis)
    {
    }
    
    ostream &operator<<(ostream &ausgabestrom, const Artikel &a)
    {
        return ausgabestrom
            << a.zeigeNr() << "\t"
            << a.zeigeKategorie() << "\t"
            << a.zeigeName() << "\t"
            << a.zeigePreis() << "\n";
    }
    
    typedef vector<Artikel> Artikelliste;
    
    ////////////////////////////////////////////////////////////////////////////////
    
    class Speisekarte
    {
    public:
    	void zeigeKategorie(KATEGORIE k) const;
    	Artikel gibArtikel(size_t nr) const;
    	void registriereArtikel(size_t nr, KATEGORIE kategorie, const string &name, float preis);
    
    private:
    	map<KATEGORIE, Artikelliste> m_kategorisiert;
    	map<size_t, Artikel *> m_inhalt;
    };
    
    void Speisekarte::zeigeKategorie(KATEGORIE k) const
    {
        //TODO: Auflistung der Artikel einer Kategorie
    }
    
    Artikel Speisekarte::gibArtikel(size_t nr) const
    {
        return *(m_inhalt.find(nr)->second);
    }
    
    void Speisekarte::registriereArtikel(size_t nr, KATEGORIE kategorie, const string &name, float preis)
    {
        Artikel a(nr, kategorie, name, preis);
    
        //TODO: Gucken, ob es schon einen Artikel mit der Nummer gibt
    
        m_kategorisiert[kategorie].push_back(a);
        m_inhalt[nr] = &m_kategorisiert[kategorie].back();
    }
    
    ////////////////////////////////////////////////////////////////////////////////
    
    class Warenkorb
    {
    public:
        size_t anzahlArtikel() const
        {
            return m_inhalt.size();
        }
        const Artikel &zeigeArtikel(size_t position) const
        {
            return m_inhalt[position];
        }
    
    	void legeRein(const Artikel &einArtikel);
    	void legeRein(int nr, KATEGORIE kategorie, const string &name, float preis);
    
    	float gesamtpreis() const;
    
    private:
        Artikelliste m_inhalt;
    };
    
    void Warenkorb::legeRein(const Artikel &einArtikel)
    {
        m_inhalt.push_back(einArtikel);
    }
    
    void Warenkorb::legeRein(int nr, KATEGORIE kategorie, const string &name, float preis)
    {
        Artikel a(nr, kategorie, name, preis);
        legeRein(a);
    }
    
    float Warenkorb::gesamtpreis() const
    {
        float ergebnis = 0;
    
        //TODO: Preise der einzelnen Artikel zusammenrechnen
    
        return ergebnis;
    }
    
    ////////////////////////////////////////////////////////////////////////////////
    
    class Bistro
    {
    public:
    	Bistro(const char *name);
    
        void bestellung(Warenkorb &korb) const;
        KATEGORIE auswahlKategorie() const;
    	void kasse(const Warenkorb &korb) const;
    
    private:
        string m_name;
        Speisekarte m_karte;
    };
    
    Bistro::Bistro(const char *name)
        : m_name(name)
    {
        //TODO: Speisekarte initialisieren
    
    }
    
    void Bistro::bestellung(Warenkorb &korb) const
    {
        cout << "Willkommen im Bistro " << m_name << "!\n";
    
        //TODO: Bestellung in einer Schleife mit Menü und Submenü
    
        //testhalber einfach mal was in den Korb gelegt
        korb.legeRein(4711, VORSPEISE, "Rote Wurst", 2.50);
        korb.legeRein(4712, HAUPTSPEISE, "Halbe Sau", 12);
    }
    
    KATEGORIE Bistro::auswahlKategorie() const
    {
        KATEGORIE ergebnis = VORSPEISE;
    
        //TODO: Auswahl der Kategorie
    
        return ergebnis;
    }
    
    void Bistro::kasse(const Warenkorb &korb) const
    {
        cout << "Sie haben folgendes bestellt:\n";
        for (size_t i = 0; i < korb.anzahlArtikel(); ++i)
        	cout << korb.zeigeArtikel(i);
    
        cout << "Ihre Bestellung kostet " << korb.gesamtpreis() << " Euro.\n";
    }
    
    ////////////////////////////////////////////////////////////////////////////////
    
    int main()
    {
        Warenkorb wk;
        Bistro b("Oguzhan");
        b.bestellung(wk);
        b.kasse(wk);
    }
    

    viel spaß noch 🙂



  • Hi,

    ich habe versucht die Aufgaben, die du mir in den Code eingebaut hast zu lösen.

    Leider zeigt der Compiler mir immer noch Fehler an 😞

    Ich probiere schon eine ganze Weile herum und komme leider trotz googlen nicht weiter.

    Kann mir vielleicht jemand einen denk Anstoß geben?

    Danke im voraus!



  • Was meckert der Compiler denn an? Die Ausgaben sind ja nicht zum Spaß da. 😉


Anmelden zum Antworten