wie kann man in eine variable erste eingegebene Zahl speichern?



  • Hallo Leute,

    ich muss ohne Array programmieren:
    Lesen Sie beliebig viele Zahlen (Abschluss mit 0) ein, und geben Sie das Maximum, das Minimum und den Mittelwert der eingegebenen Werte aus.

    wenn ich so mache gebe ich maximum der eingegebene zahle aus

    #include<iostream>
    using namespace std;
    
    int main(){
    
    	int max = 1, zahl = 1;
    
    	while(zahl != 0){
    		cin >> zahl;
    		if(zahl > max){
    			max = zahl;
    		}
    	}
    
    	cout << max << endl;
    	return 0;
    
    }
    

    danke



  • um die zahlen zu speichern nimmst du am besten einen std::vector. wie du ihn verwendest entnimmst du am besten einer referenz deiner wahl.



  • ich bin ganz ganz neu in programmierwelt und ich bin immernoch nicht bei arrays.



  • Du brauchst keinen std::vector und auch kein Array. (Bewertung des Beitrags von vario-500 daher -1)

    Wie sich das Maximum berechnen lässt, hast du bereits herausgefunden. Das Minimum geht analog dazu.
    Den Mittelwert kannst du mit summe/anzahl ausrechnen. Du musst also die Summe und die Anzahl in Variablen speichern.

    Was mit 0 gemacht werden soll, ist nicht ganz klar. So wie du es jetzt hast, kann 0 auch das Maximum sein, wenn die erste Eingabe -1 war. Falls du 0 dafür ignorieren willst, solltest du deine Schleife noch anpassen.



  • ich habe vor in min erste eingegebene zahl einzuspeichern und dann mit restliche vergleichen. Bei mir liefert min als 0

    #include<iostream>
    using namespace std;
    
    int main(){
    
    	int max = 1, zahl = 1 , min =1;
    
    	while(zahl != 0){
    		cin >> zahl;
    		min = zahl;
    		if(zahl > max){
    			max = zahl;
    		} 
    		if(min < zahl){
    			min = min;
    		}else{
    			min = zahl;
    		}
    	}
    
    	cout << max <<" " << min << endl;
    	return 0;
    
    }
    

  • Mod

    Da sind mehrere Logikfehler drin:

    1. Der Klassiker:
    Du machst:
    1. Eingabe prüfen, ggf. abbrechen
    2. Eingeben
    3. Eingabe verarbeiten
    4. Zurück zu 1.
    Jetzt rate mal, was wohl passiert, wenn die Eingabe (2.) eigentlich zum Abbruch (1.) führen würde.

    2. Ein weiterer Klassiker:
    Was ist, wenn niemals eine Zahl kleiner als 1 eingegeben wird? Oder größer als 1? Oder überhaupt keine Zahl? Die Anfangswerte von min und max solltest du nochmal überdenken.

    3. Die Zeilen 10-18:
    Ich glaube, du hast das Problem 2. schon gesehen und wolltest es lösen, aber: Häh? In Zeile 10 wird dein Minimum bei jedem Durchlauf überschrieben, Zeile 15 macht gar nichts und Zeile 17 wird genau dann ausgeführt, wenn es eigentlich falsch wäre. Außerdem kann Zeile 14 niemals true werden wegen Zeile 10.



  • wenn ich in min und max den ersten zahl speichere, wie kann ich dann mit 2. vergleichen? welche wurde der 2. zahl?



  • khati schrieb:

    wenn ich in min und max den ersten zahl speichere, wie kann ich dann mit 2. vergleichen? welche wurde der 2. zahl?

    Nimm doch einfach für min Anfangs INT_MAX und für max INT_MIN (oder die Äquivalente aus numeric_limits ).


  • Mod

    khati schrieb:

    wenn ich in min und max den ersten zahl speichere, wie kann ich dann mit 2. vergleichen? welche wurde der 2. zahl?

    Zwei Ansätze:
    1. min und max mit einer sehr großen bzw. sehr kleinen Zahl initialisieren (z.B. mal eine Referenz zum Header limits gucken)
    2. Sonderbehandlung für die erste Eingabe. Falls die erste Eingabe nicht 0 ist, kann man dies als Startwert für min und max nehmen. Falls sie 0 ist gab es keine Zahlen aus denen ein Minimum, Maximum oder Mittelwert zu berechnen ist und man wird sowieso eine andere Meldung geben wollen als sonst.

    Die zweite Lösung ist allgemeiner und besser, die erste ist etwas einfacher. Vielleicht fällt dir aber selber noch was anderes ein.



  • Mist. Hab mir kurz seine Frage durchgelesen und schon was mit vector vorbereitet. Jetzt merk ich, dass er das aber wohl doch nicht brauchen wird. Aber ich hab da jetzt so viel getippt, ich poste das trotzdem mal. Vielleicht verbessert das ja sein Verständnis ein wenig..

    #include <iostream> //cout, cin
    #include <vector> //vector
    #include <algorithm> //sort
    
    int main()
    { //naechte Zeile: vgl http://www.willemer.de/informatik/cpp/cppnames.htm
        using namespace std; //vector, cout, cin und sort liegen im namensraum std, diesen Namensraum machen wir hier bekannt
        vector<int> zahlen; //vector repraesentiert ein dynamisches Array, in diesem Fall von ganzen Zahlen (int)
        cout << "Gebe beliebig viele Zahlen ein (mit 0 wird die Eingabe beendet):\n";
        for(int zahl; ; zahlen.push_back(zahl)) //for-schleife: for(Initialisierung; Test (hier leer, da innerhalb der Schleife
        {                               //getestet wird); Aktion (hier das Hinzufuegen einer weiteren Zahl zum vector)
            cin >> zahl;
            if(!cin.good() || zahl == 0) //cin.good() ist false, wenn cin im Fehlerstatus ist (zb. durch die Eingabe von etwas,
                break;                //das nicht zum Datentyp passt, der erwartet wurde, also Buchstabe/sonst was statt Zahl)
        } //das break bricht die Schleifenausfuehrung ab
        if(zahlen.empty()) // http://www.cplusplus.com/reference/stl/vector/empty/
        {
            cout << "Keine Zahlen zu verarbeiten.\n";
            cin.get(); //liest ein einzelnes Zeichen ein. Verhindert das abrupte schliessen der Konsole
            return 0; //Verlassen der main-Funktion
        }
        sort(zahlen.begin(), zahlen.end()); //sortiert die Zahlen, die im vector drin sind, von Kleinstes bis Groesstes
        cout << "Kleinste Eingabe: " << zahlen[0] //liefert das erste Element (man faengt bei 0 an zu Zaehlen) zurueck
             << "\nMittlere: " << zahlen[zahlen.size()/2] //zahlen.size() liefert die Anzahl der Elemente des vectors uzurueck
             << "\nGroesste: " << zahlen[zahlen.size()-1]; //bei einem sortierten Array ist das erste Element das Kleinste, die Mitte
        cin.get();                                     //das mittelgrosse und das letzte das groesste
    }
    


  • also in while schleige habe ich if(zahl !=0) gegeben und habe summe der zahle und anzahl der zahle richtig gezählt. Vieleicht wird wegen min und max auch in meinem koft was erleuchtert

    respekt zu euch allen. Es ist echt harte arbeit programmieren zu lernen



  • ist der code für max und avg berechnung richtig?ausgabe wird gewünschte geliefert, aber ob man trotzdem anderes schreiben sollte?

    könnt ihr einen Tipp wegen min geben?

    #include<iostream>
    using namespace std;
    
    int main(){
    
    	int max = 0, zahl = 1 , anzahl = 0, sum = 0;
    	double avg;
    
    	while(zahl != 0){
    
    		cin >> zahl;
    
    		if(zahl !=0){
    			++anzahl;
    			sum +=zahl;
    
    			if(zahl > max){
    				max = zahl;
    			} 	
    
    		}
    
    	}
    
    	avg = sum/anzahl;
    
    	cout << " mittelwert ist " << avg <<"\n " <<"maximum ist " << max <<"\n " ;
    	return 0;
    
    }
    


  • Mach doch einfach analog zu der einen if-Abfrage eine andere, die dasselbe für min macht. Also statt max min und statt > <.
    Und ich geh mal davon aus, dass du das hier einfach ignoriert hast

    Incocnito schrieb:

    Mist. Hab mir kurz seine Frage durchgelesen und schon was mit vector vorbereitet. Jetzt merk ich, dass er das aber wohl doch nicht brauchen wird. Aber ich hab da jetzt so viel getippt, ich poste das trotzdem mal. Vielleicht verbessert das ja sein Verständnis ein wenig..

    #include <iostream> //cout, cin
    #include <vector> //vector
    #include <algorithm> //sort
    
    int main()
    { //naechte Zeile: vgl http://www.willemer.de/informatik/cpp/cppnames.htm
        using namespace std; //vector, cout, cin und sort liegen im namensraum std, diesen Namensraum machen wir hier bekannt
        vector<int> zahlen; //vector repraesentiert ein dynamisches Array, in diesem Fall von ganzen Zahlen (int)
        cout << "Gebe beliebig viele Zahlen ein (mit 0 wird die Eingabe beendet):\n";
        for(int zahl; ; zahlen.push_back(zahl)) //for-schleife: for(Initialisierung; Test (hier leer, da innerhalb der Schleife
        {                               //getestet wird); Aktion (hier das Hinzufuegen einer weiteren Zahl zum vector)
            cin >> zahl;
            if(!cin.good() || zahl == 0) //cin.good() ist false, wenn cin im Fehlerstatus ist (zb. durch die Eingabe von etwas,
                break;                //das nicht zum Datentyp passt, der erwartet wurde, also Buchstabe/sonst was statt Zahl)
        } //das break bricht die Schleifenausfuehrung ab
        if(zahlen.empty()) // http://www.cplusplus.com/reference/stl/vector/empty/
        {
            cout << "Keine Zahlen zu verarbeiten.\n";
            cin.get(); //liest ein einzelnes Zeichen ein. Verhindert das abrupte schliessen der Konsole
            return 0; //Verlassen der main-Funktion
        }
        sort(zahlen.begin(), zahlen.end()); //sortiert die Zahlen, die im vector drin sind, von Kleinstes bis Groesstes
        cout << "Kleinste Eingabe: " << zahlen[0] //liefert das erste Element (man faengt bei 0 an zu Zaehlen) zurueck
             << "\nMittlere: " << zahlen[zahlen.size()/2] //zahlen.size() liefert die Anzahl der Elemente des vectors uzurueck
             << "\nGroesste: " << zahlen[zahlen.size()-1]; //bei einem sortierten Array ist das erste Element das Kleinste, die Mitte
        cin.get();                                     //das mittelgrosse und das letzte das groesste
    }
    


  • so wie du gesagt hast, habe ich schon gemacht, aber liefert min als 0

    ja das war echt nett mit dem tipp aber ich muss ohne vectoren und arrays machen



  • Ah okay.

    Zu min: Logisch, wenn du min mit 0 initialisierst und dann keine Zahl kleiner als 0 eingibst, bleibt min halt 0. Du musst min mit einem möglichst großen Wert initialisieren, am besten mit dem großtmöglichen. Wie das geht einfach mal googlen, ist nicht schwer und wurde hier auch schon erwähnt.



  • Icognito, findest du es nicht ziemlich ineffizient, das gesamte Array zu sortieren wenn nur zwei Werte relevant sind!?



  • danke , danke, danke
    es hat geklappt
    mit min = 2147483647;



  • Sone schrieb:

    Incocnito, findest du es nicht ziemlich ineffizient, das gesamte Array zu sortieren wenn nur zwei Werte relevant sind!?
    Außerdem wird bei dir in Z. 24 so gut wie nie der Durchschnitt geliefert (nur bei Sonderfällen wie 1, 2, 3 usw.).

    Erstmal bin ich am Anfang davon ausgegangen, dass min, max und mid herausgefunden werden sollen, also der kleinste, der groesste und der Wert, der halt ungefähr genau so viele Größere wie Kleinere Werte aus der Eingabe hat (geht bei geraden Eingaben natürlich schlecht).

    Und um Effizienz brauchen wir uns bei den paar Werten, die da eingeben werden auch keine Sorge machen; selbst bei 10.000 Eingaben bräuchte sort auch auf richtig lahmen PC's nur nen Bruchteil einer Sekunde (außerdem fällt mir auf die Schnelle auch nichts ein, wie man sonst den mittleren Wert herausfinden könnte..).



  • Ja, ich hab zu spät gemerkt dass du ja gar nicht den Durschnitt wolltest *facepalm * 🙂 😃


Log in to reply