Zwei for-Schleifen hintereinander ...?!?!
-
Hallo,
ich wollte mir grad zwei for-Schleifen hintereinander schreiben und muß mit Entsetzen feststellen, dass man dann sofort die erste überspringt.
Eigentlich wollte ich die erste Schleife so bauen:int y=344;
double x,i;
for (i=0; x>=y; i=i+0.01)
.....Irgendwann erreicht x den Wert y und die Schleife wird abgebrochen. Leider kann i von 0--> 360 laufen und es kommt vor, dass nachdem das erstemal ein passendes x gefunden wurde mit höherem i noch ein x zu finden sein wird.
Deshalb wollt ich nun die zweite Schleife laufen lassen:int y=344;
double z,i;
for (j=360; z>=y; j=j-0.01)
.....Frage: wieso geht dass nicht?! Wieso rennt das Programm nur einmal bzw. nur halb durch die erste Schleife und schafft dann die zweite auch nicht wirklich?
Jannek
-
Vielleicht solltest Du, damit wir uns wenigstens Ansatzweise vorstellen können was in der Schleife passiert, die Beziehung x zu i und z zu j darlegen. Im momentanen Beispiel ist x am Anfang einfach nur undefiniert und kann alles (also auch < y) sein.
-
Jannek schrieb:
Hallo,
ich wollte mir grad zwei for-Schleifen hintereinander schreiben und muß mit Entsetzen feststellen, dass man dann sofort die erste überspringt.
Eigentlich wollte ich die erste Schleife so bauen:int y=344;
double x,i;
for (i=0; x>=y; i=i+0.01)
.....Irgendwann erreicht x den Wert y und die Schleife wird abgebrochen. Leider kann i von 0--> 360 laufen und es kommt vor, dass nachdem das erstemal ein passendes x gefunden wurde mit höherem i noch ein x zu finden sein wird.
Deshalb wollt ich nun die zweite Schleife laufen lassen:int y=344;
double z,i;
for (j=360; z>=y; j=j-0.01)
.....Frage: wieso geht dass nicht?! Wieso rennt das Programm nur einmal bzw. nur halb durch die erste Schleife und schafft dann die zweite auch nicht wirklich?
Jannek
was hast du den als x ?
wenn x kleiner ist als y dann musst du die zeichen anders setzen
for (i=0; x<=y; i=i+0.01)
-
Für x hab ich ja keinen Wert, da der ja erst in der Schleife über tausende Gleichungen ermittelt wird. Aber ich scheine offensichtlich das Konzept der Schleife nicht verstanden zu haben, weil ich mir jetzt mal eine einfache gebaut hab und die geht auch irgendwie nicht.
guckt mal hier:int main (void)
{
int z=10;
int b= 2;
double a, c, i , y, d, x;for (i=0; c <=z; i=i+0.01)
{a= i+b;
c= a+b; }
printf ("i: %f\na: %f\nc: %f\n\n", i, a, c);
for (x=i; y<=5; x=x-1)
{y=10-x;}
printf ("x: %f\ny: %.f\n\n\n", x, y);
return 0;
}Wenn ich den zweiten printf-Befehl in die Schleife packe, dann kommt schon bei der ersten Schleife nur Müll raus und wenn dich den printf-Befehl aus der zweiten Schleife raus nehm und dahinter schreib gibt er zwar für die erste Schleife die richtigen Ergebnisse, aber zickt dann bei 'y' rum.
-
Erstens: sfds (immer wieder hilfreich - für beide Seiten)
Zweitens: Was genau hast du eigentlich vor?
-
Im grunde genommen eigentlich nur den verflixten Wert für x rausbekommen, der rauskommt, wenn die zweite schleife bei y >5 abbricht. Das würde mir bei meiner eigentlichen Aufgabe weiterhelfen, weil ich dann offensichtlich mal das System verstanden hätte.
Sinn der ersten Schleife:
for (i=0; q>= 344; i=i+0.01)
Das heißt also, die Gleichungen im Schleifenkörper tasten sich langsam an ein 'q' bis es dann kleiner 344 wird.
In der der zweiten Schleife soll dann folgendes passieren:for(x=360; r>= 344; x=x-0.01)
Das heißt also, hier wird sich wieder an die 344 rangetastet, bis r dann mal kleiner wird. Die Funktionen u Gleichungen in den beiden Schleifenkörpern sind jedesmal die selben.
Das zweimal Werte für 'q' und 'r' rauskommen können, die jeweils >344 sind liegt an den Sinus- und Kosinusfunktionen, die verwendet werden.
Am Ende soll mit den 'x' bzw. 'i'-Werten, bei denen abgebrochen wurde weitergerechnet werden und jeweils ganzs am des Programms die jeweiligen Ergebnisse verglichen werden.Ist recht umfangreich, weshalb ich das jetzt hier auch nciht reinsetze. Aber vielleicht hast du ja einen Tip wegen dem im letzten Threat platzierten Schleifenproblem.
Merci
-
Wenn du nur den Schleifenkopf reinsetzt, hilft das bei der Analyse nicht wirklich weiter (und deine Erklärung ist auch reichlich ..hm.. kryptisch).
*versucht, etwas zu raten*
for(i=0;q<=val;i+=0.01) q = irgendeine_funktion(i);
Damit berechnest du die Funktion nacheinander für verschiedene Werte - am Ende hast du in i den ersten Wert, der größer als val wurde.
Analog dazu:
for(i=360;q<=val;i-=0.01) q = irgendeine_funktion(i);
Das tastet den Wertebereich von hinten her ab - du erhältst also den letzten Wert, der größer als val wurde.
Welche Beziehung soll zwischen diesen Werten bestehen? Was genau hast du (inhaltlich!!) vor? Passt meine Interpretation ungefähr auf dein Problem?
-
Was du meinst ist vollkommen verständlich (im Gegensatz zu meinen Erklärungen
). Aber das Problem ist immernoch dass ich irgendwas falsch mache.
Guck dir mal das klein (sinnloses) Programm an (hat jetzt nichts mit dem eigentlichen zu tun) und lass das mal laufen. Ich find den Fehler nicht und versteh deshalb auch mein Problem nicht....
#include<stdio.h> #include<math.h> int main (void) { int z=10; int b= 2; double a, c, i , y, x; for (i=0; c<=z; i+=0.01) {a= i+b; c= a+b; } printf ("i: %f\na: %f\nc: %f\n\n", i, a, c); for (x=i; y<=5; x-=1) {y=10-x;} printf ("x: %f\ny: %.f\n\n\n", x, y); return 0; }
Wieso haut´n das z.B. nicht hin?!?!
Danke nochmal wegen dem Hinweis für die Farben - sieht echt übersichticher aus...
-
Jannek schrieb:
Guck dir mal das klein (sinnloses) Programm an (hat jetzt nichts mit dem eigentlichen zu tun) und lass das mal laufen. Ich find den Fehler nicht und versteh deshalb auch mein Problem nicht....
Dann solltest du wenigstens einschränken können, was an diesem Programm nicht stimmt (und was es eigentlich machen sollte). Ich kann hier nur erkennen, was es macht.
Die erste Schleife addiert zu allen Zahlen von 0 (in 0.01-Schritten) zweimal hintereinander den Wert 2 (b) auf, bis es über 10 kommt, danach werden die Endwerte dieser Rechnung ausgegeben (i=6.01*, a=8.01, c=10.01).
Die zweite Schleife läuft vom Endpunkt der ersten Schleife in Einerschritten abwärts, bis y größer als 5 wird (was gleichbedeutend ist mit x<5), und gibt wieder die Endwerte aus (x=4.01, y=5.99).Stimmt das ungefähr mit dem überein, was du vorhattest?
* könnte auch sein, daß hier 6.02 drinsteht - bei der Arbeitsreihenfolge der for()-Schleife bin ich etwas unsicher
-
Ja genau, so sollte es sein. Aber bei mir gibt er nur die Werte für die erste Schleife aus und dann noch für die zweite Schleife
x = 6.02 und für y irgendeine ewiglange Zahl. Keine Ahnung wo er die herhat.
Und wie gesagt, springt das Programm auch gleich danach raus aus der Schleife.Hach, ich glaub ich gebs langsam auf....
Werd es wohl nie kappieren. So macht das echt keine Spaß.....
Kann doch nicht so schwer sein...
-
Da könnte es auch sein, daß du vergessen hast, die Werte zu initialisieren (wenn du einfach nur
double x;
angibst, wird die Variable mit einem willkürlichen Wert aufgefüllt - um einen definierten Startwert zu haben, mußt dudouble x=0;
angeben).
-
Haha, es funktioniert!!!!!!!!!!
Es lag nicht direkt an der Initialisierung. Ich habe doch x und den anderen Werten 'double' zu gewiesen.
Jetzt hab ich das mal als Akt der letzten Hoffnung in ein 'float' umgewandelt und siehe da... es funktioniert!!!!Bleibt nur noch die Frage: was genau ist denn den Unterschied zw. double und float. Ich dacht immer die nehmen sich nicht so viel.
-
Purer Zufall.
Initialisiere sie, dann wird's mit double auch gehen. Oder anders:
double x; for ( ... ; x >= 10 ; ... ) { }
Welchen Wert hat x vor der Schleife bzw. im ersten Durchlauf? Egal, wie Du antworten wirst, es stimmt nicht. Du gehst in Deinen Schleifen offenbar von irgendeiner Voraussetzung aus, die die Sprache C Dir aber nicht gibt!
-
Wenn ich x so wie du vorgeschlagen hast initaliseren funktioniert es auch, aber ich möchte ja y als Bedingung haben. D.h. y sollte in der for-Klammer stehen (irgendwie).....
Du siehst mich langsam ratlos.
-
Was LordJaxom dort oben für x gesagt hat, gilt natürlich auch analog für JEDE Variable, die in deinem Programm vorkommt - solange du ihr keinen Wert zugewiesen hast, ist ihr Inhalt "undefiniert" (das ist die exakte Bezeichnung für "willkürlich").
-
Okay, jetzt hab ich´s endlich verstanden.
Hab den Wert 'y' vor der Schleife =Null gesetzt und jetzt funktioniert es einwandfrei.
Konnte das dann auch gleich bei meinem eigentlichen Programm so machen.Danke nochmal für Eure Hilfe und Geduld.