# C++ Adressbuch



## simple3 (19. September 2012)

Hallo zusammen
Ich habe mich an einem c++ adressbuch versucht. ich hab von einem Kollegen ne aufgabenstellung bekommen um ein studentenadressbuch zu entwerfen.. ich arbeite mit visual studios c++ die aufgabe war: 



> Die Aufgabe ist, eine Studierendenverwaltung zu implementieren. Als
> Entwicklungsumgebung soll Microsoft Visual Studio 2010 Express (für C++ )
> verwendet werden. Wir gehen von einer maximalen Anzahl von 2000 Studierenden
> aus. Für jeden Studierenden sollen die folgenden Daten soweit es geht erfasst
> ...



jetzt habe ich angefangen und das ganze erstmal mit 4 einzuschleusenden sachen versucht...und das ist bei mir raus gekommen


```
#include <iostream>
#include <algorithm>
#include <string>
#include <fstream>
#include <vector>
using namespace std;


struct Adresse
{
    string strasse;
    string hausnummer;
    string postleitzahl;
    string wohnort;
};


ostream& operator<<(ostream& out, Adresse a)
{
    out << a.strasse      << ' ';
    out << a.hausnummer   << ' ';
    out << a.postleitzahl << ' ';
    out << a.wohnort      << ' ';
    return out;
}


istream& operator>>(istream& in, Adresse& a)
{
    in >> a.strasse;
    in >> a.hausnummer;
    in >> a.postleitzahl;
    in >> a.wohnort;
    return in;
}


void ausgabe_tabelle(ostream& out, const vector<Adresse>& datenbank)
{
    for(vector<Adresse>::const_iterator it=datenbank.begin(); it!=datenbank.end(); ++it)
        out << *it << endl;
}


void lade_datenbank(vector<Adresse>& datenbank)
{
    ifstream file("db.txt");
    if( file.is_open() )
    {
        for(Adresse a; file>>a; datenbank.push_back(a));
    }
}


void speichere_datenbank(const vector<Adresse>& datenbank)
{
    ofstream file("db.txt");
    if( file.is_open() )
    {
        ausgabe_tabelle(file, datenbank);
    }
}


struct suche_datensatz_praedikat
{
    string suche;
    suche_datensatz_praedikat(const string& suche) : suche(suche) {}
    bool operator()(const Adresse& a) const
    {
        if( a.hausnummer==suche || a.postleitzahl==suche || a.strasse==suche || a.wohnort==suche )
            return true;
        return false;
    }
};
vector<Adresse>::const_iterator suche_datensatz(const vector<Adresse>& datenbank)
{
    cout << endl << "Suchwort: ";
    string suchwort;
    cin >> suchwort;
    return find_if( datenbank.begin(), datenbank.end(), suche_datensatz_praedikat(suchwort) );
}


int main()
{
    vector<Adresse> datenbank;
    lade_datenbank(datenbank);

    char eingabe;
    do
    {
        cout << "Daten auf Bildschirm ausgeben (1)" << '\n';
        cout << "Datensatz eingeben            (2)" << '\n';
        cout << "Datensatz suchen              (4)" << '\n';
        cout << "Datensatz löschen             (6)" << '\n';
        cout << "Programm beenden              (0)" << '\n';
        cout << "Ihre Eingabe: ";
        cin >> eingabe;

        switch( eingabe )
        {
            case '1':
            {
                ausgabe_tabelle(cout,datenbank);
                break;
            }
            case '2':
            {
                Adresse a;
                cin >> a;
                datenbank.push_back(a);
                break;
            }
            case '4':
            {
                vector<Adresse>::const_iterator it = suche_datensatz(datenbank);
                if( it!=datenbank.end() )
                {
                    cout << endl << *it;
                }
                else
                {
                    cout << "Kein Treffer!";
                }
                break;
            }
            case '6':
            {
                vector<Adresse>::const_iterator it = suche_datensatz(datenbank);
                datenbank.erase(it);
                break;
            }
            case '0':
            {
                speichere_datenbank(datenbank);
                break;
            }
        }
    }while( eingabe!='0' );
}
```

