Zahlendreherprogramm läuft nicht wie gewünscht
-
Hey Leute!
Wir haben heute in der Schule ein (wie es unser Lehrer nennt) "Zahlendreherprogramm" erstellt. Es handelt sich um ein Programm, dass Zahlen von rechts nach links um schreibt.
z.B.: 2345 wird zu 5432.
Nun wollte ich dieses daheim nochmal selbst ausprobieren (hab es mir natürlich abgeschrieben) aber es will die zahlen einfach nicht umdrehen, sondern wirft mir einfach irgendwelche zahlen aus... kann mir einer von euch helfen und auch erklären, wo der fehler ist? wäre sau lieb von euch weil ich leidernoch blutiger anfänger bin (seit 4 unterrichtsstunden erst dabei )#include <cstdlib> #include <iostream> using namespace std; int main() { int z=5761; int a; while( z >= 1){ a = z - z / 10 * 10 + a * 10; z = z / 10; } cout << a << endl; system("PAUSE"); return EXIT_SUCCESS; }
-
Mir ist irgendwie nicht ganz klar, was die Rechnung in der Schleife bewirken soll. Gab es dazu im Unterricht irgendwelche Erklärungen?
Und bist du sicher, dass du die Rechnung richtig mitgeschrieben hast? Es kommt mir komisch vor, dass "a"
- uninitialisiert ist und
- in der Gleichung sowohl als lvalue, als auch als rvalue verwendet wird. Ich glaube gelesen zu haben, dass das Ergebnis in diesem Fall nicht definiert ist (bin aber selbst noch Anfänger und nicht sicher).
-
ich bin mir sicher dass ich richtig mitgeschrieben habe, da ich das blatt habe, auf dass mein lehrer den kompletten quelltext geschrieben hat ( als er es mir erklärt hat). aber jetzt verstehe ich es nichtmehr wirklich und funktionieren tut es auch nichtmehr
also irgendwas kann da doch nich stimmen...
danke für weitere hilfe
-
dennis.cpp schrieb:
- uninitialisiert ist und
Das wird's sein.
- in der Gleichung sowohl als lvalue, als auch als rvalue verwendet wird. Ich glaube gelesen zu haben, dass das Ergebnis in diesem Fall nicht definiert ist (bin aber selbst noch Anfänger und nicht sicher).
Dies hingegen ist überhaupt gar kein Problem und ziemlicher Alltag.
-
und was muss ich jetzt machen, damit es funktioniert?
tut mir leid, aber ich bin wirklich blutiger anfänger -.-
-
goldfit schrieb:
und was muss ich jetzt machen, damit es funktioniert?
tut mir leid, aber ich bin wirklich blutiger anfänger -.-Eine simple Änderung der Zeile 9 zu
int a=0;sollte reichen. Mach dir aber unbedingt klar, warum dies funktioniert und das andere nicht!
-
Okay, vielen dank!
dadurch, dass ich a=0 setze, bekomme ich die erste zahl ras, a wird dann erstzt und so kommen die anderen zahlen zu stande! (also so verstehe ich es zumindestens)
vielen dank das hat mir einiges grübeln erspart!
geruhsame nacht wünsche ich
-
goldfit schrieb:
Okay, vielen dank!
dadurch, dass ich a=0 setze, bekomme ich die erste zahl ras, a wird dann erstzt und so kommen die anderen zahlen zu stande! (also so verstehe ich es zumindestens)
vielen dank das hat mir einiges grübeln erspart!
geruhsame nacht wünsche ich
Ja, aber verstehst du, warum es vorher falsch war? Das a wird in der Rechnung selber benutzt. Aber welchen Wert hatte a denn bei deinem alten Programm? Dies ist wichtig zu wissen!
-
a hätte garkeinen wert und kann deshalb nicht benutzt werden. so hat a den wert 0 und dieser ändert sich nach der ersten rechnung in ein neues a. ich weiß nicht, ob meine erklärung so richtig ist aber ich weiß nichtm wie ich mich besser ausdrücken kann. auf jeden fall habe ich verstanden, warum es vorher nicht geklappt hat und auch, warum es jetzt funktioniert.
vielen dank dafür
-
"Garkein Wert" existiert für int nicht, in deinem Fall hatte a einen zufälligen Wert und führte zu unbrauchbaren Ergebnissen.
Wertetypen haben immer einen Wert, im schlimmsten Fall ist er halt uninitialisiert und damit zufällig.
-
Man könnte auch die ganze Rechnung etwas optimieren. Wodurch auch die Funktion besser ersichtlich wird. Die Formel habe ich dazu nicht verändert, nur gleich die jeweils richtigen Operatoren angewendet.
while (z > 0) { a *= BASIS + z % BASIS; z /= BASIS; }%, ist der Modulo-Operator, der dir den Rest berechnet. Nichts anderes erreichst du mitx/10*10.
Wenn ich+=schreibe, dann wird der Rechte Operand auf den linken angewendet und im linken gespeichert. Dies geht mit allen Rechenarten. Sprichx *= 10;, heißt x wird um den Faktor 10 verändert.
-
Wäre es nicht passender für so etwas mit Zeichenketten zu arbeiten? Also so ungefähr:
#include <iostream> #include <string> #include <algorithm> using namespace std; int main() { string input; cin >> input; reverse(input.begin(), input.end()); cout << input << '\n'; }
-
Paul Müller schrieb:
a *= BASIS + z % BASIS;Das ist so...nicht ganz korrekt.1 So, wie es da steht, ist es äquivalent zu
a = a * (BASIS + z % BASIS);, gewollt ist aber
a = a * BASIS + z % BASIS;1Schrecklicher Film, ich weiß, aber das Zitat ist sehr nützlich.
