From f83007679e4d9f263f37b446b88e855175840848 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 8 Nov 2011 21:05:08 +0100 Subject: [PATCH] Aufgabenblock_3 fast fertig --- Aufgabenblock_2/ClientSocket.cpp | 110 ------- Aufgabenblock_2/ClientSocket.h | 37 --- Aufgabenblock_2/SimuClient.cpp | 530 ------------------------------- Aufgabenblock_2/SimuClient.h | 81 ++--- Aufgabenblock_2/libsimu.so | Bin 0 -> 59103 bytes Aufgabenblock_3/AktivesVO.cpp | 95 ++++++ Aufgabenblock_3/AktivesVO.h | 46 +++ Aufgabenblock_3/FahrAusnahme.cpp | 18 ++ Aufgabenblock_3/FahrAusnahme.h | 22 ++ Aufgabenblock_3/Fahrrad.cpp | 27 ++ Aufgabenblock_3/Fahrrad.h | 17 + Aufgabenblock_3/Fahrzeug.cpp | 125 ++++++++ Aufgabenblock_3/Fahrzeug.h | 45 +++ Aufgabenblock_3/FzgFahren.cpp | 34 ++ Aufgabenblock_3/FzgFahren.h | 14 + Aufgabenblock_3/FzgParken.cpp | 23 ++ Aufgabenblock_3/FzgParken.h | 17 + Aufgabenblock_3/FzgVerhalten.cpp | 15 + Aufgabenblock_3/FzgVerhalten.h | 19 ++ Aufgabenblock_3/Kreuzung.cpp | 123 +++++++ Aufgabenblock_3/Kreuzung.h | 32 ++ Aufgabenblock_3/LazyAktion.h | 82 +++++ Aufgabenblock_3/LazyListe.h | 94 ++++++ Aufgabenblock_3/Losfahren.cpp | 18 ++ Aufgabenblock_3/Losfahren.h | 14 + Aufgabenblock_3/PKW.cpp | 97 ++++++ Aufgabenblock_3/PKW.h | 39 +++ Aufgabenblock_3/SimuClient.h | 46 +++ Aufgabenblock_3/SimuServer.jar | Bin 0 -> 14186 bytes Aufgabenblock_3/Streckenende.cpp | 27 ++ Aufgabenblock_3/Streckenende.h | 14 + Aufgabenblock_3/Weg.cpp | 147 +++++++++ Aufgabenblock_3/Weg.h | 57 ++++ Aufgabenblock_3/Welt.cpp | 185 +++++++++++ Aufgabenblock_3/Welt.h | 26 ++ Aufgabenblock_3/libsimu.so | Bin 0 -> 66234 bytes Aufgabenblock_3/main.cpp | 509 +++++++++++++++++++++++++++++ 37 files changed, 2068 insertions(+), 717 deletions(-) delete mode 100644 Aufgabenblock_2/ClientSocket.cpp delete mode 100644 Aufgabenblock_2/ClientSocket.h delete mode 100644 Aufgabenblock_2/SimuClient.cpp create mode 100644 Aufgabenblock_2/libsimu.so create mode 100644 Aufgabenblock_3/AktivesVO.cpp create mode 100644 Aufgabenblock_3/AktivesVO.h create mode 100644 Aufgabenblock_3/FahrAusnahme.cpp create mode 100644 Aufgabenblock_3/FahrAusnahme.h create mode 100644 Aufgabenblock_3/Fahrrad.cpp create mode 100644 Aufgabenblock_3/Fahrrad.h create mode 100644 Aufgabenblock_3/Fahrzeug.cpp create mode 100644 Aufgabenblock_3/Fahrzeug.h create mode 100644 Aufgabenblock_3/FzgFahren.cpp create mode 100644 Aufgabenblock_3/FzgFahren.h create mode 100644 Aufgabenblock_3/FzgParken.cpp create mode 100644 Aufgabenblock_3/FzgParken.h create mode 100644 Aufgabenblock_3/FzgVerhalten.cpp create mode 100644 Aufgabenblock_3/FzgVerhalten.h create mode 100644 Aufgabenblock_3/Kreuzung.cpp create mode 100644 Aufgabenblock_3/Kreuzung.h create mode 100644 Aufgabenblock_3/LazyAktion.h create mode 100644 Aufgabenblock_3/LazyListe.h create mode 100644 Aufgabenblock_3/Losfahren.cpp create mode 100644 Aufgabenblock_3/Losfahren.h create mode 100644 Aufgabenblock_3/PKW.cpp create mode 100644 Aufgabenblock_3/PKW.h create mode 100644 Aufgabenblock_3/SimuClient.h create mode 100644 Aufgabenblock_3/SimuServer.jar create mode 100644 Aufgabenblock_3/Streckenende.cpp create mode 100644 Aufgabenblock_3/Streckenende.h create mode 100644 Aufgabenblock_3/Weg.cpp create mode 100644 Aufgabenblock_3/Weg.h create mode 100644 Aufgabenblock_3/Welt.cpp create mode 100644 Aufgabenblock_3/Welt.h create mode 100755 Aufgabenblock_3/libsimu.so create mode 100644 Aufgabenblock_3/main.cpp diff --git a/Aufgabenblock_2/ClientSocket.cpp b/Aufgabenblock_2/ClientSocket.cpp deleted file mode 100644 index 74e2c6b..0000000 --- a/Aufgabenblock_2/ClientSocket.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/** - * ClientSocket implementation - * - * @version 0.2 - * @copyright (c) Robert Uhl 2009 - */ - -#include "ClientSocket.h" - -//#define DEBUG DEBUG // Debugging an/aus(auskommentieren!) - -/** - * Öffentliche Methoden - */ - -/** - * Konstruktor, der den Typ des Sockets übergeben bekommt - */ -ClientSocket::ClientSocket(const int iType) : p_iType(iType), p_iSocket(-1), p_bVerbunden(false) { - p_iSocket = socket(AF_INET, p_iType, 0); // Socket anlegen - - if (p_iSocket == -1) { - std::cerr << "--> Socket konnte nicht angelegt werden!" << std::endl; - } -} - -/** - * Destruktor - */ -ClientSocket::~ClientSocket(void) { - if (p_bVerbunden) { - Disconnect(); - } -} - -/** - * Verbindung zum Server aufnehmen - * @return bool true wenn Verbindung erfolgreich aufgebaut - */ -bool ClientSocket::Connect(const std::string& sServer, const unsigned short iPort) { - struct sockaddr_in strAdresse; - struct in_addr strInAdresse; - struct hostent* strHost; - - if (p_iSocket == -1) { - std::cerr << "--> Connect(): Socket wurde nicht angelegt!" << std::endl; - return false; - } - - if (p_bVerbunden) { - std::cerr << "--> Connect(): Achtung, noch verbunden! Keine neue Verbindung angelegt!" << std::endl; - return false; - } - - // Domainnamen in IP auflösen - strHost = gethostbyname(sServer.c_str()); - -#ifdef DEBUG - std::cout << "Host: " << strHost->h_name << std::endl; - std::cout << "IP: " << inet_ntoa( **(struct in_addr**) strHost->h_addr_list) << std::endl; - std::cout << "Port: " << iPort << std::endl; -#endif - - // IP-Adresse für connect() erzeugen - strInAdresse = **(struct in_addr**) strHost->h_addr_list; - strAdresse.sin_family = AF_INET; - strAdresse.sin_port = htons(iPort); - strAdresse.sin_addr = strInAdresse; - - // Verbindung aufbauen - if (connect(p_iSocket, (struct sockaddr*) &strAdresse, sizeof(strAdresse)) == -1) { - std::cerr << "--> connect() nicht erfolgreich!" << std::endl; - return false; - } else { - p_bVerbunden = true; - return true; - } -} - -/** - * Verbindung zum Server abbauen - */ -void ClientSocket::Disconnect(void) { - if (close(p_iSocket) == -1) { - std::cerr << "--> Disconnect(): Konnte die Verbindung nicht schliessen!" << std::endl; - } else { - p_bVerbunden = false; - } -} - -/** - * Sendet etwas über das Socket - */ -bool ClientSocket::Send(const void* vDaten, ssize_t data_len) { - if (p_iSocket == -1) { - std::cerr << "--> Send(): Socket wurde nicht angelegt!" << std::endl; - return false; - } else if (!p_bVerbunden) { - std::cerr << "--> Send(): Noch keine Verbindung aufgebaut!" << std::endl; - return false; - } - - // Senden - if (send(p_iSocket, vDaten, data_len, 0) != data_len) { - std::cerr << "--> Send(): Es konnte nicht alles gesendet werden!" << std::endl; - return false; - } - - return true; -} diff --git a/Aufgabenblock_2/ClientSocket.h b/Aufgabenblock_2/ClientSocket.h deleted file mode 100644 index 868e0f5..0000000 --- a/Aufgabenblock_2/ClientSocket.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - * ClientSocket header - * - * @version 0.2 - * @copyright (c) Robert Uhl 2009 - */ - -#ifndef CLIENTSOCKET_H -#define CLIENTSOCKET_H - -#include -#include -#include -#include -#include -#include -#include - -class ClientSocket { - public: - // Konstruktor/Destruktor - ClientSocket(const int iType); // als Type z.B. SOCK_STREAM für TCP - ~ClientSocket(void); - - // Methoden - bool Connect(const std::string& sServer, const unsigned short iPort);// auf Server mit Namen/IP sServer verbinden mit Portangabe - void Disconnect(void); - bool Send(const void* vDaten, ssize_t data_len); - - private: - // Variablen - const int p_iType; // Socket-Type - int p_iSocket; // Socket-Nummer - bool p_bVerbunden; // true = verbunden -}; - -#endif // CLIENTSOCKET_H diff --git a/Aufgabenblock_2/SimuClient.cpp b/Aufgabenblock_2/SimuClient.cpp deleted file mode 100644 index 6932ec6..0000000 --- a/Aufgabenblock_2/SimuClient.cpp +++ /dev/null @@ -1,530 +0,0 @@ -/** - * SimuClient für MacOS/Linux (Praktikum Informatik 2 RWTH Aachen) - * - * @version 0.5 - * @author Robert Uhl, 2009 - 2010 - * @author Steffen Vogel - * - * Vielen Dank an den Lehrstuhl EECS, RWTH Aachen, für den Zugang zum Quellcode des SimuClient für Windows. - */ - -#include -#include -#include -#include -#include -#include - -#include "ClientSocket.h" -#include "SimuClient.h" - -//#define DEBUG DEBUG // Debugging an/aus (auskommentieren!) - -/* - * Variablen der Bibliothek - */ -static ClientSocket* p_cGrafikServerVerbindung = NULL; // Verbindung zum Grafikserver -static string p_sServer; // Servername -static unsigned int p_iPort = 0; // Serverport -static bool p_bInitialisiert = false; // Simulationsdarstellung initialisiert? true = ja -static int p_iXSize = 0; // X Größe des Verkehrsplanes -static int p_iYSize = 0; // Y Größe des Verkehrsplanes -static map p_mWege; // Map aller erzeugten Wege; map ermöglicht find() - -/** - * Sendet eine Fehlermeldung an den Server, wenn verbunden. - * Diese wird dort als Error-MsgBox angezeigt. - */ -static void vSendeNachricht(const string& sNachricht) { - ostringstream ssNachricht; - - // noch nicht initialisiert? - muss so bleiben sonst endlose Rekursion !!! - if (!p_bInitialisiert) { - cerr << "--> Fehler: GrafikServer noch nicht initialisert!" << endl; - return; - } - - // Fehlermeldung an den GrafikServer schicken - ssNachricht << "message " << sNachricht << "#"; - if (p_cGrafikServerVerbindung->Send(ssNachricht.str().c_str(), ssNachricht.str().size())) { - -#ifdef DEBUG - cerr << "Fehlermeldung gesendet: " << ssNachricht.str() << endl; -#endif - //Sleep(100); - return; - } else { - cerr << "--> Fehler: Senden der Fehlermeldung fehlgeschlagen!" << endl; - cerr << "Die Fehlermeldung war: " << sNachricht << endl; - return; - } - return; -} - -/** - * Prüft ob der Name für eine Straße den Konventionen genügt - */ -static bool bStreetOk(const string& sName, const bool bNeu) { - if (sName.empty()) { - cerr << "--> Fehler: Der Wegname ist leer!" << endl; - vSendeNachricht("Der Wegname ist leer!"); - return false; - } - - if (sName.size() > 10) { - cerr << "--> Fehler: Der Wegname darf maximal 10 Zeichen lang sein!" << endl; - vSendeNachricht("Der Wegname darf maximal 10 Zeichen lang sein!"); - return false; - } - - // Nach ungültigen Zeichen im Namen suchen - if (sName.find_first_not_of("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_-") != string::npos) { - cerr << "--> Fehler: Der Wegname darf nur Buchstaben, Ziffern, -, _ und keine Leerzeichen enthalten!" << endl; - vSendeNachricht("Der Wegname darf nur Buchstaben, Ziffern, -, _ und keine Leerzeichen enthalten!"); - return false; - } - - if (bNeu) { // Weg wird neu angelegt - if (p_mWege.find(sName) != p_mWege.end()) { - cerr << "--> Fehler: Der Wegname wurde schon verwendet!" << endl; - vSendeNachricht("Der Wegname wurde schon verwendet!"); - return false; - } else { - p_mWege[sName] = 0; // Weg in der map speichern - return true; - } - } else { // Weg wird auf Vorhandensein geprüft - if (p_mWege.find(sName) != p_mWege.end()) { // Weg gefunden - return true; - } else { - cerr << "--> Fehler: Der Weg ist nicht vorhanden!" << endl; - vSendeNachricht("Der Weg ist nicht vorhanden!"); - return false; - } - } -} - -/** - * Prüft ob der Name für ein Farzeug den Konventionen genügt - */ -static bool bVehikelOk(const string& sName, const double rel_position, const double speed) { - if (sName.empty()) { - cerr << "--> Fehler: Fahrzeugname ist leer!" << endl; - vSendeNachricht("Fahrzeugname ist leer!"); - return false; - } - - if (sName.size() > 10) { - cerr << "--> Fehler: Der Fahrzeugname darf maximal 10 Zeichen lang sein!" << endl; - vSendeNachricht("Der Fahrzeugname darf maximal 10 Zeichen lang sein!"); - return false; - } - - // Nach ungültigen Zeichen im Namen suchen - if (sName.find_first_not_of("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_-") != string::npos) { - cerr << "--> Fehler: Der Fahrzeugname darf nur Buchstaben, Ziffern, -, _ und keine Leerzeichen enthalten!" << endl; - vSendeNachricht("Der Fahrzeugname darf nur Buchstaben, Ziffern, -, _ und keine Leerzeichen enthalten!"); - return false; - } - - if (speed < 0.0) { - cerr << "--> Fehler: Geschwindigkeit < 0.0km/h!" << endl; - vSendeNachricht("Geschwindigkeit < 0.0km/h!"); - return false; - } - - if (speed > 300.0) { - cerr << "--> Fehler: Fahrraeder sind keine Formel1-Fahrzeuge, Geschwindigkeit <= 300km/h!" << endl; - vSendeNachricht("Fahrraeder sind keine Formel1-Fahrzeuge, Geschwindigkeit <= 300km/h!"); - return false; - } - - if ( (rel_position < 0.0) || (rel_position > 1.0) ) { - cerr << "--> Fehler: Relative Position ausserhalb [0, 1]!" << endl; - vSendeNachricht("Relative Position ausserhalb [0, 1]!"); - return false; - } - - return true; -} - -/** - * Grafik-Server initialisieren - * Standard: bStarteServer = true, sServer = "localhost", iPort = 7654 - */ -bool bInitialisiereGrafik(int sizeX, int sizeY, bool bStarteServer, const string& sServer, const unsigned short iPort) { - ostringstream ssNachricht; - - // schon initialisiert? - if (p_bInitialisiert) { - cerr << "--> Fehler: GrafikServer ist schon initialisert!" << endl; - return false; - } - - // Socket für die Kommunikation zum Server anlegen - p_cGrafikServerVerbindung = new ClientSocket(SOCK_STREAM); - p_sServer = sServer; - p_iPort = iPort; - - // Größe des Verkehrsplanes speichern - p_iXSize = sizeX; - p_iYSize = sizeY; - - // Größe des Verkehrsplanes kontrollieren - if ( (sizeX < 100) || (sizeX > 2000) || (sizeY < 100) || (sizeY > 2000) ) { - cerr << "--> Fehler: Groesse des Verkehrsplanes < 100 oder > 2000" << endl; - } - - // Grafik-Server starten - if (bStarteServer) { - cout << "--> SimuServer starten ..." << endl; - system("java -jar SimuServer.jar &"); - Sleep(1000); // eine Sekunde warten - } - - // Verbindung zum Server aufbauen - if (!p_cGrafikServerVerbindung->Connect(p_sServer, p_iPort)) { - cerr << "--> Fehler: TCP/IP-Verbindung nicht moeglich!" << endl; - return false; - } - - // Init-Befehl senden - ssNachricht << "init " << sizeX << " " << sizeY << "#"; - - if (p_cGrafikServerVerbindung->Send(ssNachricht.str().c_str(), ssNachricht.str().size())) { - p_bInitialisiert = true; - -#ifdef DEBUG - cerr << "Init gesendet: " << ssNachricht.str() << endl; -#endif - - Sleep(500); - return true; - } else { - cerr << "--> Fehler: Senden Init fehlgeschlagen!" << endl; - return false; - } -} - -/** - * Zeichnet eine Kreuzung - */ -bool bZeichneKreuzung(int posX, int posY) { - ostringstream ssNachricht; - - // noch nicht initialisiert? - if (!p_bInitialisiert) { - cerr << "--> Fehler: GrafikServer noch nicht initialisert!" << endl; - return false; - } - - // Kreuzung innerhalb des Verkehrsplanes? - if ( (posX > 0) && (posX < p_iXSize) && (posY > 0) && (posY < p_iYSize) ) { - ssNachricht << "crossing " << posX << " " << posY << "#"; - if (p_cGrafikServerVerbindung->Send(ssNachricht.str().c_str(), ssNachricht.str().size())) { - -#ifdef DEBUG - cerr << "Kreuzung gesendet: " << ssNachricht.str() << endl; -#endif - - //Sleep(100); - return true; - } else { - cerr << "--> Fehler: Senden Kreuzung fehlgeschlagen!" << endl; - vSendeNachricht("Senden Kreuzung fehlgeschlagen!"); - return false; - } - } else { - cerr << "--> Fehler: Koordinaten ausserhalb des Verkehrsplanes!" << endl; - vSendeNachricht("Koordinaten ausserhalb des Verkehrsplanes!"); - return false; - } - return false; -} - -/** - * Straße zeichnen - */ -bool bZeichneStrasse(const string& way_to_name, const string& way_back_name, int length, int numPoints, int* points_xy) { - ostringstream ssNachricht; - int iCounter; - - // noch nicht initialisiert ? - if (!p_bInitialisiert) { - cerr << "--> Fehler: GrafikServer noch nicht initialisert!" << endl; - return false; - } - - // Straßenname ok? - if (!bStreetOk(way_to_name, true) || !bStreetOk(way_back_name, true)) { - return false; - } - - if (length < 0) { - cerr << "--> Fehler: Weglaenge kleiner 0!" << endl; - vSendeNachricht("Weglaenge kleiner 0!"); - return false; - } - - if (numPoints < 2) { - cerr << "--> Fehler: Mindestens zwei Koordinaten fuer die Strasse notwendig!" << endl; - vSendeNachricht("Mindestens zwei Koordinaten fuer die Strasse notwendig!"); - return false; - } - - // Straße senden - ssNachricht << "street " << way_to_name << " " << way_back_name << " " << length << " " << numPoints; - - for (iCounter = 0; iCounter < numPoints * 2; iCounter += 2) { - if ( (points_xy[iCounter] > 0) && (points_xy[iCounter] < p_iXSize) && (points_xy[iCounter + 1] > 0) && (points_xy[iCounter + 1] < p_iYSize) ) { - ssNachricht << " " << points_xy[iCounter] << " " << points_xy[iCounter + 1]; - } else { - cerr << "--> Fehler: Koordinaten ausserhalb des Verkehrsplanes! Ueberspringe..." << endl; - //vSendeNachricht("Koordinaten ausserhalb des Verkehrsplanes! Ueberspringe..."); - } - } - - ssNachricht << "#"; - - if (p_cGrafikServerVerbindung->Send(ssNachricht.str().c_str(), ssNachricht.str().size())) { - -#ifdef DEBUG - cerr << "Strasse gesendet: " << ssNachricht.str() << endl; -#endif - - //Sleep(100); - return true; - } else { - cerr << "--> Fehler: Senden Strasse fehlgeschlagen!" << endl; - vSendeNachricht("Senden Strasse fehlgeschlagen!"); - return false; - } -} - -/** - * PKW zeichnen - */ -bool bZeichnePKW(const string& carname, const string& streetname, double rel_position, double speed, double tank) { - ostringstream ssNachricht; - - // noch nicht initialisiert ? - if (!p_bInitialisiert) { - cerr << "--> Fehler: GrafikServer noch nicht initialisert!" << endl; - return false; - } - - // PKW-Name, Position und Geschwindigkeit in den Grenzen? - if (!bVehikelOk(carname, rel_position, speed)) { - return false; - } - - if (tank < 0.0) { - cerr << "--> Fehler: Tank < 0.0l!" << endl; - vSendeNachricht("Tank < 0.0l!"); - return false; - } - - if (tank > 999.9) { - cerr << "--> Fehler: Versteckte Tanks sind nicht erlaubt! Tankinhalt < 1000l!" << endl; - vSendeNachricht("Versteckte Tanks sind nicht erlaubt! Tankinhalt < 1000l!"); - return false; - } - - // Existiert die Straße? - if (!bStreetOk(streetname, false)) { - cerr << "--> Fehler: Diese Strasse gibt es nicht!" << endl; - vSendeNachricht("Diese Strasse gibt es nicht!"); - return false; - } - - ssNachricht << "sc " << carname << " " << streetname << setiosflags(ios::fixed); - ssNachricht << " " << setw(7) << setprecision(4) << rel_position; - ssNachricht << " " << setw(6) << setprecision(1) << speed; - ssNachricht << " " << setw(6) << setprecision(1) << tank << "#"; - - if (p_cGrafikServerVerbindung->Send(ssNachricht.str().c_str(), ssNachricht.str().size())) { - -#ifdef DEBUG - cerr << "PKW gesendet: " << ssNachricht.str() << endl; -#endif - //Sleep(100); - return true; - } else { - cerr << "--> Fehler: Senden PKW fehlgeschlagen!" << endl; - vSendeNachricht("Senden PKW fehlgeschlagen!"); - return false; - } -} - -/** - * Zeichne Fahrrad - */ -bool bZeichneFahrrad(const string& bikename, const string& streetname, double rel_position, double speed) { - ostringstream ssNachricht; - - // noch nicht initialisiert ? - if (!p_bInitialisiert) { - cerr << "--> Fehler: GrafikServer noch nicht initialisert!" << endl; - return false; - } - - // Fahrradname, Position und Geschwindigkeit in den Grenzen? - if (!bVehikelOk(bikename, rel_position, speed)) { - return false; - } - - // Existiert die Straße? - if (!bStreetOk(streetname, false)) { - cerr << "--> Fehler: Diese Strasse gibt es nicht!" << endl; - vSendeNachricht("Diese Strasse gibt es nicht!"); - return false; - } - - ssNachricht << "sb " << bikename << " " << streetname << setiosflags(ios::fixed); - ssNachricht << " " << setw(7) << setprecision(4) << rel_position; - ssNachricht << " " << setw(6) << setprecision(1) << speed << "#"; - - if (p_cGrafikServerVerbindung->Send(ssNachricht.str().c_str(), ssNachricht.str().size())) { - -#ifdef DEBUG - cerr << "Fahrrad gesendet: " << ssNachricht.str() << endl; -#endif - //Sleep(100); - return true; - } else { - cerr << "--> Fehler: Senden Fahrrad fehlgeschlagen!" << endl; - vSendeNachricht("Senden Fahrrad fehlgeschlagen!"); - return false; - } -} - -/** - * Sendet die aktuelle Simulationszeit an den erweiterten SimuServer - */ -void vSetzeZeit(const double dTime) { - ostringstream ssNachricht; - -#ifdef DEBUG - cout << dTime << endl; -#endif - - // noch nicht initialisiert ? - if (!p_bInitialisiert) { - cerr << "--> Fehler: GrafikServer noch nicht initialisert!" << endl; - return; - } - - if (dTime < 0.0) { - cerr << "--> Fehler: Die Zeit darf nicht negativ sein!" << endl; - vSendeNachricht("Die Zeit darf nicht negativ sein!"); - return; - } - - ssNachricht << "time " << dTime << "#"; - - if (p_cGrafikServerVerbindung->Send(ssNachricht.str().c_str(), ssNachricht.str().size())) { - -#ifdef DEBUG - cerr << "Zeit gesendet: " << ssNachricht.str() << endl; -#endif - - //Sleep(100); - return; - } else { - cerr << "--> Fehler: Senden der Zeit fehlgeschlagen!" << endl; - vSendeNachricht("Senden der Zeit fehlgeschlagen!"); - return; - } -} - -/** - * Ersetzt die Sleep()-Funktion von Windows, die mSek übernimmt - */ -void Sleep(const int mSec) { - if (mSec > 0) { - usleep(mSec * 1000); - } - return; -} - -void vBeendeGrafik(void) { - // noch nicht initialisiert ? - if (!p_bInitialisiert) { - cerr << "--> Fehler: GrafikServer noch nicht initialisert!" << endl; - return; - } - - vSendeNachricht("Simulation beendet!"); - p_cGrafikServerVerbindung->Send("close#", 6); - -#ifdef DEBUG - cerr << "Close gesendet." << endl; -#endif - - //Sleep(100); - p_cGrafikServerVerbindung->Disconnect(); - delete p_cGrafikServerVerbindung; - p_cGrafikServerVerbindung = NULL; - return; -} - -/* - * Zusätzliche Schnittstellen wegen eventueller Konvertierungsprobleme bei string/char* - */ - -bool bZeichneStrasse(const char* way_to_name, const char* way_back_name, int length, int numPoints, int* points_xy) { - string sHinweg = string(way_to_name); - string sRueckweg = string(way_back_name); - - return bZeichneStrasse(sHinweg, sRueckweg, length, numPoints, points_xy); -} - -bool bZeichneStrasse(const string& way_to_name, const char* way_back_name, int length, int numPoints, int* points_xy) { - string sRueckweg = string(way_back_name); - - return bZeichneStrasse(way_to_name, sRueckweg, length, numPoints, points_xy); -} - -bool bZeichneStrasse(const char* way_to_name, const string& way_back_name, int length, int numPoints, int* points_xy) { - string sHinweg = string(way_to_name); - - return bZeichneStrasse(sHinweg, way_back_name, length, numPoints, points_xy); -} - -bool bZeichnePKW(const char* carname, const char* streetname, double rel_position, double speed, double tank) { - string sName = string(carname); - string sWeg = string(streetname); - - return bZeichnePKW(sName, sWeg, rel_position, speed, tank); -} - -bool bZeichnePKW(const string& carname, const char* streetname, double rel_position, double speed, double tank) { - string sWeg = string(streetname); - - return bZeichnePKW(carname, sWeg, rel_position, speed, tank); -} - -bool bZeichnePKW(const char* carname, const string& streetname, double rel_position, double speed, double tank) { - string sName = string(carname); - - return bZeichnePKW(sName, streetname, rel_position, speed, tank); -} - -bool bZeichneFahrrad(const char* bikename, const char* streetname, double rel_position, double speed) { - string sName = string(bikename); - string sWeg = string(streetname); - - return bZeichneFahrrad(sName, sWeg, rel_position, speed); -} - -bool bZeichneFahrrad(const string& bikename, const char* streetname, double rel_position, double speed) { - string sWeg = string(streetname); - - return bZeichneFahrrad(bikename, sWeg, rel_position, speed); -} - -bool bZeichneFahrrad(const char* bikename, const string& streetname, double rel_position, double speed) { - string sName = string(bikename); - - return bZeichneFahrrad(sName, streetname, rel_position, speed); -} diff --git a/Aufgabenblock_2/SimuClient.h b/Aufgabenblock_2/SimuClient.h index 80133d0..f7c7252 100644 --- a/Aufgabenblock_2/SimuClient.h +++ b/Aufgabenblock_2/SimuClient.h @@ -1,40 +1,41 @@ -#pragma once -#pragma warning (disable:4786) -#include -using namespace std; - -// Folgender ifdef-Block ist die Standardmethode zum Erstellen von Makros, die das Exportieren -// aus einer DLL vereinfachen. Alle Dateien in dieser DLL werden mit dem SIMUCLIENT_EXPORTS-Symbol -// kompiliert, das in der Befehlszeile definiert wurde. Das Symbol darf nicht für ein Projekt definiert werden, -// das diese DLL verwendet. Alle anderen Projekte, deren Quelldateien diese Datei beinhalten, erkennen -// SIMUCLIENT_API-Funktionen als aus einer DLL importiert, während die DLL -// mit diesem Makro definierte Symbole als exportiert ansieht. -#ifdef SIMUCLIENT_EXPORTS -#define SIMUCLIENT_API __declspec(dllexport) -#else -#define SIMUCLIENT_API __declspec(dllimport) -#endif - -// NUTZBARE FUNKTIONEN (offizielle Schnittstelle) -SIMUCLIENT_API bool bInitialisiereGrafik(int sizeX, int sizeY, char* address = "127.0.0.1"); -SIMUCLIENT_API bool bZeichneKreuzung(int posX, int posY); -SIMUCLIENT_API bool bZeichneStrasse(const string& way_to_name, const string& way_back_name, int length, int numPoints, int* points_xy); -SIMUCLIENT_API bool bZeichnePKW(const string& carname, const string& streetname, double rel_position, double speed, double tank); -SIMUCLIENT_API bool bZeichneFahrrad(const string& bikename, const string& streetname, double relposition, double speed); -SIMUCLIENT_API void vBeendeGrafik(); -SIMUCLIENT_API void vSetzeZeit(const double dTime); - -// Zusätzliche Schnittstellen (wegen Konvertierungsproblemen bei string/char*) - -SIMUCLIENT_API bool bZeichneStrasse(const char* way_to_name, const char* way_back_name, int length, int numPoints, int* points_xy); -SIMUCLIENT_API bool bZeichneStrasse(const string& way_to_name, const char* way_back_name, int length, int numPoints, int* points_xy); -SIMUCLIENT_API bool bZeichneStrasse(const char* way_to_name, const string& way_back_name, int length, int numPoints, int* points_xy); -SIMUCLIENT_API bool bZeichnePKW(const string& carname, const char* streetname, double rel_position, double speed, double tank); -SIMUCLIENT_API bool bZeichneFahrrad(const string& bikename, const char* streetname, double rel_position, double speed); -SIMUCLIENT_API bool bZeichnePKW(const char* carname, const char* streetname, double rel_position, double speed, double tank); -SIMUCLIENT_API bool bZeichneFahrrad(const char* bikename, const char* streetname, double rel_position, double speed); -SIMUCLIENT_API bool bZeichnePKW(const char* carname, const string& streetname, double rel_position, double speed, double tank); -SIMUCLIENT_API bool bZeichneFahrrad(const char* bikename, const string& streetname, double rel_position, double speed); - -// Wrapperfunktion fuer Sleep -SIMUCLIENT_API void vSleep(int mSec); \ No newline at end of file +/* + * SimuClient für MacOS/Linux (Praktikum Informatik 2, WS 2009/10 RWTH Aachen) + * Version 0.5 + * von Robert Uhl, 2009 - 2010 + * Vielen Dank an den Lehrstuhl EECS, RWTH Aachen, für den Zugang zum Quellcode + * des SimuClient für Windows. + * Datei: SimuClient.h + * Inhalt: SimuClient sendet Daten an den (erweiterten) Java-Grafik-Server + */ + +#ifndef SIMUCLIENT_H +#define SIMUCLIENT_H + +#include +using namespace std; + +// Funktionen der Library +bool bInitialisiereGrafik(int sizeX, int sizeY, bool bStarteServer = true, const string& sServer = "localhost", const unsigned short iPort = 7654); +bool bZeichneKreuzung(int posX, int posY); +bool bZeichneStrasse(const string& way_to_name, const string& way_back_name, int length, int numPoints, int* points_xy); +bool bZeichnePKW(const string& carname, const string& streetname, double rel_position, double speed, double tank); +bool bZeichneFahrrad(const string& bikename, const string& streetname, double relposition, double speed); +void vSetzeZeit(const double dTime); // sendet die Simulationszeit an den erweiterten Grafikserver +void Sleep(const int mSec); // ersetzt die Sleep()-Funktion von Windows, die mSek übernimmt +void vBeendeGrafik(void); + +// Zusätzliche Schnittstellen wegen eventueller Konvertierungsprobleme bei string/char* +bool bZeichneStrasse(const char* way_to_name, const char* way_back_name, int length, int numPoints, int* points_xy); +bool bZeichneStrasse(const string& way_to_name, const char* way_back_name, int length, int numPoints, int* points_xy); +bool bZeichneStrasse(const char* way_to_name, const string& way_back_name, int length, int numPoints, int* points_xy); + +bool bZeichnePKW(const char* carname, const char* streetname, double rel_position, double speed, double tank); +bool bZeichnePKW(const string& carname, const char* streetname, double rel_position, double speed, double tank); +bool bZeichnePKW(const char* carname, const string& streetname, double rel_position, double speed, double tank); + +bool bZeichneFahrrad(const char* bikename, const char* streetname, double rel_position, double speed); +bool bZeichneFahrrad(const string& bikename, const char* streetname, double rel_position, double speed); +bool bZeichneFahrrad(const char* bikename, const string& streetname, double rel_position, double speed); + +#endif // SIMUCLIENT_H +// eof diff --git a/Aufgabenblock_2/libsimu.so b/Aufgabenblock_2/libsimu.so new file mode 100644 index 0000000000000000000000000000000000000000..f9ef4f1d7972662b03a4ad7952874b010548c922 GIT binary patch literal 59103 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%0A6%rj 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 +#include +#include + +#include "AktivesVO.h" + +extern double dGlobaleZeit; + +int AktivesVO::p_iMaxID = 0; +map AktivesVO::p_pObjekte; + +AktivesVO::AktivesVO() { + vInitialisierung(); +} + +AktivesVO::AktivesVO(string sName) { + vInitialisierung(); + p_sName = sName; + vRegister(); +} + +AktivesVO::AktivesVO(AktivesVO &vo) { + vInitialisierung(); + p_sName = vo.p_sName; + vRegister(); +} + +AktivesVO::~AktivesVO() { + p_pObjekte.erase(p_sName); +} + +void AktivesVO::vRegister() { + map::iterator result = p_pObjekte.find(p_sName); + if (result != p_pObjekte.end()) { + throw string("Ein Objekt mit dem Namen existiert bereits!"); + } + + p_pObjekte[p_sName] = this; +} + +AktivesVO * AktivesVO::pObjekt(string sName) { + map::iterator result = p_pObjekte.find(sName); + if (result == p_pObjekte.end()) { + throw string("Ein Objekt mit dem Namen existiert nicht!"); + } + + return result->second; +} + +void AktivesVO::vInitialisierung() { + p_iID = ++p_iMaxID; + + p_sName = ""; + p_dZeit = 0; +} + +void AktivesVO::vAusgabeHeader() { + cout << "ID Zeit Name : Kmh GesamtStrecke Verbrauch Tankinhalt" << endl; + cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" + << endl; +} + +ostream& AktivesVO::ostreamAusgabe(ostream &stream) const { + stream << setprecision(1) << setiosflags(ios::fixed) + << resetiosflags(ios::right) << setiosflags(ios::left) + << setw(3) << p_iID + << setw(5) << p_dZeit + << setw(7) << p_sName << ":"; + + return stream; +} + +istream& AktivesVO::istreamEingabe(istream &stream) { + if (p_sName != "") { + throw string("Verkehrsobjekt ist bereits initialisiert!"); + } + + stream >> p_sName; + + vRegister(); + + return stream; +} + +string AktivesVO::getName() const { + return p_sName; +} + +ostream& operator<<(ostream &stream, const AktivesVO &vo) { + return vo.ostreamAusgabe(stream); +} + +istream& operator>>(istream &in, AktivesVO &vo) { + return vo.istreamEingabe(in); +} diff --git a/Aufgabenblock_3/AktivesVO.h b/Aufgabenblock_3/AktivesVO.h new file mode 100644 index 0000000..f052eba --- /dev/null +++ b/Aufgabenblock_3/AktivesVO.h @@ -0,0 +1,46 @@ +#ifndef AKTIVESVO_H_ +#define AKTIVESVO_H_ + +#include +#include + +using namespace std; + +class AktivesVO { +public: + AktivesVO(); + AktivesVO(AktivesVO &vo); + AktivesVO(string sName); + virtual ~AktivesVO(); + + static void vAusgabeHeader(); + static AktivesVO * pObjekt(string sName); + + virtual ostream& ostreamAusgabe(ostream &stream) const; + virtual istream& istreamEingabe(istream &stream); + + virtual void vAbfertigung() = 0; /* AktivesVO ist eine abstrakte Klasse */ + virtual void vZeichnen() const = 0; + + string getName() const; + +protected: + double p_dZeit; + + /* nicht virtuell, da virtuelle Funktionen nicht + * in Konstruktoren aufgerufen werden dürfen!!! */ + void vInitialisierung(); + void vRegister(); + +private: + static int p_iMaxID; + static map p_pObjekte; + + int p_iID; + string p_sName; +}; + +ostream& operator<<(ostream &out, const AktivesVO &vo); +istream& operator>>(istream &in, AktivesVO &vo); + +#endif /* AKTIVESVO_H_ */ diff --git a/Aufgabenblock_3/FahrAusnahme.cpp b/Aufgabenblock_3/FahrAusnahme.cpp new file mode 100644 index 0000000..4627ad1 --- /dev/null +++ b/Aufgabenblock_3/FahrAusnahme.cpp @@ -0,0 +1,18 @@ +#include "FahrAusnahme.h" + +FahrAusnahme::FahrAusnahme(Fahrzeug *pFahrzeug, Weg *pWeg) : + p_pFahrzeug(pFahrzeug), + p_pWeg(pWeg) +{ } + +FahrAusnahme::~FahrAusnahme() +{ } + +Weg * FahrAusnahme::getWeg() { + return p_pWeg; +} + +Fahrzeug * FahrAusnahme::getFahrzeug() { + return p_pFahrzeug; +} + diff --git a/Aufgabenblock_3/FahrAusnahme.h b/Aufgabenblock_3/FahrAusnahme.h new file mode 100644 index 0000000..a705a15 --- /dev/null +++ b/Aufgabenblock_3/FahrAusnahme.h @@ -0,0 +1,22 @@ +#ifndef FAHRAUSNAHME_H_ +#define FAHRAUSNAHME_H_ + +#include "Fahrzeug.h" +#include "Weg.h" + +class FahrAusnahme { +public: + FahrAusnahme(Fahrzeug *pFahrzeug, Weg *pWeg); + virtual ~FahrAusnahme(); + + Weg * getWeg(); + Fahrzeug * getFahrzeug(); + + virtual void vBearbeiten() = 0; + +protected: + Fahrzeug *p_pFahrzeug; + Weg *p_pWeg; +}; + +#endif /* FAHRAUSNAHME_H_ */ diff --git a/Aufgabenblock_3/Fahrrad.cpp b/Aufgabenblock_3/Fahrrad.cpp new file mode 100644 index 0000000..0714321 --- /dev/null +++ b/Aufgabenblock_3/Fahrrad.cpp @@ -0,0 +1,27 @@ +#include + +#include "Fahrrad.h" + +/* Standardkonstruktor */ +Fahrrad::Fahrrad() : Fahrzeug() +{ } + +Fahrrad::Fahrrad(string sName, double dMaxGeschwindigkeit) : Fahrzeug(sName, dMaxGeschwindigkeit) +{ } + +/* Destruktor */ +Fahrrad::~Fahrrad() +{ } + +double Fahrrad::dGeschwindigkeit() const { + double dGeschwindigkeit; + int iReduzierung = p_dGesamtStrecke / 20; + + dGeschwindigkeit = p_dMaxGeschwindigkeit * powl(0.9, iReduzierung); + + if (dGeschwindigkeit < 12) { + dGeschwindigkeit = 12; + } + + return dGeschwindigkeit; +} diff --git a/Aufgabenblock_3/Fahrrad.h b/Aufgabenblock_3/Fahrrad.h new file mode 100644 index 0000000..4853d87 --- /dev/null +++ b/Aufgabenblock_3/Fahrrad.h @@ -0,0 +1,17 @@ +#ifndef FAHRRAD_H_ +#define FAHRRAD_H_ + +#include "Fahrzeug.h" + +using namespace std; + +class Fahrrad: public Fahrzeug { +public: + Fahrrad(); + Fahrrad(string sName, double dMaxGeschwindigkeit); + virtual ~Fahrrad(); + + double dGeschwindigkeit() const; +}; + +#endif /* FAHRRAD_H_ */ diff --git a/Aufgabenblock_3/Fahrzeug.cpp b/Aufgabenblock_3/Fahrzeug.cpp new file mode 100644 index 0000000..ffeb48e --- /dev/null +++ b/Aufgabenblock_3/Fahrzeug.cpp @@ -0,0 +1,125 @@ +#include +#include +#include + +#include "Fahrzeug.h" +#include "Weg.h" +#include "FzgFahren.h" +#include "FzgParken.h" +#include "SimuClient.h" + +extern double dGlobaleZeit; + +/* Standardkonstruktor */ +Fahrzeug::Fahrzeug() : + AktivesVO() { + vInitialisierung(); +} + +Fahrzeug::Fahrzeug(string sName) : + AktivesVO(sName) { + vInitialisierung(); +} + +Fahrzeug::Fahrzeug(string sName, double dMaxGeschwindkeit) : + AktivesVO(sName) { + vInitialisierung(); + p_dMaxGeschwindigkeit = dMaxGeschwindkeit; +} + +/* Kopierkonstruktor */ +Fahrzeug::Fahrzeug(Fahrzeug &fz) : AktivesVO(fz) { + vInitialisierung(); + p_dMaxGeschwindigkeit = fz.p_dMaxGeschwindigkeit; +} + +/* Destruktor */ +Fahrzeug::~Fahrzeug() { +} + +void Fahrzeug::vInitialisierung() { + p_dMaxGeschwindigkeit = 0; + p_dGesamtStrecke = 0; + p_dAbschnittStrecke = 0; + p_dGesamtZeit = 0; + p_pVerhalten = NULL; +} + +ostream& Fahrzeug::ostreamAusgabe(ostream &stream) const { + AktivesVO::ostreamAusgabe(stream) << setprecision(2) + << resetiosflags(ios::left) << setiosflags(ios::right) + << setw(8) << dGeschwindigkeit() + << setw(7) << p_dGesamtStrecke << " (" + << setw(6) << p_dAbschnittStrecke << ")"; + + return stream; +} + +istream& Fahrzeug::istreamEingabe(istream &stream) { + AktivesVO::istreamEingabe(stream) >> p_dMaxGeschwindigkeit; + + return stream; +} + +void Fahrzeug::vAbfertigung() { + /* nicht doppelt abfertigen (Gleitkommavgl.) */ + if (p_dZeit >= dGlobaleZeit - 1e-5) return; + + double dDelta = dGlobaleZeit - p_dZeit;; + double dStrecke = p_pVerhalten->dStrecke(this, dDelta); + + p_dGesamtZeit += dDelta; + p_dGesamtStrecke += dStrecke; + p_dAbschnittStrecke += dStrecke; + + p_dZeit = dGlobaleZeit; /* wird nur aktualisiert, falls keine Ausnahme aufgetreten ist */ +} + +double Fahrzeug::dGeschwindigkeit() const { + if (p_pVerhalten != NULL) { + Weg *pWeg = p_pVerhalten->getWeg(); + + if (pWeg != NULL) { + double dBeschraenkung = pWeg->getMaxGeschwindigkeit(); + + if (p_dMaxGeschwindigkeit > dBeschraenkung) { + return dBeschraenkung; + } + } + } + + return p_dMaxGeschwindigkeit; + +} + +double Fahrzeug::dTanken(double dMenge) { + return 0; +} + +void Fahrzeug::vNeueStrecke(Weg *pWeg, double dStartZeit) { + if (p_pVerhalten != NULL) { /* alter Weg vorhanden? */ + delete p_pVerhalten; /* Speicherleck vermeiden! */ + } + + if (dStartZeit > 0) { + p_pVerhalten = new FzgParken(pWeg, dStartZeit); + } + else { + p_pVerhalten = new FzgFahren(pWeg); + } + + p_dAbschnittStrecke = 0; +} + +double Fahrzeug::getAbschnittStrecke() const { + return p_dAbschnittStrecke; +} + +bool Fahrzeug::operator<(Fahrzeug &fz) const { + return (this->p_dGesamtStrecke < fz.p_dGesamtStrecke); +} + +void Fahrzeug::vZeichnen() const { + Weg *pWeg = p_pVerhalten->getWeg(); + bZeichneFahrrad(getName(), pWeg->getName(), getAbschnittStrecke() / pWeg->getLaenge(), dGeschwindigkeit()); +} diff --git a/Aufgabenblock_3/Fahrzeug.h b/Aufgabenblock_3/Fahrzeug.h new file mode 100644 index 0000000..e211d32 --- /dev/null +++ b/Aufgabenblock_3/Fahrzeug.h @@ -0,0 +1,45 @@ +#ifndef FAHRZEUG_H_ +#define FAHRZEUG_H_ + +#include "AktivesVO.h" +#include "FzgVerhalten.h" + +using namespace std; + +class Weg; + +class Fahrzeug : public AktivesVO { +public: + Fahrzeug(); + Fahrzeug(Fahrzeug &fz); /* Kopier Konstruktor */ + Fahrzeug(string sName); + Fahrzeug(string sName, double dMaxGeschwindkeit); + + virtual ~Fahrzeug(); /* Destruktor */ + + virtual void vAbfertigung(); + virtual double dTanken(double dMenge = 0.0); + virtual void vZeichnen() const; + virtual double dGeschwindigkeit() const; + void vNeueStrecke(Weg *pWeg, double dStartZeit = 0.0); + + double getAbschnittStrecke() const; + + bool operator<(Fahrzeug &fz) const; + //Fahrzeug & operator=(Fahrzeug &fz); /* benutze Standardzuweisungs Operator */ + + virtual ostream& ostreamAusgabe(ostream &stream) const; + virtual istream& istreamEingabe(istream &stream); + +protected: + double p_dMaxGeschwindigkeit; + double p_dGesamtStrecke; + double p_dGesamtZeit; + double p_dAbschnittStrecke; + FzgVerhalten * p_pVerhalten; + +private: + void vInitialisierung(); +}; + +#endif /* FAHRZEUG_H_ */ diff --git a/Aufgabenblock_3/FzgFahren.cpp b/Aufgabenblock_3/FzgFahren.cpp new file mode 100644 index 0000000..e429afe --- /dev/null +++ b/Aufgabenblock_3/FzgFahren.cpp @@ -0,0 +1,34 @@ +#include +#include + +#include "FzgFahren.h" +#include "Fahrzeug.h" +#include "Streckenende.h" + +using namespace std; + +FzgFahren::FzgFahren(Weg *pWeg) : FzgVerhalten(pWeg) +{ } + +FzgFahren::~FzgFahren() +{ } + +double FzgFahren::dStrecke(Fahrzeug *pFz, double dDelta) { + double dStrecke = pFz->dGeschwindigkeit() * dDelta; + + if (pFz->getAbschnittStrecke() >= p_pWeg->getLaenge() - 1e-5) { /* bereits zuweit gefahren */ + throw Streckenende(pFz, p_pWeg); + } + else if (pFz->getAbschnittStrecke() + dStrecke > p_pWeg->getSchranke() - 1e-5) { + return p_pWeg->getSchranke() - pFz->getAbschnittStrecke(); + } + else if (pFz->getAbschnittStrecke() + dStrecke > p_pWeg->getLaenge() - 1e-5) { /* fahre nur bis zum Streckenende */ + return p_pWeg->getLaenge() - pFz->getAbschnittStrecke(); + } + else { /* fahre maximal mögliche Strecke */ + p_pWeg->setSchranke(pFz->getAbschnittStrecke() + dStrecke); + //cout << "Schranke gesetzt: " << p_pWeg->getSchranke() << " von: " << pFz->getName() << endl; + return dStrecke; + } +} + diff --git a/Aufgabenblock_3/FzgFahren.h b/Aufgabenblock_3/FzgFahren.h new file mode 100644 index 0000000..acd821f --- /dev/null +++ b/Aufgabenblock_3/FzgFahren.h @@ -0,0 +1,14 @@ +#ifndef FZGFAHREN_H_ +#define FZGFAHREN_H_ + +#include "FzgVerhalten.h" + +class FzgFahren: public FzgVerhalten { +public: + FzgFahren(Weg *pWeg); + virtual ~FzgFahren(); + + double dStrecke(Fahrzeug *pFz, double dDelta); +}; + +#endif /* FZGFAHREN_H_ */ diff --git a/Aufgabenblock_3/FzgParken.cpp b/Aufgabenblock_3/FzgParken.cpp new file mode 100644 index 0000000..ed9594d --- /dev/null +++ b/Aufgabenblock_3/FzgParken.cpp @@ -0,0 +1,23 @@ +#include + +#include "FzgParken.h" +#include "Fahrzeug.h" +#include "Losfahren.h" + +extern double dGlobaleZeit; + +FzgParken::FzgParken(Weg *pWeg, double dStartZeit) : FzgVerhalten(pWeg) { + p_dStartZeit = dStartZeit; +} + +FzgParken::~FzgParken() +{ } + +double FzgParken::dStrecke(Fahrzeug *pFz, double dDelta) { + if (p_dStartZeit >= dGlobaleZeit - 1e-5) { + return 0.0; + } + else { + throw Losfahren(pFz, p_pWeg); + } +} diff --git a/Aufgabenblock_3/FzgParken.h b/Aufgabenblock_3/FzgParken.h new file mode 100644 index 0000000..0e55756 --- /dev/null +++ b/Aufgabenblock_3/FzgParken.h @@ -0,0 +1,17 @@ +#ifndef FZGPARKEN_H_ +#define FZGPARKEN_H_ + +#include "FzgVerhalten.h" + +class FzgParken: public FzgVerhalten { +public: + FzgParken(Weg *pWeg, double dStartZeit); + virtual ~FzgParken(); + + double dStrecke(Fahrzeug *pFz, double dDelta); + +private: + double p_dStartZeit; +}; + +#endif /* FZGPARKEN_H_ */ diff --git a/Aufgabenblock_3/FzgVerhalten.cpp b/Aufgabenblock_3/FzgVerhalten.cpp new file mode 100644 index 0000000..83902d1 --- /dev/null +++ b/Aufgabenblock_3/FzgVerhalten.cpp @@ -0,0 +1,15 @@ +#include "FzgVerhalten.h" + +extern double dGlobaleZeit; + +FzgVerhalten::FzgVerhalten(Weg *pWeg) { + p_pWeg = pWeg; +} + +/* Destruktor */ +FzgVerhalten::~FzgVerhalten() +{ } + +Weg * FzgVerhalten::getWeg() { + return p_pWeg; +} diff --git a/Aufgabenblock_3/FzgVerhalten.h b/Aufgabenblock_3/FzgVerhalten.h new file mode 100644 index 0000000..87d5498 --- /dev/null +++ b/Aufgabenblock_3/FzgVerhalten.h @@ -0,0 +1,19 @@ +#ifndef FZGVERHALTEN_H_ +#define FZGVERHALTEN_H_ + +#include "Weg.h" + +class FzgVerhalten { +public: + FzgVerhalten(Weg *pWeg); + virtual ~FzgVerhalten(); + + virtual double dStrecke(Fahrzeug *pFz, double dDelta) = 0; + Weg * getWeg(); + +protected: + Weg *p_pWeg; + +}; + +#endif /* FZGVERHALTEN_H_ */ diff --git a/Aufgabenblock_3/Kreuzung.cpp b/Aufgabenblock_3/Kreuzung.cpp new file mode 100644 index 0000000..6267e7d --- /dev/null +++ b/Aufgabenblock_3/Kreuzung.cpp @@ -0,0 +1,123 @@ +#include +#include +#include + +#include "Kreuzung.h" +#include "Fahrzeug.h" + +using namespace std; + +extern double dGlobaleZeit; + +Kreuzung::Kreuzung() : + AktivesVO() +{} + +Kreuzung::Kreuzung(string sName, double dTankvolumen) : + AktivesVO(sName), + p_dTankstelle(dTankvolumen) +{ } + +void Kreuzung::vVerbinde(Kreuzung *pZielKreuzung, string sHinweg, string sRueckweg, double dLaenge, Weg::Begrenzung eLimit, bool bUeberholverbot) { + Weg *pHinweg = new Weg(sHinweg, dLaenge, eLimit, bUeberholverbot); + Weg *pRueckweg = new Weg(sRueckweg, dLaenge, eLimit, bUeberholverbot); + + pHinweg->setZielKreuzung(pZielKreuzung); + pRueckweg->setZielKreuzung(this); + + pHinweg->setRueckweg(pRueckweg); + pRueckweg->setRueckweg(pHinweg); + + p_lWege.push_back(pHinweg); + pZielKreuzung->p_lWege.push_back(pRueckweg); +} + +void Kreuzung::vTanken(Fahrzeug *pFz) { + if (p_dTankstelle > 0) { + p_dTankstelle -= pFz->dTanken(); /* immmer volltanken */ + } + else { + p_dTankstelle = 0; + } +} + +void Kreuzung::vAnnahme(Fahrzeug *pFz, double dStartZeit, Weg *pNeuerWeg) { + if (pNeuerWeg != NULL) { + pNeuerWeg->vAnnahme(pFz, dStartZeit); + } + else { + p_lWege.front()->vAnnahme(pFz, dStartZeit); + } +} + +double Kreuzung::getTankinhalt() { + return p_dTankstelle; +} + +void Kreuzung::vAbfertigung() { + if (p_dZeit >= dGlobaleZeit - 1e-10) return; + + list::iterator it; + for (it = p_lWege.begin(); it != p_lWege.end(); it++) { + (*it)->vAbfertigung(); + } + + p_dZeit = dGlobaleZeit; +} + +void Kreuzung::vZeichnen() const { + list::const_iterator it; + for (it = p_lWege.begin(); it != p_lWege.end(); it++) { + (*it)->vZeichnen(); + } +} + +void Kreuzung::vZeichnen(Koordinaten iKoordinaten) const { + bZeichneKreuzung(iKoordinaten.x, iKoordinaten.y); +} + +ostream& Kreuzung::ostreamAusgabe(ostream &stream) const { + AktivesVO::ostreamAusgabe(stream) << setprecision(2) + << resetiosflags(ios::left) << setiosflags(ios::right) + << setw(8) << p_dTankstelle << " ( "; + + list::const_iterator it; + for (it = p_lWege.begin(); it != p_lWege.end(); it++) { + stream << (*it)->getName() << " "; + } + stream << ")"; + + + for (it = p_lWege.begin(); it != p_lWege.end(); it++) { + stream << endl << **it; + } + + return stream; +} + +istream& Kreuzung::istreamEingabe(istream &stream) { + AktivesVO::istreamEingabe(stream) >> p_dTankstelle; + + return stream; +} + +Weg * Kreuzung::pZufaelligerWeg(Weg *pAlterWeg) { + Weg *pZufallWeg = NULL; + + do { + list::iterator it; + int iZufall = rand() % p_lWege.size(); + int i = 0; + + for (it = p_lWege.begin(); it != p_lWege.end(); it++) { + pZufallWeg = *it; + + if (i++ >= iZufall) break; + } + } while (pZufallWeg == pAlterWeg->getRueckweg() && p_lWege.size() > 1); + + return pZufallWeg; +} + +Kreuzung::~Kreuzung() +{ } diff --git a/Aufgabenblock_3/Kreuzung.h b/Aufgabenblock_3/Kreuzung.h new file mode 100644 index 0000000..f1d1cd8 --- /dev/null +++ b/Aufgabenblock_3/Kreuzung.h @@ -0,0 +1,32 @@ +#ifndef KREUZUNG_H_ +#define KREUZUNG_H_ + +#include "SimuClient.h" +#include "AktivesVO.h" +#include "Weg.h" + +class Kreuzung: public AktivesVO { +public: + Kreuzung(); + Kreuzung(string sName, double dTankvolumen = 0); + virtual ~Kreuzung(); + + void vVerbinde(Kreuzung *pZielKreuzung, string sHinweg, string sRueckweg, double dLaenge, Weg::Begrenzung eLimit, bool bUeberholverbot); + void vTanken(Fahrzeug *pFz); + void vAnnahme(Fahrzeug *pFz, double dStartZeit = 0, Weg *pAlterWeg = NULL); + void vAbfertigung(); + void vZeichnen() const; + void vZeichnen(Koordinaten iKoordinaten) const; + Weg * pZufaelligerWeg(Weg *pAlterWeg); + + double getTankinhalt(); + + ostream& ostreamAusgabe(ostream &stream) const; + istream& istreamEingabe(istream &stream); + +private: + list p_lWege; + double p_dTankstelle; +}; + +#endif /* KREUZUNG_H_ */ diff --git a/Aufgabenblock_3/LazyAktion.h b/Aufgabenblock_3/LazyAktion.h new file mode 100644 index 0000000..bcaaf6f --- /dev/null +++ b/Aufgabenblock_3/LazyAktion.h @@ -0,0 +1,82 @@ +#ifndef LAZYAKTION_H_ +#define LAZYAKTION_H_ + +#include + +using namespace std; + +// Oberklasse LazyAktion +template class LazyAktion { + +public: + LazyAktion(list *ptLazyListe) : p_ptLazyListe(ptLazyListe) { } + virtual ~LazyAktion() { } + virtual void vAusfuehren() = 0; + +protected: + list *p_ptLazyListe; // Zeiger auf p_ListeObjekte auf die die Aktionen angewendet werden sollen +}; + +// LazyPushFront +template class LazyPushFront : public LazyAktion { + +public: + LazyPushFront(const T &einObjekt, list *eineListe) : + LazyAktion (eineListe), + p_tObjekt(einObjekt) + { } + + virtual ~LazyPushFront() { } + + void vAusfuehren() { + p_ptLazyListe->push_front(p_tObjekt); + } + +private: + using LazyAktion::p_ptLazyListe; /* für gcc notwendig */ + T p_tObjekt; +}; + +// LazyPushBack +template class LazyPushBack : public LazyAktion { + +public: + LazyPushBack(const T &einObjekt, list *eineListe) : + LazyAktion (eineListe), + p_tObjekt(einObjekt) + { } + + virtual ~LazyPushBack() { } + + void vAusfuehren() { + p_ptLazyListe->push_back(p_tObjekt); + } + +private: + using LazyAktion::p_ptLazyListe; /* für gcc notwendig */ + T p_tObjekt; +}; + +template class LazyErase : public LazyAktion { + // typedef für iterator + typedef typename list::iterator iterator; + typedef typename list::const_iterator const_iterator; + +public: + LazyErase(const iterator &itObjekt, list *eineListe) : + LazyAktion (eineListe), + p_itObjekt(itObjekt) + { } + + virtual ~LazyErase() { } + + void vAusfuehren() { + p_ptLazyListe->erase(p_itObjekt); + } + +private: + using LazyAktion::p_ptLazyListe; /* für gcc notwendig */ + iterator p_itObjekt; // bei erase Iterator speichern +}; + +#endif /* LAZYAKTION_H_ */ diff --git a/Aufgabenblock_3/LazyListe.h b/Aufgabenblock_3/LazyListe.h new file mode 100644 index 0000000..90d974d --- /dev/null +++ b/Aufgabenblock_3/LazyListe.h @@ -0,0 +1,94 @@ +#ifndef LAZYLISTE_H_ +#define LAZYLISTE_H_ + +#include + +#include "LazyAktion.h" + +using namespace std; + +template class LazyListe { + +public: + // typedef für Iterator + typedef typename list::iterator iterator; + typedef typename list::const_iterator const_iterator; + + // Konstruktor / Destruktor + LazyListe() { + bChanged = false; + } + + virtual ~LazyListe() { + if (bChanged) { + // ggf. noch anstehende Aktionen löschen + do { + delete *(p_ListeAktionen.begin()); + p_ListeAktionen.pop_front(); + } while (p_ListeAktionen.size() > 0); + } + } + + // Lesefunktionen + const_iterator begin() const { + return p_ListeObjekte.begin(); + } + const_iterator end() const { + return p_ListeObjekte.end(); + } + + iterator begin() { + return p_ListeObjekte.begin(); + } + + iterator end() { + return p_ListeObjekte.end(); + } + + bool empty() const { + return p_ListeObjekte.empty(); + } + + // Schreibfunktionen + void push_back(const T einObjekt) { + p_ListeAktionen.push_back(new LazyPushBack(einObjekt, &p_ListeObjekte)); + bChanged = true; + } + + void push_front(const T einObjekt) { + p_ListeAktionen.push_back(new LazyPushFront(einObjekt, &p_ListeObjekte)); + bChanged = true; + } + + void erase(iterator itObjekt) { + p_ListeAktionen.push_back(new LazyErase(itObjekt, &p_ListeObjekte)); + bChanged = true; + } + + // Änderungen auf Objektliste übertragen + void vAktualisieren() { + if (bChanged) { + // ausstehende Aktionen durchfuehren + typename list *>::const_iterator it; // TODO warum typename?! + for (it = p_ListeAktionen.begin(); it != p_ListeAktionen.end(); it++) { + // Aktion ausführen + LazyAktion *pAktion = *it; + pAktion->vAusfuehren(); + + // Zeiger auf Action-Element löschen + delete *it; + } + // Liste der Aktionen leeren + p_ListeAktionen.clear(); + + bChanged = false; + } + } + +private: + list p_ListeObjekte; + list *> p_ListeAktionen; + bool bChanged; +}; + +#endif /* LAZYLISTE_H_ */ diff --git a/Aufgabenblock_3/Losfahren.cpp b/Aufgabenblock_3/Losfahren.cpp new file mode 100644 index 0000000..1855497 --- /dev/null +++ b/Aufgabenblock_3/Losfahren.cpp @@ -0,0 +1,18 @@ +#include + +#include "Losfahren.h" + +using namespace std; + +Losfahren::Losfahren(Fahrzeug *pFahrzeug, Weg *pWeg) : FahrAusnahme(pFahrzeug, pWeg) +{ } + +Losfahren::~Losfahren() +{ } + +void Losfahren::vBearbeiten() { + cerr << "Fahrausnahme: Losfahren (Fzg: " << *p_pFahrzeug << ", Weg: " << *p_pWeg << ")" << endl; + + p_pWeg->vAbgabe(p_pFahrzeug); + p_pWeg->vAnnahme(p_pFahrzeug); +} diff --git a/Aufgabenblock_3/Losfahren.h b/Aufgabenblock_3/Losfahren.h new file mode 100644 index 0000000..32dfb59 --- /dev/null +++ b/Aufgabenblock_3/Losfahren.h @@ -0,0 +1,14 @@ +#ifndef LOSFAHREN_H_ +#define LOSFAHREN_H_ + +#include "FahrAusnahme.h" + +class Losfahren: public FahrAusnahme { +public: + Losfahren(Fahrzeug *pFahrzeug, Weg *pWeg); + virtual ~Losfahren(); + + void vBearbeiten(); +}; + +#endif /* LOSFAHREN_H_ */ diff --git a/Aufgabenblock_3/PKW.cpp b/Aufgabenblock_3/PKW.cpp new file mode 100644 index 0000000..2b774d5 --- /dev/null +++ b/Aufgabenblock_3/PKW.cpp @@ -0,0 +1,97 @@ +#include +#include + +#include "PKW.h" +#include "SimuClient.h" + +using namespace std; + +extern double dGlobaleZeit; + +/* Standardkonstruktor */ +PKW::PKW() : + Fahrzeug(), + p_dVerbrauch(0), + p_dTankinhalt(0), + p_dTankvolumen(0) +{ } + +PKW::PKW(string sName, double dMaxGeschwindigkeit) : + Fahrzeug(sName, dMaxGeschwindigkeit), + p_dVerbrauch(0), + p_dTankinhalt(0), + p_dTankvolumen(0) +{ } + +PKW::PKW(string sName, double dMaxGeschwindigkeit, double dVerbrauch, double dTankvolumen) : + Fahrzeug(sName, dMaxGeschwindigkeit), + p_dVerbrauch(dVerbrauch), + p_dTankinhalt(dTankvolumen / 2), + p_dTankvolumen(dTankvolumen) +{ } + +/* Destruktor */ +PKW::~PKW() +{ } + +double PKW::dTanken(double dMenge) { + double dAlterInhalt = p_dTankinhalt; + + if (dMenge == 0) { + p_dTankinhalt = p_dTankvolumen; + } else { + p_dTankinhalt += dMenge; + if (p_dTankinhalt > p_dTankvolumen) { + p_dTankinhalt = p_dTankvolumen; /* Verhindere Ãœberfüllung */ + } + } + + return p_dTankinhalt - dAlterInhalt; +} + +void PKW::vZeichnen() const { + Weg *pWeg = p_pVerhalten->getWeg(); + bZeichnePKW(getName(), pWeg->getName(), getAbschnittStrecke() / pWeg->getLaenge(), dGeschwindigkeit(), getTankinhalt()); +} + +void PKW::vAbfertigung() { + if (p_dTankinhalt > 0) { /* prüfen, ob etwas im Tank ist */ + double dDelta = dGlobaleZeit - p_dZeit; + double dStrecke = p_pVerhalten->dStrecke(this, dDelta); + + p_dTankinhalt -= dStrecke * p_dVerbrauch / 100; + + if (p_dTankinhalt < 0) { /* falls Tankinhalt negativ ist */ + p_dTankinhalt = 0; + } + + Fahrzeug::vAbfertigung(); + } + else { + p_dZeit = dGlobaleZeit; + } +} + +ostream& PKW::ostreamAusgabe(ostream &stream) const { + Fahrzeug::ostreamAusgabe(stream) << setprecision(2) << setiosflags(ios::fixed) + << resetiosflags(ios::left) << setiosflags(ios::right) + << setw(12) << dVerbrauch() + << setw(13) << p_dTankinhalt; + + return stream; +} + +istream& PKW::istreamEingabe(istream &stream) { + Fahrzeug::istreamEingabe(stream) >> p_dVerbrauch >> p_dTankvolumen; + p_dTankinhalt = p_dTankvolumen/2; + + return stream; +} + +double PKW::dVerbrauch() const { + return p_dGesamtStrecke * p_dVerbrauch / 100; +} + +double PKW::getTankinhalt() const { + return p_dTankinhalt; +} diff --git a/Aufgabenblock_3/PKW.h b/Aufgabenblock_3/PKW.h new file mode 100644 index 0000000..b1b20b3 --- /dev/null +++ b/Aufgabenblock_3/PKW.h @@ -0,0 +1,39 @@ +/* + * PKW.h + * + * Created on: 18.08.2011 + * Author: stv0g + */ + +#ifndef PKW_H_ +#define PKW_H_ + +#include + +#include "Fahrzeug.h" + +using namespace std; + +class PKW: public Fahrzeug { +public: + PKW(); + PKW(string sName, double dMaxGeschwindigkeit); + PKW(string sName, double dMaxGeschwindigkeit, double dVerbrauch, double dTankvolumen = 55); + virtual ~PKW(); + + void vAbfertigung(); + double dVerbrauch() const; + double dTanken(double dMenge = 0.0); + void vZeichnen() const; + double getTankinhalt() const; + + ostream& ostreamAusgabe(ostream &stream) const; + istream& istreamEingabe(istream &stream); + +private: + double p_dVerbrauch; + double p_dTankinhalt; + double p_dTankvolumen; +}; + +#endif /* PKW_H_ */ diff --git a/Aufgabenblock_3/SimuClient.h b/Aufgabenblock_3/SimuClient.h new file mode 100644 index 0000000..f20ec4e --- /dev/null +++ b/Aufgabenblock_3/SimuClient.h @@ -0,0 +1,46 @@ +/* + * SimuClient f�r MacOS/Linux (Praktikum Informatik 2, WS 2009/10 RWTH Aachen) + * Version 0.5 + * von Robert Uhl, 2009 - 2010 + * Vielen Dank an den Lehrstuhl EECS, RWTH Aachen, f�r den Zugang zum Quellcode + * des SimuClient f�r Windows. + * Datei: SimuClient.h + * Inhalt: SimuClient sendet Daten an den (erweiterten) Java-Grafik-Server + */ + +#ifndef SIMUCLIENT_H +#define SIMUCLIENT_H + +#include +using namespace std; + +typedef struct { + int x; + int y; +} Koordinaten; + +// Funktionen der Library +bool bInitialisiereGrafik(int sizeX, int sizeY, bool bStarteServer = true, const string& sServer = "localhost", const unsigned short iPort = 7654); +bool bZeichneKreuzung(int posX, int posY); +bool bZeichneStrasse(const string& way_to_name, const string& way_back_name, int length, int numPoints, int* points_xy); +bool bZeichnePKW(const string& carname, const string& streetname, double rel_position, double speed, double tank); +bool bZeichneFahrrad(const string& bikename, const string& streetname, double relposition, double speed); +void vSetzeZeit(const double dTime); // sendet die Simulationszeit an den erweiterten Grafikserver +void Sleep(const int mSec); // ersetzt die Sleep()-Funktion von Windows, die mSek �bernimmt +void vBeendeGrafik(void); + +// Zus�tzliche Schnittstellen wegen eventueller Konvertierungsprobleme bei string/char* +bool bZeichneStrasse(const char* way_to_name, const char* way_back_name, int length, int numPoints, int* points_xy); +bool bZeichneStrasse(const string& way_to_name, const char* way_back_name, int length, int numPoints, int* points_xy); +bool bZeichneStrasse(const char* way_to_name, const string& way_back_name, int length, int numPoints, int* points_xy); + +bool bZeichnePKW(const char* carname, const char* streetname, double rel_position, double speed, double tank); +bool bZeichnePKW(const string& carname, const char* streetname, double rel_position, double speed, double tank); +bool bZeichnePKW(const char* carname, const string& streetname, double rel_position, double speed, double tank); + +bool bZeichneFahrrad(const char* bikename, const char* streetname, double rel_position, double speed); +bool bZeichneFahrrad(const string& bikename, const char* streetname, double rel_position, double speed); +bool bZeichneFahrrad(const char* bikename, const string& streetname, double rel_position, double speed); + +#endif // SIMUCLIENT_H +// eof diff --git a/Aufgabenblock_3/SimuServer.jar b/Aufgabenblock_3/SimuServer.jar new file mode 100644 index 0000000000000000000000000000000000000000..e8c7e935475b1ca2c8449484c4f7d926ca05bebc GIT binary patch literal 14186 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 literal 0 HcmV?d00001 diff --git a/Aufgabenblock_3/Streckenende.cpp b/Aufgabenblock_3/Streckenende.cpp new file mode 100644 index 0000000..06e3da4 --- /dev/null +++ b/Aufgabenblock_3/Streckenende.cpp @@ -0,0 +1,27 @@ +#include + +#include "Streckenende.h" +#include "Kreuzung.h" + +using namespace std; + +Streckenende::Streckenende(Fahrzeug *pFahrzeug, Weg *pWeg) : FahrAusnahme(pFahrzeug, pWeg) +{ } + +Streckenende::~Streckenende() +{ } + +void Streckenende::vBearbeiten() { + Kreuzung *pZielKreuzung = p_pWeg->getZielKreuzung(); + Weg *pNeuerWeg = pZielKreuzung->pZufaelligerWeg(p_pWeg); /* wähle zufälligen Weg */ + + p_pWeg->vAbgabe(p_pFahrzeug); + pZielKreuzung->vTanken(p_pFahrzeug); + pZielKreuzung->vAnnahme(p_pFahrzeug, 0, pNeuerWeg); + + cerr << "Fahrausnahme: Fahrzeug wird umgesetzt (" + << "Fzg: " << p_pFahrzeug->getName() + << ", Weg: " << p_pWeg->getName() << " => " << pNeuerWeg->getName() + << ", Kreuz.: " << pZielKreuzung->getName() << " (Tank: " << pZielKreuzung->getTankinhalt() << ")" + << ")" << endl; +} diff --git a/Aufgabenblock_3/Streckenende.h b/Aufgabenblock_3/Streckenende.h new file mode 100644 index 0000000..8a34497 --- /dev/null +++ b/Aufgabenblock_3/Streckenende.h @@ -0,0 +1,14 @@ +#ifndef STRECKENENDE_H_ +#define STRECKENENDE_H_ + +#include "FahrAusnahme.h" + +class Streckenende: public FahrAusnahme { +public: + Streckenende(Fahrzeug *pFahrzeug, Weg *pWeg); + virtual ~Streckenende(); + + void vBearbeiten(); +}; + +#endif /* STRECKENENDE_H_ */ diff --git a/Aufgabenblock_3/Weg.cpp b/Aufgabenblock_3/Weg.cpp new file mode 100644 index 0000000..4dd9eb1 --- /dev/null +++ b/Aufgabenblock_3/Weg.cpp @@ -0,0 +1,147 @@ +#include +#include +#include +#include + +#include "SimuClient.h" +#include "Weg.h" +#include "Fahrzeug.h" +#include "FahrAusnahme.h" + +extern double dGlobaleZeit; + +/* Standardkonstruktor */ +Weg::Weg() : AktivesVO() +{ } + +Weg::Weg(string sName, double dLaenge, Begrenzung eLimit, bool bUeberholverbot) : + AktivesVO(sName), + p_dLaenge(dLaenge), + p_dUeberholverbot(bUeberholverbot), + p_eLimit(eLimit), + p_pZielKreuzung(NULL), + p_pRueckweg(NULL) +{ } + +/* Destruktor */ +Weg::~Weg() +{ } + +/* fertige alle Fahrzeuge auf Weg ab */ +void Weg::vAbfertigung() { + LazyListe::iterator it; + p_dSchranke = p_dLaenge; + + p_lFahrzeuge.vAktualisieren(); + for (it = p_lFahrzeuge.begin(); it != p_lFahrzeuge.end(); it++) { + try { + (*it)->vAbfertigung(); + } catch (FahrAusnahme &ausnahme) { + ausnahme.vBearbeiten(); + //(*it)->vAbfertigung(); + } + } + + p_lFahrzeuge.vAktualisieren(); + p_dZeit = dGlobaleZeit; +} + +void Weg::vAnnahme(Fahrzeug *pFz, double dStartZeit) { + pFz->vNeueStrecke(this, dStartZeit); + + if (dStartZeit > 0) { /* parkende Fahrzeuge werden vorne eingef�gt */ + p_lFahrzeuge.push_front(pFz); + } + else { /* fahrende hinten */ + p_lFahrzeuge.push_back(pFz); + } +} + +void Weg::vAbgabe(Fahrzeug *pFz) { + LazyListe::iterator result; + + result = find(p_lFahrzeuge.begin(), p_lFahrzeuge.end(), pFz); + + if (result != p_lFahrzeuge.end()) { /* gefunden */ + p_lFahrzeuge.erase(result); + } +} + +void Weg::vZeichnen(size_t iAnzahlKoordinaten, Koordinaten iKoordinaten[]) const { + bZeichneStrasse(getName(), p_pRueckweg->getName(), getLaenge(), iAnzahlKoordinaten, (int *) iKoordinaten); +} + +void Weg::vZeichnen() const { + LazyListe::const_iterator it; + for (it = p_lFahrzeuge.begin(); it != p_lFahrzeuge.end(); it++) { + (*it)->vZeichnen(); + } +} + +double Weg::getLaenge() const { + return p_dLaenge; +} + +double Weg::getSchranke() const { + return p_dSchranke; +} + +void Weg::setSchranke(double dSchranke) { + p_dSchranke = dSchranke; +} + +void Weg::setRueckweg(Weg * pRueckweg) { + p_pRueckweg = pRueckweg; +} + +Weg * Weg::getRueckweg() { + return p_pRueckweg; +} + +void Weg::setZielKreuzung(Kreuzung * pZielKreuzung) { + p_pZielKreuzung = pZielKreuzung; +} + +Kreuzung * Weg::getZielKreuzung() { + return p_pZielKreuzung; +} + +double Weg::getMaxGeschwindigkeit() const { + switch (p_eLimit) { + case Weg::Innerorts: return 50; + case Weg::Landstrasse: return 100; + case Weg::Autobahn: return DBL_MAX; /* unbegrenzt */ + default: return 0; + } +} + + +ostream& Weg::ostreamAusgabe(ostream &stream) const { + double dMaxGeschwindigkeit = getMaxGeschwindigkeit(); + + AktivesVO::ostreamAusgabe(stream) << setprecision(2) + << resetiosflags(ios::left) << setiosflags(ios::right) + << setw(8); + + if (dMaxGeschwindigkeit == DBL_MAX) { + stream << "(inf)"; + } + else { + stream << dMaxGeschwindigkeit; + } + + stream << setw(16) << p_dLaenge << " ( "; + + LazyListe::const_iterator it; + for (it = p_lFahrzeuge.begin(); it != p_lFahrzeuge.end(); it++) { + stream << (*it)->getName() << " "; + } + + stream << ")"; + + for (it = p_lFahrzeuge.begin(); it != p_lFahrzeuge.end(); it++) { + stream << endl << **it; + } + + return stream; +} diff --git a/Aufgabenblock_3/Weg.h b/Aufgabenblock_3/Weg.h new file mode 100644 index 0000000..55061fd --- /dev/null +++ b/Aufgabenblock_3/Weg.h @@ -0,0 +1,57 @@ +#ifndef WEG_H_ +#define WEG_H_ + +#include +#include + +#include "AktivesVO.h" +#include "LazyListe.h" +#include "SimuClient.h" + +using namespace std; + +/* Forward Deklarationen */ +class Fahrzeug; +class Kreuzung; + +class Weg : public AktivesVO { +public: + typedef enum { + Innerorts, /* 50 km/h */ + Landstrasse, /* 100 km/h */ + Autobahn /* unbegrenzt */ + } Begrenzung; + + Weg(); + Weg(string sName, double dLaenge, Begrenzung eLimit = Autobahn, bool dUeberholverbot = true); + virtual ~Weg(); + + void vAbfertigung(); + void vAnnahme(Fahrzeug *pFz, double dStartZeit = 0); + void vAbgabe(Fahrzeug *pFz); + void vZeichnen(size_t iAnzahlKoordinaten, Koordinaten iKoordinaten[]) const; /* zeichnet Weg */ + void vZeichnen() const; /* zeichnet Fahrzeuge, die sich auf dem Weg befinden */ + + double getMaxGeschwindigkeit() const; + double getSchranke() const; + void setSchranke(double dSchranke); + double getLaenge() const; + void setRueckweg(Weg * pRueckweg); + Weg * getRueckweg(); + void setZielKreuzung(Kreuzung * pZielKreuzung); + Kreuzung * getZielKreuzung(); + + ostream& ostreamAusgabe(ostream &stream) const; + +private: + double p_dLaenge; + double p_dSchranke; + bool p_dUeberholverbot; + Begrenzung p_eLimit; + LazyListe p_lFahrzeuge; + + Kreuzung *p_pZielKreuzung; + Weg *p_pRueckweg; +}; + +#endif /* WEG_H_ */ diff --git a/Aufgabenblock_3/Welt.cpp b/Aufgabenblock_3/Welt.cpp new file mode 100644 index 0000000..cc1e34f --- /dev/null +++ b/Aufgabenblock_3/Welt.cpp @@ -0,0 +1,185 @@ +#include +#include + +#include "Welt.h" +#include "PKW.h" +#include "Weg.h" +#include "Fahrrad.h" + +Welt::Welt() +{ } + +Welt::~Welt() +{ } + +void Welt::vAbfertigung() { + list::iterator it; + for (it = p_pKreuzungen.begin(); it != p_pKreuzungen.end(); it++) { + (*it)->vAbfertigung(); + } +} + +void Welt::vZeichnen() { + list::iterator it; + for (it = p_pKreuzungen.begin(); it != p_pKreuzungen.end(); it++) { + (*it)->vZeichnen(); + } +} + +ostream& Welt::ostreamAusgabe(ostream &stream) const { + list::const_iterator it; + for (it = p_pKreuzungen.begin(); it != p_pKreuzungen.end(); it++) { + stream << **it << endl; + } + + return stream; +} + +ostream& operator<<(ostream &stream, const Welt &w) { + return w.ostreamAusgabe(stream); +} + +void Welt::vEinlesen(istream &in) { + while (!in.eof()) { + string sTyp; + in >> sTyp; + + if (sTyp == "KREUZUNG") { + Kreuzung *pKr = new Kreuzung; + in >> *pKr; + + p_pKreuzungen.push_back(pKr); + } + else if (sTyp == "STRASSE") { + string sQuellKreuzung, sZielKreuzung; + string sHinweg, sRueckweg; + double dLaenge; + int eLimit; + bool bUeberholverbot; + + /* Daten einlesen */ + in >> sQuellKreuzung + >> sZielKreuzung + >> sHinweg + >> sRueckweg + >> dLaenge + >> eLimit + >> bUeberholverbot; + + /* Kreuzungen suchen */ + Kreuzung *pQuellKreuzung = static_cast(AktivesVO::pObjekt(sQuellKreuzung)); + Kreuzung *pZielKreuzung = static_cast(AktivesVO::pObjekt(sZielKreuzung)); + + eLimit--; + if (eLimit > 2 || eLimit < 0) { + throw string("Ungültige Geschwindikeitsbegrenzung (0-2)"); + } + + /* Kreuzungen verbinden & Wege erstellen */ + pQuellKreuzung->vVerbinde(pZielKreuzung, sHinweg, sRueckweg, dLaenge, static_cast(eLimit), bUeberholverbot); + } + else if (sTyp == "PKW") { + PKW *pPkw = new PKW(); + string sStartKreuzung; + double dStartZeit; + + /* Daten einlesen */ + in >> *pPkw >> sStartKreuzung >> dStartZeit; + + /* PKW einsetzen */ + Kreuzung *pStartKreuzung = static_cast(AktivesVO::pObjekt(sStartKreuzung)); + pStartKreuzung->vAnnahme(pPkw, dStartZeit); + } + else if (sTyp == "FAHRRAD") { + Fahrrad *pRad = new Fahrrad(); + string sStartKreuzung; + double dStartZeit; + + /* Daten einlesen */ + in >> *pRad >> sStartKreuzung >> dStartZeit; + + /* PKW einsetzen */ + Kreuzung *pStartKreuzung = static_cast(AktivesVO::pObjekt(sStartKreuzung)); + pStartKreuzung->vAnnahme(pRad, dStartZeit); + } + else if (sTyp != "") { + throw string("Unbekannter Typ!"); + } + } +} + +void Welt::vEinlesenMitGrafik(istream &in) { + while (!in.eof()) { + string sTyp; + in >> sTyp; + + if (sTyp == "KREUZUNG") { + Kreuzung *pKr = new Kreuzung; + Koordinaten iPos; + in >> *pKr >> iPos.x >> iPos.y; + + pKr->vZeichnen(iPos); + p_pKreuzungen.push_back(pKr); + } + else if (sTyp == "STRASSE") { + string sQuellKreuzung, sZielKreuzung; + string sHinweg, sRueckweg; + double dLaenge; + int eLimit, iAnzahlKoordinaten; + bool bUeberholverbot; + + /* Daten einlesen */ + in >> sQuellKreuzung + >> sZielKreuzung + >> sHinweg + >> sRueckweg + >> dLaenge + >> eLimit + >> bUeberholverbot + >> iAnzahlKoordinaten; + + Koordinaten *iPoly = new Koordinaten[iAnzahlKoordinaten]; + for (int i = 0; i < iAnzahlKoordinaten; i++) { + in >> iPoly[i].x >> iPoly[i].y; + } + + /* Kreuzungen suchen */ + Kreuzung *pQuellKreuzung = static_cast(AktivesVO::pObjekt(sQuellKreuzung)); + Kreuzung *pZielKreuzung = static_cast(AktivesVO::pObjekt(sZielKreuzung)); + + /* Kreuzungen verbinden & Wege erstellen */ + pQuellKreuzung->vVerbinde(pZielKreuzung, sHinweg, sRueckweg, dLaenge, static_cast(eLimit), bUeberholverbot); + + /* Wege Zeichnen */ + Weg *pHinweg = static_cast(AktivesVO::pObjekt(sHinweg)); + pHinweg->vZeichnen(iAnzahlKoordinaten, iPoly); + } + else if (sTyp == "PKW") { + PKW *pPkw = new PKW(); + string sStartKreuzung; + double dStartZeit; + + /* Daten einlesen */ + in >> *pPkw >> sStartKreuzung >> dStartZeit; + + /* PKW einsetzen */ + Kreuzung *pStartKreuzung = static_cast(AktivesVO::pObjekt(sStartKreuzung)); + pStartKreuzung->vAnnahme(pPkw, dStartZeit); + } + else if (sTyp == "FAHRRAD") { + Fahrrad *pRad = new Fahrrad(); + string sStartKreuzung; + double dStartZeit; + + /* Daten einlesen */ + in >> *pRad >> sStartKreuzung >> dStartZeit; + + /* PKW einsetzen */ + Kreuzung *pStartKreuzung = static_cast(AktivesVO::pObjekt(sStartKreuzung)); + pStartKreuzung->vAnnahme(pRad, dStartZeit); + } + else if (sTyp != "") { + throw string("Unbekannter Typ!"); + } + } +} diff --git a/Aufgabenblock_3/Welt.h b/Aufgabenblock_3/Welt.h new file mode 100644 index 0000000..fd8de2b --- /dev/null +++ b/Aufgabenblock_3/Welt.h @@ -0,0 +1,26 @@ +#ifndef WELT_H_ +#define WELT_H_ + +#include + +#include "Kreuzung.h" + +class Welt { +public: + Welt(); + virtual ~Welt(); + + void vAbfertigung(); + void vZeichnen(); + void vEinlesen(istream &in); + void vEinlesenMitGrafik(istream &in); + virtual ostream& ostreamAusgabe(ostream &stream) const; + +private: + list p_pKreuzungen; + +}; + +ostream& operator<<(ostream &out, const Welt &w); + +#endif /* WELT_H_ */ diff --git a/Aufgabenblock_3/libsimu.so b/Aufgabenblock_3/libsimu.so new file mode 100755 index 0000000000000000000000000000000000000000..8f24c856989f8b6450d3e9d7cf4f9dd6b497dbd8 GIT binary patch literal 66234 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 literal 0 HcmV?d00001 diff --git a/Aufgabenblock_3/main.cpp b/Aufgabenblock_3/main.cpp new file mode 100644 index 0000000..67c7266 --- /dev/null +++ b/Aufgabenblock_3/main.cpp @@ -0,0 +1,509 @@ +#include +#include +#include +#include +#include + +#ifdef _WIN32 /* _Win32 is usually defined by compilers targeting 32 or 64 bit Windows systems */ +#include +#endif + +#include "SimuClient.h" +#include "Welt.h" +#include "Kreuzung.h" +#include "Fahrzeug.h" +#include "Fahrrad.h" +#include "PKW.h" +#include "Weg.h" +#include "LazyListe.h" + +using namespace std; + +double dGlobaleZeit; + +void vAufgabe1(int argc, char *argv[]) { + /* 3. Initialisieren */ + Fahrzeug fz1("Porsche"); + Fahrzeug *fz2 = new Fahrzeug(); + + string name; + cout << "Bitte geben Sie einen Fahrzeugnamen ein: "; + cin >> name; + + Fahrzeug *fz3 = new Fahrzeug(name, 22.5); + + Fahrzeug::vAusgabeHeader(); + cout << fz1 << endl << *fz2 << endl << *fz3 << endl; + + /* 9. Abfertigung */ + double dAbfertigungsIntervall; + cout << endl << "Bitte geben Sie ein Abfertigungsintervall ein: "; + cin >> dAbfertigungsIntervall; + + Fahrzeug::vAusgabeHeader(); + for ( ; dGlobaleZeit < 24; dGlobaleZeit += dAbfertigungsIntervall) { /* simuliere für einen Tag */ + fz1.vAbfertigung(); + fz2->vAbfertigung(); + fz3->vAbfertigung(); + + cout << fz1 << endl << *fz2 << endl << *fz3 << endl; + } + + delete fz2; + delete fz3; +} + +/** + * Testing debugger + */ +void vAufgabe1_deb(int argc, char *argv[]) { + Fahrzeug fz1("Opel"); + Fahrzeug fz2("Benz"); + Fahrzeug fz3("Ferrari"); + Fahrzeug fz4("Mini"); + + Fahrzeug *feld_name[4] = {&fz1, &fz2, &fz3, &fz4}; + + feld_name[2] = 0; // NULL pointer => Segmention Fault + + for (int i = 0; i < 4; i++) { + cout << *feld_name[i] << endl; + } +} + +void vAufgabe2(int argc, char *argv[]) { + int iPKWs, iFahrraeder; + vector fahrzeuge; + + /* Erzeugen */ + cout << "Wie viele PKWs möchten Sie erstellen? "; + cin >> iPKWs; + + cout << "Wie viele Fahrräder möchten Sie erstellen? "; + cin >> iFahrraeder; + + for (int i = 0; i < iPKWs + iFahrraeder; i++) { + Fahrzeug *fahrzeug; + string sName; + double dMaxGeschwindkeit; + + cout << "Bitte geben Sie den Namen des Fahrzeugs Nr. " << i+1 << " an: "; + cin >> sName; + cout << "Bitte geben Sie die maximale Geschwindkeit des Fahrzeugs Nr. " << i+1 << " an: "; + cin >> dMaxGeschwindkeit; + + if (i < iPKWs) { /* erzeuge PKW */ + double dVerbrauch; + cout << "Bitte geben Sie den Verbrauch des PKWs Nr. " << i+1 << " an: "; + cin >> dVerbrauch; + + fahrzeug = new PKW(sName, dMaxGeschwindkeit, dVerbrauch); + } + else { /* erzeuge Fahrrad */ + fahrzeug = new Fahrrad(sName, dMaxGeschwindkeit); + } + + fahrzeuge.push_back(fahrzeug); + } + + /* Abfertigen */ + + double dAbfertigungsIntervall; + size_t iNachgetankt = 0; + cout << "Bitte geben Sie ein Abfertigungsintervall ein: "; + cin >> dAbfertigungsIntervall; + cout << endl; + + Fahrzeug::vAusgabeHeader(); + + for (dGlobaleZeit = 0; dGlobaleZeit < 6; dGlobaleZeit += dAbfertigungsIntervall) { + vector::iterator it; + for (it = fahrzeuge.begin(); it != fahrzeuge.end(); it++) { + if (dGlobaleZeit > 3 && iNachgetankt < fahrzeuge.size()) { + (*it)->dTanken(); + iNachgetankt++; + } + + (*it)->vAbfertigung(); + cout << **it << endl; + } + } +} + +void vAufgabe3(int argc, char *argv[]) { + PKW vw("Golf", 200, 6.7, 88); + Fahrrad velo("Haibike", 22); + Fahrzeug boat("Schiff", 11); + + dGlobaleZeit += 1.0; + velo.vAbfertigung(); + + Fahrzeug::vAusgabeHeader(); + cout << vw << endl << velo << endl << boat << endl << endl; + + if (vw < velo) { + cout << "Das Fahrrad ist bereits weiter gefahren"; + } + else { + cout << "Der Golf ist bereits weiter gefahren"; + } + + cout << endl << endl; + + Fahrrad veloKopie = velo; /* benutze Kopier Konstrukutor */ + Fahrrad veloKopie2; + + veloKopie2 = velo; /* benutze Zuweisungsoperator */ + + Fahrzeug::vAusgabeHeader(); + cout << veloKopie << endl << veloKopie2 << endl; +} + +void vAufgabe4(int argc, char *argv[]) { + Weg weg("Allee", 150.0, Weg::Landstrasse); + PKW vw("Golf", 55, 6.7, 88); + Fahrrad velo("Haibike", 22); + + weg.vAnnahme(&vw, 1.2); + weg.vAnnahme(&velo); + + Fahrzeug::vAusgabeHeader(); + for (dGlobaleZeit = 0; dGlobaleZeit < 3; dGlobaleZeit += 0.1) { + weg.vAbfertigung(); + cout << vw << endl << velo << endl << weg << endl; + } +} + +void vAufgabe5(int argc, char *argv[]) { + Weg hin("Hinweg", 500.0, Weg::Landstrasse); + Weg rueck("Rueckweg", 500.0, Weg::Landstrasse); + + hin.setRueckweg(&rueck); + rueck.setRueckweg(&hin); + + PKW vw("Golf", 55, 10, 20); + Fahrrad velo("Haibike", 22); + + bool bStarted = bInitialisiereGrafik(800, 600); + if (!bStarted) { + cerr << "Konnte Simulationsserver nicht starten!" << endl; + } + + Koordinaten iPoly[] = {{100, 100}, {700, 500} }; + hin.vZeichnen(2, iPoly); + + hin.vAnnahme(&vw, 1.2); + rueck.vAnnahme(&velo); + + Fahrzeug::vAusgabeHeader(); + for (dGlobaleZeit = 0; dGlobaleZeit < 15; dGlobaleZeit += 0.3) { + hin.vAbfertigung(); + rueck.vAbfertigung(); + + vSetzeZeit(dGlobaleZeit); + + hin.vZeichnen(); + rueck.vZeichnen(); + + cout << vw << endl << velo << endl << hin << endl << rueck << endl; + + Sleep(500); + } + + vBeendeGrafik(); +} + +void vAufgabe6(int argc, char *argv[]) { + Weg weg("Allee", 300.0, Weg::Landstrasse); + PKW vw("Golf", 55, 6.7, 88); + + weg.vAnnahme(&vw); + + Fahrzeug::vAusgabeHeader(); + for (dGlobaleZeit = 0; dGlobaleZeit < 10; dGlobaleZeit += 0.5) { + weg.vAbfertigung(); + cout << vw << endl << weg << endl; + } +} + +void vListeAusgeben(LazyListe &tListe) { + LazyListe::iterator it; + for (it = tListe.begin(); it != tListe.end(); it++) { + cout << *it << ", "; + } + cout << endl; +} + +void vAufgabe6a(int argc, char *argv[]) { + LazyListe tListe; + LazyListe::iterator it; + + /* Mit Zufallszahlen füllen */ + cout << "Fülle mit Zufallszahlen" << endl; + for (int i = 0; i < 10; i++) { + tListe.push_back(rand() % 10 + 1); + } + + cout << "Führe LazyAktionen aus" << endl; + tListe.vAktualisieren(); + + cout << "Gebe Liste aus: "; + vListeAusgeben(tListe); + + cout << "Lösche Werte > 5..." << endl; + for (it = tListe.begin(); it != tListe.end(); it++) { + if (*it > 5) { + tListe.erase(it); + } + } + + cout << "Gebe Liste aus: "; + vListeAusgeben(tListe); + + cout << "Führe LazyAktionen aus" << endl; + tListe.vAktualisieren(); + + cout << "Gebe Liste aus: "; + vListeAusgeben(tListe); + + cout << "Weitere Änderungen..." << endl; + tListe.push_front(44); + tListe.push_back(33); + + cout << "Führe LazyAktionen aus" << endl; + tListe.vAktualisieren(); + + cout << "Gebe Liste aus: "; + vListeAusgeben(tListe); +} + +void vAufgabe7(int argc, char *argv[]) { + PKW vw("Golf", 120, 10, 90); + Fahrrad velo("Haibike", 42); + + Weg hin("Hinweg", 500.0, Weg::Landstrasse); + Weg rueck("Rueckweg", 500.0, Weg::Landstrasse); + + hin.setRueckweg(&rueck); + rueck.setRueckweg(&hin); + + bool bStarted = bInitialisiereGrafik(800, 600); + if (!bStarted) { + cerr << "Konnte Simulationsserver nicht starten!" << endl; + } + + Koordinaten iPoly[] = {{100, 100}, {700, 500} }; + hin.vZeichnen(2, iPoly); + + hin.vAnnahme(&vw, 8); + hin.vAnnahme(&velo, 1); + + Fahrzeug::vAusgabeHeader(); + for (dGlobaleZeit = 0; dGlobaleZeit <= 30; dGlobaleZeit += 0.5) { + hin.vAbfertigung(); + + hin.vZeichnen(); + rueck.vZeichnen(); + + cout << vw << endl << velo << endl << hin << endl << "--" << endl; + + vSetzeZeit(dGlobaleZeit); + Sleep(500); + } + + vBeendeGrafik(); +} + +void vAufgabe8(int argc, char *argv[]) { + bInitialisiereGrafik(1000, 700); + + PKW vw("Golf", 120, 10, 90); + PKW ferrari("Ferrari", 320, 15, 210); + Fahrrad velo("Haibike", 42); + + Kreuzung kr1("K1"); + Kreuzung kr2("K2", 1000); + Kreuzung kr3("K3"); + Kreuzung kr4("K4"); + + kr1.vVerbinde(&kr2, "W12", "W21", 40, Weg::Innerorts, true); + kr2.vVerbinde(&kr3, "W23a", "W32a", 115, Weg::Autobahn, false); + kr2.vVerbinde(&kr3, "W23b", "W32b", 40, Weg::Innerorts, true); + kr2.vVerbinde(&kr4, "W24", "W42", 55, Weg::Innerorts, true); + kr3.vVerbinde(&kr4, "W34", "W43", 85, Weg::Autobahn, false); + kr4.vVerbinde(&kr4, "W44a", "W44b", 130, Weg::Landstrasse, false); + + Koordinaten iK1 = {680, 40}; + Koordinaten iK2 = {680, 300}; + Koordinaten iK3 = {680, 570}; + Koordinaten iK4 = {320, 300}; + + Koordinaten iW12[] = {{680, 40}, {680, 300}}; + Koordinaten iW23a[] = {{680, 300}, {850, 300}, {970, 390}, {970, 500}, {850, 570}, {680, 570}}; + Koordinaten iW23b[] = {{680, 300}, {680, 570}}; + Koordinaten iW24[] = {{680, 300}, {320, 300}}; + Koordinaten iW34[] = {{680, 570}, {500, 570}, {350, 510}, {320, 420}, {320, 300}}; + Koordinaten iW44[] = {{320, 300}, {320, 150}, {200, 60}, {80, 90}, {70, 250}, {170, 300}, {320, 300}}; + + kr1.vZeichnen(iK1); + kr2.vZeichnen(iK2); + kr3.vZeichnen(iK3); + kr4.vZeichnen(iK4); + + bZeichneStrasse("W12", "W21", 40, 2, (int *) iW12); + bZeichneStrasse("W23a", "W32a", 115, 6, (int *) iW23a); + bZeichneStrasse("W23b", "W32b", 40, 2, (int *) iW23b); + bZeichneStrasse("W24", "W42", 55, 2, (int *) iW24); + bZeichneStrasse("W34", "W43", 85, 5, (int *) iW34); + bZeichneStrasse("W44a", "W44b", 130, 7, (int *) iW44); + + kr1.vAnnahme(&vw); + kr1.vAnnahme(&velo); + kr2.vAnnahme(&ferrari, 5); + + for (dGlobaleZeit = 0.3; dGlobaleZeit <= 24; dGlobaleZeit += 0.01) { + kr1.vAbfertigung(); + kr2.vAbfertigung(); + kr3.vAbfertigung(); + kr4.vAbfertigung(); + + kr1.vZeichnen(); + kr2.vZeichnen(); + kr3.vZeichnen(); + kr4.vZeichnen(); + + Fahrzeug::vAusgabeHeader(); + cout + << vw << endl + << velo << endl + << ferrari << endl + << kr1 << endl + << kr2 << endl + << kr3 << endl + << kr4 << endl + << "--" << endl; + + vSetzeZeit(dGlobaleZeit); + Sleep(40); + } + + vBeendeGrafik(); +} + +void vAufgabe9(int argc, char *argv[]) { + ifstream File; + + File.open(argv[1]); + + if(!File.good()) { + throw string("Datei existiert nicht!"); + } + + PKW pkw; + Fahrrad rad; + Kreuzung krz; + + File >> pkw >> rad >> krz; + + Fahrzeug::vAusgabeHeader(); + cout + << pkw << endl + << rad << endl + << krz << endl; + + /* Teste map */ + string sName; + cout << "Geben Sie einen Namen zum Suchen ein: "; + cin >> sName; + cout << *AktivesVO::pObjekt(sName) << endl; + + cout << endl; + PKW pkw2("Porsche", 99); +} + +void vAufgabe9a(int argc, char *argv[]) { + ifstream File; + + File.open(argv[1]); + + if(!File.good()) { + throw string("Datei existiert nicht!"); + } + + bInitialisiereGrafik(1000, 900); + + Welt tErde; + tErde.vEinlesenMitGrafik(File); + + for (dGlobaleZeit = 0; dGlobaleZeit < 24*31; dGlobaleZeit += 0.1) { + tErde.vAbfertigung(); + tErde.vZeichnen(); + + cout << tErde << "--" << endl; + + vSetzeZeit(dGlobaleZeit); + Sleep(500); + } + + vBeendeGrafik(); +} + +typedef void (*aufgabe_t)(int argc, char *argv[]); +#define NUM_AUFGABEN 11 + +int main(int argc, char *argv[]) { + /* PRNG mit konstantem seed initialisieren */ + srand(55); + + int iWahl; + + aufgabe_t pAufgaben[] = { + &vAufgabe1_deb, &vAufgabe1, &vAufgabe2, &vAufgabe3, &vAufgabe4, + &vAufgabe5, &vAufgabe6, &vAufgabe6a, &vAufgabe7, &vAufgabe8, + &vAufgabe9, &vAufgabe9a + }; + + retry: + + cout + << "0: vAufgabe1_deb()" << endl + << "1: vAufgabe1()" << endl + << "2: vAufgabe2()" << endl + << "3: vAufgabe3()" << endl + << "4: vAufgabe4()" << endl + << "5: vAufgabe5()" << endl + << "6: vAufgabe6()" << endl + << "7: vAufgabe6a()" << endl + << "8: vAufgabe7()" << endl + << "9: vAufgabe8()" << endl + << "10: vAufgabe9()" << endl + << "11: vAufgabe9a()" << endl + << "Bitte wähen Sie eine Aufgabe: "; + cin >> iWahl; + cout << endl; + + if (iWahl > NUM_AUFGABEN || iWahl < 0) { + cerr << "Ungültige Eingabe! Bitte versuchen Sie es erneut" << endl; + goto retry; + } + + dGlobaleZeit = 0; /* resette globale Uhr */ + + try { + pAufgaben[iWahl](argc, argv); /* Funktionspointer aufrufen */ + } + catch (string &exception) { + cerr << exception << endl; + exit(-1); + } + + cout << endl << endl << "Nochmal? (0/1): "; + cin >> iWahl; + cout << endl; + + if (iWahl) { + goto retry; + } + + return 0; +}