C++: Mensch

C++: Mensch

C++: Mensch

➪ C#.NET ADSI


# include "stdafx.h"
# include <iostream>
# include <fstream>
# include <string>
# include <vector>
using namespace std;
#define PRINT(s,X) (s)<<(#X)<<" = "<<(X) << endl
// Prototyping der Funktionen
void TPL( istream& s );
bool  UngueltigeEingabe( istream& s );
int menue(void);
void striche(void);
// C++ unterscheidet zwischen Interface der Klasse 
// und der Implementierung der Methoden.
// Beide werden ueblicherweise in getrennten Dateien abgelegt.
// Die Implementierung der Klasse Mensch finden Sie in der 
// Datei Mensch.cpp
// Interface der Klasse Mensch
// Die Klassenbeschreibung (Interface) der Klasse Mensch
// beginnt mit dem Schluesselwort class. Anschliessend
// definiert sie den Klassennamen, hier Mensch.
// Klassendefinition 
class Mensch
{
// Innerhalb der Klasse wird in Bereiche 
// unterschiedlicher Zugrifferechte unterschieden.
protected:
 // In diesem Bereich stehen die 
 // nicht oeffentlichen Methoden und die Attribute
 // Attribute
 string m_Nachname;
 string m_Vorname;
 int m_Alter;
 int m_ID;
 // static int m_anzahl; // Klassenvariable
 // Eine Klassenvariable bietet allen 
 // Objekten einer Klasse Zugriff auf eine einzige Variable
public: 
 // In diesem Bereich stehen die Methoden, 
 //die von aussen erreichbar sein sollen
 // Standardkonstruktor
 Mensch();
 // Destruktor
 ~Mensch();
 // Parametrisierter Konstruktor
 Mensch(string, string, int, int);
 // Kopierkonstruktor
 Mensch(const Mensch&);
 // fuer jedes Attribut wird eine 
 // Schreib- und Lesemethode angelegt
 // Lesemethode fuer Attribut Nachname
 const string& Nachname(void) const; 
 // Schreibmethode fuer Attribut Nachname
 string& Nachname(void); 
 // Lesemethode fuer Attribut Vorname
 const string& Vorname(void) const; 
 // Schreibmethode fuer Attribut Vorname
 string& Vorname(void); 
 // Lesemethode fuer Attribut Alter
 const int& Alter(void) const; 
 // Schreibmethode fuer Attribut Alter
 int& Alter(void); 
 // Lesemethode fuer Attribut ID
 const int& ID(void) const; 
 // Schreibmethode fuer Attribut ID
 int& ID(void); 
 string toString();
 //static int get_Anzahl(void); //Klassenmethode
 //static void add_Anzahl(void);//Klassenmethode
};
// Im naechsten Schritt wird ein Vektor der 
// Klasse Mensch erzeugt, also ein "Behaelter", 
// in den mehrere Objekte vom Typ Mensch verwaltet 
// werden koennen. 
typedef vector<Mensch> Mensch_klasse_vector;
class STK_MAIN
{
public:
 void Mensch_erfassen(Mensch_klasse_vector&);
 void Mensch_ausgeben(Mensch_klasse_vector&);
 void Mensch_bearbeiten(Mensch_klasse_vector&);
 void Mensch_in_Datei_speichern(Mensch_klasse_vector&);
 void Mensch_in_CSV_Datei_speichern(Mensch_klasse_vector&);
 void Mensch_in_XML_Datei_speichern(Mensch_klasse_vector&);
 void Mensch_aus_Datei_lesen(Mensch_klasse_vector&);
 void Mensch_aus_CSV_Datei_lesen(Mensch_klasse_vector&);
};
void TPL( istream& s )
{
 s.clear();
 while( s.rdbuf()->in_avail() ) 
 s.rdbuf()->sbumpc();
}
bool UngueltigeEingabe( istream& s )
{
 return( s.rdbuf()->in_avail() > 1 );
}
// Autor  : Wilfried Grupe
// Datum  : 29.04.2018
// email  : wg@wilfried-grupe.de
// www.wilfried-grupe.de
Mensch::Mensch()
{
 //cout << "Aufruf Standardkonstruktor Mensch::Mensch()"<<endl;
}
Mensch::~Mensch()
{
 //cout << "Aufruf Destruktor Mensch::~Mensch()"<<endl;
}
Mensch::Mensch(string Nachname, string Vorname, int Alter, int ID)
{
 //cout << "Aufruf parametrisierter Konstruktor Mensch::Mensch( - Parameter - )"<<endl;
 m_Nachname = Nachname; 
 m_Vorname = Vorname; 
 m_Alter = Alter; 
 m_ID = ID; 
}
Mensch::Mensch(const Mensch& wg)
{
 // cout << "Aufruf Copykonstruktor Mensch::Mensch(const Mensch& wg)"<<endl;
 m_Nachname = wg.Nachname(); 
 // strcpy(m_Nachname, wg.m_Nachname); 
 m_Vorname = wg.Vorname(); 
 // strcpy(m_Vorname, wg.m_Vorname); 
 m_Alter = wg.Alter(); 
 m_ID = wg.ID(); 
}
const string& Mensch::Nachname(void) const 
{
 cout << "Aufruf const string& Mensch::Nachname(void) const"<<endl;
 return m_Nachname;
}
string& Mensch::Nachname(void)
{
 cout << "Aufruf string& Mensch::Nachname(void)"<<endl;
 return m_Nachname;
}
const string& Mensch::Vorname(void) const 
{
 // cout << "Aufruf const string& Mensch::Vorname(void) const"<<endl;
 return m_Vorname;
}
string& Mensch::Vorname(void)
{
 // cout << "Aufruf string& Mensch::Vorname(void)"<<endl;
 return m_Vorname;
}
const int& Mensch::Alter(void) const 
{
 // cout << "Aufruf const int& Mensch::Alter(void) const"<<endl;
 return m_Alter;
}
int& Mensch::Alter(void)
{
 // cout << "Aufruf int& Mensch::Alter(void)"<<endl;
 return m_Alter;
}
const int& Mensch::ID(void) const 
{
 // cout << "Aufruf const int& Mensch::ID(void) const"<<endl;
 return m_ID;
}
int& Mensch::ID(void)
{
 // cout << "Aufruf int& Mensch::ID(void)"<<endl;
 return m_ID;
}
string Mensch::toString()
{
 std::stringstream ss;
 ss << this->ID() << ": " << this->Vorname() << " " << this->Nachname() << " ist " << this->Alter() << " Jahre alt";
 return ss.str();
}
// Klassenmethoden
// int Mensch::m_anzahl; // Standard-Initialisierung Klassenvariable mit 0
// void Mensch::add_Anzahl()
// {
// m_anzahl++;
// }
// int Mensch::get_Anzahl()
// {
// return m_anzahl;
// }
void striche()
{
 cout << endl << "\t";
 for (int i = 0; i<50; i++) cout << "-";
 cout << endl << endl;
}
int menue()
{ 
 int taste; 
 striche();
 cout << "\tKLASSE: Mensch" << endl;
 cout << "\tNeuen Wert eingeben          : < 1 >" << endl;
 cout << "\tIn Datei speichern           : < 2 >" << endl;
 cout << "\tWerte lesen + ausgeben       : < 3 >" << endl;
 cout << "\tWert bearbeiten              : < 4 >" << endl; 
 cout << "\tProgramm beenden             : < 0 >" << endl; 
 striche();
 TPL(cin); 
 cin >> taste;
 taste = (int)toupper(taste);
 return(taste);
}
void STK_MAIN::Mensch_erfassen(Mensch_klasse_vector& mvo)
{
 Mensch Mensch_erf;
 string Nachname_erf;
 string Vorname_erf;
 int Alter_erf;
 int ID_erf;
 //Korrigieren Sie die Eingabemethoden ggf ueber die Funktion UngueltigeEingabe(cin)
 cout << "Bitte eingeben-> string Nachname: ";
 TPL(cin); 
 cin >> Nachname_erf;
 while(UngueltigeEingabe(cin))
 {
  cerr << "Falsche Eingabe, nochmal: " << endl;
  cout << "Bitte eingeben-> string Nachname: ";
  TPL(cin); 
  cin >> Nachname_erf;
 }
 Mensch_erf.Nachname() = Nachname_erf;
 cout << "Bitte eingeben-> string Vorname: ";
 TPL(cin); 
 cin >> Vorname_erf;
 while(UngueltigeEingabe(cin))
 {
  cerr << "Falsche Eingabe, nochmal: " << endl;
  cout << "Bitte eingeben-> string Vorname: ";
  TPL(cin); 
  cin >> Vorname_erf;
 }
 Mensch_erf.Vorname() = Vorname_erf;
 cout << "Bitte eingeben-> int Alter: ";
 TPL(cin); 
 cin >> Alter_erf;
 while(UngueltigeEingabe(cin))
 {
  cerr << "Falsche Eingabe, nochmal: " << endl;
  cout << "Bitte eingeben-> int Alter: ";
  TPL(cin); 
  cin >> Alter_erf;
 }
 Mensch_erf.Alter() = Alter_erf;
 cout << "Bitte eingeben-> int ID: ";
 TPL(cin); 
 cin >> ID_erf;
 while(UngueltigeEingabe(cin))
 {
  cerr << "Falsche Eingabe, nochmal: " << endl;
  cout << "Bitte eingeben-> int ID: ";
  TPL(cin); 
  cin >> ID_erf;
 }
 Mensch_erf.ID() = ID_erf;
 mvo.push_back(Mensch_erf);
}
void STK_MAIN::Mensch_ausgeben(Mensch_klasse_vector & mvo)
{
 unsigned int i;
 int len_Nachname = 0;
 int len_Vorname = 0;
 for(i = 0; i < mvo.size(); i++)
 {
  if(mvo[i].Nachname().length() > len_Nachname)
   len_Nachname = mvo[i].Nachname().length();
  if(mvo[i].Vorname().length() > len_Vorname)
   len_Vorname = mvo[i].Vorname().length();
 }
 len_Nachname = len_Nachname + 2;
 len_Vorname = len_Vorname + 2;
 for(i = 0; i < mvo.size(); i++)
 {  
  cout << i << "\t"
   << mvo[i].ID() << "\t"
   << setw(len_Nachname) << left
   << mvo[i].Nachname() << "   "
   << setw(len_Vorname) << left
   << mvo[i].Vorname() << "   ";
  cout <<mvo[i].Alter() << endl;
 }
 _getch();
}
void STK_MAIN::Mensch_bearbeiten(Mensch_klasse_vector& mvo)
{
 string Nachname_erf;
 string Vorname_erf;
 int Alter_erf;
 int ID_erf;
 unsigned int index = 0;
 Mensch_ausgeben(mvo);
 cout << "Welcher Datensatz soll bearbeitet werden? <index>" ;
 TPL(cin); cin >> index;
 cout << "Bitte eingeben-> string Nachname: ";
 TPL(cin); cin >> Nachname_erf;
 mvo[index].Nachname() = Nachname_erf;
 cout << "Bitte eingeben-> string Vorname: ";
 TPL(cin); cin >> Vorname_erf;
 mvo[index].Vorname() = Vorname_erf;
 cout << "Bitte eingeben-> int Alter: ";
 TPL(cin); cin >> Alter_erf;
 mvo[index].Alter() = Alter_erf;
 cout << "Bitte eingeben-> int ID: ";
 TPL(cin); cin >> ID_erf;
 mvo[index].ID() = ID_erf;
}//Ende Datei bearbeiten
void STK_MAIN::Mensch_in_Datei_speichern(Mensch_klasse_vector& mvo)
{
 string datei = "Mensch.dat";
 ofstream ofl(datei.c_str());
 if(! ofl)
 {
  cerr << "Fehler beim Dateischreiben: " << datei << endl;
  exit(1);
 }
 for (unsigned int i=0; i<mvo.size(); i++)
 {
  ofl <<mvo[i].Nachname() << " "   
   <<mvo[i].Vorname() << " "   
   <<mvo[i].Alter() << " "   
   <<mvo[i].ID() << " ";
 }
 ofl << "EOF ";
 ofl.close();
}
void STK_MAIN::Mensch_in_CSV_Datei_speichern(Mensch_klasse_vector& mvo)
{
 string datei = "Mensch.csv";
 ofstream ofl(datei.c_str());
 if (!ofl)
 {
  cerr << "Fehler beim Dateischreiben: " << datei << endl;
  exit(1);
 }
 // Schreibe Headerzeile
 ofl << "Nachname;Vorname;Alter;ID" << endl;
 for (unsigned int i = 0; i<mvo.size(); i++)
 {
  ofl << mvo[i].Nachname() << ";" 
   << mvo[i].Vorname() << ";" 
   << mvo[i].Alter() << ";" 
   << mvo[i].ID() << endl;
  // nach der letzten Zeile wird hier noch ein Zeilenumbruch eingefuegt
 }
 ofl.close();
}
void STK_MAIN::Mensch_in_XML_Datei_speichern(Mensch_klasse_vector& mvo)
{
 string datei = "Mensch.xml";
 ofstream ofl(datei.c_str());
 if (!ofl)
 {
  cerr << "Fehler beim Dateischreiben: " << datei << endl;
  exit(1);
 }
 ofl << "<Menschen>";
 for (unsigned int i = 0; i<mvo.size(); i++)
 {
  ofl <<"<Mensch><Nachname>"<< mvo[i].Nachname() 
   << "</Nachname><Vorname>" << mvo[i].Vorname() 
   << "</Vorname><Alter>" << mvo[i].Alter() 
   << "</Alter><ID>" << mvo[i].ID() 
   << "</ID></Mensch>";
 }
 ofl << "</Menschen>" << endl;
 ofl.close();
}
void STK_MAIN::Mensch_aus_Datei_lesen(Mensch_klasse_vector& mvo)
{
 string Nachname_erf;
 string Vorname_erf;
 int Alter_erf;
 int ID_erf;
 Mensch Mensch_erf;
 string datei = "Mensch.dat";
 ifstream ifl(datei.c_str());
 if(! ifl)
 {
  cerr << "Fehler beim Oeffnen der Datei: " << datei << endl;
  exit(1);
 }
 //ersten Wert lesen
 do
 {
  ifl >> Nachname_erf;
 }while(ifl.get() != ' ');
 //alle weiteren Werte lesen
 do
 {
  do
  {
   ifl >> Vorname_erf;
  }while(ifl.get() != ' '); 
  do
  {
   ifl >> Alter_erf;
  }while(ifl.get() != ' '); 
  do
  {
   ifl >> ID_erf;
  }while(ifl.get() != ' '); 
  Mensch_erf.Nachname() = Nachname_erf;
  Mensch_erf.Vorname() = Vorname_erf;
  Mensch_erf.Alter() = Alter_erf;
  Mensch_erf.ID() = ID_erf;
  mvo.push_back(Mensch_erf);
  do
  {
   ifl >> Nachname_erf;
  }while(ifl.get() != ' ');
 }while(Nachname_erf != "EOF");
 // Datei schliessen 
 ifl.close();
}
void STK_MAIN::Mensch_aus_CSV_Datei_lesen(Mensch_klasse_vector& mvo)
{ 
 string Nachname_erf;
 string Vorname_erf;
 int Alter_erf;
 int ID_erf;
 string sAlter, sID;
 string zeile;
 Mensch Mensch_erf;
 string datei = "Mensch.csv";
 ifstream ifl(datei.c_str());
 if (!ifl)
 {
  cerr << "Fehler beim Oeffnen der Datei: " << datei << endl;
  exit(1);
 }
 //erste Zeile lesen, verwerfen
 do
 {
  ifl >> zeile;
 } while (ifl.get() != '\n');
 //cout << zeile << endl;
 do
 {  
  getline(ifl, Nachname_erf, ';');
  getline(ifl, Vorname_erf, ';');
  getline(ifl, sAlter, ';'); 
  getline(ifl, sID, '\n'); 
  // Konvertierung von String in Integer mit stoi
  ID_erf = std::stoi(sID);
  Alter_erf = std::stoi(sAlter);
  Mensch_erf.Nachname() = Nachname_erf;
  Mensch_erf.Vorname() = Vorname_erf;
  Mensch_erf.Alter() = Alter_erf;
  Mensch_erf.ID() = ID_erf;
  //cout << "Nach Zuweisung: " << Mensch_erf.toString() << endl;
  // Durch den Zeilenumbruch in der letzten Zeile der CSV-Datei
  // wird die jeweils letzte Zeile fehlerhaft eingelesen:
  // Nachname_erf length()=0, dadurch wird das zuletzt eingelesene Objekt 
  // auch fehlerhaft in den Vector eingefügt
  if ((Nachname_erf.length() > 0) && (Vorname_erf.length() > 0) && (sAlter.length() > 0) && (sID.length() > 0))
  {
   //cout << "\nNachname_erf.length(): gelesen: " << Mensch_erf.toString() << endl;
   mvo.push_back(Mensch_erf);
   //cout << "In den Vector eingefuegt" << endl;
  }  
 } while (!ifl.eof());
 cout << "Datei gelesen, wird geschlossen" << endl;
 ifl.close();
}
int main(void)
{
 STK_MAIN s;
 char dto = 'J';
 int wahl; 
 Mensch_klasse_vector Mensch_wg;
 while (dto == 'J'){
  wahl = menue();
  if(wahl == 0) dto = 'X';
  switch(wahl) {
   case 1: s.Mensch_erfassen(Mensch_wg); break;
   case 2: 
    s.Mensch_in_Datei_speichern(Mensch_wg); 
    s.Mensch_in_CSV_Datei_speichern(Mensch_wg);
    s.Mensch_in_XML_Datei_speichern(Mensch_wg);
    break;
   case 3: Mensch_wg.clear();
     s.Mensch_aus_Datei_lesen(Mensch_wg); 
     s.Mensch_ausgeben(Mensch_wg);
     cout << "Daten aus CSV neu einlesen, erneute Ausgabe" << endl;
     Mensch_wg.clear();
     s.Mensch_aus_CSV_Datei_lesen(Mensch_wg);
     s.Mensch_ausgeben(Mensch_wg);
     break;
   case 4: s.Mensch_bearbeiten(Mensch_wg); break;
   default:  
     Mensch_wg.clear();
     cout << "Alle Vektoren geloescht " << endl;
     cout << "... ciao!" << endl;
  }//Ende switch
 }//Ende while
 return 0;
}

wg / 30. April 2018



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/cpp_Mensch.html