1. hab ich die aufgabe jetzt richtig verstanden und das so gut gelöst? 
2. wie kann ich bei der plz auf 5 ziffern beschränken?
3. bei dem datensatz eingeben.. verwende ich cin >> a .... wo in meinem code wird a deklariert?
4. die obersten drei befehler verstehe ich nicht ganz mit dem struct mit dem i und o stream...
ps. man merkt vllt das den code den ich mir zusammen gesucht habe, selbst noch nciht ganz verstehe


----------



## sheel (19. September 2012)

Hi und Willkommen bei tutorials.de,

KO-Kriterium 1:
Bist du dir ganz wirklich sicher, dass das in C++ programmiert werden soll?
In der Aufgabenstellung ist die Rede von structs, fscanf...
das klingt sehr nach C.

Mit "Visual Studio für C++" kann man genau so gut C programmieren.
Das allein sagt nichts aus.


----------



## simple3 (19. September 2012)

hallo
ja ich denke c++, da er immer von c++ geredet hat und oben in der beschreibung ja vusial studios express (für c++) steht wir haben immer mit printf und scanf gearbeitet aber seid dem ich anfange mir das selbst beizubringen verwende ich cout und cin ... erlich gesagt kenn ich nicht mal die unterschiede...


----------



## simple3 (19. September 2012)

hallo ich glaube ich bin etwas weiter... kann sich das mal einer durch sehen, weil irgendwie will das nicht so richtig

