Sparschwein



  • Schreiben Sie eine Klasse, deren Objekte ein Sparschwein repräsentieren. In dieses Sparschwein können nur Münzen im Wert von 1 Cent, 5 Cent und 10 Cent geworfen werden. Implementieren Sie zumindest die Methoden ''leeren'' (Setzt den Inhalt des Sparschweins auf 0), ''einwerfen'' (ermöglicht es, Münzen in das Sparschwein einzuwerfen) und ''print'' (gibt den Inhalt des Sparschweins in der Form z.B.: "2*1Cent + 1*5Cent+3*10Cent = 37Cent" aus)
    Schreiben Sie

    die nötigen Konstruktoren, damit folgende Definitionen von Objekten möglich sind (unter der Annahme, dass die Klasse den Namen Sparschwein hat):
    Sparschwein a; // erzeugt ein leeres Sparschwein
    Sparschwein b=10; // erzeugt ein Sparschwein mit 10 Eincentmünzen als Inhalt
    Sparschwein c(2,3,4); // erzeugt ein Sparschwein mit 2 Eincent-, 3 Fünfcent- und 4 Zehncentmünzen als Inhalt

    Die Vergleichsoperatoren <, >, ==, !=, die jeweils den Inhalt zweier Sparschweine vergleichen
    Schreiben Sie ein Hauptprogramm, das mindestens zwei Instanzen Ihrer Klasse verwendet und die Verwendung der verschiedenen Methoden illustriert.

    Ich habe diese Aufgabe versucht, auch unter Berücksichtung eines Beitrags der hier bereits erstellt wurde und habe es leider nicht geschafft das Beispiel zu lösen. Ich hoffe mir kann eventuell irgendwer helfen, was ich falsch gemacht habe, beziehungsweise einen Ansatz geben wie ich es bewältigen kann. Das Problem ist, dass ich gerade erst mit Klassen angefangen habe und sie noch sehr schlecht verstehe.

    Mein Ansatz folgt im ersten Kommentar



  • Hier mein Ansatz:

    class sparschwein{
    
    	int inhalt;
    	int muenzen[3];
    
    	public:
    
    		int leeren();
    		int einwerfen(int muenz_art, int anzahl);
    		int print(int cent1, int cent5, int cent10);
    
    }
    
    int sparschwein ::leeren(){
    
    	inhalt=0;
    	return inhalt;
    
    }
    
    void sparschwein ::einwerfen(int muenz_art, int anzahl){
    
    	muenzen[muenz_art] += anzahl;
    
    }
    
    void sparschwein ::print(int cent1, int cent5, int cent10){
    
    	cout << cent1 << endl;
    	cout << cent5 << endl;
    	cout << cent10 << endl;
    };
    
    #include <iostream>
    using namespace std;
    
    int main () {
    
    	int was;
    	int 1cent;
    	int 5cent;
    	int 10cent;
    
    	cout << endl;
    	cout << "Was möchten sie tun? " << endl;
    	cout << endl;
    	cout << "1: Sparschwein leeren" << endl;
    	cout << "2: Einwerfen" << endl;
    	cout << "3: Inhalt des Sparschweins ausgeben" << endl;
    	cin >> was;
    
    	switch (was) {
    
    		case 1:
    
    		sparschwein ::leeren();
    		break;
    
    		case 2:
    
    		cout << "Wieviel 1 Cent möchten sie einwerfen? ";
    		cin >> 1cent;
    
    		cout << "Wieviel 5 Cent möchten sie einwerfen? ";
    		cin >> 5cent;
    
    		cout << "Wieviel 10 Cent möchten sie einwerfen? ";
    		cin >> 10cent;
    
    		sparschwein ::einwerfen(1cent, 5cent, 10cent);
    
    		break;
    
    		case 3:
    
    		sparschwein ::print(1cent, 5cent, 10cent);
    		break;
    
    	}
    return 0;
    }
    


  • Hier noch die Fehlermeldungen, falls diese weiterhelfen:

    haupt.C:7:6: error: invalid suffix "cent" on integer constant
    int 1cent;
    ^
    haupt.C:8:6: error: invalid suffix "cent" on integer constant
    int 5cent;
    ^
    haupt.C:9:6: error: invalid suffix "cent" on integer constant
    int 10cent;
    ^
    haupt.C:29:10: error: invalid suffix "cent" on integer constant
    cin >> 1cent;
    ^
    haupt.C:32:10: error: invalid suffix "cent" on integer constant
    cin >> 5cent;
    ^
    haupt.C:35:10: error: invalid suffix "cent" on integer constant
    cin >> 10cent;
    ^
    haupt.C:37:27: error: invalid suffix "cent" on integer constant
    sparschwein ::einwerfen(1cent, 5cent, 10cent);
    ^
    haupt.C:37:34: error: invalid suffix "cent" on integer constant
    sparschwein ::einwerfen(1cent, 5cent, 10cent);
    ^
    haupt.C:37:41: error: invalid suffix "cent" on integer constant
    sparschwein ::einwerfen(1cent, 5cent, 10cent);
    ^
    haupt.C:43:23: error: invalid suffix "cent" on integer constant
    sparschwein ::print(1cent, 5cent, 10cent);
    ^
    haupt.C:43:30: error: invalid suffix "cent" on integer constant
    sparschwein ::print(1cent, 5cent, 10cent);
    ^
    haupt.C:43:37: error: invalid suffix "cent" on integer constant
    sparschwein ::print(1cent, 5cent, 10cent);
    ^
    haupt.C: In function ‘int main()’:
    haupt.C:7:6: error: expected unqualified-id before numeric constant
    int 1cent;
    ^
    haupt.C:8:6: error: expected unqualified-id before numeric constant
    int 5cent;
    ^
    haupt.C:9:6: error: expected unqualified-id before numeric constant
    int 10cent;
    ^
    haupt.C:23:3: error: ‘sparschwein’ has not been declared
    sparschwein ::leeren();
    ^
    haupt.C:37:3: error: ‘sparschwein’ has not been declared
    sparschwein ::einwerfen(1cent, 5cent, 10cent);
    ^
    haupt.C:43:3: error: ‘sparschwein’ has not been declared
    sparschwein ::print(1cent, 5cent, 10cent);
    ^
    sparschwein.C:12:1: error: expected ‘;’ after class definition
    }
    ^
    sparschwein.C:23:6: error: prototype for ‘void sparschwein::einwerfen(int, int)’ does not match any in class ‘sparschwein’
    void sparschwein ::einwerfen(int muenz_art, int anzahl){
    ^
    sparschwein.C:9:7: error: candidate is: int sparschwein::einwerfen(int, int)
    int einwerfen(int muenz_art, int anzahl);
    ^
    sparschwein.C:29:6: error: prototype for ‘void sparschwein::print(int, int, int)’ does not match any in class ‘sparschwein’
    void sparschwein ::print(int cent1, int cent5, int cent10){
    ^
    sparschwein.C:10:7: error: candidate is: int sparschwein::print(int, int, int)
    int print(int cent1, int cent5, int cent10);



  • int was;
    int 1cent;
    int 5cent;
    int 10cent;

    Variablennamen müssen mit einem Buchstaben oder _ beginnen.



  • Hallo

    Ich glaube du solltest dir erst noch mal anschauen wie man Klassen arbeitet.

    Als Beispiel, definieren der Klasse:

    class MyClass {
        int par_;
      public:
        // Standard-Konstruktor
        MyClass();
        // Konstruktor mit Parameter
        MyClass(int par);
    
        // Member-Funktionen
        void TueEtwas();
        int ErmittleWas();
    };
    
    MyClass::MyClass() : par_(0) {}
    MyClass::MyClass(int par) : par_(par) {}
    
    void MyClass:TueEtwas() { ++par_; }
    int MyClass::ErmittleWas() { return par_; }
    

    Und so verwendet man die Klasse:

    #include <iostream>
    
    // Ein Objekt erzeugen mit den StandardKonstruktor
    MyClass myObj1;
    // Ein Objekt erzeugen, mit dem Konstruktor mit Parametern
    MyClass myObj2(5);
    
    // Die Funktionen auf der Klasse rufen
    myObj1.TueEtwas();
    myObj2.TueEtwas();
    
    std::cout << myObj1.ErmittleWas() << " - " << myObj2.ErmittleWas();
    

    Und danach würde ich mal anfangen die Aufgabenstellung 1:1 in eine Klasse zu gießen, als Vorlage schreib ich dir die Main-Funktion, die nach deinem Umbau funktionieren muss:

    int main() {
      // Erzeuge ein leeres Sparschwein
      Sparschwein a;
      a.print();
    
      // Erzeuge ein Sparschwein mit einem direkten Inhalt
      Sparschwein b = 10;
      b.print();
    
      // Erzeuge ein Sparschwein mit vielen Münzen
      Sparschwein c(47, 11, 42);
      c.print();
    
      // Erzeuge leeres Sparschwein mit nachfolgenden Einwurf
      Sparschwein d;
      d.einwerfen(0, 8, 15);
      d.print();
      // Und wieder leeren
      d.leeren();
      d.print();
    };
    

    Die Ausgabe dazu müsste dann wie folgt lauten:

    0 * 1 Cent + 0 * 5 Cent + 0 * 10 Cent = 0 Cent
    10 * 1 Cent + 0 * 5 Cent + 0 * 10 Cent = 10 Cent
    47 * 1 Cent + 11 * 5 Cent + 42 * 10 Cent = 522 Cent
    0 * 1 Cent + 8 * 5 Cent + 15 * 10 Cent = 190 Cent
    0 * 1 Cent + 0 * 5 Cent + 0 * 10 Cent = 0 Cent
    

    Gruß Marco



  • Danke, ich denke ich verstehe jetzt wie die Aufgabe eigentlich zu verstehen ist.
    Ja ich weiß, da ich noch nichts mit Klassen zu tun hatte und gerade erst angefangen habe damit, fällt es mir momentan noch sehr schwer sie überhaupt zu definieren.

    Danke für die Ansätze, werde es morgen gleich versuchen umzusetzen



  • Ich habe es jetzt nochmal versucht, ganz einfach nur immer alles mit cout auszugeben. Leider funktioniert nicht mal das...

    class Sparschwein{
    
    	int inhalt;
    	int muenzen[3];
    
    	public:
    		a.print();
    		b.print();
    		c.print();
    		d.einwerfen();
    		d.print();
    		d.leeren();
    		d.print();
    };	
    
    void ::a.print() {
    
    	cout << "0 * 1 Cent + 0 * 5 Cent + 0 * 10 Cent = 0 Cent" << endl;
    
    }
    
    void ::b.print() {
    
    	cout << "10 * 1 Cent + 0 * 5 Cent + 0 * 10 Cent = 10 Cent" << endl;
    
    }
    
    void ::c.print() {
    
    	cout << "47 * 1 Cent + 11 * 5 Cent + 42 * 10 Cent = 522 Cent" << endl;
    
    }
    
    void ::d.einwerfen(0, 8, 15) {
    
    	::d.print(0,8,15);
    }
    
    void ::d.print(0,8,15) {
    
    	cout << "0 * 1 Cent + 8 * 5 Cent + 15 * 10 Cent = 190 Cent" << endl;
    
    }
    
    void ::d.leeren() {
    
    	::d.print();
    
    }
    
    void ::d.print() {
    
    	cout << "0 * 1 Cent + 0 * 5 Cent + 0 * 10 Cent = 0 Cent" << endl;
    
    }
    


  • Was heißt denn das funktioniert nicht? Wir haben keine Glaskugeln.



  • Damit meine ich, es kommt beim kompilieren folgende Fehlermeldung:

    Sparschwein.C:7:3: error: ‘a’ does not name a type
    a.print();
    ^
    Sparschwein.C:8:3: error: ‘b’ does not name a type
    b.print();
    ^
    Sparschwein.C:9:3: error: ‘c’ does not name a type
    c.print();
    ^
    Sparschwein.C:10:3: error: ‘d’ does not name a type
    d.einwerfen();
    ^
    Sparschwein.C:11:3: error: ‘d’ does not name a type
    d.print();
    ^
    Sparschwein.C:12:3: error: ‘d’ does not name a type
    d.leeren();
    ^
    Sparschwein.C:13:3: error: ‘d’ does not name a type
    d.print();
    ^
    Sparschwein.C:16:9: error: expected initializer before ‘.’ token
    void ::a.print() {
    ^
    Sparschwein.C:22:9: error: expected initializer before ‘.’ token
    void ::b.print() {
    ^
    Sparschwein.C:28:9: error: expected initializer before ‘.’ token
    void ::c.print() {
    ^
    Sparschwein.C:34:9: error: expected initializer before ‘.’ token
    void ::d.einwerfen(0, 8, 15) {
    ^
    Sparschwein.C:39:9: error: expected initializer before ‘.’ token
    void ::d.print(0,8,15) {
    ^
    Sparschwein.C:45:9: error: expected initializer before ‘.’ token
    void ::d.leeren() {
    ^
    Sparschwein.C:51:9: error: expected initializer before ‘.’ token
    void ::d.print() {
    ^
    In file included from haupt.C:2:0:
    Sparschwein.C:7:3: error: ‘a’ does not name a type
    a.print();
    ^
    Sparschwein.C:8:3: error: ‘b’ does not name a type
    b.print();
    ^
    Sparschwein.C:9:3: error: ‘c’ does not name a type
    c.print();
    ^
    Sparschwein.C:10:3: error: ‘d’ does not name a type
    d.einwerfen();
    ^
    Sparschwein.C:11:3: error: ‘d’ does not name a type
    d.print();
    ^
    Sparschwein.C:12:3: error: ‘d’ does not name a type
    d.leeren();
    ^
    Sparschwein.C:13:3: error: ‘d’ does not name a type
    d.print();
    ^
    Sparschwein.C:16:9: error: expected initializer before ‘.’ token
    void ::a.print() {
    ^
    Sparschwein.C:22:9: error: expected initializer before ‘.’ token
    void ::b.print() {
    ^
    Sparschwein.C:28:9: error: expected initializer before ‘.’ token
    void ::c.print() {
    ^
    Sparschwein.C:34:9: error: expected initializer before ‘.’ token
    void ::d.einwerfen(0, 8, 15) {
    ^
    Sparschwein.C:39:9: error: expected initializer before ‘.’ token
    void ::d.print(0,8,15) {
    ^
    Sparschwein.C:45:9: error: expected initializer before ‘.’ token
    void ::d.leeren() {
    ^
    Sparschwein.C:51:9: error: expected initializer before ‘.’ token
    void ::d.print() {
    ^
    haupt.C: In function ‘int main()’:
    haupt.C:8:4: error: ‘class Sparschwein’ has no member named ‘print’
    a.print();
    ^
    haupt.C:10:18: error: conversion from ‘int’ to non-scalar type ‘Sparschwein’ requested
    Sparschwein b = 10;
    ^
    haupt.C:11:4: error: ‘class Sparschwein’ has no member named ‘print’
    b.print();
    ^
    haupt.C:13:26: error: no matching function for call to ‘Sparschwein::Sparschwein(int, int, int)’
    Sparschwein c(47, 11, 42);
    ^
    haupt.C:13:26: note: candidates are:
    In file included from haupt.C:2:0:
    Sparschwein.C:1:7: note: Sparschwein::Sparschwein()
    class Sparschwein{
    ^
    Sparschwein.C:1:7: note: candidate expects 0 arguments, 3 provided
    Sparschwein.C:1:7: note: Sparschwein::Sparschwein(const Sparschwein&)
    Sparschwein.C:1:7: note: candidate expects 1 argument, 3 provided
    haupt.C:14:4: error: ‘class Sparschwein’ has no member named ‘print’
    c.print();
    ^
    haupt.C:17:4: error: ‘class Sparschwein’ has no member named ‘einwerfen’
    d.einwerfen(0, 8, 15);
    ^
    haupt.C:18:4: error: ‘class Sparschwein’ has no member named ‘print’
    d.print();
    ^
    haupt.C:20:4: error: ‘class Sparschwein’ has no member named ‘leeren’
    d.leeren();
    ^
    haupt.C:21:4: error: ‘class Sparschwein’ has no member named ‘print’
    d.print();
    ^



  • Warum genau setzt du "a." davor?



  • Weil ich nach der Angabe von Marc-O gehe in meiner Main.

    Also a.print() bedeutet 0 * 1 Cent + 0 * 5 Cent + 0 * 10 Cent = 10 Cent.

    In der Angabe, die ich bekommen habe steht auch: Sparschwein a; // erzeugt ein leeres Sparschwein
    Sparschwein b=10; // erzeugt ein Sparschwein mit 10 Eincentmünzen als Inhalt
    Sparschwein c(2,3,4); // erzeugt ein Sparschwein mit 2 Eincent-, 3 Fünfcent- und 4 Zehncentmünzen als Inhalt



  • Deine Klassendefinition ist trotzdem falsch und das "a.Print" macht so keinen Sinn.

    class Sparschwein{
    
        int inhalt;
        int muenzen[3];
    
        public:
            void print();
            void einwerfen(int muenze);
            void leeren();
    };
    

    Wenn dann muss das so aussehen.



  • also mehr so in diese Richtung?
    Tut mir sehr leidl, dass ich noch so wenig Ahnung habe von Klassen, fällt mir schwer daher das ganze zu verstehen.

    class Sparschwein{
    
    	int inhalt;
    	int muenzen[3];
    
    	public:
    
    		void print();
    		void einwerfen(int muenze);
    		void leeren();
    
    };	
    
    void ::a.print() {
    
    	cout << "0 * 1 Cent + 0 * 5 Cent + 0 * 10 Cent = 0 Cent" << endl;
    
    }
    
    void ::b.print() {
    
    	cout << "10 * 1 Cent + 0 * 5 Cent + 0 * 10 Cent = 10 Cent" << endl;
    }
    
    void ::c.print() {
    
    	cout << "47 * 1 Cent + 11 * 5 Cent + 42 * 10 Cent = 522 Cent" << endl;
    }
    
    void ::d.print() {
    
    	cout << "0 * 1 Cent + 0 * 5 Cent + 0 * 10 Cent = 0 Cent" << endl;
    
    }
    
    void ::d.einwerfen() {
    
    	::d.print(0,8,15);
    
    }
    
    void ::d.print(0,8,15) {
    
    	cout << "0 * 1 Cent + 8 * 5 Cent + 15 * 10 Cent = 190 Cent" << endl;
    }
    
    void ::d.leeren() {
    
    	::d.print(0,0,0);
    }
    
    void ::d.print(0,0,0) {
    
    	cout << "0 * 1 Cent + 0 * 5 Cent + 0 * 10 Cent = 0 Cent" << endl;
    }
    


  • Hallo,

    class Sparschwein{
    
        int inhalt;
        int muenzen[3];
    
        public:
    
            void print(int firstCoin, int secondCoind, int thirdCoin);
            void einwerfen(int firstCoin, int secondCoind, int thirdCoin);
            void leeren();
    
    }; 
    
    void Sparschwein::print(int firstCoin, int secondCoind, int thirdCoin) {
    
        cout << "0 * 1 Cent + 0 * 5 Cent + 0 * 10 Cent = 0 Cent" << endl;
    
    }
    
    void Sparschwein::einwerfen(int firstCoin, int secondCoin, int thirdCoin) {
    
        ::print(firstCoind, secondCoin, thirdCoin);
    
    }
    
    void Sparschwein::leeren() { 
        ::print(0,0,0);
    }
    


  • Das ganze würde dann aber nicht mehr mit der alten Main funktionieren oder?
    Also nicht mehr mit:

    #include <iostream>
    #include "Sparschwein.C"
    using namespace std;
    
    int main () {
    
    	Sparschwein a;
    	a.print();
    
    	Sparschwein b = 10;
    	b.print();
    
    	Sparschwein c(47, 11, 42);
    	c.print();
    
    	Sparschwein d;
    	d.einwerfen(0, 8, 15);
    	d.print();
    
    	d.leeren();
    	d.print();
    
    return 0;
    }
    


  • Wieso denn nicht? Wenn du die entsprechenden Konstruktoren noch implementierst sollte das Problemlos funktionieren.



  • Das heißt ich muss jetzt nur noch bei meiner Klasse immer jeweils a. b. c. d. print, einwerfen und leeren einbauen oder?





  • warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
    int muenzen[3] {0, 0, 0};

    Liegt das eventuell, dass der Inhalt Privat ist und ich ihn nicht bearbeiten darf im Weiteren?
    Denn default mäßig ist ja am Anfang alles Privat in der Klasse.



  • Nein, weiter kau ich dir jetzt nicht vor. - Dann musst du selbst mal google / die Doku bemühen wie du ein Array Initialisierst. - Außerdem scheint bei dir ja C++ 11 vorhanden zu sein, sonst wäre da keine Warnung sondern ein Compiler-Fehler.



  • Ich darf nicht nicht in der Klasse initialisieren, sondern erst im Konstruktor selbst, ist das richtig?

    Danke für eure Hilfe! 🙂

    PS: Habe es jetzt bereits gelöst, ein großes Dankeschön an euch, für eure Hilfe! 🙂


Anmelden zum Antworten