Neuling



  • Hallo zusammen,

    ich lerne gerade in der Technikerschule C++ und bin auch sofort auf ein Problem gestossen. Wir haben folgende Aufgabe bekommen:
    - Eine Funktion soll 10 Zahlen von Tastatur einlesen und anschließend den größten/kleinsten Wert ausgeben.

    Ich habe mal wie folgt angefangen:

    #include "stdafx.h"
    #include <stdio.h>
    #include <conio.h>
    #include <math.h>

    int _tmain(int argc, _TCHAR* argv[])
    {

    int x,anzahl;
    double zahl,summe=0.0,mittelwert,klein=0,gross=0;

    printf("\nWieviel Werte wollen Sie eingeben: ");
    scanf("%i",&anzahl);
    printf("\n");
    for(x=1; x<=anzahl; x++)
    {
    printf("Bitte %i. Zahl eingeben: ",x);
    scanf("%lf",&zahl);
    //summe=summe+zahl;

    }
    for(gross > zahl;;)

    //printf("\n\nSumme der Zahlen = %f",klein);
    printf("\nGroeste der Zahlen = %f",gross);

    getch();

    return 0;
    }

    habe aber keine Ahnung wie ich weiter machen soll. Wenn ich den Mittelwert oder die Sunmme ausrechnen müßte das würde ich hinbekommen. Wir müßen die Aufgabe mithilfe von for, while oder do-Schleifen lösen, da wir gerade dieses Thema behandeln. Ich danke euch mal im Voraus für eure Hilfe............



  • Leg außerhalb der Schleife eine Variabel an die das Maximum beinhaltet. In der Schleife gehst du dann jede Zahl durch. Wenn die Zahl größer als das bisherige Maximum setzt du das Maximum auf den Wert der jeweilige Zahl. Wenn nicht tust du nichts. Am Ende der Schleife hast du dann das gesamte Maximum.



  • 1. Bitte bitte benutze in Zukunft etwas ausagekräftigere threadtitel! Danke.
    2. Was du da machst ist eher C. In C++ benutzt man cout und cin aus iostream zur ein bzw. ausgabe (auch die header sind alle aus C).

    3. zu deinem problem: überleg mal ob du dir den bisher größten/kleinsten wert merken kannst. (Wie würdest du den die Aufgabe manuell lösen?)

    Gruß
    Fencer

    Ps: Deine main funktion ist nicht standardgemäß ([cpp]int main(int argc,char* argv[])

    EDIT: Löst doch nicht immer Hausaufgaben für andere. Grad bei so einer Aufgabe ist der Lerneffekt dann gleich 0.



  • erste zahl merken, rest durchgehen und wenn eine zahl kleiner als die gemerkte ist diese merken



  • Am einfachsten wäre natürlich für jede Zahl eine Variable anzulegen und diese dann miteinander vergleichen. Aber dadurch würde denke ich der Code unnötig groß werden, und mit der Schleifenthematik beim Einlesen hat das auch nichts zu tun, oder ????



  • Lies mal genau durch was gesagt wurde! 2 vars genügen

    btw: Aus Interesse: Lernt ihr diesen Stil (printf,scanf,deklaration von main...) bei euch in der Schule? 🙂



  • Ja Fencer, den Stil lernen wir................ Unsere Lehrerin hat sogar den Doktortitel



  • danke. (ist aber trotzdem eher C 😉 )



  • Ja, wir haben auch mit c angefangen.
    Das mit dem Einlesen der Zahlen kann ich aber auch so lassen, oder ?????



  • Achso, ich war etwas verwirrt weil du C++ geschrieben hast.:)

    wenn das in ordnung geht, kannst du es so lassen.

    Ich hätte das aud diese Weise gemachtgemacht:

    #include<iostream>
    using namespace std;
    ....
    int zahl;
    cin>>zahl;//einlesen
    cout<<zahl<<endl;//ausgeben
    


  • Jetzt ist es auch C++.

    Und wie würdest Du dann weitermachen ? Ich steh grad echt voll auf dem Schlauch. Habe den ganzen Mittag gelernt und denke, dass da jetzt irgendwo ne Blokade ist.....



  • okay weil ich heute meinen guten tag hab und obwohl das schon 3 mal (!!!) gesagt wurde.

    Definiere am anfang eine variable max und eine min.
    Schleife 10 mal:
    Zahl einlesen.
    Wenn größer als max /kleiner als min --> max bzw. min ersetzen

    nach der schleife:
    max und min ausgeben.

    fertig. Code ist nicht im preis inbegriffen 😉

    Programmieraufwand: 5-30 minuten



  • Danke Fencer,

    meinst Du mit folgender Zeile:

    Wenn größer als max /kleiner als min --> max bzw. min ersetzen

    das hier:

    Wenn größer als max geteilt durch kleiner als min --> max bzw. min ersetzen ,

    oder wie meinst Du das genau ?????????????



  • Jetzt dachte ich das geht mit nem 4 Zeiler, aber wieso ist int einlesen so umständlich? 😡

    #include<iostream>
    #include<set>
    
    int main()
    {
    	std::set<int> m;
    	for(int i = 0;i<10;i++){
    		int n;
    		std::cin>>n;
    		m.insert(n);//gibts hier eigentlich nix um direkt nen int zu bekommen ohne ihn so umständlich mit >> rauszuholen?
    	}
    	std::cout<<"min"<<*m.begin()<<"max"<<*m.rbegin();
    }
    


  • / ist als "bzw." gemeint



  • Also mit 10 Werten hab ichs auch nicht kürzer hinbekommen...
    Hier braucht man halt STRG+Z um das eof anzugeben... (kA, was man in der Unix-Welt drücken müsste^^)

    #include <algorithm>
    #include <iostream>
    #include <iterator>
    #include <set>
    
    int main()
    {
    	std::set<int> values;
    	values.insert(std::istream_iterator<int>(std::cin), std::istream_iterator<int>());
    	std::cout << "min: " << *values.begin() << "; max: " << *values.rbegin() << std::endl;
    }
    

    Es wäre einfach, wenn es copy_n gäbe - aber aus irgend nem Grund gibts das nicht... Aber hauptsache es gibt 20Milliarden replaces bei string...

    #include <algorithm>
    #include <iostream>
    #include <iterator>
    #include <vector>
    
    int main()
    {
    	std::vector<int> values;
    	std::copy_n(std::istream_iterator<int>(std::cin), std::back_inserter(values), 10); //(src, dest, count)
    	std::sort(values.begin(), values.end());
    	std::cout << "min: " << *values.begin() << "; max: " << *values.rbegin() << std::endl;
    }
    

    PS:
    ist hieran irgendwas falsch?

    #include <iostream>
    #include <iterator>
    #include <set>
    
    int main()
    {
    	std::set<int> values(std::istream_iterator<int>(std::cin), std::istream_iterator<int>());
    }
    

    MSVC 9 schrieb:

    error C2751: 'std::cin' : the name of a function parameter cannot be qualified



  • unskilled schrieb:

    PS:
    ist hieran irgendwas falsch?

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-250511.html ist das selbe Problem.


  • Mod

    @unskilled: Mit std:sort schießt du weit über das Ziel hinaus, da nur Maximum und Minimum gesucht werden. Es gibt ja in algorithm auch Algorithmen dafür.



  • @Ryuzaki: ach ja - hatte ich so gar gelesen, aber schon wieder verdrängt^^
    @SeppJ: stimmt - hatte die aufgabenstellung schon wieder vergessen : D

    also:

    #include <algorithm>
    #include <iostream>
    #include <iterator>
    #include <vector>
    
    int main()
    {
        std::vector<int> values;
        std::copy_n(std::istream_iterator<int>(std::cin), std::back_inserter(values), 10);
        std::cout << "min: " << *std::min_element(values.begin(), values.end())
                << "; max: " << *std::max_element(values.begin(), values.end()) << std::endl;
    }
    

    bb


  • Mod

    Ausgezeichnet, das sollte die Referenzlösung sein, wenn in ein paar Tagen der nächste diese Frage stellt. 👍


Anmelden zum Antworten