Telefonbuch (Konsolenanwendung) in C++ überspringt Eingabeaufforderung



  • Hallo Leute,

    bin zurzeit im ersten Semester meines Studiums und wir sollen nun etwas mit der String Bibliothek herumspielen. Da dachte ich mir, ich schreibe mal eine Art Telefonbuch. Wenn ich dann einen Eintrag erstellen möchte und Name sowie Nummer abfrage, so überspringt er eine Eingabe. Am Besten den Quelltext mal fix rauskopieren und selbst testen, dann seht ihr, was ich meine.

    #include <iostream>
    #include <string>
    using namespace std;
    
    class Eintrag
    {
    public:
    	void eintragErstellen( string name, double nummer )
    	{
    		cout <<endl << "Erstelle Eintrag mit Namen " << name << " und Nummer " << nummer << endl;
    	}
    };
    
    class Telefonbuch
    {
    public: 
    	void begruessen( string besitzer )
    	{
    		cout <<endl << "Willkommen im Telefonbuch von " << besitzer << "!" << endl << endl;
    	}
    };
    
    int main()
    {
    	// Variablen deklarieren
    	string besitzer, name;
    	double nummer;
    	int anzahleintraege = 0, auswahl;
    	// Objekt "Telefonbuch" erzeugen mit Namen "meinTelefonbuch"
    	Telefonbuch meinTelefonbuch;
    	// Name des Besitzers anfordern
    	cout << "Bitte gib deinen Namen ein:" << endl;
    	// Namen des Besitzers einlesen
    	getline( cin, besitzer );
    	// Funktion begruessen aus Klasse Telefonbuch aufrufen
    	meinTelefonbuch.begruessen( besitzer );
    	// Frage, was der Besitzer machen will
    	cout << "Waehlen Sie aus den folgenden Aufgaben:" << endl << "1 Eintrag erstellen" << endl << "2 Beenden" << endl << "Bitte waehlen Sie jetzt:" << endl;
    	// Waehlen
    	cin >> auswahl;
    	// entsprechend der Eingabe handeln
    	if( auswahl == 1){
    		// Objekt "Eintrag" erzeugen mit Namen "meinEintrag"
    		Eintrag meinEintrag;
    		// Namen fuer Eintrag einlesen
    		cout << "Bitte gib einen Namen ein:" << endl;
    		getline( cin, name );
    		// Nummer fuer Eintrag einlesen
    		cout << "Bitte gib eine Nummer ein:" << endl;
    		cin >> nummer;
    		// Variable fuer Anzahl der Eintraege erhöhen
    		anzahleintraege++;
    		// Funktion eintragErstellen aus Klasse Eintrag aufrufen
    		meinEintrag.eintragErstellen( name, nummer );
    		} else if( auswahl == 2) {
    		return 0;
    	}
    }
    

    Ich vermute, dass ich zwischen den zwei Eingabeaufforderungen eine Art Pause einfügen muss, weiß aber nicht, wie. In meinem C++ Buch fand ich auch nichts passendes hierzu.

    Jemand einen Tipp parat?
    Vorab vielen Dank!

    Grüße
    AsHell



  • Problem gelöst!

    cin.seekg(0,std::ios::end);
    		cin.clear();
    

    Vor jede neue Eingabeaufforderung und es funktioniert! 😃


  • Mod

    double ist der wohl denkbar schlechteste Datentyp für eine Telefonnummer. Wie wäre es mit einem String?



  • Ja, das habe ich mittlerweile auch bemerkt. 🙂 Danke für den Hinweis!
    Falls es interessiert, hier der momentane Quelltext:

    #include <iostream>
    #include <string>
    using namespace std;
    int anzahleintraege;
    
    class Eintrag
    {
    public:
    	void eintragErstellen( string name, string nummer )
    	{
    		cout << endl << "Eintrag mit Nummer " << anzahleintraege << " wird erstellt..."<< endl;
    		// Hier muss das Programm die Daten für den Eintrag fest abspeichern - nur wie? 
    		cout << "Fertig!" << endl << endl;
    	}
    };
    
    class Telefonbuch
    {
    public: 
    	void begruessen( string besitzer )
    	{
    		cout <<endl << "Willkommen im Telefonbuch von " << besitzer << "!" << endl << endl;
    	}
    };
    
    int main()
    {
    	// Variablen deklarieren
    	string besitzer, name, nummer;
    	int auswahl;
    	// Objekt "Telefonbuch" erzeugen mit Namen "meinTelefonbuch"
    	Telefonbuch meinTelefonbuch;
    	// Name des Besitzers anfordern
    	cout << "Bitte gib deinen Namen ein:" << endl;
    	// Namen des Besitzers einlesen
    	cin.seekg(0,std::ios::end);
    	cin.clear();	
    	getline( cin, besitzer );
    	// Funktion begruessen aus Klasse Telefonbuch aufrufen
    	meinTelefonbuch.begruessen( besitzer );
    	Auswahl:
    	// Frage, was der Besitzer machen will
    	cout << "Waehlen Sie aus den folgenden Aufgaben:" << endl << "1 Eintrag erstellen" << endl << "2 Eintraege anschauen" << endl << "3 Beenden" << endl << endl << "Bitte waehlen Sie jetzt:" << endl;
    	// Waehlen
    	cin.seekg(0,std::ios::end);
    	cin.clear();
    	cin >> auswahl;
    	// entsprechend der Eingabe handeln
    	if( auswahl == 1 ){
    		// Variable fuer Anzahl der Eintraege erhöhen
    		anzahleintraege++;
    		// Objekt "Eintrag" erzeugen mit Namen "meinEintrag"
    		Eintrag meinEintrag;
    		// Namen fuer Eintrag einlesen
    		cout << endl << "Bitte gib einen Namen ein:" << endl;
    		cin.seekg(0,std::ios::end);
    		cin.clear();
    		getline( cin, name );
    		// Nummer fuer Eintrag einlesen
    		cout << "Bitte gib eine Nummer ein:" << endl;
    		cin.seekg(0,std::ios::end);
    		cin.clear();
    		getline( cin, nummer );
    		// Funktion eintragErstellen aus Klasse Eintrag aufrufen
    		meinEintrag.eintragErstellen( name, nummer );
    		goto Auswahl;
    		} else if( auswahl == 2 ) { 
    		goto Auswahl;
    		}else if( auswahl == 3 ) {
    		return 0;
    	}
    }
    

    Grüße



  • Okay, eine kleine Frage hätte ich da noch...

    Ich will nun, dass die Daten temporär abgespeichert werden.

    Für Eintrag 1 sollen Name und Telefonnummer als
    name1 und nummer1 (beide vom Typ String) abgespeichert werden.
    Da ich einen Integer "anzahleintraege" habe, wollte die Strings für jeden Eintrag
    in der Funktion eintragErstellen erzeugen lassen.
    Nur: Wie genau mache ich das?

    string name(anzahleintraege); oder solche Konstruktionen funktionieren leider nicht!

    Danke vorab. 😉


  • Mod

    Noch ein Tipp: Goto in unerfahrenen Händen führt erfahrungsgemäß unweigerlich zu Spagetticode. Meide es als Anfänger. Schreib alle Programme sauber mit den vorgegebenen Schleifenkonstrukten und sauberen Abbruchbedingungen. Versuche, dabei auch break zu vermeiden.

    edit: Zu deiner neuen Frage: Du suchst Container wie z.B. std::vector. Sollte in einem guten Lehrbuch bald drankommen.



  • Vielen Dank für deine Infos!
    Dann hab ich ja jetzt noch einiges vor mir. 😃

    Einen schönen Sonntag noch,
    AsHell. 👍



  • Da ich leider (NOCH!) nicht angemeldet bin,
    kann ich meinen Beitrag nicht editieren.

    Wollte nur kurz Bescheid geben, dass der Tipp mit den Vektoren top war!
    Funktioniert nun so, wie ich das wollte.

    Dickes Dankeschön!

    Gruß
    AsHell



  • Ich muss doch nochmal nerven... 🙄

    Will nun überprüfen, ob der Vektor an der Stelle "einzelnereintrag" (Integer) leer ist oder nicht.

    if( namen[einzelnereintrag].size() == 0 ){
    

    Geht leider nicht. Habe auch schon "... == NULL" und Ähnliches versucht.
    Mit .empty() komme ich auch nicht weiter. Internetrecherchen haben mehr verwirrt, als gut getan und genau ein solcher Fall ist in meinem Büchlein (Einstieg in C++, 4. Auflage, Arnold Willemer) nicht beschrieben.

    Die Komplette if-Bedingung sieht wie folgt aus:

    // pruefen ob der Eintrag existiert
    		if( namen[einzelnereintrag].size() == 0 ){
    			cout << endl << "Dieser Eintrag existiert nicht!" << endl;
    			cout << "********************************" << endl << endl;
    			}else{
    			// Eintrag ausgeben
    			cout << endl << "Eintrag Nr.: " << einzelnereintrag+1 << " Name: " << namen[einzelnereintrag] << " Nummer: " << nummern[einzelnereintrag] << endl;
    			cout << "********************************" << endl << endl;
    		}
    

    Für einen Tipp wieder vorab vielen Dank!

    Achja: Kann man irgendwo für den Erhalt des Forums spenden?
    Ich glaube, das sollte ich bald tun. 😉

    Grüße
    AsHell



  • Nach langem Überlegen selbst gelöst:
    Die Vektoradresse, die er überprüfen wollte, existierte nicht.
    Hab daher den Vektor nun so erstellt:

    vector<string> namen (1000);
    

    So kann ich nun zumindest die Stellen bis vector[999] prüfen.
    Durch eine if Bedingung kann ich nun bei größerer Eingabe direkt abbrechen.

    Grüße


Log in to reply