Telefonbuch als Konsolenprogramm
-
Hallo
Ich habe die Aufgabe bekommen ein Telefonbuchprogramm in C++ zu schreiben womit ich mir aber sehr schwer tue. Bei der Umsetzung soll ich folgendermaßen vorgehen. Über Hilfe und Erläuterungen bin ich sehr dankbar.
1. Eine Struktur entwerfen die Vorname, Nachname und die Telefonnummer
enthält.Das Telefonbuch soll max 100 Einträge haben und in einen Feld
gespeichert werden, das global definiert werden soll.
2. Eine Funktion "Initialisierung()", die bei jedem Eintrag dem Namen einen leeren
String zuweist.
3. Das Programm soll die Eingabe, Anzeige und das Löschen von Einträgen
ermöglichen. Diese Aktionen sollen in Funktionen gefasst werden. Bei der
Anzeige soll überprüft werden, ob der Eintrag existiert. Bei der Löschfunktion
reicht es den Namen zu löschen.
4. Eine Funktion "Nummereingabe(),schreiben, welche den Benutzer nach einer
Eintragnummer fragt. Als Rückgabewert sollte die Funktion die Eintragnummer
oder -1 zurückgeben, wenn die Eingabe außerhalb des Bereiches lag. Außerdem
soll vor jedem Zugriff geprüft werden, ob der Wert innerhalb der Feldgrenzen
liegt.
5. Zum Schluß eine main()-Funktion bei der am Anfang die Initialisierung
durchgeführt werden soll. Am liebsten wäre mir da eine switch-case-Konstruktion.Bis jetzt habe ich folgenden Code:
Es ist nicht viel aber ein Anfang. Bei der Initialisierung bin ich mir schon nicht ganz sicher ob Sie so OK ist.#include <iostream.h> //Struktur global vereinbart struct person{ char vorname[80]; char nachname[80]; int telefonnummer; }; person telefonbuch[100]; //Funktion für die Initialisierung person Initialisierung(char vorname, char nachname, int telefonnummer){ person daten; strcpy(daten.vorname=vorname); strcpy(daten.nachname=nachname); daten.telefonnummer=telefonnummer; return(daten); } void main(){ char p[50]; cin.getline(p,50); cin.getline(p,50); }
/edit: sfds
-
Und wo haste Probleme ?
-
Bei den 3 Funktionen in Punkt 3 geht es schon los. Ich lerne gerade C++, wenn ich Code sehe kann ich das auch meist gut nachvollziehen und auch wieder anwenden, aber ich brauche immer ein kleines Beispiel.
-
Hi
Naja du schreibst eben die Funktionen dafür.
Für die Ausgabe gehst du das Array durch und gibst nacheinander die Werte aus.
Übergib halt den Namen als Parameter und prüfe beim Durchlaufen ob die Namen übereinstimmen, um einen bestimmten Datensatz auszugeben.
Beim Löschen gehst du genauso vor, nur dass du den Datensatz nicht ausgibst sondern löschst.Für die Eingabe musst du eben zunächst die Werte vom User holen und einen entsprechenden Eintrag erzeugen und ihn einfügen.
Euer Lehrer will ja nichts dolles von euch sonst hätte er dir Aufgabe anders gestellt. So schwer ist das nicht. Du hast doch schon ganz gut angefangen.
Und ein einfaches Menu kannst du doch zb. so machen:
Zur Auswahl entsprechende Zahl drücken:
[1] Eintrag hinzufügen
[2] Eintrag löschen
[3] Eintrag mit Namen XXX anzeigen
[4] Eintrag mit Nummer X ausgeben
[5] Program beendenDas kannst du dann ganz locker mit ner while-Schleife und switch-case machen.
-
So, ich bin jetzt schon ein Stück weiter. Ich habe im Moment zwei Fragen zu meinen Code.
1.Wieso funktioniert in meiner Funktion "Eingabe" das lesen der Namen nicht richtig mit cin.getline(a,80); ? Da kommt dann nur Müll raus. Ich wollte doch das der Name dort richtig eingelesen wird, auch falls jemand zwei Namen eingibt, wegen der Leerzeichen.
Und
2.Funktioniert meine Funktion Ausgabe noch nicht richtig. Kann mir da mal jemand einen Tip geben?Dann versuche ich auch wieder allein weiter zu kommen.
#include <iostream.h> #include <string.h> //Struktur global vereinbart struct person{ char vorname[80]; char nachname[80]; char telefonnummer[30]; }; person telefonbuch[100]; //Funktion für die Initialisierung person Initialisierung(char vorname[80], char nachname[80], char telefonnummer[30]){ person telefonbuch; strcpy(telefonbuch.vorname, telefonbuch.vorname); strcpy(telefonbuch.nachname, telefonbuch.nachname); strcpy(telefonbuch.telefonnummer, telefonbuch.telefonnummer); return(telefonbuch); } //Funktion für die Eingabe void eingabe(char vorname[80],char nachname[80],char telefonnummer[30]){ person telefonbuch; cout<<"Geben Sie bitte ihren Vornamen ein."<<endl; //cin.getline(a,80); cin>>vorname; cout<<"Vorname war "<<vorname<<endl; cout<<"Geben Sie bitte ihren Nachnamen ein."<<endl; cin>>nachname; cout<<"Nachname war "<<nachname<<endl; cout<<"Geben Sie jetzt bitte ihre Telefonnummer ein."<<endl; cin>>telefonnummer; cout<<"Telefonnummer war "<<telefonnummer<<endl<<'\n'; } //Funktion für die Ausgabe void ausgabe(char nachname[80]){ int index,i; person telefonbuch; cout<<"Gesuchter Nachname: "; cin>>nachname; index = telefonbuch.nachname; if(index == -1) cout<<"Name befindet sich nicht im Telefonbuch!"<<endl<<'\n'; else cout<<"Der Nachname: "<<nachname<<" ist vorhanden."<<endl<<'\n'; } void main(){ char vorname[80]; char nachname[80]; char telefonnummer[30]; bool nochmal=true; while(nochmal){ int was; cout<<"Waehlen Sie aus dem Menue aus."<<endl; cout<<"Wollen sie (1) Einen Eintrag neu anlegen"<<endl; cout<<" (2) Die Eintraege anzeigen"<<endl; cout<<" (3) Einen Eintrag loeschen"<<endl; cout<<" (4) Programm beenden"<<endl; cin>>was; switch(was){ case 1: { eingabe(vorname,nachname,telefonnummer); break; } case 2: { ausgabe(nachname); break; } /*case 3: { loeschen(x,y,z); }*/ case 4: { nochmal=false; break; } // Fehlerabfang default: { cout<<"Ungueltige Auswahl.\n\n"; } } } char p[50]; cin.getline(p,50); cin.getline(p,50); }
/edit: sfds
-
Hi
Also bei der Eingabefunktion ist mir nicht ganz klar warum du sie so deklariert hast. Warum übergibst du Parameter holst aber die Werte erst in dieser Funktion ? Nun ich sehe auch nicht wo a deklariert wurde.
Das selbe bei der Ausgabe. Du übergibst der Funktion einen Parameter nachname, den du zwar in diesem Fall auch benutzt der aber keine Parameterfunktion besitzt und nicht als Rückgabe dienen kann, weil es sich um eine Kopie und keinen zeiger oder eine Referenz handelt. Auch ist mir nicht ganz klar was du mit der Zeile: index=telefonbuch.nachname erreichen willst. Das sollte sich eigentlich garnicht kompilieren lassen.Hmm also ein ganz einfaches prog ohne main könnte so aussehen
#include<iostream> #include<string> #include<vector> using namespace std; enum eInsertResult{ iOk, iFailed, iRecExist }; struct daten{ string vorname; string nachname; string telefon; }; vector<daten> telefonbuch; void Init(void){ telefonbuch.clear(); } eInsertResult Insert(const string &vn,const string &nn,const string &tel){ vector<daten>::const_iterator cit; for(cit=telefonbuch.begin();cit!=telefonbuch.end();cit++){ if(cit->vorname==vn && cit->nachname==nn) return iRecExist; } daten toins={vn,nn,tel}; telefonbuch.push_back(toins); return iOk; } void Ausgabe(const string &vn){ vector<daten>::const_iterator cit; for(cit=telefonbuch.begin();cit!=telefonbuch.end();cit++){ if(cit->vorname==vn){ cout<<"Name: "<<cit->nachname<<endl; cout<<"Vorname: "<<cit->vorname<<endl; cout<<"Tel.: "<<cit->telefon<<endl<<endl; } } } void Eingabe(void){ string vn,nn,tel; cout<<"Name: "; cin>>nn; cout<<"Vorname: "; cin>>vn; cout<<"Telefon: "; cin>>tel; if(Insert(vn,nn,tel)==eRecExist) cout<<endl<<"Datensatz existierte bereits"<<endl; } void Delete(const string &vn,const string &nn){ vector<daten>::iterator it; for(it=telefonbuch.begin();it!=telefonbuch.end();it++){ if(it->vorname==vn && it->nachname==nn) telefonbuch.erase(it); } }
Das ganze macht sich natürlich in einer eigenen Telefonbuchklasse besser.
Ich hab nicht getestet ob es funktioniert. Der compiler sagt dir dann schon was falsch ist. Logisch gesehen müsste es aber stimmen.