C++ Adressbuch

simple3

Grünschnabel
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
werden.

Matrikelnummer
Name
Vorname
Adresse mit
o Straße
o Hausnummer
o Postleitzahl und
o Ort/Stadt
Telefon mit
o Mobilnummer
o Festnetznummer
E-Mail
Studiengang (mit Start des Studiums),
Praxispartner
o Firma mit Adresse
Straße
Hausnummer
Postleitzahl und
Ort/Stadt
o Ansprechpartner beim Praxispartner
Mobilnummer
Festnetznummer
E-Mail

Die erhobenen Daten sollen auf Festplatte gespeichert werden. Bei einem Neustart
des Programms sollen die gespeicherten Daten von der Festplatte zunächst geladen
werden, so dass ein zusätzlicher Eintrag anschließend eingegeben werden kann.
Die Ausgabe eines Datensatzes (alle Angaben eines Studierenden) soll auf einer
Bildschirmseite dargestellt werden.

Es soll ebenfalls möglich sein, einen Datensatz zu suchen respektive zu finden
und zwar entweder über a) die Matrikelnummer, b) den Namen c) den Vornamen
oder d) Praxispartner. Gibt es mehrere Suchresultate (Treffer), sollen diese immer
vollständig und dann nacheinander ausgegeben werden. Des Weiteren soll es
möglich sein, einen Datensatz zu ändern und auch zu löschen.

Das ganze Programm soll über eine Menüsteuerung zu bedienen
sein. Es müssen also folgende Menüpunkte realisiert werden:

Daten eingeben
Daten auf Bildschirm ausgeben
Daten von HD lesen
Datensatz suchen
Daten auf HD speichern
Datensatz löschen
Datensatz ändern

Hinweise

Die Daten sollten in einem Abstrakten Datentyp (ADT) erfasst werden. Einen oder
auch mehrere struct wäre hier hilfreich.

Die Studierenden sollten ein einem Feld (Array) vom Typ struct verwalten werden.

Die Funktionen fscanf und fprintf reichen evtl. nicht aus, um die Daten von
der HD zu lesen bzw. auf die HD zu schreiben.

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

C++:
#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
 
Zuletzt bearbeitet:
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.
 
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...
 
hallo ich glaube ich bin etwas weiter... kann sich das mal einer durch sehen, weil irgendwie will das nicht so richtig
C++:
#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' );
}
 
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:
C++:
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.
 
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; )?
 
Zuletzt bearbeitet:
: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.
 
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
C++:
#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
 
Zurück