Hi,
im folgenden poste ich 3 Klassen aus meinem kleinen Projekt des Praktikums an der Uni, welches ständig erweitert wird..
Ich bitte euch den Code einmal anzuschauen und Verbesserungsvorschläge zu posten, bzw. Stellen mit schlechtem Programmierstil aufzuzeigen.
im folgenden poste ich 3 Klassen aus meinem kleinen Projekt des Praktikums an der Uni, welches ständig erweitert wird..
Ich bitte euch den Code einmal anzuschauen und Verbesserungsvorschläge zu posten, bzw. Stellen mit schlechtem Programmierstil aufzuzeigen.
C++:
class NAVI{
private:
public:
virtual void routeberechnen() = 0;
virtual void ausgeben() = 0;
virtual string get() = 0;
virtual void adv() = 0;
virtual void reset() = 0;
virtual void ins_manuel() = 0;
virtual void ins(string x, int x_ko, int y_ko) = 0;
virtual void del() = 0;
virtual bool consist_of(string x)= 0;
virtual void write_to_binary_file() = 0;
virtual void read_from_binary_file() = 0;
virtual void read_from_textfile() = 0;
virtual void write_to_textfile() =0 ;
};
C++:
class Ort
{
private:
string name;
int x_koordinate;
int y_koordinate;
public:
Ort()
{
name="";
x_koordinate = 0;
y_koordinate = 0;
}
void set_name(string eingabe_name)
{
name=eingabe_name;
}
void set_x_koordinate(int x)
{
x_koordinate=x;
}
void set_y_koordinate(int y)
{
y_koordinate=y;
}
string get_name()
{
return name;
}
int get_x_koordinate()
{
return x_koordinate;
}
int get_y_koordinate()
{
return y_koordinate;
}
};
C++:
class deutsch : public NAVI
{
private:
struct knoten {
Ort info;
struct knoten *next;
};
struct knoten *pos; // Positionszeiger
struct knoten *pre_pos; // Vorgänger des Positionszeigers
struct knoten *anfang; // Zeiger auf den Anfang der Liste
public:
deutsch() {
pos = pre_pos = anfang = NULL; // Leere Liste
read_from_binary_file(); //vorhande Daten aus binäer Datei in die Liste laden.
}
~deutsch(){
write_to_binary_file(); //vorhanden Einträge aus der Liste in Binär datei schreiben.
}
virtual void routeberechnen()
{
cout <<"Test zur Routenberechnung"<<endl;
}
void ausgeben() { // ausgeben von Anfang bis Ende
struct knoten *p = anfang; // p zeigt auf aktuellen Knoten
cout <<endl<< "Orte: ";
while (p != NULL) {
cout << p->info.get_name()<<"["<<p->info.get_x_koordinate()<<"]"<<
"["<<p->info.get_y_koordinate()<<"]"<< " "; // Infoteil des aktuellen Knoten ausgeben
p = p->next; // p auf Folgeelement setzen
}
cout << endl;
}
string get() { // liefere aktuelles Element
return pos->info.get_name();
}
bool end() { // Ende erreicht?
return (pos == NULL);
}
void adv() { // Positionszeiger vorrücken
if (pos != NULL) {
pre_pos = pos;
pos = pos->next;
}
}
void reset() { // Positionszeiger an den Anfang setzen
pos = anfang;
pre_pos = NULL;
}
void ins_manuel() // Manuelle Eingabe des Ortes und der Koordinaten
{
string x;
int x_ko,y_ko;
cout << endl <<"Neuen Ort hinzufuegen: ";
cin >> x;
cout << endl <<"X-Koordinate eingeben: ";
cin >> x_ko;
cout << endl <<"Y-Koordinate eingeben: ";
cin >> y_ko;
if (consist_of(x)==false){
struct knoten *p = new knoten; // erzeuge neuen knoten
p->info.set_name(x);// Infowert wird x
p->info.set_x_koordinate(x_ko);
p->info.set_y_koordinate(y_ko);
p->next = pos; // next wird initialisiert mit alten P.-Zeiger
// es wird also VOR dem aktuellen Element eingefügt
if (anfang == NULL) // Leere Liste
anfang = p;
if (pre_pos != NULL) // Positionszeiger hat einen Vorgänger
pre_pos->next = p;
else // neues Element steht am Anfang
anfang = p;
pos = p; // Positionszeiger zeigt nun auf das neue Element
}
else{
cout << "Der eingegebene Ort " << x << " ist bereits vorhanden"<<endl;
}
}
void ins(string x, int x_ko, int y_ko) {
struct knoten *p = new knoten; // erzeuge neuen knoten
p->info.set_name(x);// Infowert wird x
p->info.set_x_koordinate(x_ko);
p->info.set_y_koordinate(y_ko);
p->next = pos; // next wird initialisiert mit alten P.-Zeiger
// es wird also VOR dem aktuellen Element eingefügt
if (anfang == NULL) // Leere Liste
anfang = p;
if (pre_pos != NULL) // Positionszeiger hat einen Vorgänger
pre_pos->next = p;
else // neues Element steht am Anfang
anfang = p;
pos = p; // Positionszeiger zeigt nun auf das neue Element
}
void del(){
string x;
cout <<endl<<"Geben Sie den Ortsnamen ein welcher geloescht werden soll: "<<endl;
cin >> x;
reset(); // Reset der Zeiger pos und pre_pos
struct knoten *p = anfang;// p zeigt auf aktuellen Knoten
bool status=false;
while (p != NULL) {
if (x == p->info.get_name()){ //vergleicht ob Ort bereits in der Liste ist.
if(pos!= NULL) //wenn p zeiger nicht am ende steht:
{
if (pre_pos!= NULL) // p zeiger steht nicht am anfang ( weil sonst preP auf NULL)
{
pre_pos->next =pos->next ;
}
else
anfang= pos->next; //anfang neu setzen
delete p; //löscht
cout <<"Ort geloescht"<<endl;
status=true;
if(pre_pos != NULL)
{
pos=pre_pos->next; //p zeiger steht auf ehemaligen nachfolger
}
else
pos = anfang;
break;
}
}
adv(); // Positionszeiger weiterrücken
p = p->next; // p auf Folgeelement setzen
}
reset(); // Zeiger wieder resetten
if(status==false)
cout << "Der von Ihnen eingegebene Ort ist nicht in der Liste!"<< endl;
}
bool consist_of(string x){
struct knoten *p = anfang; // p zeigt auf aktuellen Knoten
while (p != NULL) {
if(p->info.get_name() == x) //vergleicht ob Ort bereits in der Liste ist.
{
return true;
}
p = p->next; // p auf Folgeelement setzen
}
return false;
}
void write_to_binary_file()
{
struct daten
{
char test[30];
int x_ko;
int y_ko;
};
daten p_daten;
const char *x;
struct knoten *p = anfang;
ofstream binary_file;// Zieldatei (Schreiben)
binary_file.open("binaer.dat", ios::out|ios::binary); // zum Schreiben öffnen
if (!binary_file) { // Datei kann nicht geoeffnet werden
cerr << "binaer.dat" << " kann nicht geoeffnet werden!\n";
getch();
}
while (p != NULL) {
strcpy(p_daten.test, p->info.get_name().c_str());//Umwandlung String in Char
p_daten.x_ko = p->info.get_x_koordinate();
p_daten.y_ko = p->info.get_y_koordinate();
binary_file.write(reinterpret_cast<char *>(&p_daten),sizeof(daten));
p = p->next; // p auf Folgeelement setzen
}
binary_file.close();
}
void read_from_binary_file()
{
struct daten
{
char test[30];
int x_ko;
int y_ko;
};
daten p_daten;
ifstream binary_file;
binary_file.open("binaer.dat", ios::in|ios::binary);
if (!binary_file) { // Datei kann nicht geoeffnet werden
cerr << "binaer.dat" << " kann nicht geoeffnet werden!\n";
getch();
}
while (binary_file.read(reinterpret_cast<char *>(&p_daten),sizeof(daten))) {
ins(p_daten.test,p_daten.x_ko,p_daten.y_ko);
}
binary_file.close();
}
void read_from_textfile()
{
cout <<"Neue Ortsnamen werden nun eingelesen!"<<endl;
int x_ko;
int y_ko;
string line;
string token;
ifstream textfile; // Quelldatei (Lesen)
textfile.open("textfile.txt", ios::in); // zum Lesen öffnen
if (!textfile) { // Datei kann nicht geoeffnet werden
cerr << "textfile.txt" << " kann nicht geoeffnet werden!\n";
}else{
while(getline(textfile,line)){
stringstream iss;
vector<string> inhalt;
iss << line;
while(getline(iss,token,','))
{
inhalt.push_back(token);
}
iss.clear();
if (consist_of(inhalt[0])==false)
{
// String to Int
stringstream sstr(inhalt[1]);
sstr >> x_ko;
stringstream sstr2(inhalt[2]);
sstr2 >> y_ko;
ins(inhalt[0], x_ko, y_ko);
}
}
}
textfile.close();
}
void write_to_textfile()
{
cout <<"Aller Ortsnamen werden in die Textdatei geschrieben"<<endl;
struct knoten *p = anfang; // p zeigt auf aktuellen Knoten
ofstream textfile; // Zieldatei (Schreiben)
textfile.open("textfile.txt", ios::out); // zum Schreiben öffnen
if (!textfile) { // Datei kann nicht geoeffnet werden
cerr << "textfile.txt" << " kann nicht geöffnet werden!\n";
getch();
}
while (p != NULL) {
textfile << p->info.get_name()<<","<<p->info.get_x_koordinate()<<","<<p->info.get_y_koordinate()<<endl; // Infoteil des aktuellen Knoten in Datei schreiben
p = p->next; // p auf Folgeelement setzen
}
textfile.close();
}
};