Zahlenfolge umdrehen, Problem
-
Moin Moin ich möchte mittels einer For Schleife eine Zahl umdrehen, spich 1234 in 4321 umwandeln. Habe mir folgendes dafür ausgedacht ! Leider gibt er mir nur Murkszahlen aus, wo ist mein Denkfehler ?
Gruß loko
int main () { int zahl,rest; int zahlenfolge [5]; cout << " Bitte geben Sie eine Zahl ein:" <<endl; cin >> zahl; for (int i=0; zahl < 0 ;i++) { rest = zahl%10; zahl = zahl/10; zahlenfolge [i] = rest; } cout << zahlenfolge; system("PAUSE"); return EXIT_SUCCESS; }
-
Mach's doch einfach so:
#include <iostream> using namespace std; int main() { char str[50]={0}; cout << " Bitte geben Sie eine Zahl ein:" <<endl; cin >> str; for(int i=strlen(str)-1;i>=0;i--) { cout << str[i]; } cout << endl; system("PAUSE"); return EXIT_SUCCESS; }
-
int main(int argc, char* argv[]) { int zahl, rest, umkehr = 0; cout << "Bitte geben Sie eine Zahl ein: "; cin >> zahl; for (int i = 0; zahl > 0 ; ++i) { rest = zahl % 10; zahl = zahl / 10; umkehr = umkehr * 10 + rest; } cout << umkehr << endl; }
-
Hey, wir arbeiten hier schliesslich mit C++
int main() { std::string Str = "1234"; std::reverse(Str.begin(), Str.end()); }
Umwandlung von und zu
int
machst du mitstd::stringstream
.
-
@loko,
Das Problem ist, dass er die Variablezahlenfolge
implizit in einen Zeiger umwandelt und dann den Zeiger, welcher auf den Speicherbereich zeigt, ausgibt. Du siehst also die hexadezimale Darstellung eines Zeigers. Wenn du willst, dass dein Code funktioniert, musst du jede Zahl einzeln ausgeben, also in etwa so:for(int i = 0; i < 5; ++i) { std::cout << zahlenfolge[i]; }
Nun wirst du aber wahrscheinlich feststellen, dass es immer noch nicht funktioniert, das hat mit einem weiteren Fehler im Code und einem Denkfehler zu tun:
for (int i=0; zahl < 0 ;i++)
Hier hat es einen Operatorfehler. Richtig wäre:
for (int i=0; zahl > 0 ;i++)
Und der Denkfehler ist, dass du 5 Zahlen hast, aber vielleicht nur 3 oder 4 benötigst. Die anderen welche du ausgibst, sind uninitialisiert und wenn man die Zahl 1234 eingibt, kommt dann womöglich sowas raus: 4321654683343
Falls man bei deinem Code bleiben möchte, würde ich sowas empfehlen:
int main () { int zahl,rest; int zahlenfolge = 0; // Nur eine Zahl! cout << " Bitte geben Sie eine Zahl ein:" <<endl; cin >> zahl; for (int i=0; zahl > 0 ;i++) { rest = zahl%10; zahl = zahl/10; zahlenfolge *= 10; zahlenfolge += rest; } cout << zahlenfolge << endl; system("PAUSE"); return EXIT_SUCCESS; }
Alternative wäre auch noch sowas denkbar, was aber nicht nur Zahlen aktzeptiert:
#include <string> #include <iostream> void wait_close() { std::cout << "Press enter to exit ..." << std::endl; std::cin.ignore(std::cin.rdbuf()->in_avail()); std::cin.clear(); std::cin.get(); } int main() { std::string number; std::cout << "Enter a number!" << std::endl; std::cin >> number; std::cout << std::string(number.rbegin(), number.rend()) << std::endl; wait_close(); return 0; }
Grüssli
-
Ein Flüchtigkeitsfehler und ein Denkfehler:
int main () { int zahl,rest; int zahlenfolge [5]; cout << " Bitte geben Sie eine Zahl ein:" <<endl; cin >> zahl; for (int i=0; zahl < 0 ;i++) // Hier soll wohl zahl>0 stehen { rest = zahl%10; zahl = zahl/10; zahlenfolge [i] = rest; } cout << zahlenfolge; // Dies gibt die Addresse des Feldes aus. //Um die Werte der Zahlen zu bekommen musst du das //Feld in einer Schleife durchgehen, z.B. so: for (int i=0;i<5;++i){ cout << zahlenfolge[i]; } cout<<endl; system("PAUSE"); return EXIT_SUCCESS; }
-
Danke für die gute Erklärung, bin nämlich noch nicht lange beim C++... und kann mir trotz kopfzerbrechen einige dinge einfach nicht erklären, weil mir teilweise noch Grundlagen fehlen
Die Aufgabe über einen string zu lösen ist mir auch eingefallen, hat auch geklappt... ich sollte es aber über eine Schleife realisieren
Gruß loko
-
Dann schreibe doch eine Schleife mit 2 Strings. Den ersten liest Du zeichenweise vorwärts ein und füllst den zweiten rückwärts auf. Etwa so:
int i,j,len, char string1[]="12345"; char string2[10]; itoa(string1,zahl,10); strcpy(string2,string1); // sichert das Nullzeichen! len=strlen(string1); for(i=0,j=len-1;i<len;i++,j--) string2[j]=string1[i]; string2[len]='\o'; // vermeidet das vorherige strcpy!
--> Diese und andere Grundlagen solltest Du schon beherrschen. Also übe das einfach!
--> Solltest Du statt eines String einen Integer haben, dann brauchst Du noch die beiden Funktionen itoa() und atoi().//Edit: C++ code tag hinzugfügt
-
berniebutt schrieb:
--> Diese und andere Grundlagen solltest Du schon beherrschen. Also übe das einfach!
In C vielleicht, aber nicht in hier.
In C++ würde ich nicht mit
itoa()
,strcpy()
undchar
-Arrays arbeiten.std::string
undstd::stringstream
sind da deine Hilfe. Und falls du sogar auf die Schleife verzichten willst, gibt es wie gesagt den STL-Algorithmusstd::reverse()
.@ berniebutt:
Übrigens noch ein Detail: Das terminierende Nullzeichen ist '\0' und nicht '\o'. Im Weiteren gibt es C++-Tags.