Anzahl der Arrays eingeben
-
Hallo ich möchte per Tastatureingabe bestimmen, wieviele Array-Variabeln angelegt werden sollen:
int main() { int iAnzahl; cout "Anzahl der Eintraege: "; cin >> iAnzahl; struct PersonTyp Person[iAnzahl]; int iZahl; for ( iZahl=0; iZahl<iAnzahl; iZahl++) { DatenAendern(Person[iZahl]); cout << "\nNeuer Eintrag: \n"; cout << "\nDein Name ist: \t"<<Person[iZahl].sName<<endl; cout << "Dein Wohnort ist: \t"<<Person[iZahl].sWohnort<<endl; cout << "Dein Alter ist: \t"<<Person[iZahl].sAlter<<endl; cout << "Deine Telefonnr ist: \t"<<Person[iZahl].sTelefon<<endl; cout << "Dein Email ist: \t"<<Person[iZahl].sEmail<<endl; cout << endl; } getch(); return 0; }Problem:
Der Compiler will, dass ich aus der Variabel ne const mache.Error 1 error C2057: expected constant expressionWenn ich das mache, kann ich sie aber per Hand nicht mehr ändern.
hmmm
-
Dynamische Sachen musst du auf dem Heap mittels new erzeugen:
int main() { int iAnzahl; cout "Anzahl der Eintraege: "; cin >> iAnzahl; PersonTyp *Person = new PersonTyp[iAnzahl]; // Mit new anlegen int iZahl; for ( iZahl=0; iZahl<iAnzahl; iZahl++) { DatenAendern(Person[iZahl]); cout << "\nNeuer Eintrag: \n"; cout << "\nDein Name ist: \t"<<Person[iZahl].sName<<endl; cout << "Dein Wohnort ist: \t"<<Person[iZahl].sWohnort<<endl; cout << "Dein Alter ist: \t"<<Person[iZahl].sAlter<<endl; cout << "Deine Telefonnr ist: \t"<<Person[iZahl].sTelefon<<endl; cout << "Dein Email ist: \t"<<Person[iZahl].sEmail<<endl; cout << endl; } delete[] Person; // Wichtig: delete nicht vergessen! getch(); return 0; }Viel einfacher wäre es natürlich, gleich einen dynamischen Container zu nehmen...
-
Die Grössen von Arrays müssen in C++ zur Kompilierzeit bekannt sein. Die naheligende Lösung ist ein Array per new zu allokieren.
Wem das aber zu viel Aufwand ist das alles selbst zu warppen, sollte einen der Standardcontainer, wie z.B
std::vectornehmen.#inlucde <vector> int main() { int iAnzahl; cout "Anzahl der Eintraege: "; cin >> iAnzahl; std::vector<PersonTyp> Person(iAnzahl); int iZahl; for ( iZahl=0; iZahl<iAnzahl; iZahl++) { DatenAendern(Person[iZahl]); cout << "\nNeuer Eintrag: \n"; cout << "\nDein Name ist: \t"<<Person[iZahl].sName<<endl; cout << "Dein Wohnort ist: \t"<<Person[iZahl].sWohnort<<endl; cout << "Dein Alter ist: \t"<<Person[iZahl].sAlter<<endl; cout << "Deine Telefonnr ist: \t"<<Person[iZahl].sTelefon<<endl; cout << "Dein Email ist: \t"<<Person[iZahl].sEmail<<endl; cout << endl; } getch(); return 0; }
-
Danke für die Antworten.
Habe es nun hinbekommen, dass man eine Anzahl eingeben kann und er entsprechende viele Einträge vornimmt.Nun habe ich ein neues Problem:
Wenn ich meine Anzahl eingebe und mit den Eintragungen (Name, Wohnort, Email etc) beginnen möchte, lässt er beim ersten mal(nur beim ersten mal) Name aus und beginnt mit Wohnort:.
Wenn sich die Abfragen anschließend wiederholen, klappt es wunderbar und er fragt alles ab.
Wisst ihr wie ich das meine?
Screenshot: http://img10.imageshack.us/i/screenpbw.jpg/Code:
#include "stdafx.h" #include <iostream> #include <conio.h> #include <string> using namespace std; struct PersonTyp { string sName; string sWohnort; string sAlter; string sTelefon; string sEmail; }; void DatenAendern (PersonTyp &Person) { cout << "Name: "; getline(cin,Person.sName); cout << "Wohnort: "; getline(cin,Person.sWohnort); cout << "Alter: "; getline(cin,Person.sAlter); cout << "Telefon: "; getline(cin,Person.sTelefon); cout << "E-Mail: "; getline(cin,Person.sEmail); } int main() { int iAnzahl; cout << "Anzahl der Eintraege: "; cin >> iAnzahl; struct PersonTyp *Person = new PersonTyp[iAnzahl]; // Mit new anlegen int iZahl; for ( iZahl=0; iZahl<iAnzahl; iZahl++) { DatenAendern(Person[iZahl]); cout << "\nNeuer Eintrag: \n"; cout << "\nDein Name ist: \t"<<Person[iZahl].sName<<endl; cout << "Dein Wohnort ist: \t"<<Person[iZahl].sWohnort<<endl; cout << "Dein Alter ist: \t"<<Person[iZahl].sAlter<<endl; cout << "Deine Telefonnr ist: \t"<<Person[iZahl].sTelefon<<endl; cout << "Dein Email ist: \t"<<Person[iZahl].sEmail<<endl; cout << endl; } delete[] Person; getch(); return 0; }
-
Schreib bei der ersten Eingabe:
cin >> iAnzahl; cin.ignore(1,'\n');Um zu verstehen wieso das so ist, solltest du dich eingehender mit Streams befassen, was allgemein ein recht lohnendes Thema ist.
-
Bubby schrieb:
Code:
int iAnzahl; cout << "Anzahl der Eintraege: "; cin >> iAnzahl;cin >> iAnzahl liest nur die Zahl, also nicht mehr den Zeilenvorschub.
Bubby schrieb:
struct PersonTyp *Person = new PersonTyp[iAnzahl]; // Mit new anlegenDas wollen wir uns ganz schnell mal wieder abgewöhnen. Das "struct" ist in C++ hier überflüssig. Nimm
std::vector<PersonenTyp> Person; // oder besser "personen"Bubby schrieb:
int iZahl; for ( iZahl=0; iZahl<iAnzahl; iZahl++) {Person.push_back(PersonTyp()); DatenAendern(Person.back());Bubby schrieb:
cout << "\nNeuer Eintrag: \n"; cout << "\nDein Name ist: \t"<<Person[iZahl].sName<<endl; cout << "Dein Wohnort ist: \t"<<Person[iZahl].sWohnort<<endl; cout << "Dein Alter ist: \t"<<Person[iZahl].sAlter<<endl; cout << "Deine Telefonnr ist: \t"<<Person[iZahl].sTelefon<<endl; cout << "Dein Email ist: \t"<<Person[iZahl].sEmail<<endl; cout << endl; } delete[] Person;Das delete[] Person ist mit dem Vektor überflüssig. Toll, oder?
Gruß,
SP