Schleife soll mit vorherigem Wert weiterrechnen

FlasherXXL

Lt. Junior Grade
Registriert
Feb. 2009
Beiträge
389
Hallo Community,

ich habe eine simple Schleife:

Code:
n= 3
for (int i = 0; i <= n+1 ; ++i) {

	if (i == 0) {
		real y = 0;	
	}	
	else {
		real y = (y+grosK);
}
k1 = irgendein Wert
k2 = irgendein Wert
		real grosK = (0.5*(k1+k2));}

Gedanke: Bei i=0 soll y 0 sein. Alles darüber soll das neue Y aus der Addition vom vorherigen Y und grosK sein.

Problem: Er übernimmt grosK nicht. Anscheinend rechnet er immer wieder von vorne, wobei jede Variable zurückgesetzt wird.
Wie kann man das beheben, bzw. besser machen?

Wäre für einen Tipp sehr dankbar!

Gruß
 
Du musst die Variable y vor der Schleife bzw. nur einmal definieren. Du definierst sie aktuell in jedem Durchlauf neu. Oder hab ich hier nen Denkfehler?
 
Das Zauberwort, nach dem du suchen solltest, lautet "variable scope".
 
Welche Sprache ist das? Definiere die Variablen die ihren Wert behalten sollen doch einfach mal außerhalb der Schleife. ;)
 
Du könntest Dir mit einer Hilfsvariable ausserhalb der Schleife helfen.
ungefähr in dieser Richtung:


Code:
n= 3
old_grosK = 0

for (int i = 0; i <= n+1 ; ++i) {

	if (i == 0) {
		real y = 0;	
	}	
	else {
                old_grosK = grosK  // oder old_grosK += grosK
		real y = (y+old_grosK);
        }
}
 
Du deklarierst ja auch in jeder Schleife die Variablen y und grosK neu.

Außerdem glaube ich wird im ersten Durchgang grosK verwendet obwohl es noch nicht deklariert ist. Deine if klausel wird nömlich nie erreicht das du mit ++i i erhöhst bevor die schleife ausgeführt wird, also bereits im ersten durchlauf ist i = 1
 
Steht was mit C++. Bin kein Programmierer, kann das ehrlich gesagt gar nicht so genau sagen :rolleyes:

Die Schleife hat im ersten Durchlauf i=0.
Die If-Klausel wird also im ersten Durchgang erreicht.
Im 2. Durchgang bleibt Y aber weiterhin 0, obwohl im ersten Durchgang grosK errechnet wurde und somit das neue Y eigentlich einen Wert haben sollte.

Wie definiere ich denn die Werte außerhalb der Schleife wenn ich sie doch nur innerhalb einer Schleife berechnen kann?

Danke erstmal!
 
Zuletzt bearbeitet:
Narbennarr schrieb:
Deine if klausel wird nömlich nie erreicht das du mit ++i i erhöhst bevor die schleife ausgeführt wird, also bereits im ersten durchlauf ist i = 1

Stimmt so nicht ganz, beim Erhöhen des counters im for-loop ist pre und post increment äquivalent.

Edit:
FlasherXXL schrieb:
Wie definiere ich denn die Werte außerhalb der Schleife wenn ich sie doch nur innerhalb einer Schleife berechnen kann?

Hierzu wie oben bereits mehrfach erwähnt Information zu den Begriffen variable scope, Deklaration und Zuweisung nachlesen.
 
Zuletzt bearbeitet:
FlasherXXL schrieb:
Wie definiere ich denn die Werte außerhalb der Schleife wenn ich sie doch nur innerhalb einer Schleife berechnen kann?
Du schreibst es ja schon selbst: du definierst die Variablen außerhalb und berechnest diese dann innerhalb der Schleife.

Aktuell definierst und berechnest du sie aber in jedem Durchgang neu und folglich bleibt der Wert immer gleich.

Deklariere die Variablen einfach vorher und initialisiere sie (wie du es auch mit n=3 machst).
 
Reglohln schrieb:
Deklariere die Variablen einfach vorher und initialisiere sie (wie du es auch mit n=3 machst).

ok. Wie mache ich das?
GrosK und folglich Y kann ja erst in der Schleife berechnet werden.
 
