Prüfung zweier Nummern



  • So hier ist der gesamte Code. Vielleicht ist ein hässlicher Code. Bei ISBN wurden int und char genommen um eine Überprüfung ob es gültige Werte haben.

    #include "std_lib_facilities.h"
    
    class Book
    {
    public:
    	void ISBN(int a, char h, int b, char e, int c, char f, int d);
    	void Titel(string name);
    	void Autor(string name, string vorname);
    	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);
    private:
    	int a,b,c,d;
    	string name, name2, vorname,antwort;
    	char h,e,f;
    };
    
    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, char hh, int bb, char ee, int cc, char ff, int dd)
    {
    	if ( aa < 0 || hh != '-' || bb < 0 || ee != '-' || cc < 0 || ff != '-' || dd != 0) {
    		cout << "Sorry das ist keine ISBN!" << endl;}
    	else {
    		cout << aa << hh << bb << ee << cc << ff << dd << endl;}
    
    }
    
    bool operator==(Book& New, Book& New3)
    {
    	return New.ISBN(45,'-',78,'-',89,'-',0)==New3.ISBN(45,'-',45,'-',56,'-',0);
    }
    
    bool operator!=(Book& New, Book& New3)
    {
    	return!(New==New3);
    }
    
    void f()
    {
    	Book New("Das","Buch");
    	Book New2("Das","Das");
    	Book New3("Buch","Drei");
    	Book Test("Neues","Buch");
    	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);
    	Test.ISBN(45,'+',45,'-',45,'-',0);
    }
    
    int main()
    {
        f();
    
    	keep_window_open();
        return 0;
    }
    


  • Und wo wird deine ISBN nun gespeichert, damit du diese Werte im == operator aufrufen kannst? Bislang sehe ich da nichts. Du versuchst gerade den Rückgabewert zweier Funktionen (void) miteinander zu vergleichen, das geht natürlich nicht.



  • Also das ist das Problem. Sollte man das in einem Vector werfen? Oder eine Funktion schreiben?



  • Du kannst das Ganze in einen String packen oder in die Variablen int a b c d die du dafür angelegt, aber nie verwendet hast. char h e f brauchst du da aber auch nicht, da ja klar sein sollte wo der Bindestrich dann ist. Wenn du die Werte gespeichtert hast, musst du diese nur vergleichen in dem operator.



  • OK versuche mal etwas zu machen.



  • Aber eins verstehe ich nicht. Die Zahlen sind ja im ISBN. Wieso wird das nicht erkannt?



  • Das sind doch nur lokale Variablen die beim Ende der Funktion freigegeben werden. Siehe dafür die Themen "Scope" und "Gültigkeiten von Variablen".

    Die ISBN-Funktion müsste eher so aussehen:

    void Book::ISBN(int aa, char hh, int bb, char ee, int cc, char ff, int dd) 
    { 
        if ( aa < 0 || hh != '-' || bb < 0 || ee != '-' || cc < 0 || ff != '-' || dd != 0) { 
            cout << "Sorry das ist keine ISBN!" << endl;} 
        else { 
            cout << aa << hh << bb << ee << cc << ff << dd << endl;
    a = aa; b = bb; c = cc; d = dd; // Variablen in der Klasse speichern} 
    
    }
    

    Und dann fragt der Operator diese Variablen ab und vergleicht diese.

    bool operator==(const Book& lhs, const Book& rhs) 
    { 
        return (lhs.a == rhs.a && lhs.b == rhs.b && lhs.c == rhs.c && lhs.d == rhs.d); 
    }
    

    Wenn die Variablen private sind, dann muss der Operator friend sein, oder du musst getter-methoden verwenden.



  • Danke für den Tipp. Werde am Programm morgen weiter arbeiten.



  • 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;
    }
    

Anmelden zum Antworten