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



  • 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