Bücherverleih ( Anfängeraufgabe Uni )



  • Servus,

    wir sollen nun die erste Aufgabe mit Klassen machen , und da hab ich so meine Problemchen. Inzwischen habe ich es geschafft den array m_book mit den Büchern zu befüllen. Nun hab ich 3 dumme Fragen:

    1. Wie kann ich eine einzige Position im Array auslesen z.B. [2] ?
    2. Wie kann ich eine Schleife über das Array machen die schaut ob der aktuelle Satz befüllt oder leer ist? ( Um das nächste Buch an die richtige Stelle zu packen )
    3. Wie kann ich eine Schleife über das Array legen die ein bestimmtes Feld ( ISBN-Nummer ) mit einer anderen vergleicht, zum beispiel um ein bestimmtesBuch zu löschen?

    Wenn ihr Profis mir da helfen könntet oder ein paar hilfreiche Gedankenanstupser geben könntet wär ich euch sehr verbunden ! 👍

    Cya

    ( Das Gerüst des Programs war vorgegeben und muss eingehalten werden )

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class cBook
    {
    	string m_title;
    	string m_author;
    	string m_isbn;
    
    public:
    
    	cBook(string title,
    		string author,
    		string isbn)
    	{
    
    		m_title = title;
    		m_author = author;
    		m_isbn = isbn;
    
    	}
    
    	// ...
    };
    
    class Student
    {
    	// array der geliehenen Buecher
    	cBook* m_book[8];
    	int i = 0;
    private:
    
    public:
    
     	Student()
    	{
    		// ...
    	}
    
    	~Student()
    	{
    		// ...
    	}
    
    	void addBook(cBook& book)
    	{
    		if (i <= 7 )
    			*(m_book + i) = &book;
    			i++;
    
    	}
    
    	void removeBook(cBook& book)
    	{
    		// ..
    	}
    
    	void printBooks()
    	{
    		cout << "Buecher" << m_book[0] << endl;
    	}
    };
    
    /** This is the entry point of the program. */
    int main(int argc, char* argv[])
    {
    	cout << "----------------\n";;
    
    	cBook book_1("Introduction to Algorithms",
    		"Th. Cormen, Ch. Leiserson, R. Rivest",
    		"0262531968");
    
    	cBook book_2("The C++ Programming Language",
    		"Bjarne Stroustrup",
    		"0201700735");
    
    	cBook book_3("Grundkurs Informatik",
    		"H. Ernst",
    		"3528257172");
    
    	Student student;
    	student.addBook(book_1);
    	student.addBook(book_2);
    	student.addBook(book_3);
    	student.printBooks();
    
    	cout << "----------------\n";;
    
    	student.removeBook(book_2);
    	student.printBooks();
    
    	cout << "----------------\n";
    	system("PAUSE");
    
    	return 0;
    }
    

  • Mod

    kenyo schrieb:

    1. Wie kann ich eine einzige Position im Array auslesen z.B. [2] ?

    Genau so. array[2].

    2. Wie kann ich eine Schleife über das Array machen die schaut ob der aktuelle Satz befüllt oder leer ist? ( Um das nächste Buch an die richtige Stelle zu packen )

    Erstmal gibt es keine "leeren" Objekte. Ein Objekt ist immer in irgendeinem Zustand. Wenn der Typ des Objekts es unterstützt, dass es auch einen Leerzustand gibt, dann kannst du den natürlich auch Abfragen. Hier hast du als Objekttyp einen Zeiger auf den Buchtyp gewählt. Für Zeiger gibt es einen Sonderwert, den nullptr (oder einfach nur 0, wenn du kein C++11 benutzt), der sich anbietet, um eine Leerstelle anzuzeigen.

    Deutlich besser wäre aber eine geeignetere Datenstruktur. Dein Zeigerfeld hat viele Nachteile:
    -Es hat eine maximale Größe
    -Es hat Leerstellen
    -Siehe Frage 3.
    Hier böte sich mindestens erstmal ein dynamisches Feld an (Standardbibliothek: std::vector), eventuell besser (je nach genauen Anforderungen) ein std::set (siehe Frage 3).

    3. Wie kann ich eine Schleife über das Array legen die ein bestimmtes Feld ( ISBN-Nummer ) mit einer anderen vergleicht, zum beispiel um ein bestimmtesBuch zu löschen?

    Indem du das einfach tust. Wo ist das Problem?

    Du könntest auch einen sortierten Container benutzen, so dass du nicht alle Bücher durchsuchen musst, sondern direkt das richtige Buch findest. Dies wäre das std::set, das ist ein sortierter Container mit passabel schnellem Löschen, Einfügen und Suchen. Nicht so schnell beim Anhängen und Abhängen wie ein vector, aber gut, wenn man gezielte Zugriffe anhand eines Suchkriteriums braucht.



  • Irgendwie klappts bei mir nicht.

    Habe ein Screenshot vom Debugger gemacht... in der Ausgabe steht zwar die Adresse der einzelnen Positionen, aber nicht was darin steht.

    http://imageshack.com/a/img801/3547/7enh.png


  • Mod

    Was ist denn deiner Meinung nach

    cBook* m_book[8];
    

    für eine Art von Objekt? Beschreib mal mit Worten den Datentyp.

    Beispiele:

    int foo[5];  // foo ist ein Array[5] aus ints
    void *bar;   // bar ist ein Zeiger auf void
    


  • [code="cpp"]cBook* m_book[8];

    für mich ist das ein Zeiger auf ein Array von Objekten/Instanzen der Klasse cBook. Falls ich Recht habe, kenne ich aber leider die Syntax nicht um die membervariablen auszulesen. Vielleicht hab ich auch den falschen Denkansatz


  • Mod

    kenyo schrieb:

    cBook* m_book[8];
    

    für mich ist das ein Zeiger auf ein Array von Objekten/Instanzen der Klasse cBook.

    Nein, ist es nicht. Es ist ein Array von 8 Zeigern Objekte des Typs cBook.

    Dies wirft jedoch eine interessante Frage auf: Wieso willst du einen Zeiger auf ein Array haben? Ein Array von Zeigern auf Bücher kann ich ja noch halbwegs verstehen, schließlich stehen in der Bücherliste nicht die Bücher selbst, sondern nur Verweise auf Bücher. Aber ein Zeiger auf ein Array von Buchobjekten? Was soll damit modelliert werden?

    Ein Zeiger auf ein Array von 8 Büchern, wäre übrigens:

    cBook (*m_book)[8];
    

    Aber ich glaube kaum, dass du das wirklich so möchtest.



  • Danke für die Info soweit.

    Ich wollte keinen Zeiger auf ein Array von Objekten, das war nur meine Interpretation. Der Befehl selbst war schon in dem vorgegebenen "Programmgerüst" welches wir einhalten sollen.
    Wenn ich den Debugger richtig lese, dann hats mit dem Dateneinlesen ja auch geklappt , mein Problem ist jetzt das Datenauslesen der einzelnen Bücher.

    Die Ausgabe soll so aussehen :

    ----------------
    [Buch 0] Titel: Introduction to Algorithms
    Autor: Th. Cormen, Ch. Leiserson, R. Rivest, ISBN: 0262531968
    [Buch 1] Titel: The C++ Programming Language
    Autor: Bjarne Stroustrup, ISBN: 0201700735
    [Buch 2] Titel: Grundkurs Informatik
    Autor: H. Ernst, ISBN: 3528257172
    ----------------
    [Buch 0] Titel: Introduction to Algorithms
    Autor: Th. Cormen, Ch. Leiserson, R. Rivest, ISBN: 0262531968
    [Buch 2] Titel: Grundkurs Informatik
    Autor: H. Ernst, ISBN: 3528257172
    ----------------


  • Mod

    Wenn du einen Zeiger auf ein Objekt hast, wie kommst du dann an das Objekt, auf das er zeigt?



  • Wenn ich das wüsste, wäre ich wahrscheinlich schon fertig mit der Aufgabe 🙂


  • Mod

    kenyo schrieb:

    Wenn ich das wüsste, wäre ich wahrscheinlich schon fertig mit der Aufgabe 🙂

    Dann wäre jetzt ein guter Zeitpunkt, sich mal die Grundlagen von Zeigern anzugucken. Du hast doch sicherlich ein Lehrbuch oder Script oder ähnliches?



  • Das war mir schon bewusst, leider läuft die Frist bald ab und ich musste viel arbeiten, deshalb dachte ich könnte man mir hier helfen. Schade.

    Trotzdem danke!


  • Mod

    kenyo schrieb:

    deshalb dachte ich könnte man mir hier helfen. Schade.

    Hilfe zur Selbsthilfe gilt eigentlich als Hilfe. Wenn du zu einer Frist dein Programm haben musst, aber es selbst mit Hilfe nicht programmieren kannst, dann musst du eben jemanden dafür bezahlen. Aber niemand wird dir deine Hausaufgaben machen. Und die 5 Minuten, um nachzuschauen, wie die absoluten Grundlagen von Pointern (dir fehlt die Syntax! Das ist kein komplizierter Fehler beim Umgang mit Pointern, sondern Faulheit sich mal eben die erste Seite im ersten Kapitel über Pointer durchzulesen.) aussehen, sollten wohl nicht groß zzum Ablauf deiner Fristen beitragen, oder?



  • Mehr als das Auslesen der Membervariablen des Objektes auf die der Pointer zeigt hab ich ja von Anfang an nicht mal gewollt. Die Syntax wäre weniger Arbeit gewesen als die ganzen Gegenfragen.

    Die Hausaufgabe ( aus mehreren Aufgaben bestehend ) habe ich übrigens auch ohne diese Aufgabe schon bestanden, (hier gibts keine noten nur bestehen / nicht bestehen ) also keine Angst, dass ich mir hier die Hausaufgabe
    von jemandem machen wollte 😋

    Thread kann zugemacht werden.

    Bye 👍


Anmelden zum Antworten