Zerlegen wir mal den Code:

Code:
for (int i = 0; i <= n + 1; i++) {
  if (i == 0) {
    real y = 0;	
  }
  [...]
}

Was macht das ganze? Es weist einer Variablen y beim ersten Durchlauf der Schleife den Wert 0 zu. Diese Variable wird innerhalb des if-Blocks deklariert und ist somit auch nur dort gültig.

Denken wir uns das "[...]" mal weg. Braucht man dann dafür noch eine Schleife? Nein, der Teil des Codes ist quasi äquivalent zu
Code:
real y = 0;

Exkurs Scopes:

Code:
// Keine Variable bekannt
int x = 0;
if (...) {
  int y = 1;
  // x ist 0
  // y ist 1
} else {
  int x = 2;
  // x ist 2 - das _neue_ x
  // y nicht bekannt
}
// x ist 0 - das _alte_ x

Vielleicht kommst du ja jetzt drauf ;)
 
Zuletzt bearbeitet:
Ich muss mal fragen: Gibt es eine Lösung für mein Problem?

Weil ich stehe gerade echt auf dem Schlauch :/ Für mich ist das echt schwer vorzustellen...

Ich bin dankbar für die Tipps und Vorschläge, aber das übersteigt ein wenig meine Kompetenz.
 
Und ich muss mal gegenfragen, ließt du auch die ganzen Hinweise hier? Hier werden massig Tips gegeben, du fragst aber weiter beständig nach Lösungen. Wenn du eine fertige Lösung willst, mach ich dir ein Angebot zu meinem üblichen Stundensatz, ich glaube das willst du nicht wirklich. So funktioniert das hier einfach nicht, wir geben dir hier Hilfe zur Selbsthilfe, übernehmen aber nicht die Arbeit für dich.
 
Ok, es gibt also lokale und globale Variablen. Und wenn ich das richtig verstanden habe, ist mein Problem die Schleife, weil ich in dieser nur lokale Variablen habe, mein grosK aber eigentlich eine globale sein sollte?

VikingGe hat ja schon einen Ansatz gebracht, der keine Schleif beinhaltet. Wie bekomme ich das dann aber hin, dass er mehrere Schritte rechnet, ohne das ich die hintereinander als Code schreiben muss? Dafür habe ich ja eigentlich im for das i definiert.
 
Zuletzt bearbeitet:
Denk doch einfach mal scharf nach. Du hast ja scheinbar jetzt begriffen, dass der ZUSTAND einer Variablen oft vom KONTEXT (oder, doof gesagt, Ort im Code) abhängt, in dem sie definiert ist. Wenn du eine Variable innerhalb eines Schleifendurchlaufs definierst, dann "verpufft" sie üblicher Weise am Ende des Durchlaufs.

Wo muss die Variable also definiert werden, damit sie NICHT in jedem Schleifendurchlauf neu definiert wird, sondern ihre Werte beibehält bzw. Änderungen innerhalb der Schleife sich auch nach der Schleife auswirken?
 
So sitz gerade in der Bahn und hab nix zu tun, hier bitte:

Code:
int n = 3;
real grosK = 0; // sonst fliegt uns je nach sprache der else bereich um die ohren
real y = 0; // mache y außerhalb der schleife sichtbar

for (int i = 0; i <= n+1 ; i++) {
	
	if (i == 0) {
		y = 0;	
	}	
	else {
		y =  y + grosK;
	}
	
	k1 = 1;
    k2 = 2;
	grosK = (0.5*(k1+k2));#
}

echo y;
echo grosk; // oder was auch immer, soll nur als beispiel dienen die werte auszugeben

am ende wirst du dann genau ein grosK haben, mit dem Wert grosK = (0.5*(k1+k2)); k1 und k2 aus der letzen iteration (i=4, 5. durchlauf)
Y wird ebenfalls der zuletz berechnete wert sein. wozu brauchst du das überhaupt, das wird ja nirgends verwendet.

willst du am ende alle Y und alle grosK speichern, also aus jedem durchlauf? dann müssten wir da anders rangehen.

Habs net getestet da aufm handy getippt und kp. welche sprache das ist, sollte aber laufen.

