Aufgabe 0
Legen Sie ein Arbeitsverzeichnis Name_Vorname.Matrikelnumer an. Legen Sie darin ein neues C++ Projekt LiwanzenVZ an.
Aufgabe 1
a) Deklarieren Sie zunächst Folgendes, und definieren Sie es danach. Region ist ein Enumerator (ndef, amer, apac, emea ), der auch Klassenmember ist. Der Einfachheit halber muss jedes Mitglied des sozialen Netzwerks LiwanzenVZ einen eindeutigen Namen habe. b) Auf der Grundlage von 1a) – aber für die Implementierung nicht unbedingt darauf beschränkt – entwickeln Sie nun die folgenden Funktionalitäten aus main :
i. Legen Sie ein geeignetes Objekt namens vL für die Speicherung von beliebig vielen LiwanzenVZ-Mitgliedern an und füllen Sie es im Quellcode über eine Supportfunktion namens populate mit sechs Mitgliedern:
Joey (amer), Johnny (amer), DeeDee (amer), Tommy (emea), Suzy (apac) und Sheena (amer).
Geben Sie mittels einer weiteren Supportfunktion namens print_LVZMembers eine komplette Liste mit allen gespeicherten Mitgliedern und ihren Details möglichst benutzerfreundlich zeilenweise aus (d.h. beispielsweise auch, dass Region nicht als Zahl erscheint).
ii. Lassen Sie den Benutzer mittels einer Supportfunktion namens add_Liwanze beliebig viele weitere Mitglieder hinzufügen, wobei jeder Name in der Liste eindeutig sein muss. Lassen Sie zur Vereinfachung keine Eingaben für die Region zu, die Sie hier immer auf ndef setzen. Die Eingabe eines bereits vorhandenen Namens wird abgelehnt, eine sinnvolle Meldung wird ausgegeben und das Programm fordert den Benutzer erneut zur Eingabe auf. Bei sonstigen Eingabefehlern werfen Sie eine Ausnahme, die zum Programmabbruch mit Fehlermeldung führt.
Nach jeder geglückten Registrierung einer neuen „Liwanze“ wird eine komplette Liste mit allen Mitgliedern und deren Details im LiwanzenVZ möglichst benutzerfreundlich ausgegeben. Durch Eingabe von q wird die Registrierung weiterer Mitglieder beendet.
Aufgabe 2
a) Erweitern Sie nun die Lösung aus Aufgabe 1 wie folgt: Die Methode connects überprüft, ob es zu der Liwanze im Zeigerargument eine direkte Verbindung (im sog. „tier one“) gibt. Die Methode connected überprüft, ob es von der Liwanze (im Zeigerargument) eine direkte Verbindung (im sog. „tier one“) gibt. Vergessen Sie nicht, ggf. auch Ihre bisherigen Programmteile anzupassen. b) Auf der Grundlage von 2a) – aber für die Implementierung nicht darauf beschränkt – entwickeln Sie Ihr Programm nun wie folgt weiter:
i. Vernetzen Sie im Quellcode die sechs ursprünglich registrierten Mitglieder über eine Supportfunktion namens init_connections wie folgt:
Lösen Sie dies mit einer Methode namens make_connection, die aus init_connections aufgerufen wird; setzen Sie make_connection auch im nächsten Aufgabenteil 2 b) ii. ein. Geben Sie durch geeignete Supportfunktionen / Methoden das Netzwerk komplett und so übersichtlich und benutzerfreundlich wie möglich aus.
ii. Lassen Sie den Benutzer das Netzwerk beliebig durch Eingabe von zwei unterschiedlichen Mitgliedernamen erweitern – es wird dann vom zuerst eingegebenen Name zu dem zweiten eingegebenen Namen eine Verbindung gewünscht. Ist mindestens einer der beiden Namen nicht registriert, wird dies mit einer sinnvollen Meldung abgefangen und erneut zur Eingabe zweier Namen aufgefordert (bei sonstigen Eingabefehlern wird eine Ausnahme geworfen, die zu einer Fehlermeldung und zum Programmabbruch führt).
Ist die Verbindung bereits vorhanden, wird eine informative Meldung angezeigt und es wird erneut zur Eingabe zweier Namen aufgefordert. Ist die Verbindung noch nicht vorhanden, wird sie erstellt, es wird eine Erfolgsmeldung ausgegeben und wiederum zur Eingabe zweier Namen aufgefordert.
Stellen Sie sicher, dass jede Verbindung konsistent unter beiden Namen entsprechend abgespeichert wird, werfen Sie bei Verletzung dieser Konsistenz unbedingt eine Ausnahme, die zu einer Fehlermeldung mit Programmabbruch führt.
Nach jeder geglückten Erweiterung wird das vollständige Tier-One-Netzwerk (d.h. alle direkten Beziehungen) des ersten Namens und des zweiten Namens, mit allen Details (einschließlich der Anzahlen der jeweils ein- und ausgehenden Beziehungen) möglichst benutzerfreundlich angezeigt.
Durch Eingabe von q wird die Erweiterung des Netzwerks (und damit das Programm) schließlich beendet.
Error.h
#ifndef ERROR_H
#define ERROR_H
#include
#include
using std::string;
using std::runtime_error;
void error (string s)
{throw runtime_error(s);}
void error (string s1, string s2)
{error(s1+s2);}
#endif /* ERROR_H */
LiwanzenVZ.cpp
#include "LiwanzenVZ.h"
using namespace std;
Liwanze::Liwanze() :
name(""), loc(ndef)
{}
Liwanze::Liwanze(string sname, Region location) :
name(sname), loc(location)
{}
string Liwanze::get_name() const
{return name;}
Liwanze::Region Liwanze::get_loc()const
{return loc;}
void Liwanze::print() const
{
cout << "Name:\t" << name << endl;
if (loc==ndef) cout << "Region:\t\t" << "Nicht definiert" << endl;
if (loc==amer) cout << "Region:\t\t" << "Americas" << endl;
if (loc==apac) cout << "Region:\t\t" << "Asia-Pacific" << endl;
if (loc==emea) cout << "Region:\t\t" << "Europe, Middle East, Africa" << endl;
}
void populate(vector& vL) {
vL.push_back(Liwanze("Joey", Liwanze::amer));
vL.push_back(Liwanze("Johnny", Liwanze::amer));
vL.push_back(Liwanze("DeeDee", Liwanze::amer));
vL.push_back(Liwanze("Tommy", Liwanze::emea));
vL.push_back(Liwanze("Suzy", Liwanze::apac));
vL.push_back(Liwanze("Sheena", Liwanze::amer));
}
void print_LVZMembers(const vector& vL)
{
for (int i = 0; i < vL.size(); i++) {
cout << i+1 << ". ";
vL[i].print();
vL[i].print_tierone();
cout << "\n";
}
}
void add_Liwanze(vector& vL, string sname)
{
if (b_check_ok(vL, sname)==true)
{vL.push_back(Liwanze(sname, Liwanze::ndef));}
else
{
while (b_check_ok(vL, sname)==false)
{
cout << "Benutzer bereits vorhanden.";
cout << "Bitte geben Sie einen gültigen Namen ein:"; cin >> sname;
}
vL.push_back(Liwanze(sname, Liwanze::ndef));
}
}
bool b_check_ok(const vector& vL, string sname)
{
for (int i=0; i {
if (vL[i].get_name()==sname){return false;}
}
return true;
}
bool Liwanze::connects(Liwanze* a) const
{
for (int i=0; iget_name()==connectsTo[i]) return true;
}
return false;
}
bool Liwanze::connected(Liwanze* a) const
{
for (int i=0; iget_name()==connectedFrom[i]) return true;
}
return false;
}
void Liwanze::print_tierone() const
{
int i=0;
int j=0;
cout << "Connects to:\t";
for (i=0; i {
if (i {cout << connectsTo[i] << ", ";}
else
{
cout << connectsTo[i];
}
}
cout << "\n";
cout << "Connected from:\t";
for (j=0; i {
if (i {cout < else
{
cout << connectedFrom[i];
}
}
cout << "\nAusgehend:" << i << endl;
cout << "Eingehend:" << j << endl;
cout << "\n"; } void Liwanze::add_connTo(Liwanze* a) { if (this->connects(a))
{
cerr << "Verbindung besteht bereits" << endl; } else { connectsTo.push_back(a->get_name());
}
}
void Liwanze::add_connFrom(Liwanze* a)
{
if (this->connected(a))
{
cerr << "Verbindung besteht bereits" << endl; } else { connectedFrom.push_back(a->get_name());
}
}
void Liwanze::make_connection(string sTo, vector& vL)
{
Liwanze* To=0;
for (int i=0; iconnects(To)==false && To->connected(this)==false)
{
this->add_connTo(To);
To->add_connFrom(this);
if (this->connects(To)==true && To->connected(this)==true)
{
cout << "Verbindung erfolgreich hergestellt.\n";
cout << "\n" << this->get_name() << " \n"; this->print_tierone();
cout << "\n" << To->get_name() << " \n"; To->print_tierone();
return;
}
else
{
error("Inkonsitente Daten");
}
}
else
{
cerr << "Verbindung besteht bereits." << endl;
return;
}
}
if (i==vL.size()-1)
{
cout << "2. Benutzer " << sTo << " konnte nicht gefunden werden. Bitte Namen erneut eingeben: \n"; cin >> sTo;
i=-1;
}
}
}
void connect_2(vector& vL)
{
string sa="<>";
string sb="<>";
cout << "\nVon Mitglied 1:"; cin >> sa;
cout << "Zu Mitglied 2:"; cin >> sb;
for (int i=0; i {
if (vL[i].get_name()==sa)
{
vL[i].make_connection(sb, vL);
return;
}
if (i==vL.size()-1)
{
cout << "1. Benutzer " << sa << " konnte nicht gefunden werden. Bitte Namen erneut eingeben: \n"; cin >> sa;
i=-1;
}
}
}
void init_connections(vector& vL)
{
for (int i=0; i {
if (vL[i].get_name()=="Joey")
{
vL[i].make_connection("Johnny", vL);
vL[i].make_connection("DeeDee", vL);
vL[i].make_connection("Suzy", vL);
vL[i].make_connection("Sheena", vL);
}
if (vL[i].get_name()=="Johnny")
{
vL[i].make_connection("Joey", vL);
vL[i].make_connection("Suzy", vL);
}
if (vL[i].get_name()=="DeeDee")
{vL[i].make_connection("Suzy", vL);}
if (vL[i].get_name()=="Tommy")
{vL[i].make_connection("Suzy", vL);}
if (vL[i].get_name()=="Sheena")
{vL[i].make_connection("Joey", vL);
}
}
}
Main.cpp
#include "error.h"
#include "LiwanzenVZ.h"
using namespace std;
int main() {
try{
string sname = "";
char cend = 'a';
vector vL;
populate(vL);
init_connections(vL);
print_LVZMembers(vL);
cout << "\n";
while (cend != 'q' && cend!='Q')
{
cout << "Möchten Sie ein neues Mitglied hinzufügen? (C) Continue, (Q) Quit." << endl; cin >> cend;
if (cend=='c' || cend=='C')
{
cout << "Name des neuen Mitglieds:"; if (cin >> sname)
{
add_Liwanze(vL, sname);
print_LVZMembers(vL);
cout << "\n";
}
}
else
{
if (cend=='q' || cend=='Q'){}
else{error("Ungültige Eingabe");}
}
}
while (1!=0)
{
cout << "\nZwei Mitglieder miteinander verbinden:";
connect_2(vL);
}
print_LVZMembers(vL);
return 0;
}
catch (exception &e)
{cerr << e.what();}
catch (...)
{cerr << "Unbekannter Fehler";}
}
LiwanzenVZ.h
#include
#include
using namespace std;
#ifndef LIWANZENVZ_H
#define LIWANZENVZ_H
class Liwanze;
void populate(vector&);
void print_LVZMembers(const vector&);
void add_Liwanze(vector&, string);
bool b_check_ok(const vector&, string);
void init_connections(vector&);
void add_2(vector&);
void connect_2(vector&);
void error (string);
void error (string, string);
class Liwanze{
public:
enum Region{ndef, amer, apac, emea};
Liwanze();
Liwanze( string, Region );
string get_name() const;
Region get_loc() const;
void print() const;
bool connects(Liwanze*) const;
bool connected(Liwanze*) const;
void print_tierone() const;
void add_connTo(Liwanze*);
void add_connFrom(Liwanze*);
void make_connection(string, vector&);
private:
string name;
Region loc;
vector connectsTo;
vector connectedFrom;
};
#endif /* LIWANZENVZ_H */