Klasse, Funktionen definiert => Kombination mit if-Statement



  • Hallo zusammen,

    ich habe eine Konsolenanwendung geschrieben und möchte, dass bei einer bestimmten Eingabe das Programm beendet wird.

    Was ich bisher habe sind:
    eine Klasse mit 3 Datenelementen (string für Datum, und 2 int für Messwerte)
    eine Funktion, die die Datenelemente abfragt und die Werte durch eine for-Schleife in einem Array speichert

    Ich bin relativ neu in der C++ Programmierung, deswegen meine Frage wie kann man das lösen? Schreibt man eine Funktion in die Klasse? Bzw. wo kommt das if hin? Und wie bringe ich C++ dazu dann nicht mehr nach den weiteren Elementen zu fragen?

    Vielen Dank im Voraus!


  • Mod

    Du solltest auf jeden Fall aufpassen, nicht alles in eine Funktion oder Codeblock zu packen. Deine Leseschleife darf nicht die Aufgabe bekommen, das Programm zu beenden. Sonst kannst du sie nie wieder in anderem Kontext benutzen. Besser also, dass die Schleife ihr Ding macht, sich gegebenenfalls beendet, und dann die Kontrolle wieder an den aufrufenden Code abgibt. Und der aufrufende Code kann dann, wenn er es so will, so aufgebaut sein, dass er erst die Leseschleife aufruft, und danach das Programm beendet.

    Typischer Beispielaufbau einer Leseschleife in C++:

    while (cin >> wert)
    {
       verarbeite(wert);
    }
    

    Dies beendet sich, wenn der Rückgabewert der Lesefunktion (hier im Beispiel cin >> wert) anzeigt, dass die letzte Leseaktion nicht erfolgreich war, etwa weil das Ende der Daten erreicht wurde, oder nicht zum erwarteten Format des Typs von wert passen.

    Oder wenn man zusätzlich auf bestimmte Werte prüfen und ggf. abbrechen will:

    while (cin >> wert)
    {
       if (wert == abbruchwert) 
           break;
       verarbeite(wert);
    }
    

    Wichtig dabei ist auch, dass die Prüfung, ob überhaupt eine gültige Eingabe erfolgte (das while (cin >> wert)), weiter vorhanden bleibt. Sonst verarbeitet/prüft man eventuell Mülldaten.



  • @SeppJ erstmal vielen Dank für die ausführliche Erklärung!

    Ein paar Erläuterungen zu meinem Programm:
    Also ich habe die Klasse "Wert" erstellt mit den Datenelementen: Datum, Messwertmorgens, Messwertabends.

    Diese werden über die Funktion "einenWert()" abgefragt. Return ist "Einzelwert".

    In einer for-Schleife "mehrereWerte()" werden diese abgefragten Werte in dem Array "MEHRWerte[ ]" abgespeichert. Return ist "index".

    Dann habe ich noch 2 void Funktionen: eine zeigt den Einzelwert an und gibt ihn an eine for Schleife ab die alle Werte anzeigt. Die letzte Funktion ist nachher in meiner main().

    Jetzt haben sich gerade einige neue Fragen ergeben:
    Die Lesefunktion ist dann "einenWert()"?
    Die Abfragefunktion ist dann "mehrereWerte()"?

    Und wie muss ich jetzt meine Abfragefunktion anpassen? Denn jetzt läuft sie bis zum vorher festgelegten Maxwert.
    int mehrereWerte(Wert MEHRWerte[], int nMaxGroesse)
    {
    int index;
    for(index = 0; index < nMaxGroesse; index++)
    {
    MEHRWerte[index] = einenWert();
    }
    return index;

    Vielen Dank im Voraus!



  • Dauert die Funktion denn so lange, daß der Anwender sie abbrechen muß?

    Wie sieht denn bisher (im groben) deine main-Funktion aus?



  • @Th69

    cout << "Liste eingegebene Werte: " << endl;
    Wert MEHRWerte[365];
    Int ncount = mehrereWerte(MEHRWerte, 365);
    anzeigenMEHRWerte(MEHRWerte, ncount);

    Return 0;

    Das ist die Main, es ist nicht dynamisch, weil ich auch noch nicht weiß wie ich das hinkriege. Also wenn es mehr als 365 Tage sind, muss ich wieder neustarten.

    Letztendlich soll der Benutzer beim Datum "beenden" schreiben und dann werden die Werte in eine txt Datei geschrieben.

    Wichtig ist aber auch, dass ich verstehe was mein Programm macht, weil ich noch ziemlich neu in c++ bin.

    Vielen Dank im Voraus!



  • @Sebastian_L hallo zusammen, kann mir bitte noch jemand helfen? Siehe oben.

    Vielen Dank im Voraus



  • Vielleicht solltest zuerst Mal echten C++ Code posten und keinen Pseudocode. Und den Originalquelltext am Besten auch mit Code-Tags formatieren (über den Textbox gibt´s eine Toolbox mit dem entsprechenden Symbol).
    Und dann erklär mal bitte, was du genau erreichen willst. Und bitte genau, was du erreichen möchtest, und nicht wie du es umsetzen möchtest.



  • @DocShoe hallo also hier ist mein Code bis jetzt:

    #include <iostream>
    
    class Wert
    {
    public:
        std::string Datum;
        int morgens;
        int abends;
    };
    
    Wert einenWert()
    {
        Wert Einzelwert;
        std::cout << "Bitte geben Sie ein Datum mit folgendem Format ein [TT.MM.JJJJ]: ";
        std::cin >> Einzelwert.Datum;
        std::cout << "Bitte geben Sie den Messwert für morgens ein : ";
        std::cin >> Einzelwert.morgens;
        std::cout << "Bitte geben Sie den Messwert für morgens ein : ";
        std::cin >> Einzelwert.abends;
    
        return Einzelwert;
    }
    
    int mehrereWerte(Wert MEHRWerte[], int nMaxGroesse)
    {
        int index;
        for(index = 0; index < nMaxGroesse; index++)
        {
            MEHRWerte[index] = einenWert();
        }
        return index;
    }
    
    
    
    
    
    
    void anzeigen1Wert(Wert Einzelwert)
    {
        std::cout << "Datum: " << Einzelwert.Datum << std::endl;
        std::cout << "morgens: " << Einzelwert.morgens << std::endl;
        std::cout << "abends: " << Einzelwert.abends << std::endl;
    }
    
    void anzeigenMEHRWerte(Wert MEHRWerte[], int nCount)
    {
        for(int index = 0; index < nCount; index++)
        {
            anzeigen1Wert(MEHRWerte[index]);
        }
    }
    
    
    int main()
    {
        std::cout << "Programm zum Eintragen von Messwerten" << std::endl << std::endl;
        Wert MEHRWerte[365];
        int nCount = mehrereWerte(MEHRWerte, 365);
        anzeigenMEHRWerte(MEHRWerte, nCount);
    
        return 0;
    }
    
    

    meine Fragen sind folgende:
    Wie und wo schreibt man den Code zum beenden der Schleife? Ich möchte gern, dass der Benutzer im Datum schreibt "beenden", dann werden die Daten in eine txt-Datei geschrieben und das Programm beendet. Und wie bekommt man es hin, dass diese Datei erstellt wird?

    Und wie kann man es dynamischer hinbekommen, wenn man z.B mehr als 365 Werte eintragen möchte?

    Wo kann ich z.B: Gültigkeitsprüfungen für das Datum hinschreiben?

    In einem C++ Buch habe ich etwas über Zeiger gelesen:
    ist z.B: int* Testvariable
    das gleiche wie int *Testvariable

    Vielen Dank im Voraus!



  • Für dynamische Arrays gibt es vector<...>.

    Und dann baust du deine Einlesefunktion entsprechend so um, wie @SeppJ es schon beschrieben hat (eigentlich würde man dafür dann auch einen eigenen überladenen Stream-Operator erstellen, aber das würdest du wohl ersteinmal noch nicht verstehen).
    Daher für dich:

    #include <vector>
    
    std::vector<Datum> werte;
    while (true)
    {
      Wert wert = einenWert(); // besserer Name wäre hier: leseWert o.ä.
      if (wert.Datum == "beenden")
        break;
    
      werte.push_back(wert);
    }
    
    // schreibe Datei mit allen Werten
    // ...
    

Log in to reply