```
#include <iostream>
#include <algorithm>
#include <string>
#include <fstream>
#include <vector>
using namespace std;

struct Matrikelnummer       //einen strukt pro absatz in der datenbank
{
	string nummer;
};

struct Name
{
	string Vorname;
	string Nachname;
};

struct Adresse
{
    	string strasse;
   	string hausnummer;
    	string postleitzahl;
    	string wohnort;
};

struct Telefon
{
	string Telefonnummer;
	string Handynummer;
};

struct E-Mail
{
	string Mail;
};

struct Studiengang
{
	string Fachgebieht;
	string studienstart;
};

struct Praxispartner
{
	string Firma;
	string Firmenstraße;
	string Firmenhausnummer;
	string Firmenplz;
	string Firmenort;
	string Ansprechpartner;
	string Ansprechpartnernummer;
	string Ansprechpartnernummer2;
	string Ansprechpartnere-mail;
};

void ausgabe_tabelle(ostream& out, const vector<Adresse>& datenbank)
{
    for(vector<Adresse>::const_iterator it=datenbank.begin(); it!=datenbank.end(); ++it)
        out << *it << endl;
}


void lade_datenbank(vector<Adresse>& datenbank)
{
    ifstream file("db.txt");
    if( file.is_open() )
    {
        for(Adresse a; file>>a; datenbank.push_back(a));     //hier wird jetzt nur das a aufgeführt, aber das ist ja nciht mehr richtig oder?
    }
}


void speichere_datenbank(const vector<Adresse>& datenbank)
{
    ofstream file("db.txt");
    if( file.is_open() )
    {
        ausgabe_tabelle(file, datenbank);
    }
}


struct suche_datensatz_praedikat
{
    string suche;
    suche_datensatz_praedikat(const string& suche) : suche(suche) {}
    bool operator()(const Adresse& a) const                                   // genau wie hier, wird auch nur das a aufgeführt
    {
        if( d.Vorname==suche || d.Nachname==suche || h.Firma==suche || c.Martrikelnummer==suche)
            return true;
        return false;
    }
};
vector<Adresse>::const_iterator suche_datensatz(const vector<Adresse>& datenbank)
{
    cout << endl << "Suchwort: ";
    string suchwort;
    cin >> suchwort;
    return find_if( datenbank.begin(), datenbank.end(), suche_datensatz_praedikat(suchwort) );
}

void einlesen_daten ()                    //funktion mit leeren klammern richtig?
{
		cout << "Martrikelnummer:";
                cin >> c.nummer;

		cout << "Vorname:";
               	cin >> d.Vorname;
		cout << "Nachname:";
                cin >> d.Nachname;

		cout << "strasse:";
                cin >> a.strasse;
		cout << "hausnummer:";
               	cin >> a.hausnummer;
		cout << "postleitzahl:";
                cin >> b.postleitzahl;
		cout << "wohnort:";
                cin >> a.wohnort;

		cout << "Telefonummer:";
                cin >> e.telefonummer;
		cout << "Handynummer:";
		cin >> e.Handynummer;

		cout << "E-mail:";
               	cin >> f.mail;

		cout << "Fachgebiet:";
                cin >> g.Fachgebiet;
		cout << "Studienstart:";
                cin >> g.Studienstart;

		cout << "Firma:";
                cin >> h.Firma;
		cout << "Firmenstraße:";
               	cin >> h.Firmenstraße;
		cout << "Firmenhausnummer:";
                cin >> h.Firmenhausnummer;
		cout << "Firmenplz:";
                cin >> h.Firmenplz;
		cout << "Firmenort:";
                cin >> h.Firmenort;
		cout << "Ansprechpartner:";
               	cin >> h.Ansprechpartner;
		cout << "Ansprechpartnernummer:";
                cin >> h.Ansprechpartnernummer;
		cout << "Ansprechpartnernummer2:";
                cin >> h.Ansprechpartnernummer2;
		cout << "Ansprechpartnere-mail:";
                cin >> h.Ansprechpartnere-mail;





}

int main()
{
    vector<Adresse> datenbank;
    lade_datenbank(datenbank);

    char eingabe;
    do
    {
        cout << "Daten auf Bildschirm ausgeben (1)" << '\n';
        cout << "Datensatz eingeben            (2)" << '\n';
        cout << "Datensatz suchen              (4)" << '\n';
        cout << "Datensatz löschen             (6)" << '\n';
        cout << "Programm beenden              (0)" << '\n';
        cout << "Ihre Eingabe: ";
        cin >> eingabe;

        switch( eingabe )
        {
            case '1':
            {
                ausgabe_tabelle(cout,datenbank);
                break;
            }
            case '2':
            {
		Martrikelnummer c[5];
		Name d;
		Adresse a;
		Adresse b[5];
		Telefon e;
		E-mail f;
		Studiengang g;
		Praxispartner h;
		void einlesen_daten ();
                datenbank.push_back(a);
                datenbank.push_back(b);
                datenbank.push_back(c);     //macht man das so?
                datenbank.push_back(d);
                datenbank.push_back(e);
                datenbank.push_back(f);
                datenbank.push_back(g);
                datenbank.push_back(h);
                break;
            }
            case '4':
            {
                vector<Adresse>::const_iterator it = suche_datensatz(datenbank);
                if( it!=datenbank.end() )
                {
                    cout << endl << *it;
                }
                else
                {
                    cout << "Kein Treffer!";
                }
                break;
            }
            case '6':
            {
                vector<Adresse>::const_iterator it = suche_datensatz(datenbank);
                datenbank.erase(it);
                break;
            }
            case '0':
            {
                speichere_datenbank(datenbank);
                break;
            }
        }
    }while( eingabe!='0' );
}
```


----------



## sheel (19. September 2012)

Der Unterschied zwischen C und C++?
a) es sind verschiedene Sprachen
...
...


Zu den Fragen im ersten Beitrag:

1) Also mal angenommen, es soll C++ sein; auf die Schnelle drübergeschaut (neuer Code):
*An Objektorienterung&Codestil könnte man noch mehr rausholen.
*Kannst du das kompilieren?

2) zB. nach der Eingabe die Stringlänge prüfen und ggf. "Ungültig" sagen.

3) (alter Code) Das "Adresse a" hier ist die Deklaration:

```
ostream& operator<<(ostream& out, Adresse a)
```

4) Damit bewirkst du, dass cin und cout bei << und >> Adressen umgehen können,
nicht nur mit den normalen int/float/string...
Und wie eine Adresse zu behandeln ist steht dann eben in der Funktion.


Zu den Kommentaren im neuen Code:

"einen strukt pro absatz in der datenbank":
Du hast keine Datenbank, auch nichts Ähnliches.
Eine Datenbank hat auch keine Absätze.

"nur das a aufgeführt":
Was ist aufführen? Warum a? ...

