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 mit std::stringstream .


  • Administrator

    @loko,
    Das Problem ist, dass er die Variable zahlenfolge 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


  • Mod

    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() und char -Arrays arbeiten. std::string und std::stringstream sind da deine Hilfe. Und falls du sogar auf die Schleife verzichten willst, gibt es wie gesagt den STL-Algorithmus std::reverse() .

    @ berniebutt:
    Übrigens noch ein Detail: Das terminierende Nullzeichen ist '\0' und nicht '\o'. Im Weiteren gibt es C++-Tags.


Anmelden zum Antworten