Hilfe bei kleinem Programm mit Array



  • ToniKukoc schrieb:

    Hallo,bekomme es bei diesem Programm nicht hin die durchschnittliche Abweichung zu berechnen,es berechnet nur den Abstand des letzten Wertes zum Durchschnittswert,was mache ich falsch?
    ...
    Außerdem müsste ich wissen wie ich es bei dem Array hinbekomme dass ich die Länge nicht vorher festlege sondern diesen vom Benutzer festgelegt wird,indem ich ihn in der ersten Zeile befrage.
    Mit dem Maximum und Minimum ist das ja kein Problem,aber wie bekomme ich das mit der Summe bei dem Durchschnitt hin und dementsprechend dann auch mit der Abweichung.

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        double durchschnitt = 0, max, min,abweichung;
        int feldanzahl;
    
    	cout << "Geben Sie die Anzahl der Felder ein:" << endl ;
    
    	cin >> feldanzahl;
    
    	double *feld = new double[feldanzahl];
    
        if (feld == NULL)
        {
            cout << "Error: kein Speicher verfuegbar!" << endl;
            return 1;
        }
    
        for(int k = 0; k != feldanzahl; k++)
        {
            cout << "Temperatur Tag " << k+1<< ":  ";
            cin >> feld[k];
    		if (k == 0)
    		{
    			max = min = feld[0];
    		}		
    		else
    			if (feld[k] > max)   
    			{
    				max = feld[k]   ;
    			}					  
    			else
    				if (feld[k] < min)
    				{
    					min = feld[k]   ;
    				}
    				   ;
    		durchschnitt +=   feld[k];
        }
    	durchschnitt /= (double)feldanzahl;
        //for(int k=0;k!=7;k++)
        //{
        //durchschnitt = (feld[0] + feld[1] + feld[2] + feld[3] + feld[4] + feld[5] + feld[6]) / 7;
        //}
        /*max = feld[0];
        min = feld[0];
        for(int i = 0; i != 7; i++)
        {
            if(feld[i] < min)
                min = feld[i];
            if(feld[i] > max)
                max = feld[i];
        }
    	*/
        for (int k=0;k!=feldanzahl;++k)
        {
    
                abweichung =  durchschnitt-feld[k];
                cout << "Abweichung Tag "<< k+1 << ": " << abweichung << endl ;
    	}
    
        cout << endl << "Durchschnittstemperatur: " << durchschnitt << endl;
        cout << "Maximaltemperatur: " << max << endl;
        cout << "Minimaltemperatur: " << min << endl;
    
        delete[] feld;
      /*
       fflush(stdin);  */
       getchar();
    
       return 0;
    }
    

    😉



  • Viel hübscher ist es jz auch nicht...

    Und richtiger erst recht nicht (new gibt nie 0/NULL/nullptr zurück)...

    naja - offensichtlich hat auch niemand anders ahnung, welcher thread das war, den ich meinte... oder ihr seid alle faul! ;o)

    bb



  • unskilled schrieb:

    Und richtiger erst recht nicht (new gibt nie 0/NULL/nullptr zurück)...

    nie? nothrow...
    simon



  • theta schrieb:

    unskilled schrieb:

    Und richtiger erst recht nicht (new gibt nie 0/NULL/nullptr zurück)...

    nie? nothrow...
    simon

    siehst du irgendwo ein nothrow in dem code-bsp? ich nich...



  • wie verhaelt sich denn dein compiler, wenn Du die exceptions abgeschalten hasst ?
    ne exception wirst da nie bekommen ^^

    was sagt denn der C++ Standard, muss new ne exception werfen wenn es den speicher ned kriegen kann ???

    zumindest bei mir hier beim MS compiler laeuft der mit abgeschaltenen exceptions durch und steigt ned mit nem Terminate aus ....
    die einzige chance ist eigentlich den rueckgabewert zu checken, und da iss definiert das der NULL sein muss, wenn das new ned erfolgreich war !

    Ciao ...



  • Der Standard sagt eben, dass new ein fertig konstruiertes Objekt zurückgibt oder eine Exception wirft...
    Wenn man dieses Verhalten nicht möchte, dann muss man nothrow verwenden - allerdings kann dieses new imho dann trotzdem noch nen bad_alloc werfen - wenn im CTor des Objekts ein new fehlschlägt...

    bb



  • Danke für die Antworten
    aber

    Wollte eigentlich nur wissen wie ich das hier

    for(int k=0;k!=7;k++)
        {
        durchschnitt = (feld[0] + feld[1] + feld[2] + feld[3] + feld[4] + feld[5] + feld[6]) / 7;
        }
    

    und das was ich noch neu als Abweichung geschrieben habe:

    f(feld[0] - durchschnitt < 0)
      abweichung0 = feld[0]+ durchschnitt;
      if(feld[0] - durchschnitt >= 0)
      abweichung0 = feld[0] - durchschnitt;
    
        if(feld[1] - durchschnitt < 0)
      abweichung1 = feld[1]+ durchschnitt;
      if(feld[1] - durchschnitt >= 0)
      abweichung1 = feld[1] - durchschnitt;
    
        if(feld[2] - durchschnitt < 0)
      abweichung2 = feld[2]+ durchschnitt;
      if(feld[2] - durchschnitt >= 0)
      abweichung2 = feld[2] - durchschnitt; 
    
        if(feld[3] - durchschnitt < 0)
      abweichung3 = feld[3]+ durchschnitt;
      if(feld[3] - durchschnitt >= 0)
      abweichung3 = feld[3] - durchschnitt;
    
        if(feld[4] - durchschnitt < 0)
      abweichung4 = feld[4]+ durchschnitt;
      if(feld[4] - durchschnitt >= 0)
      abweichung4 = feld[4] - durchschnitt;
    
        if(feld[5] - durchschnitt < 0)
      abweichung5 = feld[5]+ durchschnitt;
      if(feld[5] - durchschnitt >= 0)
      abweichung5 = feld[5] - durchschnitt;
    
        if(feld[6] - durchschnitt < 0)
      abweichung6 = feld[6]+ durchschnitt;
      if(feld[6] - durchschnitt >= 0)
      abweichung6 = feld[6] - durchschnitt;
    
    abweichung = abweichung0+abweichung1+abweichung2+abweichung3+abweichung4+abweichung5+abweichung6;
    durchabweichung=abweichung/7;
    

    so hinbekomme dass ich nicht die 7 vorher festgelegt habe,sondern der Benutzer es bestimmt.Das soll mit einem Array geschehen,nicht mit Vektoren.



  • ToniKukoc schrieb:

    Danke für die Antworten
    aber

    Wollte eigentlich nur wissen wie ich das hier

    for(int k=0;k!=7;k++)
        {
        durchschnitt = (feld[0] + feld[1] + feld[2] + feld[3] + feld[4] + feld[5] + feld[6]) / 7;
        }
    

    Aehhh ... Was tuts Du da eigentlich? Du berechnest siebenmal die Variable durchschnitt - Der Loop-Zaehler k wird kein einziges Mal verwendet.

    Ich vermute mal, Du meinst soetwas:

    for(int k=0;k!=7;k++)
        durchschnitt += feld[k];
    
    durchschnitt /= 7;
    

    ToniKukoc schrieb:

    und das was ich noch neu als Abweichung geschrieben habe:

    f(feld[0] - durchschnitt < 0)
      abweichung0 = feld[0]+ durchschnitt;
      if(feld[0] - durchschnitt >= 0)
      abweichung0 = feld[0] - durchschnitt;
    // etc.
    

    Auch hier - wohl eher soetwas

    for(int k=0;k!=7;k++)
        abweichung = fabs (feld[0] - durchschnitt);
    
    abweichung /= 7;
    

    ToniKukoc schrieb:

    so hinbekomme dass ich nicht die 7 vorher festgelegt habe,sondern der Benutzer es bestimmt.

    Niemand hindert Dich die "7" durch eine Variable zu ersetzen und diese einzulesen.



  • RHBaum schrieb:

    zumindest bei mir hier beim MS compiler laeuft der mit abgeschaltenen exceptions durch und steigt ned mit nem Terminate aus ....
    die einzige chance ist eigentlich den rueckgabewert zu checken, und da iss definiert das der NULL sein muss, wenn das new ned erfolgreich war !

    Wieso sollte das definiert sein, nur weil du im Compiler die Exceptions deaktiviert hast? Laut C++-Standard gibt new nur einen Nullzeiger zurück, wenn die überladene Version mit std::nothrow aufgerufen wird. Andernfalls wird wie gesagt eine Exception vom Typ std::bad_alloc geworfen. Welches undefinierte Verhalten bei abgeschalteten Exceptions auftritt, kann ich dir jedoch auch nicht sagen.



  • Nexus schrieb:

    Welches undefinierte Verhalten bei abgeschalteten Exceptions auftritt, kann ich dir jedoch auch nicht sagen.

    👍


Anmelden zum Antworten