Eine Funktion mit leeren () ist nichts grundsätzlich Falsches.
Die Variablen a bis h drin gibts allerdings nicht.


----------



## simple3 (20. September 2012)

sheel hat gesagt.:


> 2) zB. nach der Eingabe die Stringlänge prüfen und ggf. "Ungültig" sagen.


wie mach ich das?

und wie könnte ich die anzahl der datensätze auf 2000 begrenzen... danach wär mein programm fertig


----------



## sheel (20. September 2012)

@Stringlänge:

```
while(meinstring.length() > 5)
{
    count << "Zu lang";
    cin >> meinstring;
}
```


@2000-Grenze:
Auch so. Mit einem _if_.

@Programm fertig: Naaaja.


> Kannst du das kompilieren?


----------



## simple3 (20. September 2012)

jetzt sag mir nochmal schnell was du mit kompilieren meinst ? .. ich bastel nachher mal die grenzen in den code und stell den hier nochmal rein .. nach meine gefühl ist der sehr unsauber, aber besser kann ich es nicht^^

jetzt weiß ich aber gar nicht wo ich die schleife rein machen soll? da wo ich die structs deklariere ? da wo ich die punkt strings abfrage (cin >> a.beispiel) oder da wo ich die variablen deklariere ( adresse a; )?


----------



## sheel (20. September 2012)

:suspekt:
Du weißt nicht, wie man das Programm kompiliert?
...Wie viel Programme hast du bisher schon geschrieben?
Weil wie eine Aufgabe für Totalanfänger schaut mir das nicht aus.

Oder anders gefragt, weißt du, wie du das geschriebene Programm startest?
Dabei wird es kompiliert.
Ein Hilfsprogramm, genannt Compiler, übersetzt den geschriebenen Code in
computerverständliche Befehle. Ergebnis ist bei Windows eine Exe-Datei.
Die kann man dann erst wirklich starten.

Bei Visual Studio geht das alles ziemlich im Hintergunrd
und kann mit ein paar Mausklicks in Gang gesetzt werden
(solange man keine speziellen Compilereinstellungen braucht).
Und sollte der Compiler im Code Fehler entdecken bekommst du diese im VS-Fenster angezeigt.


Wenn die Lehrer ihren Schülern/Studenten so eine Aufgabe vorsetzen,
ohne dass das Wort Kompilieren bekannt ist...irgendwo ist da was daneben gegangen.



Wo die Schleife hingehört: Natürlich da, wo der String eingegeben wird. cin.


----------



## simple3 (20. September 2012)

moin hat soweit alles geklappt, das programm läuft super... ich weiß jetzt nur noch nicht wie ich das mit der begranzung auf 2000 daten einfüge bzw. wo ich das einfüge

