Kapitel 6
Alle Codedateien dieses Kapitels herunterladen
06_5_1_SchauMirInDieAugen.cpp
/*
* Lösung für Übung 6.5.1 - Schau mir in die Augen
*
* Die Hilfsfunktion colorToString() ist der "Bonus"
*/
#include <iostream>
#include <string>
enum class Color { Brown, Blue, Green, Grey };
std::string colorToString(Color color)
{
switch (color)
{
case Color::Brown:
return "Braun";
case Color::Blue:
return "Blau";
case Color::Green:
return "Gr\201n";
case Color::Grey:
return "Grau";
default:
std::cerr << "Unbekannte Augenfarbe " << static_cast<int>(color) << std::endl;
return "";
}
}
class Person
{
public:
Person(const std::string& f, const std::string& l, int a, Color ec)
: firstName(f), lastName(l), age(a), eyeColor(ec)
{
}
std::string toString()
{
return lastName + ", " + firstName
+ ". Alter: " + std::to_string(age)
+ ". Augenfarbe: " + colorToString(eyeColor);
}
std::string firstName;
std::string lastName;
int age = -1;
Color eyeColor;
};
int main()
{
Person melanie("Melanie", "Muster", 42, Color::Green);
Person markus("Markus", "Muster", 41, Color::Brown);
std::cout << melanie.toString() << std::endl;
std::cout << markus.toString() << std::endl;
return 0;
}
06_5_2_DasAuto.cpp
/*
* Lösung für Übung 6.5.2 - Das Auto
*/
#include <iostream>
#include <string>
class Car
{
public:
Car(const std::string modelName, int year)
: modelName(modelName), year(year)
{
}
void drive()
{
std::cout << modelName << " f\204hrt" << std::endl;
}
void brake()
{
std::cout << modelName << " bremst" << std::endl;
}
std::string modelName;
int year;
};
int main()
{
Car trabbi("Trabant", 1983);
Car beetle("VW K\204fer", 1955);
trabbi.drive();
beetle.drive();
beetle.brake();
trabbi.brake();
return 0;
}
06_5_3_Blockbuster.cpp
/*
* Lösung für Übung 6.5.3 - Blockbuster
*
* searchKeywordMulti() ist die Bonusfunktion
*/
#include <iostream>
#include <string>
#include <vector>
struct Movie
{
Movie(const std::string& title, int year, const std::vector<std::string>& keywords)
: title(title), year(year), keywords(keywords)
{
}
std::string title;
int year;
std::vector<std::string> keywords;
};
Movie searchKeyword(const std::vector<Movie>& movies, const std::string& keyword)
{
for (Movie movie : movies)
{
for (std::string movieKeyword : movie.keywords)
{
if (movieKeyword == keyword)
{
return movie;
}
}
}
// Den "leeren Film" zurückgeben
return Movie("", 0, {});
}
std::vector<Movie> searchKeywordMulti(const std::vector<Movie>& movies, const std::string& keyword)
{
std::vector<Movie> result;
for (Movie movie : movies)
{
for (std::string movieKeyword : movie.keywords)
{
if (movieKeyword == keyword)
{
result.push_back(movie);
}
}
}
return result;
}
int main()
{
std::vector<Movie> movies = {
Movie("Der Pate", 1972, { "Mafia", "Drogen", "Drama" }),
Movie("Leon der Profi", 1994, { "Mafia", "Drama", "Rache" }),
Movie("Zur\201ck in die Zukunft", 1985, { "Zeitreisen", "Kom\224die" }),
Movie("Forrest Gump", 1994, { "Kom\224die", "Drama", "Melodram" })
};
Movie drama = searchKeyword(movies, "Drama");
std::cout << "Einfache Suche: " << std::endl << " " << drama.title << std::endl;
std::vector<Movie> dramas = searchKeywordMulti(movies, "Drama");
std::cout << "Mehrfachsuche: " << std::endl;
for (Movie movie : dramas)
{
std::cout << " " << movie.title << std::endl;
}
return 0;
}
06_5_4_BeehrenSieUnsBaldWieder.cpp
/*
* Lösung für Übung 6.5.5 - Beehren Sie uns bald wieder
*
* Dies ist die Erweiterung des Buchbeispiels 06_4_2_HotelInteraktiv.cpp
* Die Veränderungen sind:
* - neue Methode checkout() in der Klasse Room
* - neue Methode checkout() in der Klasse Hotel
* - Bonus: eine Modusauswahl in main() (siehe Variable bookingMode)
*/
#include <iostream>
#include <vector>
#include <string>
std::vector<std::string> split(const std::string& str)
{
std::vector<std::string> parts;
size_t start = 0;
size_t end = str.find(',');
while (end != std::string::npos)
{
parts.push_back(str.substr(start, end - start));
start = end + 1;
end = str.find(',', start);
}
parts.push_back(str.substr(start, end));
return parts;
}
class Person
{
public:
Person(const std::string& f, const std::string& l, int a)
: firstName(f), lastName(l), age(a)
{
}
Person(const std::string& input)
{
std::vector<std::string> parts = split(input);
if (parts.size() == 3)
{
lastName = parts.at(0);
firstName = parts.at(1);
age = std::stoi(parts.at(2));
}
}
Person()
{
}
std::string toString()
{
return lastName + ", " + firstName
+ ". Alter: " + std::to_string(age);
}
std::string firstName;
std::string lastName;
int age = -1;
};
class Room
{
public:
Room(const std::string& n, int c, int p)
: name(n), capacity(c), pricePerPerson(p)
{
}
bool book(const Person& person, int maxPrice)
{
if (pricePerPerson <= maxPrice // Preis okay
&& persons.size() < capacity) // Frei
{
persons.push_back(person);
return true;
}
// Dieser Raum eignet sich nicht
return false;
}
bool checkout(const Person& person)
{
for (int i = 0; i < persons.size(); i++)
{
// Wenn alle Eigenschaften gleich sind, nehmen wir an, dass es dieselbe Person ist
const Person& foundPerson = persons.at(i);
if (foundPerson.firstName == person.firstName
&& foundPerson.lastName == person.lastName
&& foundPerson.age == person.age)
{
persons.erase(persons.begin() + i);
return true;
}
}
// Die Person wurde nicht in diesem Raum gefunden
return false;
}
const std::string name;
const int capacity;
const int pricePerPerson;
std::vector<Person> persons;
};
class Hotel
{
public:
Hotel(const std::string& n, const std::vector<Room>& r)
: name(n), rooms(r)
{
}
bool book(const Person& person, int maxPrice)
{
// Einen freien Raum finden, der dem Preis genügt
// Wichtig: Per Referenz auf den Raum zugreifen!
for (Room& room : rooms)
{
if (room.book(person, maxPrice))
{
return true;
}
}
// Keinen Raum gefunden
return false;
}
bool checkout(const Person& person)
{
// Wichtig: Per Referenz auf den Raum zugreifen!
for (Room& room : rooms)
{
if (room.checkout(person))
{
return true;
}
}
return false;
}
std::string toString()
{
std::string output = "Belegung Hotel " + name + ":\n"
+ "=============================\n";
for (Room room : rooms)
{
output += "Raum " + room.name + ":\n";
for (Person person : room.persons)
{
output += person.toString() + "\n";
}
if (room.persons.empty())
{
output += " Leer\n";
}
output += "-----------------------------\n";
}
return output;
}
const std::string name;
std::vector<Room> rooms;
};
int main()
{
const std::vector<Room> rooms = {
Room("101", 2, 40),
Room("102", 2, 50),
Room("103", 6, 20),
Room("104", 1, 70)
};
Hotel hotel("California", rooms);
// Interaktive Buchung
std::cout << "Buchungssystem" << std::endl;
while (true)
{
// String über die Konsole entgegennehmen
std::string input;
std::cout << "Buchen (1) oder Auschecken (2) ? ";
std::getline(std::cin, input);
const bool bookingMode = (input == "1");
std::cout << "Nachname,Vorname,Alter:" << std::endl;
// Neuen String über die Konsole entgegennehmen
std::getline(std::cin, input);
// String an den Konstruktor übergeben
Person person(input);
if (person.age < 0)
{
// Hieran erkennen wir eine "ungültige" Person
std::cerr << "Eingabefehler!" << std::endl;
}
else if (bookingMode)
{
// Person soll eingebucht werden
std::cout << "Maximalpreis: ";
std::getline(std::cin, input);
int maxPrice = std::stoi(input);
if (hotel.book(person, maxPrice))
{
std::cout << "Zimmer gefunden!" << std::endl;
std::cout << hotel.toString();
}
else
{
std::cout << "Kein Zimmer gefunden!" << std::endl;
}
}
else
{
// Person soll ausgecheckt werden
if (hotel.checkout(person))
{
std::cout << "Person wurde ausgecheckt: " << person.toString() << std::endl;
std::cout << hotel.toString();
}
else
{
std::cerr << "Konnte Person beim Auschecken nicht finden! Ist sie abgehauen?" << std::endl;
}
}
}
return 0;
}