Code review - mein Programm spinnt ein bisschen



  • Hallo,

    ich bin gerade dabei C++ zu lernen und hab mein erstes, etwas größeres Programm geschrieben um die Sache mmit den Arrays und Strukturen zu üben. Das Programm funktioniert auch schon ganz gut, aber folgendes eben nicht:

    1.)
    Wenn ich in Zeile 66 als Eingabe einen Buchstaben eingebe, spielt das Programm verrückt -> Es hört nicht mehr auf sich selbst aufzurufen.
    Hat das irgendwas mit dem Array zu tun?

    2.)
    Bei der Ausgabe in den Zeilen 41 und 53 steht hinter Alter immer eine Null ("Alter = 0"), da soll jedoch gar nichts stehen, wenn das Array an dieser Stelle nicht belegt wurde.

    Wisst ihr vielleicht wie man diese Probleme behebt?

    Das Programm ist im Grunde eine Liste, die beliebig erweitert werden kann und man darf sich aussuchen, ob jeweils nur eine Person angezeigt wird oder die ganze Liste.

    #include <cstdlib>
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    // globale Variablen
    
     struct Adresse
        {
    
           string name;
           int Alter;
        };
    
     const int Anzahl = 10;
     Adresse Person[Anzahl];
    
     int Auswahl;
    
      //globale Variablen 
    
    // Funktionen
    
     //einzeln_anzeigen()
     void einzeln_anzeigen()
     {
       int Auswahl;
    
       do
        {
        cout << "Auswahl (1 - 10): ";
        cin >> Auswahl;
        Auswahl--;
    
        }while (Auswahl < 0 || Auswahl > 10);
        cout << endl;
        cout << "Name: " << Person[Auswahl].name << endl;
        cout << "Alter: " << Person[Auswahl].Alter << endl << endl;
     }
     //einzeln_anzeigen()
    
     //alle_anzeigen()
     void alle_anzeigen()
     {
          int i;
    
          for (i=0; i<Anzahl; i++)
          {
              cout << "Name: " << Person[i].name << endl;
              cout << "Alter: " << Person[i].Alter << endl << endl;
          }
     }
       //alle_anzeigen()
    
       //Personen_hinzufügen()
       int Zaehler = 3; //Darf nicht in Funktion stehen
       int Personen_hinzufuegen()
     {
          cout << "Name: ";
          cin >> Person[Zaehler].name;
    
          cout << "Alter: ";
          cin >> Person[Zaehler].Alter;
    
          Zaehler++;      //Array Stelle +1, damit keine
                          //Stelle doppelt beschrieben wird
    
          return Zaehler;
      }
      //Personen_hinzufügen()
    
    // Funktionen
    
    int main(int argc, char *argv[])
    {
    
         struct Adresse
        {
           string name;
           int Alter;
        };
    
        int waehle;
    
        //Menü
        do   //Do-While Schleife zum Beenden des Programms
        {
        cout << "***P E R S O N E N V E R Z E I C H N I S***" << endl;
        cout << "-------------------------------------------" << endl << endl;
        cout << "1 - Personen einzeln anzeigen" << endl << endl;
        cout << "2 - Alle Personen anzeigen" << endl << endl;  
        cout << "3 - Neue Personen hinzufuegen" << endl << endl;
        cout << "4 - Programm beenden" << endl << endl;
        cout << "Auswahl: ";
    
        //Menü
    
       //Personen
       Person[0].name = "Kay";
       Person[0].Alter = 18;
    
       Person[1].name = "Mark";
       Person[1].Alter = 24;
    
       Person[2].name = "Max Mustermann";
       Person[2].Alter = 52;
       //Personen
    
       //Menü-Steuerung
    
       cin >> waehle;
       cout << endl;
    
          switch (waehle)
          {
              case 1:
                   einzeln_anzeigen();
                   break;
              case 2:
                   alle_anzeigen();
                   break;
              case 3:
                   Personen_hinzufuegen();
                   break;
           }
       }while(waehle != 4);  ////Do-While Schleife zum Beenden des Programms
    
        //Menü-Steuerung
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Grüße,

    Kay



  • 1.)
    Wenn ich in Zeile 66 als Eingabe einen Buchstaben eingebe, spielt das Programm verrückt -> Es hört nicht mehr auf sich selbst aufzurufen.
    Hat das irgendwas mit dem Array zu tun?

    Du liest dort in eine Integer-Variable ein.
    Was hast du erwartet, was passiert, wenn dort ein Buchstabe oder sogar ein String reingepackt werden soll?

    Das das zumindest Probleme gibt, sollte dir klar sein.



  • zu 1.:
    Ich glaube das liegt daran, dass Alter nunmal vom Typ int ist und wenn du nen Buchstaben eingibst, kanns das net verarbeiten!

    zu 2.:
    mach einfach:
    if(Person[Auswahl].Alter != 0)
    {
    cout << Person[Auswahl].Alter;
    }

    ich glaube das geht...und es wird wohl keiner eine Person anlegen, die 0 Jahre alt ist 😛



  • Finn schrieb:

    zu 1.:
    Ich glaube das liegt daran, dass Alter nunmal vom Typ int ist und wenn du nen Buchstaben eingibst, kanns das net verarbeiten!

    Klar kann das Zeichen als Integer "verarbeitet" werden. Dann wird halt der ASCII-Code dargestellt.



  • Danke euch!

    Nur, wie kann ich umgehen das Jemand einen Buchstaben eingibt bei der Integer Variable? Kann man alle Buchstaben in einem Ausdruck zusammenfassen?

    also wie folgt:

    Wenn ... .Alter ein Buchstabe ist... geht es nicht.

    Ich möchte es irgendwie umgehen alle Buchstaben aufzulisten. 😉



  • Kay schrieb:

    Nur, wie kann ich umgehen das Jemand einen Buchstaben eingibt bei der Integer Variable? Kann man alle Buchstaben in einem Ausdruck zusammenfassen?

    Naja, der Integer-Datentyp ist hier wohl ungeeignet, da die ASCII-Werte von 65-90 ein Zeichen repräsentieren und gleichzeitig ein mögliches Alter seien könnten. Ich empfehle dir einen char(acter) oder std::string. Da könntest du durch das Array iterieren und überprüfen ob es ein Zeichen beinhaltet.



  • Hm du könntest statt int Alter, int Alter[2] nehmen und dann

    if(Alter[1] != 1 || Alter[1] != 2 /*und so weiter..bis:*/|| Alter[2] != 0)
    {
        //Fehler
    }
    

    Dann müssteste halt die zahlen von 0-9 abfragen für Alter[1] und Alter[2] und umgehst damit, dass was anderes weiterverarbeitet wird!
    Das is natürlich recht unschön...vllt. hat ja wer was schöneres 😃


  • Mod

    Das kann man so machen:

    int Alter;
      while(!(cin>>Alter)){                  // Auf Fehler prüfen
        cout<<"Das war keine Zahl!"<<endl;   // Wenn ein Fehler gemacht wurde:
        cin.clear();                         // Fehlerflags löschen
        cin.ignore();                        // Nächstes Zeichen ingorieren
      }
    


  • So... das Problem wäre gelöst, hab es erstmal mit SeppJ´s Variante gemacht. 🙂

    Jetzt aber nochmal zu den Nullen... Also das Programm gibt automatisch immer eine Null hinter Alter aus wenn ich die Stelle im array aufrufe, obwohl ich nirgendswo gesagt habe, dass da eine Null hin soll. Da soll wie gesagt gar nichts stehen, sofern kein Alter angegeben wurde.



  • Wenn du nicht willst, dass da eine 0 steht, dann zeig "Alter" einfach nicht an. Irgendeinen Wert muss ja die Integer-Variable haben. Und das ist im Debug-Modus standardmäßig 0, wenn du nichts anderes definiert hast.



  • Ok, dann guck ich mal dass der nur die ausspuckt wo was eingetragen wurde.

    Jetzt hab ich aber noch grad gesehen, dass bei der Variante:

    while(!(cin>>Person[Zaehler].Alter)){
                cout << "Das war keine Zahl" << endl;
                cin.clear();
                cin.ignore();
    }
    

    Es wird immer so oft "Das war keine Zahl" ausgeschrieben, wie Zeichen die ich eingebe. Ich möchte aber auch bei einem langen Namen, zum Beispiel "Max Mustermann", nur eine Warnung bekommen und nicht 14, geht das?


  • Mod

    Kay schrieb:

    Es wird immer so oft "Das war keine Zahl" ausgeschrieben, wie Zeichen die ich eingebe. Ich möchte aber auch bei einem langen Namen, zum Beispiel "Max Mustermann", nur eine Warnung bekommen und nicht 14, geht das?

    Ja natürlich, du musst einfach nur ein bisschen simple Programmlogik dazumachen, die die Meldung nur beim ersten Durchlauf der Schleife anzeigt. Dies umzusetzen überlasse ich aber dem geneigten Leser.


Anmelden zum Antworten