Werte merken
-
Vielleicht kann mir ja einer helfen?? Und zwar geht es um folgendes:
Ich soll die Genauigkeit eines bestimmten Wertes erhöhen. Dazu soll ich immer den letzten und den vorletzten Wert nehmen und ein Mittel daraus berechnen
Ein Beispiel:
while(1) { scanf("%d,&a_neu); //a einlesen b=(a_alt+a_neu)/2; //a_alt ist der Wert davor printf("%d,b); a_neu -> a_alt werden }So sollte das sein.. Glaub kaum dass es schwer ist, jedoch fehlt mir die idee.. Wahrscheinlich ist es ziemlich easy mit einer globalen Variablen oder??
Danke für eure Hilfe ^^
-
a_neu -> a_alt werdenDu kannst doch Zuweisungen. Schreib doch erst mal diese Zeile vernünftig, und auch alles andere, was du noch kannst. Und dann stelle fest, was dein Programm macht und was es nicht macht. Letzteres verwandelst du dann in eine konkrete Frage, die wir dir beantworten können.

EDIT: Globale lassen wir lieber weg...
-
lol... ist es wirklich so einfach??
while(1) { scanf("%d,&a_neu); //a einlesen b=(a_alt+a_neu)/2; //a_alt ist der Wert davor printf("%d,b); a_neu=a_alt; }
-
Du solltest vll noch aufpassen das du nicht irgendwas zufälliges in dein variablen stehen hast

-
Acid69 schrieb:
lol... ist es wirklich so einfach??
while(1) { scanf("%d,&a_neu); //a einlesen b=(a_alt+a_neu)/2; //a_alt ist der Wert davor printf("%d,b); a_neu=a_alt; }Gegenfrage: funktioniert es denn (ich verstehe nicht, wieso du es nicht einfach ausprobierst)?
Ich gebe mal selbst die Antwort: nein, nicht ganz.
Noch eine Frage: was denkst du, bewirkt deine letzte Zeile?
Und noch eine: welchen Wert hat a_alt im ersten Schleifendurchlauf?
-
ups noch ein kleiner fehler, aber so oder?
while(1) { scanf("%d,&a_neu); //a einlesen b=(a_alt+a_neu)/2; //a_alt ist der Wert davor printf("%d,b); a_alt=a_neu }
-
Abgesehen vom vergessenen Semikolon... nochmal: welchen Wert hat a_alt im ersten Durchlauf?
-
_matze schrieb:
Acid69 schrieb:
lol... ist es wirklich so einfach??
while(1) { scanf("%d,&a_neu); //a einlesen b=(a_alt+a_neu)/2; //a_alt ist der Wert davor printf("%d,b); a_neu=a_alt; }Gegenfrage: funktioniert es denn (ich verstehe nicht, wieso du es nicht einfach ausprobierst)?
Ich gebe mal selbst die Antwort: nein, nicht ganz.
Noch eine Frage: was denkst du, bewirkt deine letzte Zeile?
Und noch eine: welchen Wert hat a_alt im ersten Schleifendurchlauf?Das Problem ist, ich will jetzt nicht das ganze Programm reinstellen, sondern mir geht es nur um diese eine "Funktion"
In meiner letzten Zeile soll einfach eine neue Variable deklariert werden, so dass ich mit dieser (+ dem neuen Wert) den Mittelwert errechnen kann?
Ja wegen dem ersten Schleifendurchlauf ist mir auch gerade aufgefallen.. muss ich mir noch schnell was überlegen ^^
-
_matze schrieb:
welchen Wert hat a_alt im ersten Durchlauf?
a_ganz_alt?
-
Belli schrieb:
_matze schrieb:
welchen Wert hat a_alt im ersten Durchlauf?
a_ganz_alt?
witzig

Ja ich könnte es mit einer Schleife machen, dass im ersten Durchlauf nur a_neu ausgegeben wird und dann eben b=(a_alt+a_neu)/2 .. oder gibt es eine etwas "schönere" Lösung?
-
Acid69 schrieb:
Das Problem ist, ich will jetzt nicht das ganze Programm reinstellen, sondern mir geht es nur um diese eine "Funktion"
Das ist ja schön und gut, aber selbst so ein einzelner Schnipsel muss in sich so stimmig sein, dass wir damit etwas anfangen können. Ist er das nicht, stellen wir eventuell Fehler fest, die gar keine sind (z.B. Initialwert von alt_a, falls du vor dem Schnipsel einen vergeben hättest).
Acid69 schrieb:
In meiner letzten Zeile soll einfach eine neue Variable deklariert werden, so dass ich mit dieser (+ dem neuen Wert) den Mittelwert errechnen kann?
Das musst du nicht mehr erklären, den Verdreher hast du ja direkt korrigiert.
Acid69 schrieb:
Ja wegen dem ersten Schleifendurchlauf ist mir auch gerade aufgefallen.. muss ich mir noch schnell was überlegen ^^
Dann überleg mal. :p
-
Also a_alt hat beim ersten durchlauf noch keinen Wert, deswegen wäre er 0
Aber mithilfe einer Schleife könnte ich ja sagen, dass er beim ersten mal nur a_neu nehmen soll und danach eben mit der formel b=(a_neu+a_alt)/2
oder gibt es eine "schönere" Lösung? ^^
Und vielen Dank für deine Hilfe

