R
Die Sache mit dem Parser hört sich sehr kompliziert an. Ich habe schon versucht mir über google ein Bild, über die Umsetzung eines solchen Parsers, zu verschaffen, bin aber noch nicht schlauer geworden.
Habe mich aber auch nur kurz damit beschäftigt, da ich zuerst mein Programm fertig bekommen wollte. Wie der Zufall es wollte, bekam ich das Buch "C++ von A bis Z" von meinem Vater geschenkt. Nach 200Seiten kam ich dann auf ein Beispielprojekt, in welchem dargestellt wurde, wie man solche Listen, anhand von Strukturen, verwirklicht.
Den Quellcode bin ich dann so lange durchgegangen bis ich alles verstanden habe. Dann habe ich mein Programm einfach mal komplett neu geschrieben und mein, neu erworbenes, wissen mit eingebracht.
Das Ergebnis ist folgendes:
#pragma once
#include <string>
// Neue Klasse vom Typ Personen
class Personen{
private:
std::string vName, nName;
std::string gebDat;
std::string strasse; int hausNr;
std::string stadt; int plz;
int vorwahl, rufNr;
public:
//Deklaration eines Zeigers, welcher auf das nächste Objekt der Liste zeigt
Personen* next;
//Methoden-Deklaration
Personen();
~Personen(void);
void ausgabe(void);
bool vergleich(std::string vorName, std::string nachName);
};
/* Personen.cpp */
#include "Personen.h"
#include <iostream>
using namespace std;
//Methoden-Definition des Konstruktors
//Der Konstruktor wird zum anlegen neuer Objekte verwendet
Personen::Personen(){
cout << "Vorname: ";
cin >> this->vName;
cin.ignore();
cout << "Nachname: ";
cin >> this->nName;
cin.ignore();
cout << "Geburtstadum (dd.mm.yyyy): ";
cin >> this->gebDat;
cin.ignore();
cout << "Strasse: ";
cin >> this->strasse;
cin.ignore();
cout << "Hausnr.: ";
cin >> this->hausNr;
cin.ignore();
cout << "Stadt: ";
cin >> this->stadt;
cin.ignore();
cout << "Postleitzahl: ";
cin >> this->plz;
cin.ignore();
cout << "Vorwahl: ";
cin >> this->vorwahl;
cin.ignore();
cout << "Rufnr.: ";
cin >> this->rufNr;
cin.ignore();
next = 0;
}
//Methoden-Definiton des Dekonstruktors
//Der Dekonstruktor wird zum entfernen bestehender Objekte verwendet
Personen::~Personen(void){
}
void Personen::ausgabe(void){
cout << "Vorname:\t" << this->vName << endl;
cout << "Nachname:\t" << this->nName << endl;
cout << "Geburtsdatum:\t" << this->gebDat << endl;
cout << "Strasse:\t" << this->strasse << endl;
cout << "Hausnr.:\t" << this->hausNr << endl;
cout << "Stadt:\t\t" << this->stadt << endl;
cout << "Postleitzahl:\t" << this->plz << endl;
cout << "Rufnummer:\t" << this->vorwahl << "//" << this->rufNr << endl;
}
bool Personen::vergleich(string vorName, string nachName){
if(vorName == this->vName && nachName == this->nName)
return true;
else
return false;
}
/* main.cpp */
#include "Personen.h"
#include <iostream>
using namespace std;
//Funktions-Prototypen
Personen* newPerson(Personen* anfang);
Personen* delPerson(Personen* anfang);
void showPerson(Personen* anfang);
int main(void){
Personen* anfang = 0; //Anfang (Anker) der Liste
int auswahl;
do{
cout << "1 - Neuen Eintrag erstellen" << endl;
cout << "2 - Bestehenden Eintrag entfernen" << endl;
cout << "3 - Bestehende Eintraege auflisten" << endl;
cout << "4 - Programm beenden" << endl;
cout << "Ihre Auswahl: ";
cin >> auswahl;
switch(auswahl){
case 1:
anfang = newPerson(anfang);
break;
case 2:
anfang = delPerson(anfang);
break;
case 3:
showPerson(anfang);
break;
case 4:
break;
default:
cout << "Falsche Eingabe!" << endl;
}
}while(auswahl != 4);
return 0;
}
Personen* newPerson(Personen* anfang){
Personen* node = 0;
//Es ist noch kein Objekt in der Liste,
//also wird das erste Objekt angelegt
if(anfang == 0){
anfang = new Personen;
return anfang;
}
//Es sind schon Objekte in der Liste vorhanden,
//also wird das neue Objekt hinten angehängt
else{
Personen* newNode = 0;
node = anfang;
while(node->next != 0)
node=node->next;
newNode = new Personen;
node->next = newNode;
delete delNode;
return anfang;
}
}
Personen* delPerson(Personen* anfang){
string vName, nName;
cout << "Bitte den Vornamen der zu loeschenden Person eingeben: ";
cin >> vName;
cin.ignore();
cout << "Bitte den Nachnamen der zu loeschenden Person eingeben: ";
cin >> nName;
cin.ignore();
if(anfang == 0){
cout << "Die Liste ist leer" << endl;
return anfang;
}
//Wenn das erste Objekt gesucht wird:
if(anfang->vergleich(vName, nName)){
Personen* delNode = anfang;
if(anfang->next != 0)
anfang = anfang->next;
delete delNode;
}
//Die komplette Liste durchsuchen
else{
Personen* delNode;
Personen* node = anfang;
//Die Liste durcharbeiten so langeder Folgeeintrag, des gesuchten Objektes,
//!= 0 ist oder eine Übereinstimmung mit der Eingabe gefunden wurde
while(node->next != 0 && !(node->next->vergleich(vName, nName)))
node = node->next;
if(node->next == 0)
cout << "Diese Person existiert nicht" << endl;
else{
//Das zu löschende Element an delNode geben
delNode = node->next;
//Das Folgeobjekt in bufNode zwischenspeichern
Personen* bufNode = delNode->next;
//Das Folgeobjekt and das voherige Objekt geben (???)
node->next = bufNode;
}
}
return anfang;
}
void showPerson(Personen* node){
if(node == 0){
cout << "Die Liste ist leer" << endl;
}
else{
cout << "1." << endl;
node->ausgabe();
for(int i = 0; node->next != 0; i++){
node = node->next;
cout << i+2 << "." << endl;
node->ausgabe();
}
}
}
Sollte etwas unsauber programmiert sein, sollten Kommentare fehlen oder gar falsch sein (dann habe ich etwas falsch verstanden) wäre es schön, wenn ihr mich drauf aufmerksam machen könntet. Verbesserungsvorschläge nehme ich immer gern und danked an
MfG
RisH