Array einer Klasse



  • Hallo zusammen!

    Ich schreibe morgen eine Klausur in Informatik und hab heute mal ein bisschen gebastelt um wieder ein wenig in die Programmierung rein zu kommen. Hierbei habe ich eine Klasse (Daten) angelegt die ich mit Personendaten füllen will. Die zugehörigen Variablen habe ich "pers" genannt. Da ich immer wieder Personen dazu nehmen und auch wieder löschen will, wollte ich das Ganze über ein Array der Klasse lösen.
    Allerdings meckert mir mein Compiler immer, daß "pers" ein nicht deklarierter Bezeichner ist.

    Hier mal ein Auszug aus der main mit dem Funktionsaufruf:

    void main() {
    	int i=1;
    	char auswahl='q';
    	daten pers[30];
    	//Eingaben
    	do{
    	cout << "Zum beenden der Eingabe x beim Namen eingeben" << endl << endl;
    	daten pers[i];
    	pers[i].eingabe(i);
    	i++;
    	while(pers[i-1].name != 'x')
    	//Ende Eingabe
    

    und hier der Teil aus der Klasse mit der aufgerufenen Funktion "eingabe":

    class daten {
    public:
    	string name;
    	int alter;
    
    	daten(void){
    		name="xxx";
    		alter=0;
    	}
    	void eingabe(int i){
    		cout << "Person " << i << ": " << endl << "Name: ";
    		cin >> pers[i].name;
    		cout << endl << "Alter: ";
    		cin >> pers[i].alter;
    		system("cls");
    	};
    

    Wäre super, wenn mir jemand von Euch sagen könnte, was ich falsch mache!

    Ich sag schon mal im Vorraus Danke!

    Gruß
    Andreas



  • Was soll Zeile 8 deiner main-Funktion bewirken? Wo ist die schließende, geschweifte Klammer, um den do-Block zu schließen?



  • Und pers ist in der main-Methode definiert. Da hast Du in deiner Klassenmethode keinen Zugriff drauf. Außerdem heißt es int main() und nicht void main()... (void) ist unnötig und system ist nicht portabel.


  • Mod

    Schunki schrieb:

    Da ich immer wieder Personen dazu nehmen und auch wieder löschen will, wollte ich das Ganze über ein Array der Klasse lösen.

    Das ist eigentlich keine Argumentation aus der die Benutzung eines Arrays folgt, sondern im Gegenteil ein Argument dafür, eine dynamische Datenstruktur zu benutzen.



  • der code ist von vorne bis hinten komplett falsch und schlecht

    void main() {
        int i=1;
        char auswahl='q';
        daten pers[30]; // hier erstellst du ein array von deinen daten, ok
    
        do{ // schlechte formatierungen, rücke ein!!!
        cout << "Zum beenden der Eingabe x beim Namen eingeben" << endl << endl;
        daten pers[i]; // hier versuchst du ein neues array zu erstellen, mit dynamischer grösse da i nicht konstant ist (siehe oben)
        pers[i].eingabe(i); // hier versuchst du auf das erste array element zuzugreifen, schön und gut, aber der index fängt bei 0 an und geht bis n-1
        i++; // hier erhöst du i, ok
        while(pers[i-1].name != 'x') // erstens fehlt heir ein abschlissendes ';' und zweitens vergleichst du einen string mit einem char, das geht nicht
    
    class daten {
    public:
        string name;  // schonmal was von kapselung gehört? wenn ja dann lies dir das kapitel nochmal durch, wenn nein google mal
        int alter;
    
        daten(void){
            name="xxx"; // initialisierungsliste? wieso gibst du deinen daten den namen xxx??
            alter=0;
        }
        void eingabe(int i){ // diese methode kann nur auf den namen und das alter einer daten instanz zugreifen, wieso brauchst du hier ein i als paramter?
            cout << "Person " << i << ": " << endl << "Name: ";
            cin >> pers[i].name; // wo kommt denn hier ein array her??? wenn müsste es this->name heissen
            cout << endl << "Alter: ";
            cin >> pers[i].alter; // gleiche wie oben
            system("cls");
        };
    

    sorry kollege aber nimm dir nochmal ein buch deiner wahl (nicht galileo und nicht jürgen wolf!) und arbeite c++ nochmal durch
    für diesen code würde ich als lehrer nichtmals 10% der punkte geben...



  • für diesen code würde ich als lehrer nichtmals 10% der punkte geben...

    Das ist zu hart. In Klausuren auf Papier macht man zwangsläufig viele Fehler.

    Dennoch ist der Code natürlich schlecht und weist sehr viel Unverständnis, das will ich nicht wegreden.



  • Eisflamme schrieb:

    für diesen code würde ich als lehrer nichtmals 10% der punkte geben...

    Das ist zu hart. In Klausuren auf Papier macht man zwangsläufig viele Fehler.

    Ich kann dir nur aus dem Studium berichten, das eine eindeutig falsche Wahl der Datenstruktur (z.B. Array statt dynamischer Liste, obwohl die Klausur eindeutig nach einer dynamischen Datenstruktur verlangte) mehrere Noten Unterschied machen konnte.



  • Schnell gemacht, aber funktioniert und bestimmt ausbaufähig:

    #include <string>
    #include <vector>
    #include <iostream>
    using namespace std;
    
    class Daten
    {
    public:
        Daten()
        : m_age(0)
        {}
    
        Daten(const string& name, int age)
        : m_name(name), m_age(age)
        {}
    
        const string& getName() const { return m_name; }
        int getAge() const { return m_age; }
    
    private:
        int m_age;
        string m_name;
    };
    
    void eingabe(vector<Daten>& v)
    {
        int age = 0;
        string name;
        cout << "Name: " << endl;
        cin  >> name;
        cout << endl << "Alter: " << endl;
        cin  >> age;  
    
        Daten person(name, age);
        v.push_back(person);
    }
    
    void display(vector<Daten>& v)
    {
        vector<Daten>::iterator it = v.begin();
        for ( it; it != v.end(); it++ )
        {
            cout << "-----------------------" << endl;
            cout << "Name: " << it->getName() << endl;
            cout << "Alter:" << it->getAge() << endl;
            cout << "-----------------------" << endl;
        }
    }
    
    int main()
    {
        vector<Daten> vec;
        bool run = true;
    
        while ( run )
        {
            string choice;
            cout << "a - Neue Person anlegen" << endl;
            cout << "b - Personen anzeigen" << endl;
            cout << "c - Ende" << endl;
            cin  >> choice;
    
            if ( choice == "c" )
                run = false;
            else if ( choice == "b" ) 
                display(vec);
            else if ( choice == "a" )
                eingabe(vec);
    
        }
    
    }
    


  • asc:
    Vielleicht hatten die ja keine Container und der Lehrer will genau das? Offensichtlich ist es ja schon schwierig genug zu vermitteln, dass es int main statt void main heißt. Container kommen je nach Anordnung der Vorlesungsteile ganz am Ende, wenn man z.B. erstmal sämtliche syntaktische Grundlagen und Klassenteile ohne Container erklären möchte (oder selbst herleitet).



  • Eisflamme schrieb:

    Vielleicht hatten die ja keine Container und der Lehrer will genau das?

    Kann sein, wir kennen aber weder die Aufgabenstellung noch den Lehrer.

    Eisflamme schrieb:

    Offensichtlich ist es ja schon schwierig genug zu vermitteln, dass es int main statt void main heißt. Container kommen je nach Anordnung der Vorlesungsteile ganz am Ende,...

    Wenn überhaupt. Ich habe häufig genug erlebt das noch immer C mit Klassen im Unterricht behandelt wird, auf einen Stand von etwa 1990.



  • Schunki schrieb:

    ... Ich schreibe morgen eine Klausur ...

    Schunki schrieb:

    ...hab heute mal ein bisschen gebastelt ...

    !



  • Immerhin tut er was, komm schon 🕶


Anmelden zum Antworten