-
Acid69 schrieb:
Also a_alt hat beim ersten durchlauf noch keinen Wert, deswegen wäre er 0
Aber mithilfe einer Schleife könnte ich ja sagen, dass er beim ersten mal nur a_neu nehmen soll und danach eben mit der formel b=(a_neu+a_alt)/2
oder gibt es eine "schönere" Lösung? ^^
Und vielen Dank für deine Hilfe

Was heißt er wäre 0???
Du musst a_alt ja irgendwo deklarieren und auch initialisieren, sonst ist das Verhalten undefiniert. In den meisten Fällen hat dann die Variable den Wert, der vorher in dem Speicher den die Variable nun benutzt stand.Lg freeG
-
fr33g schrieb:
Acid69 schrieb:
Also a_alt hat beim ersten durchlauf noch keinen Wert, deswegen wäre er 0
Aber mithilfe einer Schleife könnte ich ja sagen, dass er beim ersten mal nur a_neu nehmen soll und danach eben mit der formel b=(a_neu+a_alt)/2
oder gibt es eine "schönere" Lösung? ^^
Und vielen Dank für deine Hilfe

Was heißt er wäre 0???
Du musst a_alt ja irgendwo deklarieren und auch initialisieren, sonst ist das Verhalten undefiniert. In den meisten Fällen hat dann die Variable den Wert, der vorher in dem Speicher den die Variable nun benutzt stand.Lg freeG
ja eben, dass mein ich ja.. er wird vorher noch nicht verwendet => Er ist 0, solange bis er halt beim ersten mal den Wert von a_alt bekommt!
Edit: Ist die Variante mit der Schleife für den ersten Durchlauf angebracht oder gibt es eine bessere Variante?
-
Acid69 schrieb:
Also a_alt hat beim ersten durchlauf noch keinen Wert, deswegen wäre er 0
Aber nur, wenn du auch mit 0 initialisierst! Sonst steht in der Variable irgendwas Zufälliges.
Was hältst du denn hiervon?
scanf("%d,&a_neu); //a einlesen a_alt=a_neu; while(1) { b=(a_alt+a_neu)/2; //a_alt ist der Wert davor printf("%d,b); a_alt=a_neu; scanf("%d,&a_neu); //a einlesen }
-
Acid69 schrieb:
ja eben, dass mein ich ja.. er wird vorher noch nicht verwendet => Er ist 0, solange bis er halt beim ersten mal den Wert von a_alt bekommt!
Nein, stimmt nicht. Probier es aus:
int test; printf("%d",test);Da steht höchstwahrscheinlich nicht 0.
Variablen ohne Initialisierung sind in C und C++ nicht automatisch 0, anders als in vielen anderen Sprachen.
-
Was du suchst ist ein Ringpuffer, der bis zu einer bestimmten Größe wächst und dann beim Einfügen eines neuen Elements das älteste entfernt. Der resultierende Wert ist dann der Mittelwert aller im Ringpuffer befindlichen Elemente. Sowas kann man sich mit std::vector oder std::list ziemlich einfach selber bauen, oder man sucht eine Ringbuffer oder circular_buffer im Netz.
-
Man könnte als Verbesserung auch einfach mal iostreams verwenden.
-
Acid69 schrieb:
fr33g schrieb:
Acid69 schrieb:
Also a_alt hat beim ersten durchlauf noch keinen Wert, deswegen wäre er 0
Aber mithilfe einer Schleife könnte ich ja sagen, dass er beim ersten mal nur a_neu nehmen soll und danach eben mit der formel b=(a_neu+a_alt)/2
oder gibt es eine "schönere" Lösung? ^^
Und vielen Dank für deine Hilfe

Was heißt er wäre 0???
Du musst a_alt ja irgendwo deklarieren und auch initialisieren, sonst ist das Verhalten undefiniert. In den meisten Fällen hat dann die Variable den Wert, der vorher in dem Speicher den die Variable nun benutzt stand.Lg freeG
ja eben, dass mein ich ja.. er wird vorher noch nicht verwendet => Er ist 0, solange bis er halt beim ersten mal den Wert von a_alt bekommt!
Edit: Ist die Variante mit der Schleife für den ersten Durchlauf angebracht oder gibt es eine bessere Variante?
Solange die Variable in einer Funktion deklariert wurde, kann ich dir zu 95% garantieren dass der Wert nicht 0 ist.
LG freeG
-
fr33g schrieb:
95%
Deutlich mehr.
