Klaasen



  • Hallo
    ich bin neu hier und habe eine Farge.
    Also ich habe einen Auftrag vom professor bekommen und soll diesen erledigen.
    Ich soll das hier machen:

    **
    Implementieren Sie die Klassen Zutat und Smoothie zur Unterstützung der Verwaltung einer Bar.
    Eine Zutat hat einen Namen (String mit Länge>0) und einen physiologischen Brennwert (in kJ, ganze Zahl zwischen 10 und 75 jeweils
    inklusive). Folgende Methoden und Operatoren sind in der Klasse Zutat zu implementieren:
     Konstruktor(en) mit zwei Parametern und einem Parameter. Name und Brennwert in dieser Reihenfolge. Der Name muss
    immer spezifiziert werden, bei fehlender Angabe des Brennwerts ist der Defaultwert 32 zu verwenden. Sollte einer der
    übergebenen Werte nicht den Anforderungen entsprechen (z.B. Name mit Länge 0, bzw. Brennwert nicht im erlaubten
    Bereich), so ist eine Exception vom Typ runtime_error zu werfen.
     int brennwert() const: Liefert den Brennwert der Zutat zurück.
     operator==: Vergleicht zwei Zutaten und liefert true, wenn sie in Name und Brennwert übereinstimmen, false
    sonst.
     operator<<: Die Ausgabe eines Objekts des Typs Zutat soll in der Form [Name Brennwert kJ] erfolgen,
    z.B.: [Apfel 27 kJ].
    Ein Smoothie besteht aus einer Aufeinanderfolge von Schichten einzelner Zutaten. Die gleiche Zutat kann mehrmals zu einem
    Smoothie hinzugefügt werden, um dickere Schichten oder gewünschte Muster zu erzeugen. Ein Smoothie hat eine Bezeichnung
    (String mit Länge > 0) sowie eine Liste von Zutaten in der Reihenfolge, wie sie (von unten) aufgeschichtet werden. Folgende
    Methoden und Operatoren sind in der Klasse Smoothie zu implementieren:
     Konstruktor mit einem Parameter, der die Bezeichnung des Smoothies festlegt. Es gibt keinen Defaultwert. Wird eine
    Bezeichnung mit Länge 0 übergeben, so ist eine Exception vom Typ runtime_error zu werfen.
     void hinzu(const Zutat& z): Fügt eine Schicht mit einer weiteren Zutat zum Smoothie oben hinzu.
     int brennwert() const: Berechnet den gesamten Brennwert des Smoothies als Summe der Brennwerte der
    verwendeten Zutaten.
     operator<<: Die Ausgabe eines Objekts des Typs Smoothie soll in der Form [{Liste der Zutaten}, Bezeichnung]
    erfolgen. Die Liste der Zutaten ist in der Reihenfolge auszugeben, wie sie hinzugefügt wurden, z.B.:
    [{[Apfel 27 kJ], [Birne 31 kJ], [Apfel 27 kJ]}, Turm von Hanoi]**

    Das sind die Codes die ich geschrieben habe:

    #include<iostream>
    #include<string>
    #include<stdexcept>
    #include"zutat.h" 
    using namespace std;
    
    Zutat:: Zutat (string<int>, name)
    {
    	if(name.size()<=0)
    	{
    		throw runtime_error_error("Dieser String ist leer!\n");
    	}
    }
    
    int Zutat:: int brennwert() const
    {
    	if (brennwert<10)
    	{
    		throw runtime_error("Brennwert ist zu niedrig!\n");
    
    	else if (brennwert>75)
    	{	
    		throw runtime_error("Brennwert ist zu hoch!\n")
    	}
    		return brennwert;
    
    	}
    } 
    bool Zutat:: operator==(const Zutat& name, brennwert) const
    {
    	if(name==name && brennwert==brennwert)
    	{
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    }
    ostream& Zutat::print(ostream&o) const
    {
    	return o << "[" << name << brennwert << " kJ ]\n";
    }
    
    ostream& operator<<(ostream& o, const Zutat& z)
    {
    	return z.print(o);
    }
    
    #ifndef ZUTAT_H
    #define ZUTAT_H
    
    #include <iostream>
    #include <string>
    #include <stdexcept>
    using namespace std;
    
    class Zutat{
    	string<int> name;
    	int brennwert{32};
    	public:
    	Zutat(const string&, int);
    	int brennwert() const;
    	bool operator==(const Zutat&) const;
    	ostream&print(ostream&) const;
    	};
    	ostream& operator<<(ostream&, const Zutat&)
    #endif
    
    #include<iostream>
    #include<string>
    #include<stdexcept>
    #include"zutat.h" 
    #include"smoothie.h"
    using namespace std;
    
    Smoothie:: Smoothie(string, Bezeichnung)
    {
    	if (bezeichnung.size()<=0)
    		throw runtime_error ("Dieser String ist leer!\n");
    }
    
    void Smoothie:: hinzu(const Zutat&zutat)
    {
    	zutat.push_back(s);
    }
    
    int Smoothie:: brennwert() const
    {
    		int sumbrennwert;
    		sumbrennwert= vector<Zutat>brennwert + vector<Zutat>brennwert;
    		return sumbrennwert;
    }
    
    ostream&Smoothie::print(ostream&o) const
    {
    	return <<zutat<<"="<< bezeichnung<<"\n";
    }
    
    ostream& operator<<(ostream&O, const Smoothies& s)
    {
    	return s.print(o);
    }
    
    #ifndef SMOOTHIE_H
    #define SMOOTHIE_H
    
    #include <iostream>
    #include <string>
    #include <stdexcept>
    using namespace std;
    
    class Smoothie{
    	string Bezeichnung;
    	vector<Zutat>zutat;
    	public:
    	Smoothies(const string&vector<Zutat>{});
    	void hinzu(const Zutat& z);
    	int brennwert() const;
    
    	ostream& print(ostream&) const;
    };
    ostream operator<<)(ostream& Smoothie&);
    
    #endif
    
    #include<iostream>
    #include<string>
    #include<vector>
    #include"zutat.h"
    #include"smoothie.h"
    using namespace std;
    
    int main() {
      Zutat z1{"Apfel"};
      try {
        Zutat z1{""};
        cout  << "Error 1\n";
      }
      catch (runtime_error& e) {
        cout << "Leerer Name nich erlaubt!\n";
      }
      try {
        Zutat z2("Abfel", 200);
        cout << "Error 2\n";
      }
      catch (runtime_error& e) {
        cout << "Brennwert zu hoch!\n";
      }
      try {
        Zutat z2("Apfel", 0);
        cout << "Error 3\n";
      }
      catch (runtime_error& e) {
        cout << "Brennwert zu niedrig!\n";
      }
      cout << (z1 == Zutat{"Apfel",12}) << (Zutat{"Birne"}==z1) << (z1==Zutat{"Apfel",32}) << '\n';
      cout << z1.brennwert() << Zutat{"Birne",17}.brennwert() << '\n';
      cout << Zutat{"Birne",17} << z1 << '\n';
      try {
        cout << Zutat{"Mango", 10} << '\n';
        cout << Zutat{"Zitrone",75} << '\n';
        cout << Zutat{"Kirsche",9} << '\n';
      }
      catch (runtime_error& e) {
        cout << "Brennwert zu gering\n";
      }
      try {
        cout << Zutat{"Kirsche",76} << '\n';
        cout << "Error 4\n";
      }
      catch (runtime_error& e) {
        cout << "Brennwert zu hoch\n";
      }
    
      try {
        Smoothie s{""};
        cout << "Error 5\n";
      }
      catch (runtime_error& e) {
        cout << "Smoothie muss eine Bezeichnung haben!\n";
      }
      Smoothie s{"Turm von Hanoi"};
      s.hinzu(Zutat{"Apfel"});
      cout << s.brennwert() << '\n';
      s.hinzu(Zutat{"Birne",31});
      cout << s.brennwert() << '\n';
      s.hinzu(Zutat{"Apfel",32});
      cout << s.brennwert() << '\n';
      cout << s << '\n';
      cerr << s << '\n';
    
      //Dekommentieren fuer Zusatzbeispiel unterheben
      /*
      cout << "\n\nZusatz unterheben:\n";
      s.unterheben(Zutat{"Banane",40});
      cout << s <<'\n';
      try {
        Smoothie{"Test"}.unterheben(z1);
        cout << "Error 4\n";
      }
      catch (runtime_error& e) {
        cout << "Unterheben nicht moeglich!\n";
      }
      */
    
      //Dekommentieren fuer Zusatzbeispiel liste
      /*
      cout << "\n\nZusatz liste:\n";
      s.liste(cout);
      cout<<'\n';
      s.liste(cerr);
      cerr<<'\n';
      */
    
      return 0;
    }
    

    Es will aber bei mir nicht compilen. Kann einer helfen?



  • Es kann bestimmt jemand helfen.
    Aber lesen tut das so keiner. Formatiere den Code mit C++ Tags, direkt unter den Smiles. Dann brauchen wir die Compiler-Fehlermeldungen, weil wir wollen Code ja nicht jedes mal selbst in einer IDE ausprobieren. Aso und Fettschreibung ist auch so schlecht lesbar.



  • Ich hab es jetzt nur mal in IDE-One reingeworfen. - Du hast mehrere Syntaktische Fehler. - Schau dir deinen Code nochmal komplett an. Ein wenig zu voreilig. - Kommt durch deine komisch verwendeten Code-Tags.



  • Kann einer helfen?

    Der Compiler.

    1. behebe den ersten Fehler
    2. übersetze neu
    3. wenn Fehler auftreten, gehe zu 1.



  • string<int>, name - was ist das?



  • Das brauch man in Klaasen.



  • manni66 schrieb:

    Kann einer helfen?

    Der Compiler.

    1. behebe den ersten Fehler
    2. übersetze neu
    3. wenn Fehler auftreten, gehe zu 1.

    Das Problem ist er gibt mir einen Meter langen Code aus und ich kann daraus nichts lesen.



  • inflames2k schrieb:

    Ich hab es jetzt nur mal in IDE-One reingeworfen. - Du hast mehrere Syntaktische Fehler. - Schau dir deinen Code nochmal komplett an. Ein wenig zu voreilig. - Kommt durch deine komisch verwendeten Code-Tags.

    Wie meinst du das?



  • Info123456 schrieb:

    Das Problem ist er gibt mir einen Meter langen Code aus und ich kann daraus nichts lesen.

    Dann versuch doch wenigstens mal, manni66s Frage zu beantworten, nämlich: "string<int>, name - was ist das?"

    Du könntest auch erst einmal erklären, was du mit string<int> erreichen willst. Die Klasse std::string kennt keine Template-Argumente.

    Überhaupt scheinst du überflüssige "int" zu mögen wie auch in der folgenden Zeile:

    int Zutat:: int brennwert() const
    

    Wenn dir die "meterlange Fehlermeldung" zu lang ist, dann lies nur den ersten Fehler, berichtige ihn und kompiliere neu. Die weiteren Fehler können auch Folgefehler sein!



  • Manni hat ja schon gefragt:

    #ifndef ZUTAT_H
    #define ZUTAT_H
    
    #include <iostream>
    #include <string>
    #include <stdexcept>
    using namespace std;
    
    class Zutat{
        string<int> name;    // int?
        int brennwert{32};
        public:
        Zutat(const string&, int);   // int?
        int brennwert() const;  // Brennwert zum 2ten?
        bool operator==(const Zutat&) const;
        ostream&print(ostream&) const;
        };
        ostream& operator<<(ostream&, const Zutat&)
    #endif
    

    Hoff mal das du schon mal anfangen kannst?

    Kannst du die Fehlermeldungen bei dir nicht scollen? In den meisten Fällen Punkt für Punkt angehen, dann werden es schon weniger.

    Es gibt Entwicklungsumgebungen wo man nicht die Fehlermeldungen anscollen kann.
    Kannst du dann die Meldungen in eine Datei umleiten oder den Compiler zur Erstellung einer Fehlerliste bewegen?



  • f.-th. schrieb:

    Manni hat ja schon gefragt:

    #ifndef ZUTAT_H
    #define ZUTAT_H
    
    #include <iostream>
    #include <string>
    #include <stdexcept>
    using namespace std;
     
    class Zutat{
        string<int> name;    // int?   // das hab ich schon entfernt
        int brennwert{32};
        public:
        Zutat(const string&, int);   // int?   // das hab ich auch schon entfernt
        int brennwert() const;  // Brennwert zum 2ten? // das geht aus der angabe heraus. ich brauche einen wert um das intervaal zu schecken und einen weiteren der mir nur den brannwert zurückliefert
        bool operator==(const Zutat&) const;
        ostream&print(ostream&) const;
        };
        ostream& operator<<(ostream&, const Zutat&)
    #endif
    

    Hoff mal das du schon mal anfangen kannst?

    Kannst du die Fehlermeldungen bei dir nicht scollen? In den meisten Fällen Punkt für Punkt angehen, dann werden es schon weniger.

    Es gibt Entwicklungsumgebungen wo man nicht die Fehlermeldungen anscollen kann.
    Kannst du dann die Meldungen in eine Datei umleiten oder den Compiler zur Erstellung einer Fehlerliste bewegen?

    Danke für die Hilfe! Ich schau nun mal was sich machen lässt. Eine Frage: Beim ersten Brennwert brauche ich das ganze mit 32 zu intialisieren wie es in der angabe steht ider wie mach ich das?



  • Info123456 schrieb:

    ersten Brennwert brauche ich das ganze mit 32 zu intialisieren wie es in der angabe steht ider wie mach ich das?

    So wie es in der Aufgabe steht: "fehlender Angabe des Brennwerts ist der Defaultwert 32 zu verwenden"



  • Also hier hab ich es mal geschafft einiges zu verbessern aber es dauert noch eine weile hier nochmals die neuen codes
    zunsächst nochmals die angabe:
    Implementieren Sie die Klassen Zutat und Smoothie zur Unterstützung der Verwaltung einer Bar.
    Eine Zutat hat einen Namen (String mit Länge>0) und einen physiologischen Brennwert (in kJ, ganze Zahl zwischen 10 und 75 jeweils
    inklusive). Folgende Methoden und Operatoren sind in der Klasse Zutat zu implementieren:
     Konstruktor(en) mit zwei Parametern und einem Parameter. Name und Brennwert in dieser Reihenfolge. Der Name muss
    immer spezifiziert werden, bei fehlender Angabe des Brennwerts ist der Defaultwert 32 zu verwenden. Sollte einer der
    übergebenen Werte nicht den Anforderungen entsprechen (z.B. Name mit Länge 0, bzw. Brennwert nicht im erlaubten
    Bereich), so ist eine Exception vom Typ runtime_error zu werfen.
     int brennwert() const: Liefert den Brennwert der Zutat zurück.
     operator==: Vergleicht zwei Zutaten und liefert true, wenn sie in Name und Brennwert übereinstimmen, false
    sonst.
     operator<<: Die Ausgabe eines Objekts des Typs Zutat soll in der Form [Name Brennwert kJ] erfolgen,
    z.B.: [Apfel 27 kJ].
    Ein Smoothie besteht aus einer Aufeinanderfolge von Schichten einzelner Zutaten. Die gleiche Zutat kann mehrmals zu einem
    Smoothie hinzugefügt werden, um dickere Schichten oder gewünschte Muster zu erzeugen. Ein Smoothie hat eine Bezeichnung
    (String mit Länge > 0) sowie eine Liste von Zutaten in der Reihenfolge, wie sie (von unten) aufgeschichtet werden. Folgende
    Methoden und Operatoren sind in der Klasse Smoothie zu implementieren:
     Konstruktor mit einem Parameter, der die Bezeichnung des Smoothies festlegt. Es gibt keinen Defaultwert. Wird eine
    Bezeichnung mit Länge 0 übergeben, so ist eine Exception vom Typ runtime_error zu werfen.
     void hinzu(const Zutat& z): Fügt eine Schicht mit einer weiteren Zutat zum Smoothie oben hinzu.
     int brennwert() const: Berechnet den gesamten Brennwert des Smoothies als Summe der Brennwerte der
    verwendeten Zutaten.
     operator<<: Die Ausgabe eines Objekts des Typs Smoothie soll in der Form [{Liste der Zutaten}, Bezeichnung]
    erfolgen. Die Liste der Zutaten ist in der Reihenfolge auszugeben, wie sie hinzugefügt wurden, z.B.:
    [{[Apfel 27 kJ], [Birne 31 kJ], [Apfel 27 kJ]}, Turm von Hanoi]

    hier sind nun die neuen codes
    [code="#include<string>
    #include<stdexcept>
    #include"zutat.h"
    #include"smoothie.h"
    #include<iostream>

    using namespace std;

    Smoothie::Smoothie(string bezeichnung)
    {
    if (bezeichnung.size()<=0)
    throw runtime_error ("Dieser String ist leer!\n");
    }

    Smoothie::Smoothie(void hinzu(const Zutat&zutat))
    {
    zutat.push_back(s);
    }

    int Smoothie::brennwert() const
    {
    int sumbrennwert;
    sumbrennwert= vector<Zutat>brennwert + vector<Zutat>brennwert;
    return sumbrennwert;
    }

    ostream&Smoothie::print(ostream&o) const
    {
    return <<zutat<<"="<< bezeichnung<<"\n";
    }

    ostream& operator<<(ostream&O, const Smoothies& s)
    {
    return s.print(o);
    }"]

    [code="#ifndef SMOOTHIE_H
    #define SMOOTHIE_H

    #include <string>
    #include <stdexcept>
    #include <iostream>

    using namespace std;

    class Smoothie{
    string bezeichnung;
    vector<Zutat>zutat;
    public:
    Smoothie(string);
    Smoothie(void);
    void hinzu(const Zutat& z);
    int brennwert() const;

    ostream& print(ostream&) const;
    };
    ostream operator<<(ostream& Smoothie&);

    #endif"]

    [code="#include<string>
    #include<stdexcept>
    #include "zutat.h"
    #include<iostream>
    using namespace std;

    Zutat::Zutat(string name)
    {
    if(name.size()<=0)
    {
    throw runtime_error("Dieser String ist leer!\n");
    }
    }

    int Zutat::brennwert() const
    {
    return brennwert;
    }
    Zutat::Zutat(int brennwert)
    {
    if (brennwert<10)
    {
    throw runtime_error("Dieser Brennwert ist zu niedrig!\n");
    }
    else if (brennwert>75)
    {
    throw runtime_error("Dieser Brennwert ist zu hoch!\n");
    }
    }

    bool Zutat::operator==(const Zutat& name, brennwert)
    {
    if(name==name && brennwert==brennwert)
    {
    return true;
    }
    else
    {
    return false;
    }
    }
    ostream& Zutat::print(ostream&o) const
    {
    return o << "[" << name << brennwert << " kJ ]\n";
    }

    ostream& operator<<(ostream& o, const Zutat& z)
    {
    return z.print(o);
    }"]

    [code="#ifndef ZUTAT_H
    #define ZUTAT_H
    #include <string>
    #include <stdexcept>
    #include <iostream>
    using namespace std;

    class Zutat{
    string name;
    int brennwert();
    public:
    Zutat(string);
    Zutat(int);
    int brennwert() const;
    bool operator==(const Zutat&) const;
    ostream&print(ostream&) const;
    };
    ostream& operator<<(ostream&, const Zutat&);
    #endif

    "]

    und noch die main funktion hab ich einiges rauskommentiert um zu sehen ob er halt das erste erfüllen würde

    [code="#include<string>
    #include<vector>
    #include"zutat.h"
    #include"smoothie.h"
    #include<iostream>

    using namespace std;

    int main() {
    Zutat z1{"Apfel"};
    try {
    Zutat z1{""};
    cout << "Error 1\n";
    }
    catch (runtime_error& e) {
    cout << "Leerer Name nich erlaubt!\n";
    }
    /*try {
    Zutat z2("Abfel", 200);
    cout << "Error 2\n";
    }
    catch (runtime_error& e) {
    cout << "Brennwert zu hoch!\n";
    }
    try {
    Zutat z2("Apfel", 0);
    cout << "Error 3\n";
    }
    catch (runtime_error& e) {
    cout << "Brennwert zu niedrig!\n";
    }
    cout << (z1 == Zutat{"Apfel",12}) << (Zutat{"Birne"}==z1) << (z1==Zutat{"Apfel",32}) << '\n';
    cout << z1.brennwert() << Zutat{"Birne",17}.brennwert() << '\n';
    cout << Zutat{"Birne",17} << z1 << '\n';
    try {
    cout << Zutat{"Mango", 10} << '\n';
    cout << Zutat{"Zitrone",75} << '\n';
    cout << Zutat{"Kirsche",9} << '\n';
    }
    catch (runtime_error& e) {
    cout << "Brennwert zu gering\n";
    }
    try {
    cout << Zutat{"Kirsche",76} << '\n';
    cout << "Error 4\n";
    }
    catch (runtime_error& e) {
    cout << "Brennwert zu hoch\n";
    }

    try {
    Smoothie s{""};
    cout << "Error 5\n";
    }
    catch (runtime_error& e) {
    cout << "Smoothie muss eine Bezeichnung haben!\n";
    }
    Smoothie s{"Turm von Hanoi"};
    s.hinzu(Zutat{"Apfel"});
    cout << s.brennwert() << '\n';
    s.hinzu(Zutat{"Birne",31});
    cout << s.brennwert() << '\n';
    s.hinzu(Zutat{"Apfel",32});
    cout << s.brennwert() << '\n';
    cout << s << '\n';
    cerr << s << '\n';

    //Dekommentieren fuer Zusatzbeispiel unterheben
    /*
    cout << "\n\nZusatz unterheben:\n";
    s.unterheben(Zutat{"Banane",40});
    cout << s <<'\n';
    try {
    Smoothie{"Test"}.unterheben(z1);
    cout << "Error 4\n";
    }
    catch (runtime_error& e) {
    cout << "Unterheben nicht moeglich!\n";
    }
    */

    //Dekommentieren fuer Zusatzbeispiel liste
    /*
    cout << "\n\nZusatz liste:\n";
    s.liste(cout);
    cout<<'\n';
    s.liste(cerr);
    cerr<<'\n';
    */

    return 0;
    }"]



  • Und jetzt macht dir jemand die Fehler raus?



  • manni66 schrieb:

    Und jetzt macht dir jemand die Fehler raus?

    NEIN ICH BRAUCHE NUR JEMANDEN DER SAGT IN WELCHER REIHE ICH DEN FEHLER FINDE WEIL ICH DAS EINFACH NICHT HERAUSFINDEN KANN IHN RAUSNEHMEN WERDE ICH SCHON SELBER NUR KOMM ICH NICHT DRAUF WO SICH DER FEHLER BEFINDET



  • Und das ist nicht dasselbe?



  • Info123456 schrieb:

    NEIN ICH BRAUCHE NUR JEMANDEN DER SAGT IN WELCHER REIHE ICH DEN FEHLER FINDE [...]

    rofl. wie denn ohne Zeilennummern, DU HORST!



  • Info123456 schrieb:

    KANN IHN RAUSNEHMEN WERDE ICH SCHON SELBER NUR KOMM ICH NICHT DRAUF WO SICH DER FEHLER BEFINDET

    Wie lautet denn der erste Fehler? Auch wenn Du den Text nicht entziffern kannst, es muss bei den Meldungen auch einen Anfang geben. Dort sind unter anderem Ziffern und Zahlen zu erkennen. Eine davon ist die Programmzeile, in der der Fehler ist.



  • Info123456 schrieb:

    manni66 schrieb:

    Und jetzt macht dir jemand die Fehler raus?

    NEIN ICH BRAUCHE NUR JEMANDEN DER SAGT IN WELCHER REIHE ICH DEN FEHLER FINDE WEIL ICH DAS EINFACH NICHT HERAUSFINDEN KANN IHN RAUSNEHMEN WERDE ICH SCHON SELBER NUR KOMM ICH NICHT DRAUF WO SICH DER FEHLER BEFINDET

    Sag mal bist du irgendwie zu blöd die Fehlermeldungen des Compilers zu lesen? Da stehen die Zeilenangaben drin! Desweiteren im Sinne aller: Du nervst!


Anmelden zum Antworten