C Summenfunktion in C - Denkanstoß gesucht

Pennerschwert

Commodore
Registriert
Mai 2011
Beiträge
4.186
Guten Abend, ich versuche schon eine Weile eine Summenfunktion in C zu programmieren. Aus irgendeinem Grund will die Funktion aber einfach nicht funktionieren. Eventuell könnt ihr mir ja sagen, wo mein Denkfehler liegt.

Ich will folgende Summe programmieren: d.PNG

In dem Buch das ich verwende um C zu lernen, steht folgendes Beispiel für die Berechnung einer Summe:

Das Beispiel berechnet folgende Summe: f.PNG

Code:
int summe (int n)
{
   int lv;
   int zwsumme = 0;

   for (lv = 1; lv <= n; lv = lv + 1)
      zwsumme = zwsumme + lv;

   return zwsumme; 
}

Ich habe mich an diesem Beispiel orientiert und folgendes programmiert:

Code:
float Summe(int sum)
{
	int i;
	float erg = 0;
	
	for (i = 1; i <= sum; i = i + (1/i))
	{
		erg = erg + i;
	}

	return erg;
}

Meine Ausgabe, die auch den Wert an die Funktion Summe übergibt sieht so aus:

Code:
void tabelleAusgeben(int grenze) //gibt die ergebnisse als tabelle aus
{
	int i;


	for (i = 1; i <= grenze; i++)
	{
		printf("%2.d %0.4f %0.7f\n", i, Division(i), Summe(i));
	}

}

Die Ausgabe Funktion gibt die Ergebnisse in einem Bereich von 0 bis zu einer, vorher eingegeben Grenze, aus. Das funktioniert so weit auch.

Vielleicht kann mir jemand meinen Fehler erklären oder mir einen Denkanstoß geben, wie ich die Sache angehen muss. Google spuckt leider nur Hilfestellungen zu Summenfunktionen aus, die wie das Beispiel aus meinen Lehrbuch funktionieren.
 

Anhänge

  • d.PNG
    d.PNG
    4,8 KB · Aufrufe: 184
Zuletzt bearbeitet:
Dein Problem ist, dass du nicht so richtig weißt wie eine for-Schleife funktioniert.
for(Initialisierung; Bedingung; Transformation) {...}
Die Transformation gibt an was von einer Iteration zur nächsten geändert werden soll. Stellt dir am Anfang am besten vor, dass dieser Block am Ende der Schleife steht. Damit sähe deine Funktion so aus:
Code:
float Summe(int sum)
{
	int i;
	float erg = 0;
	
	for (i = 1; i <= sum;)
	{
		erg = erg + i;
		i = i + (1/i);
	}
 
	return erg;
}
So ist es denke offensichtlich, dass das nicht hinhaut. Was du willst ist, dass i in jeder Iteration um 1 erhöht wird. Dafür willst du aber 1/i zu deiner Zwischensumme addieren. Das sollten erstmal genug Tips sein, um die Lösung nicht direkt vorweg zunehmen.
 
Deine for Schleife ist falsch. Du erhöhst den counter immer um 1/i und das bei einer Ganzzahl.

Code:
	for (i = 1; i <= sum; i ++)
	{
		erg = erg + (1/i);
	}
 
Dein Zähler für die Schleife ist kaputt. Da muss i = i+1 hin, sonst läuft die Summe viel öfter als gedacht. Die dort definierte Aktion wird auch erst am Ende der Schleife durchgeführt.

Probier mal das für die Schleife:

for(i=1, i <= sum, i = i+1){
erg = erg + 1/i
}


Dabei hat das i = i +1 NICHTS mit deiner Summe zu tun - es ist einfach nur der Zähler für die Schleife. Nach jedem Durchlauf der Schleife wird i um eins erhöht, und die Schleife läuft solang, bis die Abbruchbedingung ( i <= sum ist falsch) wahr ist.

Anderes Beispiel für eine Schleife ist z.B.

for(i=1, i <= 10, i = i+1){
print(i)
}

wird einfach 1,2,...,10 ausgeben.
 
Hallo,

das Problem ist, dass du fast eine Endlosschleife programmier hast.
Du erhöst i immer um 1/i. Wenn jetzt i(0) = 1 der Wert von i ist, wenn noch keine Durchlauf der Schleife passiert ist, so erhälst du für i(1) = 2,
i(3) = 1,5 i(4)= 1,6666 und so weiter, das steigt nur sehr sehr langsam und dauert entsprechend lange bis sum erreicht wurde.
Nimm also lieber i= i+1 (was man sehr oft nimmt) und addiere zu erg = erg + 1/i.

Viele Grüße
Seekuh
 
Ich weiß schon wie eine for Schleife funktioniert. Ich habe eher das Beispiel aus dem Lehrbuch falsch verstanden bzw. nicht komplett durchdacht.

Mein erster Ansatz, bevor ich in dem Lehrbuch nachgeschlagen hatte, sah so aus:

Code:
float Summe(int sum)
{
	int i;
	float erg = 0;
	
	for (i = 1; i <= sum; i++)
	{
		erg = erg + (1/i);
	}

	return erg;
}

Das funktioniert aber auch nicht. Die Ausgabe sieht dann so aus:

y.PNG

Eigentlich soll aber das rauskommen:

x.PNG

Aus irgendeinem Grund bricht also die Schleife ab und ich habe keine Ahnung warum.
 
Zuletzt bearbeitet:
Probier mal 1./i

Aktuell dividierst du einen Int durch einen Int, raus kommt ein Int, d.h. alles hinter dem Komma wird einfach abgeschnitten. Deshalb kommt immer 1 raus, im ersten Durchlauf ist noch 1/1 = 1, alles gut, im Zweiten wird dann aus 1/2 = 0.5 eine 0.

Mit dem . hinter der 1 machst du die 1 zum float, so sollte auch der Teil hinter dem Komma berücksichtigt werden.

Falls das nicht reicht, mach aus i auch mal einen float, also float i; zum Initialisieren.
 
Zuletzt bearbeitet:
Das war der dämliche Denkfehler ...

Na immerhin stimmt die Berechnungsmethode an sich. Da überlege ich stundenlang, warum die Berechnungsmethode nicht funktioniert, obwohl ich einfach nur einen falschen Datentyp verwendet habe :mussweg:

Trotzdem danke für euere Hilfe, jetzt sollten die restlichen paar Funktionen die ich noch brauche kein Problem mehr sein.
 
Du glaubst gar nicht wie oft ich schon debuggt habe, weil ich irgendwo einen int dividiert hab :D

Was ich da aber sehr hilfreich finde, ist print-debugging - also einfach jede Variable ausgeben lassen (oder in der IDE verfolgen, falls sowas benutzt wird). Wenn du dir in jeder Runde 1/i hättest ausgeben lassen, wärst du da sehr schnell drauf gekommen.
 
Danke für den Tipp, ich weiß welche Funktion du meinst. An die habe ich leider nicht gedacht.

Auf jeden Fall wieder was gelernt !
 
Deine Implementierung ist grundsätzlich falsch. Der Summierungsoperator nimmt als Argument auch eine Funktion entgegen. Deshalb solltest du ihn entweder als Funktion höherer Ordnung implementieren, oder weil das in C leider nicht richtig schön geht, einen Funktionszeiger annehmen, dessen Ergebnis aufsummiert wird.
 
Zurück
Oben