Gewichtete Summe und Harmonische Mittel berechnen; Array enthält beliebig viele einträge



  • Hallo,
    ich komme nicht weiter.
    Es geht um folgendes:

    # include <iostream>
    using namespace std;
    
    int main() {
    	double A[] = { 1.03, 94.62, 94.87, 88.97, 51.64,
    			       13.28, 85.8, 75.07, 23.23, 46.08 };
    
    	int n = sizeof(A) / sizeof(double);
    	double sum;
    	double harm;
    
    ++++++++++++++++++++++++++++++++++++++++++++++++++
    	int i;
    
    	sum = 0;
    
    	for (i = 0; i <= n; i++) {
    		sum += A[i]/i;
    	}
    
    ++++++++++++++++++++++++++++++++++++++++++++++++++
    
    	cout << "Gewichtete Summe: " << sum << endl;
    	cout << "Harmonisches Mittel: " << harm << endl;
    	return 0;
    }
    

    Der Code innerhalb der plus' ist meine Idee, um ans Ziel zu kommen.
    Die anderen Sachen sind vorgegeben.

    Ich bekomme kein vernünftiges Ergebnis.
    Ich weiß nicht, ob bzw. was ich falsch gemacht habe.

    Der Array sollte erweiterbar sein.

    Ich weiß auch gar nicht, wie ich den Inhalt der eckigen klammern definieren kann!?

    PS: Die Bibliotheken cmath und math.h dürfen nicht verwendet werden.


  • Mod

    Welches Ergebnis erwartest du und warum? Welches Ergebnis bekommst du stattdessen?

    Soll das C oder C++ sein? Technisch gesehen ist das C++, aber du fragst im C-Forum und bis auf die Ausgabe ist der Code typischer C-Stil.

    Ich weiß auch gar nicht, wie ich den Inhalt der eckigen klammern definieren kann!?

    Wovon redest du?

    PS: Die Bibliotheken cmath und math.h dürfen nicht verwendet werden.

    Wirst du auch garantiert nicht brauchen. Wirft aber wieder die Frage auf, ob du C++ (cmath) oder C (math.h) machen möchtest.



  • heid schrieb:

    Der Array sollte erweiterbar sein.

    Mach dies:

    double *A = malloc (n*sizeof(double));
    

    n ist die Anahl der Doubles, die du haben willst.
    Ansprechen kannst du die Elemente in A wie ein Array (mit [], von 0 bis n-1).



  • Eigentlich soll das c++ sein, denke ich. Der Kurs an der Uni heißt jedenfalls c++. Dann bitte ich um Verschiebung des Threads und um Verzeihung. 🙂

    Zu den eckigen Klammern: Hier "double A[]" steht kein wert drin, d.h., das Programm ermittelt ihn, soweit ich weiß.

    Ich will die Summe ja bis zum letzten Array-Eintag laufen lassen. Aber, wie kann ich das, wenn ich nicht weiß, welcher dieser ist. Ich brauche also eine Variable - so vermute ich. Aber ich weiß nicht, wie ich diese richtig in Verbindung setzen kann.

    Ich benutze Eclipse und habe vorhin bei "Gewichtete Summe: " ein "inf" herausbekommen und jetzt zeigt er mir ein Fehler an, aus dem ich nicht schlau werde:

    "invalid types ‘double [10][double]’ for array subscript".

    Die Gewichtete Summe ist jedenfalls so definiert in der Aufgabe:

    a_sum = Summenzeichen: i=1, bis n (a_i/i) = a_1/1 + a_2/2 + ... + a_n/n

    (Ich hoffe, das ist verständlich)



  • PS: Ich darf nur das zwischen den Plus' verändern.



  • heid schrieb:

    PS: Ich darf nur das zwischen den Plus' verändern.

    Dann hat sich das mit der Erweiterbarkeit des Arrays schon einmal erledigt. Zumindest zur Laufzeit.



  • heid schrieb:

    Ich benutze Eclipse und habe vorhin bei "Gewichtete Summe: " ein "inf"
    ...
    a_sum = Summenzeichen: i=1, bis n (a_i/i) = a_1/1 + a_2/2 + ... + a_n/n

    sum += A[i]/i;
    

    Da der Schleifenzähler bei 0 beginnt, solltest du besser: sum += A[i]/(i+1) schreiben. 😉



  • Danke! Jetzt habe ich einen Wert heraus von ca. 143. Müsste stimmen.

    Für das Harmonisches Mittel habe ich jetzt das hier:

    int i;
    
    	sum = 0;
    
    	for (i = 0; i <= n; i++) {
    		sum += A[i]/(i+1);
    	}
    	for (i = 0; i <= n; i++) {
    		harm = n/harm + n/(1/A[i]);
    	}
    

    Diese ist definiert, laut Aufgabe durch:

    a_harm = n/(summenzeichen: i=1, bis n (1/a_i)) = n/((1/a_1) + (1/a_2) + ... + (1/a_n))

    Ich bekomme eine Lösung von ca. 0.021.

    Ist der Code für das Harmonisches Mittel richtig?



  • heid schrieb:

    Ich will die Summe ja bis zum letzten Array-Eintag laufen lassen. Aber, wie kann ich das, wenn ich nicht weiß, welcher dieser ist. Ich brauche also eine Variable - so vermute ich. Aber ich weiß nicht, wie ich diese richtig in Verbindung setzen kann.

    Die Anzahl steht doch in n.

    Allerdings läuft deine Schleife eins zu weit. Da das Array bei 0 anfängt muss die Schleife bis < n (nicht <=) laufen.



  • heid schrieb:

    Ist der Code für das Harmonisches Mittel richtig?

    Sieht für mich falsch aus.
    n/((1/a_1) + (1/a_2) + ... + (1/a_n))
    ... interpretiere ich als: erst alle Kehrwerte addieren und danach n durch diese Summe teilen.



  • heid schrieb:

    Ist der Code für das Harmonisches Mittel richtig?

    Nein.

    Die Summe wird in der Schleife gebildet.
    Und wie in der Formel auch, kannst du das n/ ausklammern.
    Das spart auch ein paar Divisionen.



  • Etwa so:

    harm = 0;
    for (i = 0; i < n; i++) { 
            harm += 1/A[i];   // Summe der Kehrwerte berechnen
        }
    harm = n/harm; // zum Schluss teilen
    


  • Nochmals Danke an alle! 🙂

    Ich habe es in der Zwischenzeit auch versucht und hier das Ergebnis:

    int i;
    	double k;
    
    	sum = 0;
    	k = 0;
    
    	for (i = 0; i < n; i++) {
    		sum += A[i]/(i+1);
    	}
    	for (i = 0; i < n; i++) {
    		k += 1/A[i];
    		harm = n/k;
    	}
    

    Dieses müsste Äquivalent zu deinem sein oder?

    Jedenfalls wusste ich noch nicht, dass man z.B. harm auch zweimal in einer Gleichung

    harm = n/harm;
    

    verwenden darf.



  • heid schrieb:

    Jedenfalls wusste ich noch nicht, dass man z.B. harm auch zweimal in einer Gleichung

    harm = n/harm;
    

    verwenden darf.

    Das ist ja auch keine Gleichung, sondern eine Zuweisung.
    "ist gleich" wird in C als == geschrieben (zwei Gleichheitszeichen hintereinander).



  • Stimmt. 🙂
    Muss mich noch daran gewöhnen.



  • Zumal sum += A[i]/(i+1); ja auch nur eine kurzschreibweise für
    sum = sum + A[i]/(i+1); ist.

    Und das harm = n/k; sollte ausserhalb der Schleife stehen., da du sonst n-1 unnötige Divisionen hast.



  • Zumal sum += A[i]/(i+1); ja auch nur eine kurzschreibweise für
    sum = sum + A[i]/(i+1); ist.

    Ist mir auch gerade klar geworden. 😃

    Und das harm = n/k; sollte ausserhalb der Schleife stehen., da du sonst n-1 unnötige Divisionen hast.

    Habe ich gemacht. Danke.


Anmelden zum Antworten