dynamische struktur arrays



  • #include "stdafx.h"

    struct datum
    {
    int tag;
    char monat[10];
    int jahr;
    };

    struct kategorie
    {
    int lauflaenge;
    float laufzeit;
    };

    typedef struct wettkampf
    {
    struct datum zeitpunkt;
    struct kategorie daten;
    char ort[51];
    };

    wettkampf eingabeNeuerWettkampfDaten()
    {
    wettkampf help;
    system("cls");
    cout << "NEUE WETTKAMPFDATEN" << endl;
    cout << "Bitte geben Sie den Tag ein (int): ";
    cin >> help.zeitpunkt.tag;
    cout << "Bitte geben Sie den Monat ein (int): ";
    cin >> help.zeitpunkt.monat;
    cout << "Bitte geben Sie das Jahr ein (int): ";
    cin >> help.zeitpunkt.jahr;
    cout << "Bitte geben Sie die Laufzeit ein (float): ";
    cin >> help.daten.laufzeit;
    help.daten.lauflaenge = 100;

    return help;
    }

    void neuerWettkampf(wettkampf **liste, int *anz)
    {
    (*anz)++;
    liste[*anz-1]= new wettkampf;
    wettkampf help = eingabeNeuerWettkampfDaten();
    liste[*anz-1] = &help;
    }

    int ausgabeAllerWettkampfdaten(wettkampf **liste, int anz)
    {

    return 0;
    }

    void main(void)
    {
    int anz = 0;
    wettkampf *liste;
    char auswahl;

    cout << "Beispiel zur Verwaltung der Wettkampfdaten eines Sportlers in einem dynamischen Strukturarray." << endl;
    getche();

    do
    {
    system("cls");
    cout << "1. Neuer Wettkampf\n" << endl;
    cout << "2. Ausgabe aller Wettkampfdaten\n" << endl;
    cout << "3. Ausgabe spezieller Wettkampfdaten\n" << endl;
    cout << "4. Ausgabe aller Bestzeiten\n" << endl;
    cout << "5. Ende\n" << endl;
    cout << "Bitte Auswahl eingeben: " << endl;
    auswahl = getche();

    switch(auswahl)
    {
    case '1': neuerWettkampf(&liste, &anz); break;
    case '2': ausgabeAllerWettkampfdaten(&liste,anz); break;
    case '3': break;
    case '4': break;
    }

    }
    while (auswahl != '5');

    }

    BITTE HILFE SOBALD ICH DAS ZWEITE MAL WETTKAMPFDATEN EINGEBE HÄNGT ALLES
    thx angelus2snd



  • So, damit sich das mal jemand auch durchließt (Code Tags)

    zuerst mal nur mit kommentaren

    #include <iostream>
    using namespace std;
    
    struct datum
    {
       int tag;
       char monat[10]; //wieso nicht std::string?
       int jahr;
    };
    
    struct kategorie
    {
       int lauflaenge;
       float laufzeit;
    };
    
    typedef struct wettkampf //willst du sicher ohne typedef haben, oder? (achtung, rhetorische frage)
    {
       struct datum zeitpunkt; //struct extra anzugeben ist nicht nötig
       struct kategorie daten; //dito
       char ort[51]; //ein string ist toll
    };
    
    wettkampf eingabeNeuerWettkampfDaten()
    {
       wettkampf help;
       system("cls"); //unportabel!
       cout << "NEUE WETTKAMPFDATEN" << endl;
       cout << "Bitte geben Sie den Tag ein (int): ";
       cin >> help.zeitpunkt.tag;
       cout << "Bitte geben Sie den Monat ein (int): ";
       cin >> help.zeitpunkt.monat;
       cout << "Bitte geben Sie das Jahr ein (int): ";
       cin >> help.zeitpunkt.jahr;
       cout << "Bitte geben Sie die Laufzeit ein (float): ";
       cin >> help.daten.laufzeit;
       help.daten.lauflaenge = 100;
    
       return help; //du gibst by value zurück. könnte eventuell etwas langsamer 
       //sein aber noch erträglich.
    }
    
    void neuerWettkampf(wettkampf **liste, int *anz)
    {
       (*anz)++; //wieso nicht anz als referenz übergeben?
       liste[*anz-1]= new wettkampf; //sicher, dass liste[*anz-1] auch existiert?
       wettkampf help = eingabeNeuerWettkampfDaten();
       liste[*anz-1] = &help; //du bist witzig... zuerst machst du einen
       //neuen wettkampf 2 zeilen weiter oben, und jetzt nimmst du dir einfach einen
       //lokalen vom stack? ->crash ist vorprogrammiert...
    }
    
    int ausgabeAllerWettkampfdaten(wettkampf **liste, int anz);
    
    void main(void) //es soll heißen int main. void main gibt es nicht.
    {
       int anz = 0;
       wettkampf *liste; //aha, wie ich mir gedacht habe. du stellst speicher
       //für einen einzigen zeiger zur verfügung, benutzt ihn aber wie ein array
       //kann nicht gutgehen.
       //mach lieber so was wie wettkampf **liste = new wettkampf * [ANZAHL];
       //oder arbeite am besten mit den STL-Containern!
       char auswahl;
    
       cout << "Beispiel zur Verwaltung der Wettkampfdaten eines Sportlers in einem dynamischen Strukturarray." << endl;
       getche(); //auch unportabel...
    
       do
       {
          system("cls"); //siehe weiter oben...
          cout << "1. Neuer Wettkampf\n" << endl;
          cout << "2. Ausgabe aller Wettkampfdaten\n" << endl;
          cout << "3. Ausgabe spezieller Wettkampfdaten\n" << endl;
          cout << "4. Ausgabe aller Bestzeiten\n" << endl;
          cout << "5. Ende\n" << endl;
          cout << "Bitte Auswahl eingeben: " << endl;
          auswahl = getche(); //quiek.. ist aber nicht das schlimmste hier in dem code...
    
          switch(auswahl)
          {
             case '1': neuerWettkampf(&liste, &anz); break;
             case '2': ausgabeAllerWettkampfdaten(&liste,anz); break;
             case '3': break;
             case '4': break;
          }
    
       }
       while (auswahl != '5');
    
    }
    

    ups... solltest dir vielleicht noch ein Buch kaufen...


Anmelden zum Antworten