Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einleseroutine wird übersprungen



maak
07-08-2005, 13:13
Hallo,

ich würde gerne für jemanden zur Demonstration der Verwendung von Strukturen (später auch Klassen) ein rudimentäres Mitarbeiter-Verwaltungsprogramm schreiben. Leider finde ich auf eine Frage keine Lösung: Wenn man den Programmcode, den ich unten hineinkopiert habe, kompiliert und im Hauptmenü Nummer 1 wählt, dann werden die Daten nicht eingelesen, sondern alle Einlesebefehle einfach übersprungen und das Programm beendet anstatt den nächsten Schleifendurchlauf zu starten. Vielleicht kann mir jemand von euch helfen, dem Problem auf den Grund zu gehen? Vielen Dank im Voraus!

Mit freundlichen Grüßen
maak


#include <conio.h>
#include <iostream>
using namespace std;

struct mitarbeiter
{ char name[20];
char vorname[20];
char titel[10];
char geschlecht;
char strasse[100];
char wohnort[30];
int plz;
char position[40];
int lohn;
int urlaub;
int urlaub_verbraucht;
int eintrittsdatum;
};

int nummer=0;
mitarbeiter arbeiter[30];

void neuer_mitarbeiter(mitarbeiter *person)
{ system("cls");
cout<<endl<<" Neuen Mitarbeiter registrieren"<<endl<<endl;
cout<<" Name: ";
cin.get(person->name,19);
cout<<" Vorame: ";
cin.get(person->vorname,19);
cout<<" Titel: ";
cin.get(person->titel,9);
cout<<" Geschlecht: ";
cin>>person->geschlecht;
cout<<" Position: ";
cin.get(person->position,39);
cout<<" Strasse: ";
cin.get(person->strasse,99);
cout<<" Postleitzahl: ";
cin>>person->plz;
cout<<" Wohnort: ";
cin.get(person->wohnort,29);
cout<<" Lohn: ";
cin>>person->lohn;
cout<<" Urlaub: ";
cin>>person->urlaub;
person->urlaub_verbraucht=0;
cout<<" Eintrittsdatum: ";
cin>>person->eintrittsdatum;
cout<<endl<<" Der neue Mitarbeiter wurde angelegt."<<endl;
getch();
}

int hauptmenue()
{ system("cls");
int wahl;
cout<<endl<<" Hauptmenue"<<endl<<endl
<<" 1) Neuen Mitarbeiter eintragen"<<endl
<<" 2) Mitarbeiter bearbeiten"<<endl
<<" 3) Programm beenden (Datensaetze werden geloescht!)"<<endl<<endl
<<" Deine Wahl: ";
cin>>wahl;
return wahl;
}

void main(void)
{ int wahl=-1;
for(;;)
{ wahl=hauptmenue();
if(wahl==1&&nummer<30)
neuer_mitarbeiter(&arbeiter[nummer++]);
else
break;
}
}

SeeksTheMoon
08-08-2005, 10:29
kann sein dass es an der globalen Variable "nummer" liegt, denn der Rest sieht ok aus. Mit globalen Variablen bekommt man immer wilde Fehler.

quinte17
08-08-2005, 11:48
gut ich weiß nicht, wie des c++ mit cin handhabt, aber kann es vielleicht sein, dass in "wahl" nicht [,nur] eine 1 drinsteht??
in C hat man da schon seine "probleme" dass da dann noch ein returnzeichen unter umständen mit drin ist.

wie wäre es zuvor einen cout auf wahl zu machen, bevor du in die if-else bedingung kommst...
das könnte dir vielleicht helfen beim debuggen :D

greetz

maak
08-08-2005, 19:30
Hallo,

danke für die Tipps. Leider brauche ich "nummer" und "arbeiter" in zu vielen anderen Funktionen, als dass ich alle mit Zeigern übergeben würde, außer es lässt sich absolut nicht vermeiden.

Die Idee mit cout hatte ich bereits, aber es ist entweder das Richtige oder eben gar nichts in dieser Variablen, wenn wieder einmal alle cin übersprungen wurden?

mfg
maak

ContainerDriver
08-08-2005, 20:06
Hallo.

Du solltest statt der Methode get() lieber getline() verwenden (ich weiß ganz ehrlich nicht, was das get() mit zwei Argumenten macht, allerdings funktioniert dein Schnipsel bei mir fast (siehe unten) wenn ich getline() verwende).

Dummerweise gibt es noch ein zweites Problem: und zwar verwendest du manchmal einfach nur cin (für Zahlen) und manchmal cin.get (bzw. cin.getline()). Wenn du mit cin eine Zahl einliest, dann lässt cin das \n, mit dem du Eingabe abschließt, im Tastaturpuffer. Das darauffolgende cin.getline() liest dann genau dieses \n ein und "denkt", das die Eingabe fertig ist, was aber eigentlich nicht so ist.
Du hast jetzt also zwei Möglichkeiten: entweder du liest alles über cin.getline() ein und filterst dann Zahlen z.B. mit atoi() raus oder du setzt vor jedes cin.getline() einfach noch ein cin.getline() um den Tastaturpuffer zu leeren.

Gruß, Florian

maak
11-08-2005, 07:47
Hallo,

das scheint der Fehler gewesen zu sein. Bis jetzt funktioniert es damit einwandfrei. Danke schön!

lg, maak