Wirkt so als wolltest ne Formel berechnen, wenn uns sagst was genau vorhast könnten wir besser helfen, für sowas würden sich z.b. rekursive schleifen ehr anbieten.

P.S. hab die ne pm geschickt ;)

Edit:

Da y ja mit 0 initialisiert wurde entfällt quasi auch der erste block und du könntest die ganze aussage negieren. Um zu verhindern das er bei jeder Iteration die if abfrage macht könntest du die erste auch manuell ausrechnen und dann eben bei i=1 starten. Um redudanten code zu vermeiden dann alles in eine Funktion auslagern.....
 
Zuletzt bearbeitet:
Daaron schrieb:
Wo muss die Variable also definiert werden, damit sie NICHT in jedem Schleifendurchlauf neu definiert wird, sondern ihre Werte beibehält bzw. Änderungen innerhalb der Schleife sich auch nach der Schleife auswirken?

Davor oder nicht?

Edit: Ah, ok. Arrays?! Ist das das "Zauberwort"? Ich lese mich gerade mal ein und versuche das umzusetzen.

Edit: WOHUUU! Ich flippe gerade mega aus, weil das tatsächlich geklappt hat!!!
Ergänzung ()

Lösung (für dieses Beispiel, auf meine Art gelöst):

Code:
n= 3
real y[];
real grosK[];
real i;

    for (int i = 0; i <= n+1 ; ++i) {
     
    	if (i == 0) {
    		y[0] = 0;	
    	}	
    	else {
    		y[i] = (y[i-1]+grosK[i-1]);   //[i-1] Wert, vom vorherigen Durchgang
    }
    k1 = irgendein Wert
    k2 = irgendein Wert
    		real grosK[i] = (0.5*(k1+k2));}
 
Zuletzt bearbeitet:
Ja sorry, dann halt nicht. Ich bin kein Programmierer und kann mir nicht jeden erdenklichen Weg vorstellen.
Behaltet eure Lösungen für euch, meins funktioniert jetzt auch.

Aber danke an alle, die versucht haben zu helfen. Kann geschlossen werden.
Ergänzung ()

PS: Wenn ich von einem mathematik schwachem Kind wissen möchte, was 5+2 ist und es nach 50 Versuchen immernoch nicht weiß, weil es einfach nicht weiß, wie das "Problem" richtig anzugehen ist, lass ich es denn dumm da stehen? Es kann es einfach nicht besser wissen...
Ich als Trainer lasse mir doch auch nicht alles aus der Nase ziehen, nur damit man "lernt" wie etwas geht. Kann sein, dass hier viele anderer Meinung sind, aber in meinen Augen bin ich durch die (gut(!)) gemeinten Tipps und Vorschläge nicht wirklich schlauer geworden, obwohl ich mich mit sämtlichen anderen Foren, Anleitungen, Erklärungen etc. Stunden und Nächte um die Ohren gehauen habe, nur um dann zu lesen, dass es doch so einfach wäre. Sorry, aber das hilft keinem weiter.

Das als Abschluss, ich will dazu jetzt keine Diskusion sehen. Schreibt mir sonst ne PM.
 
Na das nenn ich doch mal zickig...

Schon in den ersten Antworten hier stand, was dein Fehler ist: Der Variable Scope... sinngemäß der Ort, an dem du Variablen definierst und der ihre "Lebensspanne" definiert.
Alles Weitere wäre ganz einfaches, logisches Denken. Wenn es falsch ist, die Variable in der Schleife zu definieren, und es offensichtlich auch falsch sein muss, sie nach der Schleife zu definieren, wo muss man sie dann definieren? Also wenn es an so etwas scheitert, dann sollte man GAR NICHT programmieren, nicht einmal so einen Pippifax wie den hier. Dann sollte man solche Probleme outsourcen und sich auf seine eigene Kernkompetenz besinnen.
Mal ehrlich: Ist es wirtschaftlich sinnvoll, sich wegen solchen Trivialproblemen Stunden und Nächte um die Ohren zu schlagen? Du hättest genauso jemanden bezahlen können, der das Problem in 5 Minuten für dich löst.
 
Zurück
Oben