```
#include <iostream> 
#include <algorithm> 
#include <string> 
#include <fstream> 
#include <vector> 
using namespace std; 


struct Adresse
{
	string nummer;
	string Vorname;
	string Nachname;
	string strasse;
   	string hausnummer;
   	string postleitzahl;
    string wohnort;
	string Telefonnummer;
	string Handynummer;
	string Mail;
	string Fachgebieht;
	string studienstart;
	string Firma;
	string Firmenstraße;
	string Firmenhausnummer;
	string Firmenplz;
	string Firmenort;
	string Ansprechpartner;
	string Ansprechpartnernummer;
	string Ansprechpartnernummer2;
	string Ansprechpartneremail;
};
ostream& operator<<(ostream& out, Adresse a) 
{ 
    out << a.nummer      << ' '; 
    out << a.Vorname   << ' '; 
    out << a.Nachname << ' '; 
    out << a.strasse      << ' '; 
	out << a.hausnummer      << ' '; 
    out << a.postleitzahl  << ' '; 
    out << a.wohnort << ' '; 
    out << a.Telefonnummer      << ' ';     
	out << a.Handynummer     << ' '; 
    out << a.Mail   << ' '; 
    out << a.Fachgebieht << ' '; 
    out << a.studienstart      << ' '; 
	out << a.Firma << ' '; 
    out << a.Firmenstraße      << ' ';     
	out << a.Firmenhausnummer    << ' '; 
    out << a.Firmenplz   << ' '; 
    out << a.Firmenort << ' '; 
    out << a.Ansprechpartner      << ' '; 
	out << a.Ansprechpartnernummer  << ' '; 
    out << a.Ansprechpartnernummer2 << ' '; 
    out << a.Ansprechpartneremail      << ' '; 
    return out; 
} 


istream& operator>>(istream& in, Adresse& a) 
{ 
    in >> a.nummer;
    in >> a.Vorname;  
    in >> a.Nachname;
    in >> a.strasse;    
	in >> a.hausnummer;      
    in >> a.postleitzahl;  
    in >> a.wohnort; 
    in >> a.Telefonnummer;      
	in >> a.Handynummer;    
    in >> a.Mail;   
    in >> a.Fachgebieht; 
    in >> a.studienstart;     
	in >> a.Firma;  
    in >> a.Firmenstraße;           
	in >> a.Firmenhausnummer;    
    in >> a.Firmenplz;  
    in >> a.Firmenort; 
    in >> a.Ansprechpartner;      
	in >> a.Ansprechpartnernummer;  
    in >> a.Ansprechpartnernummer2;  
    in >> a.Ansprechpartneremail;      
    return in; 
} 


void ausgabe_tabelle(ostream& out, const vector<Adresse>& datenbank) 
{ 
    for(vector<Adresse>::const_iterator it=datenbank.begin(); it!=datenbank.end(); ++it)
         out << *it << endl; 
} 


void lade_datenbank(vector<Adresse>& datenbank) 
{ 
    ifstream file("db.txt"); 
    if( file.is_open() ) 
    { 
        for(Adresse a; file>>a; datenbank.push_back(a)); 
    } 
} 


void speichere_datenbank(const vector<Adresse>& datenbank) 
{ 
    ofstream file("db.txt"); 
    if( file.is_open() ) 
    { 
        ausgabe_tabelle(file, datenbank); 
    } 
} 


struct suche_datensatz_praedikat 
{ 
    string suche; 
    suche_datensatz_praedikat(const string& suche) : suche(suche) {} 
    bool operator()(const Adresse& a) const 
    { 
        if( a.nummer==suche || a.Vorname==suche || a.Nachname==suche || a.Firma==suche )
             return true; 
        return false; 
    } 
}; 
vector<Adresse>::const_iterator suche_datensatz(const vector<Adresse>& datenbank)
 { 
    cout << endl << "Suchwort: "; 
    string suchwort; 
    cin >> suchwort; 
    return find_if( datenbank.begin(), datenbank.end(), suche_datensatz_praedikat(suchwort) );
 } 


int main() 
{ 
    vector<Adresse> datenbank; 
    lade_datenbank(datenbank); 
    char eingabe; 
    do 
    { 
		
		system("cls");
        cout << "Daten auf Bildschirm ausgeben (1)" << '\n'; 
        cout << "Datensatz eingeben            (2)" << '\n'; 
        cout << "Datensatz suchen              (3)" << '\n'; 
        cout << "Datensatz löschen             (4)" << '\n'; 
        cout << "Programm beenden              (0)" << '\n'; 
        cout << "Ihre Eingabe: "; 
        cin >> eingabe; 

		
        switch( eingabe ) 
        { 
            case '1': 
            { 
                ausgabe_tabelle(cout,datenbank); 
                break; 
            } 
            case '2':
            {
			Adresse a;
				cout << "Martrikelnummer:";
                cin >> a.nummer;
				cout << "Vorname:";
	         	cin >> a.Vorname;
				cout << "Nachname:";
                cin >> a.Nachname;
				cout << "strasse:";
                cin >> a.strasse;
				cout << "hausnummer:";
               	cin >> a.hausnummer;
				cout << "postleitzahl:";
	            cin >> a.postleitzahl;
			while(a.postleitzahl.length() != 5)
			{ 
				cout << "falsch\n";
				cout << "postleitzahl:";
				cin >> a.postleitzahl;
			}
				cout << "wohnort:";
                cin >> a.wohnort;
				cout << "Telefonummer:";
                cin >> a.Telefonnummer;
				cout << "Handynummer:";
				cin >> a.Handynummer;
				cout << "E-mail:";
               	cin >> a.Mail;
				cout << "Fachgebiet:";
                cin >> a.Fachgebieht;
				cout << "Studienstart:";
                cin >> a.studienstart;
				cout << "Firma:";
                cin >> a.Firma;
				cout << "Firmenstraße:";
               	cin >> a.Firmenstraße;
				cout << "Firmenhausnummer:";
                cin >> a.Firmenhausnummer;
				cout << "Firmenplz:";
                cin >> a.Firmenplz;
				cout << "Firmenort:";
                cin >> a.Firmenort;
				cout << "Ansprechpartner:";
               	cin >> a.Ansprechpartner;
				cout << "Ansprechpartnernummer:";
                cin >> a.Ansprechpartnernummer;
				cout << "Ansprechpartnernummer2:";
                cin >> a.Ansprechpartnernummer2;
				cout << "Ansprechpartnere-mail:";
                cin >> a.Ansprechpartneremail;
                datenbank.push_back(a);
                break;
            } 
            case '3': 
            { 
                vector<Adresse>::const_iterator it = suche_datensatz(datenbank);
                 if( it!=datenbank.end() ) 
                { 
                    cout << endl << *it; 
                } 
                else 
                { 
                    cout << "Kein Treffer!"; 
                } 
                break; 
            } 
            case '4': 
            { 
                vector<Adresse>::const_iterator it = suche_datensatz(datenbank);
                 datenbank.erase(it); 
                break; 
            } 
            case '0': 
            { 
                speichere_datenbank(datenbank); 
                break; 
            } 
			
			
        } 
		system("pause");
    }while( eingabe!='0' ); 
}
```
kompilieren weiß ich was du meinst ich drücke f5 oder strg f7 und dann macht das mein programm


