Berechnung in neue Funktion.
-
Meine Aufgabe lautet:
# Entwickeln Sie eine C++-Anwendung, die den Anwender zur Eingabe einer Zahl auffordert. Das Programm soll daraufhin die Reihenfolge der Ziffern in der Zahl umdrehen - beispielsweise soll 1234 in 4321 umgewandelt werden. Das Umdrehen der Reihenfolge der Ziffern soll in einer eigenen Funktion erfolgen, die keinen Rückgabewert besitzt und einen Parameter erwartet. Die Ausgabe der umgedrehten Zahl auf den Bildschirm soll in der Funktion main() erfolgen.
Ich habe das Programm jetzt erstmal in einer Funktion geschrieben, dann sieht es so aus:
#include <iostream> using namespace std; int main() { int zahl, i, umdreher[32]; for (i = 0; i < 32; ++i) { umdreher[i] = 0; } cout << "Nennen sie eine drei stellige Zahl!\n"; cin >> zahl; for (i = 0; zahl > 0; zahl = zahl/10) { umdreher[i] = 0 + zahl%10; ++i; } for (i = 0; i < 32; ++i) { cout << umdreher[i]; } cout << endl; }Im moment, sieht mein Quelltext so aus:
#include <iostream> using namespace std; void rechnung(int &zahl, int &i, int&umrechnung[32]) { for (i = 0; i < 32; ++i) { umrechnung[i] = 0; } for (i = 0; zahl > 0; zahl = zahl/10) { umrechnung[i] = 0 + zahl%10; ++i; } int main() { int z, l, u[32]; cout << "Nennen sie eine drei stellige Zahl!\n"; cin >> z; rechnung(z, l, u) for (l = 0; l < 32; ++l) { cout << u[l]; }Aber der stimmt ja, hinten und vorne nicht.

PS:Bitte an die Aufgabenstellung halten (kann sein das ich mich versehentlich nicht dran halte).
-
void rechnung(int &zahl) // die anderen Parameter brauchst du nicht! { int res = 0; int l = static_cast<int> (std::log10 (zahl)) + 1; // Länge der Zahl bestimmen std::cout << "l = " << l << std::endl; for (int i = 10; zahl; i *= 10, --l) { res += (zahl % i) / (i / 10) * static_cast<int> (std::pow (10., l)); zahl -= (zahl % i); } zahl = res; }Nicht perfekt, aber auf jeden Fall lauffähiger. Kleiner Tipp: Man erreicht dies einfach durch umbauen eines geläufigen Quersummeprogramms.
-
@.filmor Dein Algorithmus gibt eine um den Faktor 10 zu große Zahl aus.
Ich versuch's mal mit einer Alternative:
#include <algorithm> // reverse #include <iostream> #include <sstream> // stringstream #include <string> void umdrehen( int& zahl ) { std::stringstream strm; strm << zahl; std::string s = strm.str(); std::reverse( s.begin(), s.end() ); std::stringstream strm2; strm2 << s; strm2 >> zahl; } int main() { using namespace std; cout << "Geben Sie bitte eine Zahl ein: "; int zahl; if( cin >> zahl ) { umdrehen( zahl ); cout << "Die umgedrehte Zahl: " << zahl << endl; } return 0; }Gruß
Werner
-
Oder ohne strings:
#include <iostream> void num_reverse(int & num){ int res = num % 10; while(num /= 10){ res *= 10; res += num % 10; } num = res; } int main(){ std::cout << "Geben Sie bitte eine Zahl ein: "; int num; if(std::cin >> num){ num_reverse(num); std::cout << "Die umgedrehte Zahl: " << num << std::endl; } return 0; }
-
Leider sind mir davon viele Begriffe nicht bekannt. :|
Kann man es nicht mit den von mir genannten schaffen?
-
evilissimos Variante nutzt nur Kerneigenschaften der Sprache, ohne die Referenz wäre das sogar unter C gültig. Also, was fehlt dir dabei?
-
.filmor schrieb:
evilissimos Variante nutzt nur Kerneigenschaften der Sprache, ohne die Referenz wäre das sogar unter C gültig. Also, was fehlt dir dabei?Habe seinen Beitrag garnicht gesehen. o.O (schau auf Erstellungsdatum)
@evilissimos: Ich bedanke mich vielmals, deine Idee mit 30,320,321 ist um einiges besser.

Aber was ist(num /= 10für eine Bedingung? Wie wird da die Schleife beendet?
-
Sorry für Doppelpost!
Habe nun meinen Quellcode bearbeitet und die Idee mit dem x*10 übernommen.
#include <iostream> using namespace std; void rechnung(int &zahl) { int wert; for (wert = zahl%10, zahl = zahl/10; zahl > 0; zahl = zahl/10) { wert = wert*10; wert = wert + zahl%10; } zahl = wert; } int main() { int u; cout << "Nennen sie eine Zahl!\n"; cin >> u; rechnung(u); cout << u << endl; }Was sagt ihr dazu?
-
kevin123 schrieb:
@evilissimos: Ich bedanke mich vielmals, deine Idee mit 30,320,321 ist um einiges besser.

Aber was ist(num /= 10für eine Bedingung? Wie wird da die Schleife beendet?
Das wird so lange ausgeführt bis num / 10 == 0
num /= 10ist das gleiche wie
num = num / 10zu deinem code, der macht eben das, was meiner auch macht aber mit viel mehr code

BR evilissimo