Additionsfunktion mit Vector



  • Guten Tag,

    Ich hatte vor eine gewöhnliche Additionsfunktion zu erstellen, wobei der Benutzer gewöhnliche Zahlen eingibt und falls ein "=" erkannt wird sollen diese Zahlen addiert und das Ergebnis ausgegeben werden.

    Meine Überlegung war, dass ich mit einer if-Anweisung überprüfe ob das eingegebene Zeichen ein = ist oder nicht. Falls nicht sollen die Zahlen in einen Vector gespeichert werden. Sobald ein = erkannt wird werden die einzelnen Zahlen des Vectors addiert und das Ergebnis ausgegeben...

    Nunja, an der Umsetzung scheitert es...

    Ziel ist letztenendes die Addition beliebig vieler Zahlen ohne vorher festlegen zu müssen wie viele es sind. Vielleicht ist meine Idee auch komplizierter gedacht als es sein müsste...

    Vielen Dank für eure Hilfe 🙂

    double Zahl;
    double Erg;
    vector <double> Zahlen;
    
    	//Nehme ich hier am besten eine While-Schleife damit die IF-Anweisung immer wieder aufgerufen wird?
    	cin >> Zahl;
    	if (Zahl != '=')
    	{
                Zahlen.push_back;
    	}
    	else 
    	{
    		//Hier sollen die Zahlen des Vectors addiert und Das Ergebniss (Erg) ausgegeben werden.
    		//Allerdings weiß ich nicht wie ich das anstelle...
    	}


  • std::accumulate wäre eine Idee.



  • @deaster sagte in Additionsfunktion mit Vector:

    if (Zahl != '=')

    Ein = in der Eingabe wird nie in ein double eingelesen.

    Warum willst du die Zahlen in einen Vector packen? Einfach gleich addieren und gut iss.



  • @Pikkolini Danke.. die Accumulate funktion kannte ich noch nicht 🙂
    @manni66 1. Naja dann dürfte es ja trotzdem ungefähr so funktionieren wie ich das möchte, oder verstehe ich da was falsch? 2. Ja deshalb frage ich... Ich denke oftmals Komplizierter und Umständlicher als es sein müsste..

    Hab jetzt accumulate benutzt und konnte auch fast alle Fehler beseitigen... Das mit dem push_back hab ich wohl noch nicht so verstanden^^

    double Zahl;
    double Erg;
    vector <double> Zahlen;
    	
    	cin >> Zahl;
    	if (Zahl != '=')
    	{
    		Zahlen.push_back;  //"Keine Standartsyntax; "&" zum Erstellen eines Verweises auf das Member verwenden" (Fehlercode C3867) Heißt das ich muss einen Pointer verwenden?
    	}
    	else
    	{
    		Erg = accumulate(Zahlen.begin(), Zahlen.end(), 0);
                    cout << Erg;
    	}


  • push_back ist eine Klassenfunktion, den sie benötigt ja einen Parameter (nämlich was hinzugefügt werden soll):

    Zahlen.push_back(Zahl);
    

    Und so wie @manni66 schon schrieb, ist deine Abfrage so unsinnig.
    Da laut ASCII-Tabelle das Gleichheitszeichen = den Wert 61 (0x3D) hat, würde also bei Eingabe dieses Wertes der else-Zweig ausgeführt.

    Daher müßtest du einen string einlesen und diesen abtesten:

    std::string eingabe;
    cin >> eingabe;
    
    if (eingabe != '=')
    {
       double zahl = stod(eingabe); // Umwandlung string -> double
       Zahlen.push_back(zahl);
    }
    else
    {
       // ...
    }
    

    Falls du weitere Fehler bei der Umwandlung abfangen willst, dann s. stod ("Exceptions").



  • Was dann noch fehlt wäre die Behandlung von Fehlern beim Einlesen der Strings:

    std::string eingabe;
    std::cin >> eingabe;
    if (!std::cin)
    {
        // Fehler (vermutlich end-of-file) behandeln
    }
    else if (eingabe != '=')
    {
       double zahl = stod(eingabe); // Umwandlung string -> double
       Zahlen.push_back(zahl);
    }
    else
    {
       // ...
    }
    


  • Ich würde einfach eine einzige double Variable aufaddieren während Du die Zahlen einließt und halt bei einem '=' die Summe ausgeben und zurücksetzen. Beispielsweise so:

    int main()
    {
        using namespace std;
        cout << "Zahlen eingeben ('q' zum Beenden):\n";
        for (double sum = 0;;) {
            if (double n; cin >> n) {
                sum += n;
            } else  {
                cin.clear();
                switch (cin.get()) {
                case '=':
                    cout << "Summe: " << sum << '\n';
                    sum = 0;
                    break;
                case 'q':
                    return 0;
                default:
                    cin.ignore(numeric_limits<streamsize>::max(), '\n');
                    cout << "Fehlerhafte Eingabe!\n";
    // man könnte sum zuruecksetzen
                }
            }
        }
    }
    


  • Vielen Dank für die ganzen Antworten 🙂

    Die Vector Variante hat direkt funktioniert. Jedoch habe ich nun ein anderes Problem.. Als ich die funktion in eine Klasse gepackt habe (nichtmehr in die main) kommt ständig der Fehler: "Bezeichner 'Addieren' wurde nicht definiert" sowie "Addieren: Bezeichner wurde nicht gefunden"

    Arbeite seit kurzem mit VisualStudio und nichtmehr netbeans. Muss man da irgendwas beachten um funktionen aus anderen klassen verwenden zu können?



  • Meine Glaskugel sagt ja.



  • @deaster Am besten ein reduziertes Beispiel deines Codes reinstellen, das den Fehler reproduziert. Meine Fehlermeldung lautet nämlich genau gleich: "Bezeichner 'Addieren' wurde nicht definiert" :o)



  • Ok ich bin einfach nur zu blöd gewesen^^

    @HarteWare Hätte zu deinem code eine frage... Wenn etwas anderes als ein double wert eingegeben wird müsste es doch ins else springen und dort dann überprüfen... falls es sich nicht um '=' oder 'q' handelt müsste es ins default springen oder? Bei mir jedenfalls wird die default ausgabe nicht gemacht und das programm läuft weiter aber erkennt keine eingaben mehr.



  • @deaster

    Bei mir

    Wird wohl eher am Code als am Ort liegen.



  • Dann debugge doch mal deinen Code.
    Und Ideone-Code mit passenden Eingabewerten liefert das erwartete Verhalten:
    "1 2 = abc d e 3 4 = x yz q"

    =>

    Summe: 3
    Fehlerhafte Eingabe!
    Fehlerhafte Eingabe!
    Fehlerhafte Eingabe!
    Summe: 7
    Fehlerhafte Eingabe!



  • Bei mir funktioniert es sowohl unter Linux, als auch unter Windows. Wobei man v. a. für Windows noch auf eof() prüfen könnte, damit auch bei einem CTRL+Z das Programm richtig terminiert. Genauso macht es evtl. auch keinen Sinn, bei std::cin.bad() noch eine Recovery-Aktion zu starten. Tut mir leid, dass es buggt^^

    Bin offen für Verbesserungsvorschläge (evtl. erst einen char einlesen und dann entscheiden, bei Ziffer, Punkt oder Minus unget() und dann double einlesen?). Sollte nur eine Anregung sein vom Prinzip her.

    LG