Aufgabe 13
- Aufgabenstellung
- Lösung
Sie sollen ein Programm schreiben, das Teilnehmer für einen Workshop verwaltet. Jeder Teilnehmer hat einen Namen (als std::string) und eine Teilnehmernummer (int). Anschließend soll nach Teilnehmern gesucht werden können. Die Größe des Workshops, also die Anzahl der Teilnehmer soll erst während der Runtime, also während das Programm bereits läuft, eingegeben werden.
Das Programm soll folgendermaßen strukturiert werden:
- Verwenden Sie eine Klasse
Teilnehmermit den privaten Membern:std::string nameundint nummer. Fügen Sie dieser Klasse passende Konstruktoren, Setter- und Getter-Methoden hinzu. - Der Benutzer gibt die Anzahl der Teilnehmer ein.
- Dynamisch wird ein Array von Teilnehmern reserviert. Beispiel:
Teilnehmer* teilnehmer = new Teilnehmer[anzahl]; - Für jeden Teilnehmer werden Name und Teilnehmernummer eingelesen.
- Implementieren Sie eine Funktion
void zeigeTeilnehmer(const Teilnehmer* teilnehmer, int anzahl), die alle Teilnehmer auflistet. - Implementieren Sie eine Funktion
Teilnehmer* sucheTeilnehmerNachNummer(Teilnehmer* teilnehmer, int anzahl, int nummer), die per Zeiger auf den Teilnehmer mit der gesuchten Nummer zeigt odernullptrzurückgibt, wenn nicht gefunden. Der Benutzer soll auffordert werden, eine Teilnehmernummer einzugeben. - Zum Schluss muss der dynamisch reservierte Speicher wieder freigegeben werden.
Hinweise
Nutzen Sie den Header <string> um std::string verwenden zu können.
Überlegen Sie sich warum das Teilnehmer Array hier dynamisch allokiert werden muss. Tipp: Die Begriffe Run-Time und Compile-Time spielen hier eine Rolle.
Wiederholen Sie idealerweise noch einmal den Unterschied zwischen Stack und Heap und versuchen Sie nachzuvollziehen warum dynamischer Speicher zum Schluss manuell freigegeben werden muss, um den Sinn dieser Aufgabe nachvollziehen zu können.
#include <iostream>
#include <string>
class Teilnehmer {
private:
std::string name;
int nummer;
public:
Teilnehmer() : name(""), nummer(0) {} // Konstruktor
void setName(const std::string& n) { // Setter-Methode
name = n;
}
void setNummer(int num) {
nummer = num;
}
std::string getName() const { // Getter-Methode
return name;
}
int getNummer() const {
return nummer;
}
};
// Funktion zur Ausgabe aller Teilnehmer
void zeigeTeilnehmer(const Teilnehmer* teilnehmer, int anzahl) {
std::cout << "Teilnehmerliste:\n";
for (int i = 0; i < anzahl; ++i) {
std::cout << (i + 1) << ": " << teilnehmer[i].getName()
<< " (Nummer " << teilnehmer[i].getNummer() << ")\n";
}
}
// Funktion zur Suche nach Teilnehmernummer, gibt Zeiger auf Teilnehmer oder nullptr zurück
Teilnehmer* sucheTeilnehmerNachNummer(Teilnehmer* teilnehmer, int anzahl, int nummer) {
for (int i = 0; i < anzahl; ++i) {
if (teilnehmer[i].getNummer() == nummer) {
return &teilnehmer[i];
}
}
return nullptr;
}
int main() {
int anzahl;
std::cout << "Wie viele Teilnehmer gibt es? ";
std::cin >> anzahl;
if (anzahl <= 0) {
std::cout << "Ungültige Anzahl!\n";
return 1;
}
Teilnehmer* teilnehmer = new Teilnehmer[anzahl];
for (int i = 0; i < anzahl; ++i) {
std::string name;
int nummer;
std::cout << "Geben Sie Name und Nummer für Teilnehmer " << (i + 1) << " ein:\n";
std::cin >> name >> nummer;
teilnehmer[i].setName(name);
teilnehmer[i].setNummer(nummer);
}
zeigeTeilnehmer(teilnehmer, anzahl);
int suchNummer;
std::cout << "\nGeben Sie eine Teilnehmernummer zur Suche ein: ";
std::cin >> suchNummer;
Teilnehmer* gefunden = sucheTeilnehmerNachNummer(teilnehmer, anzahl, suchNummer);
if (gefunden) {
std::cout << "Teilnehmer mit Nummer " << suchNummer << " ist: " << gefunden->getName() << "\n";
} else {
std::cout << "Kein Teilnehmer mit Nummer " << suchNummer << " gefunden.\n";
}
delete[] teilnehmer;
return 0;
}