Array - Arithmetisches Mittel - nur 2 Variablen - Hilfe



  • gläubiger schrieb:

    Nein, ich glaube die zweite Variable ist für die Eingabe.

    Oh, verflixt. Naja, dann halt fünfmal hinschreiben.

    gläubiger schrieb:

    cout << accumulate(istream_iterator<int>(cin), {}, 0)/5. << std::endl << std::flush;
    

    Deswegen empfehle ich meinem Arbeitgeber, keine Projekte mehr in C++ anzufangen, wenn kein sehr erfahrener Aufpasser dabei ist. Sozusagen wider besseres Wissen. C++ ist die allerallerbeste Sprache, um was sehr dickes zu schreiben. Leider sind die C++-Leute Leute, die meistens unlesbaren Code frickeln, obwohl gerade und nur C++ die Möglichkeit bietet, stets lesbar zu schreiben.



  • Danke für die zahlreichen Antworten!

    btw: Mir ist klar, dass das Menü eigentlich unnötig ist. Ich habe es aus esthetischen Gründen hinzugefügt und da ich mit dem Array nur eine Variable benutz zu haben glaubte, was sich durch

    SeppJ schrieb:

    Es ist zwar technisch gesehen nur eine Variable, aber es ist wahrscheinlich gemeint, dass du kein Array nutzen sollst.

    bestätigt hat, habe ich mir die Freiheit genommen.

    Ok. Ab jetzt nur das Nötigste.

    Kein Array habe ich verstanden, aber wieso kein double? Der Durchschnitt lässt sich doch auch von Fließkommazahlen bilden?

    "summe" als Variable?

    gläubiger schrieb:

    cout << accumulate(istream_iterator<int>(cin), {}, 0)/5. << std::endl << std::flush;

    das sagt mir nun garnichts^^

    Ich werde mich mal daran versuchen, sobald ich Zeit finde.



  • ceko94 schrieb:

    [...] aber wieso kein double? Der Durchschnitt lässt sich doch auch von Fließkommazahlen bilden?

    double für Messwerte? Yay!! 🙂
    double für Menüauswahl? Nay!! 😞

    ceko94 schrieb:

    [...] "summe" als Variable?

    Das hat dir gläubiger weiter oben doch eh schon verraten.

    ceko94 schrieb:

    gläubiger schrieb:

    cout << accumulate(istream_iterator<int>(cin), {}, 0)/5. << std::endl << std::flush;

    das sagt mir nun garnichts^^

    Verständlich. Du bist wahrscheinlich über den Tamplateparameter <int> gestoßen ... nein, der zählt nicht wirklich als variable 🤡



  • #include <iostream>
    using namespace std;
    
    int main()
    {
        double x, summe;
        summe = 0;
    
        cout << "Messwert 1? ";
        cin >> x;
        summe += x;
        cout << "Messwert 2? ";
        cin >> x;
        summe += x;
        cout << "Messwert 3? ";
        cin >> x;
        summe += x;
        cout << "Messwert 4? ";
        cin >> x;
        summe += x;
        cout << "Messwert 5? ";
        cin >> x;
        summe += x;
    
        cout << "Arithmetisches Mittel = ";
        cout << summe / 5 << endl;
    
        return 0;
    }
    

    Zufriedenstellend?



  • jein.

    #include <iostream> 
    
    // using namespace std;  das fangen wir uns garnicht erst an -->
    using std::cin;
    using std::cout;
    
    int main() 
    { 
    //     double x, summe;  variablen so lokal, so nahe wie möglich am Verwendungsort definieren
    //     summe = 0;        Dort kann man ihnen meistens auch einen sinvollen Wert geben:
    
    	cout << "Messwert 1? "; 
    	double x;
        cin >> x;
        double summe = x;
    
        cout << "Messwert 2? "; 
        cin >> x;
        summe += x;
    
        cout << "Messwert 3? "; 
        cin >> x;
        summe += x;
    
        cout << "Messwert 4? "; 
        cin >> x;
        summe += x;
    
        cout << "Messwert 5? "; 
        cin >> x;
        summe += x;
    
        cout << "Arithmetisches Mittel = ";
        cout << summe / 5 /* << endl; <<-- wofuer endl? -->> */ << '\n';
    
        // return 0;  kannst dir sparen. main() gibt immer 0 zurueck, wenn sie _nichts_ zurueckgibt.
    }
    

  • Mod

    // using namespace std;  das fangen wir uns garnicht erst an --> 
    using std::cin; 
    using std::cout; 
    
    int main() 
    { 
    //     double x, summe;  variablen so lokal, so nahe wie möglich am Verwendungsort definieren
    

    lol



  • Hey, ich bin (fast) immer für die Lolz. 😉
    Jetzt könnten wir uns noch über eine "schöne" Lösung mit zwei Variablen unterhalten :p



  • Den Scope jeder Variable möglichst gering halten!

    double summe = [](){
          cout << "Messwert 1? ";
          double x;
          cin >> x;
          return x;
        }();
        summe += [](){
          cout << "Messwert 2? ";
          double x;
          cin >> x;
          return x;
        }();
        summe += [](){
          cout << "Messwert 3? ";
          double x;
          cin >> x;
          return x;
        }();
        summe += [](){
          cout << "Messwert 4? ";
          double x;
          cin >> x;
          return x;
        }();
        summe += [](){
          cout << "Messwert 5? ";
          double x;
          cin >> x;
          return x;
        }();
        cout << "Arithmetisches Mittel = ";
        cout << summe / 5 /* << '\n';
    


  • Swordfish schrieb:

    // using namespace std;  das fangen wir uns garnicht erst an --> 
    using std::cin; 
    using std::cout;
    

    Begründung bitte.

    Btw, wir haben bisher nur "using namespace std;" gelernt und erklärt bekommen, dass man dadurch cin/cout benutzen kann. mehr nicht.

    Ich verstehe die 2 Implementierungen, aber wieso? Was ist der Sinn dahinter? Technisch, kosmetisch..inwiefern verbessernd?

    //     double x, summe;  variablen so lokal, so nahe wie möglich am Verwendungsort definieren
    //     summe = 0;        Dort kann man ihnen meistens auch einen sinvollen Wert geben:
    

    Lediglich damit ich den überblick behalte und logischer schreibe oder gibt es auch einen technischen nutzen?



  • forthelolz schrieb:

    Den Scope jeder Variable möglichst gering halten!

    Scope? Bitte immer eine kurze Erklärung und die Funktion dazuschreiben. Ich komme mit, aber brauche es anfangs etwas konkreter.


  • Mod

    Ich glaube, Swordfish dreht gerade durch :p . Seine letzten beiden Beiträge lieber einfach nicht beachten.



  • Keine Ahnung, warum dich jetzt alle verunsichern wollen. Dein Code war voll in Ordnung.
    Mit dem Scope ist hier totale Klugscheiiserei. Du solltest die Variabeln eine Zeile später definieren.
    Allgemein ist das aber richtig, dass wenn du z.B. ein x nur in einem Scope (= der Bereich innerhalb der {}-Klammern) brauchst, dass du x dann auch erst da definierst.



  • SeppJ schrieb:

    Ich glaube, Swordfish dreht gerade durch :p . Seine letzten beiden Beiträge lieber einfach nicht beachten.

    Hey!? 😮 🤡 👍

    forthelolz schrieb:

    Den Scope jeder Variable möglichst gering halten!

    Yay!! 😃

    Swordfish schrieb:

    Jetzt könnten wir uns noch über eine "schöne" Lösung mit zwei Variablen unterhalten :p

    Na? was is?



  • Ok, danke. Haha. Ich kann verstehen, dass man mich in einen bestimmten Programmier-Stil lenken möchte. Ich finde es auch sehr interessant und bin auch ziemlich offen dafür. Ich versuche einfach alles aufzusaugen, damit ich mir überhaupt erstmal selber Gedanken darüber machen kann.

    Übrigens wieso "\n" über endl? Unser Prof meinte für uns eignet sich endl besser, weil aus irgendeinem Grund die Fehler bei einer Fehlkompilierung dargestellt werden? Oder sowas in der Richtung.. das war zwar heute, aber der tag war bis dahin schon lang. Die Aufzeichnung schaue ich mir nochmal an.

    Scope = {}. Got it.



  • Swordfish schrieb:

    Na? was is?

    Meinste mich?



  • Scope ist z.B. der Bereich innerhalb von {}. Allgemein ist das der Sichtbarkeitsbereich und der soll so lokal wie möglich gehalten werden.
    (also z.B. nicht ohne guten Grund global (=global scope)):



  • ceko94 schrieb:

    Swordfish schrieb:

    Na? was is?

    Meinste mich?

    Ne, natürlich nicht. Ich möchte ja nur vermeiden daßd irgendwann so furchtbaren code wie ich schreibst. Deswegen das pedantische rumreiten auf gutem Stil ... sonst kommt irgendwann sowas raus:

    #include <cstdint>
    #include <iostream> 
    
    int main()
    {	
    	float s = 0.f;for(std::uint64_t i=05ull
    	<<075;std::cout<<"Messwert #"<<(3<<1)-(
    	i>>61ull)<<": ",i>>075ull;i-=01ull<<075
    	,s+=*(float*)&i)std::cin>>*(float*)&i;\
    	std::cout<<"Mittelwert: "<<s/05.<<'\n';
    }
    


  • ceko94 schrieb:

    Übrigens wieso "\n" über endl? Unser Prof meinte für uns eignet sich endl besser, weil aus irgendeinem Grund die Fehler bei einer Fehlkompilierung dargestellt werden? Oder sowas in der Richtung.. das war zwar heute, aber der tag war bis dahin schon lang. Die Aufzeichnung schaue ich mir nochmal an.

    Das endl kannst du dir intern als

    cout << '\n' << flush;
    

    vorstellen. Bei Konsolenausgaben ist das zu 99% nicht gewollt und macht das Programm nur unnötig langsam. Wenn du nur einmal was ausgibst magst du das nicht merken aber wenn du ein Programm hast, welches mit einer hohen Frequenz Konsolenausgaben erzeugt merkst du den Unterschied deutlich. Von daher solltest du dir es gar nicht erst aneignen 😉


  • Mod

    Eigentlich sind echte Konsolenausgaben so ziemlich der einzige Fall, wo es relativ egal ist, ob man endl oder '\n' schreibt.



  • piping?


Anmelden zum Antworten