----------



## sheel (21. September 2012)

@Kompilieren: Jaa...so ungefähr das ist es.

Begrenzung: Beim Datensatz-eingeben. Wo sonst?


```
Wenn (datenbank hat mehr als 1999 Einträge)
    stopp;
```
Das Übersetzen in C++ ist deine Aufgabe


----------



## simple3 (21. September 2012)

hi 
ja ich meinte eher nicht wie ich so einen befehl schreibe sondern an welcher stelle in meinem code ich das packen soll...

so?


```
if(datenback < 2000)
{               
datenbank.push_back(a);
break;
}
else
{
cout >> "datenbank voll!";
break;
}
```


----------



## sheel (21. September 2012)

sheel hat gesagt.:


> Beim Datensatz-eingeben. Wo sonst?


Das ist von den Möglichkeiten

```
cout << "Daten auf Bildschirm ausgeben (1)" << '\n'; 
        cout << "Datensatz eingeben            (2)" << '\n'; 
        cout << "Datensatz suchen              (3)" << '\n'; 
        cout << "Datensatz löschen             (4)" << '\n'; 
        cout << "Programm beenden              (0)" << '\n';
```
das Einzige, wo mehr Datensätze werden, also kommt da auch die Mengenbeschränkung hin.

main, case 2 vom switch.

edit: Warum nicht gleich vor der Eingabe?
Sonst Ok.

edit2: Doch nicht ok, ein Fehler übersehen. Siehe unten.


----------



## simple3 (21. September 2012)

```
case '2':
            {
				if (datenbank > 1999)
				{
					cout << "datenbank voll!";
					system("pause");
					break;
				}
				else 
				{
			Adresse a;
```

das geht nicht ....


----------



## sheel (21. September 2012)

Das else muss nicht sein, weil ja schon durch das break aufgehört wird.
Schadet aber auch nicht.

Und zum Fehler...
was ist datenbank?
Eine Zahl, die größer oder kleiner als eine andere sein kann...?

...
Und welche Funktion eines Vectors gibt dessen Größe zurück?


----------



## simple3 (21. September 2012)

datenbank.legth ?
ich könnte gerade nur raten...


----------



## sheel (21. September 2012)

Wieso klickst du dann nicht mal den Link im letzten Beitrag an?
Da steht alles...

Verlangt ja keiner, dass man alles auswendig lernt.
Aber im Internet findet man die Lösung sehr schnell.


----------

