Prüfung zweier Nummern



  • Da int a,b,c,d private sind habe ich ein int a2,b2,c2,d2 bei public gesetzt. Vielleicht ist das nicht in Ordnung aber beim Buch von aus ich lernen habe ich diesen bool operator zum ersten Mal gesehen. Dieser bool operator überprüft das die zwei Nummer gleich sind, kann man da auch etwas ausgeben lassen?



  • ja, schreib dein count rein

    greetz KN4CK3R



  • OK und wieder was gelernt.



  • Wie will der <<operator den Wert von New.Autor2() ausgeben obwohl es so geschrieben wurde das es sollte.

    string Autor2(){return autor;}
    
    ostream& operator<<(ostream& os, Book& New)
    {
    	return os << New.Titel2() << " " << New.Titel3() << "\n"
    	          << New.Autor2() << endl;
    }
    


  • winux schrieb:

    Wie will der <<operator den Wert von New.Autor2() ausgeben obwohl es so geschrieben wurde das es sollte.

    Ich verstehe nur Bahnhof. Versuch bitte dich klar, präzise und vor allem verständlich auszudrücken.



  • und was ist jetzt deine Frage?

    greetz KN4CK3R



  • Also laut der Übung soll man mit dem <<operator den Titel, Autor und ISBN auf jeweils getrennte Zeilen ausgeben. Da aber die int und string private sind habe ich eine Funktion geschrieben die diese Werte zurückgreifen. Und das Problem ist folgendes, ich habe die Funktion geschrieben das auf die private Variablen zurückgreifen kann. Aber irgendwie will der <<operator sie nicht asugeben.



  • wenn deine Titel2() etc Funktionen das tun was sie sollen, dann sieht der Code recht brauchbar aus. Wie versucht du das denn auszugeben?

    greetz KN4CK3R



  • Die Funktionen

    string Titel2(){return name;} 
    string Titel3(){return name2;}
    string Autor2(){return autor;}
    
    ostream& operator<<(ostream& os, Book& New)
    {
    	return os << New.Titel2() << " " << New.Titel3() << "\n"
    	          << New.Autor2() << endl;
    }
    
    operator<<(cout,New);
    


  • und was is wenn du das normal machst?

    cout << "test: " << deineBuchVariable << endl;
    

    greetz KN4CK3R



  • Könnte man auch machen nur die Übung verlangt das es mit dem <<operator gemacht wird. Das Probleme ist das Titel2 und Titel3 angezeigt werden und Autor2 nicht.



  • Der ganze Code:

    class Book
    {
    public:
    	void ISBN(int a, int b, int c, int d);
    	void Titel(string name, string name2);
    	void Autor(string autor);
    	void Copyright(string name);
    	void liehen(string name, string name2, string antwort);
    	void geben(string name, string name2, string antwort, int a);
    	Book(string name, string name2);
    	int a2,b2,c2,d2;
    	string Titel2(); 
    	string Titel3(){return name2;}
    	string Autor2(){return autor;}
    private:
    	int a,b,c,d;
    	string name, name2, vorname,antwort,autor;
    };
    
    Book::Book(string n, string n2):name(n),name2(n2)
    {
    	if (n != n2) {
    		cout << n << " " << n2 << endl;} 
    	else {
    		cout << "Ungueltiger name!" << endl;}
    }
    
    void Book::liehen(string n, string n2, string an)
    {
    	if (an == "ja" || an == "Ja") {
    		cout << n << " " << n2 << " " << "ist ausgeliehen?" << " " << an << endl;}
    	else {
    		cout << "Das Buch sollte ausgeliehen sein!" << endl;}
    }
    
    void Book::geben(string n, string n2, string an, int aa)
    {
    	if (an != "Montag " && an != "Dienstag" && an != "Mittwoch" && an != "Donnerstag" && an != "Freitag" && aa > 31) {
    		cout << "Das ausgeliehen buch" <<  " "  << "\"" << n << " " << n2 << "\"" << " " << "kommt am" << " " << an <<  " " << "dem" << " " << aa  << " " << "zurueck." << endl;}
    	else {
    		cout << "Ungueltiger Tag oder Wochentag!" << endl;}
    }
    
    void Book::ISBN(int aa, int bb, int cc, int dd)
    {
    	if ( aa < 0 || bb < 0 || cc < 0 || dd != 0) {
    		cout << "Sorry das ist keine ISBN!" << endl;}
    	else {
    		cout << aa << "-" << bb << "-" << cc << "-" << dd << endl;}
    
    	a2 == aa;           //  Variablen in der Klasse speichern
    	b2 == bb;
    	c2 == cc;
    	d2 == dd;
    }
    
    void Book::Autor(string autor)
    {
    	cout << autor << endl;
    }
    
    void Book::Titel(string name, string name2)
    {
        cout << name << " " << name2 << endl;	
    }
    
    string Book::Titel2()     
    {
    	return name;
    }
    
    bool operator==(const Book& New, const Book& New3)
    {
    	return (New.a2 == New3.a2 && New.b2 == New3.b2 && New.c2 == New3.c2 && New.d2 == New3.d2);
    }
    
    bool operator!=(const Book& New, const Book& New3)
    {
    	return!(New==New3);
    }
    
    ostream& operator<<(ostream& os, Book& New)
    {
    	return os << New.Titel2() << " " << New.Titel3()  
    		      << New.Autor2() << endl;
    
    } 
    
    void f()
    {
    	Book New("Das","Buch");
    	Book New2("Das","Das");
    	Book New3("Buch","Drei");
    	Book Test("Neues","Buch");
    	New.Titel("Das", "Buch");
    	New.Autor("Bill Johnson");
    	New.liehen("Das","Buch","Ja");
    	New2.liehen("Ein","Buch","Nein");
    	New.geben("Das","Buch","Montag",15);
    	New2.geben("Ein","Buch","Samstag",30);
    	Test.geben("Neues","Buch","Montag",56);
    	New.ISBN(45,78,89,0);
    	New2.ISBN(96,89,88,12);
    	New3.ISBN(45,45,56,0);
    	operator==(New,New3);
    	operator!=(New,New3);
    	operator<<(cout,New);
    }
    
    int main()
    {
        f();
    
    	keep_window_open();
        return 0;
    }
    


  • void Book::ISBN(int aa, int bb, int cc, int dd)
    {
        if ( aa < 0 || bb < 0 || cc < 0 || dd != 0) {
            cout << "Sorry das ist keine ISBN!" << endl;}
        else {
            cout << aa << "-" << bb << "-" << cc << "-" << dd << endl;}
    
        a2 == aa;           //  Variablen in der Klasse speichern
        b2 == bb;
        c2 == cc;
        d2 == dd;
    }
    

    Das ist keine Zuweisung, sondenr ein Vergleich. Richtig wäre es mit =



  • OK da ist ein Fehler.



  • Aber wieso wird der string in Autor2 nicht ausgegeben?



  • Weil die Funktion Autor keinen String speichert überall der selbe Fehler.



  • #include <iostream>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    enum Wochentag
    {
    	MONTAG,
    	DIENSTAG,
    	MITTWOCH,
    	DONNERSTAG,
    	FREITAG,
    	SAMSTAG,
    	SONNTAG
    };
    
    //DATUM
    class Datum
    {
    public:
    	Datum(int tag, int monat, int jahr, Wochentag wochentag)
    		:tag(tag), monat(monat), jahr(jahr), wochentag(wochentag){};
    
    	friend ostream& operator<<(ostream& out, const Datum& val);
    
    private:
    	int tag, monat, jahr;
    	Wochentag wochentag;
    };
    
    ostream& operator<<(ostream& out, const Datum& val)
    {
    	switch(val.wochentag)
    	{
    	case MONTAG:
    		out << "Montag ";
    		break;
    	case DIENSTAG:
    		out << "Dienstag ";
    		break;
    	case MITTWOCH:
    		out << "Mittwoch ";
    		break;
    	case DONNERSTAG:
    		out << "Donnerstag ";
    		break;
    	case FREITAG:
    		out << "Freitag ";
    		break;
    	case SAMSTAG:
    		out << "Samstag ";
    		break;
    	case SONNTAG:
    		out << "Sonntag ";
    		break;
    	}
    
    	out << "den " << val.tag << "." << val.monat << "." << val.jahr;
    
    	return out;
    }
    
    //ISBN
    #define MAX_ISBN 4
    
    class Isbn
    {
    public:
    	Isbn(const int myisbn[MAX_ISBN])
    	{
    		for(int i = 0; i < MAX_ISBN; ++i)
    			isbn[i] = myisbn[i];
    	}
    
    	bool operator!=(const Isbn& rhs);
    	bool operator==(const Isbn& rhs);
    	friend ostream& operator<<(ostream& out, const Isbn& val);
    
    private:
    	int isbn[MAX_ISBN];
    };
    
    //ISBN METHODEN
    ostream& operator<<(ostream& out, const Isbn& val)
    {
    	out << val.isbn[0] << "-" << val.isbn[1] << "-" << val.isbn[2] << "-" << val.isbn[3];
    	return out;
    }
    
    bool Isbn::operator==(const Isbn& rhs)
    {
    	for(int i = 0; i < MAX_ISBN; ++i)
    		if(isbn[i] != rhs.isbn[i])
    			return false;
    
    	return true;
    }
    
    bool Isbn::operator!=(const Isbn& rhs) 
    { 
        return !(*this == rhs); 
    } 
    
    //BUCH
    class Buch 
    { 
    public: 
        Buch(const string& name, const string& vorname, Isbn isbn)
    		:name(name), vorname(vorname), isbn(isbn), ausgeliehen(false), datum(0,0,0,MONTAG){}
    
    	void Ausleihen(const Datum& ausleihdatum){ausgeliehen = true; datum = ausleihdatum;}
    	bool Istgeliehen(){return ausgeliehen;}
    	void Zurueckgeben(){ausgeliehen = false;}
    
    	bool operator!=(const Buch& rhs);
    	bool operator==(const Buch& rhs);
    	friend ostream& operator<<(ostream& out, const Buch& val);
    
    private: 
    	Isbn isbn;
        string name, vorname;
    	bool ausgeliehen;
    	Datum datum;
    }; 
    
    //BUCH METHODEN
    ostream& operator<<(ostream& out, const Buch& val)
    {
    	out << "Autorname: "		<< val.name
    		<< "\nAutorvorname: "	<< val.vorname
    		<< "\nBuch-ISBN: "		<< val.isbn
    		<< "\nAusgeleihen: ";
    
    	if(val.ausgeliehen)		out << "Am " << val.datum;
    	else					out << "Nein";
    
    	return out;
    }
    
    bool Buch::operator==(const Buch& rhs) 
    { 
    	if(isbn != rhs.isbn || name != rhs.name || vorname != rhs.vorname)
    		return false;
    
        return true; 
    } 
    
    bool Buch::operator!=(const Buch& rhs) 
    { 
        return !(*this == rhs); 
    } 
    
    //MAIN
    int main() 
    { 
    	int meineisbn[] = {45,67,23,12};
    	Buch buch("Mustermann", "Max", Isbn(meineisbn)); 
    	cout << buch << "\n\n";
    
    	buch.Ausleihen(Datum(15,7,2010, FREITAG));
    	cout << buch;
    }
    


  • Ok wieder der selbe Fehler.



  • Die nächste Aufgabe ist das man einen Aufzählungstyp erzeugen soll. Das wurde auch gemacht und es wurden auch die Werte reingeschrieben. Die Änderungen wurden am Konstruktor gemacht, doch der Compiler sagt: Syntaxfehler: Bezeichner 'Genre', Überladene Memberfunktion nicht in 'Book' gefunden.

    enum Genre{
    Roman , Sachbuch, Zeitschrift, Biografie, Kinder
    };
    
    Book(string name, string name2, Genre g);
    
    Book::Book(string n, string n2, Genre gg):name(n),name2(n2)
    {
    	if (n != n2) {
    		cout << n << " " << n2 << endl;} 
    	else {
    		cout << "Ungueltiger name!" << endl;}
    }
    
    Book New("Das","Buch",Book::Sachbuch);
    

    Es wurde gelöst.



  • So die jetzt ein anderes Problem, die geben Funktion hat einen Fehler. Es soll nur Wochentage akzeptieren und das Datum darf nicht höher als 31 sein. New.geben wird ausgegeben was OK ist weil ja Wochentag und Datum stimmen. New2.geben wird ausgegeben das ist ein Fehler weil der Wochentag Samstag ist aber das Datum ist der 30-ste. Test.geben wird nicht ausgegeben was wiederum OK ist weil der Wochentag mit Montag richtig ist nur das Datum ist mit dem 56 falsch.

    void Book::geben(string b, string b2, string an, int aa)
    {
    	if (an == "Montag " || an == "Dienstag" || an == "Mittwoch" || an == "Donnerstag" || an == "Freitag" && aa <= 32) {
    		cout << "Das ausgeliehen buch" <<  " "  << "\"" << b << " " << b2 << "\"" << " " << "kommt am" << " " << an <<  " " << "dem" << " " << aa  << " " << "zurueck." << endl;}
    	else {
    		cout << "Ungueltiger Tag oder Wochentag!" << endl;}
    }
    
    New.geben("Das","Buch","Montag",15);
    New2.geben("Ein","Buch","Samstag",30);
    Test.geben("Neues","Buch","Montag",56);
    

Anmelden zum Antworten