Umdrehen einer switch Anweisung? -->Reihung?



  • schonmal vielen Dank für die Tipps!

    @ Andi01: Dein erster Vorschlag gefällt mir, da ich Ihn direckt verstanden habe. Allerdings soll die Zahl nicht in Ziffern eingegeben werden und beliebiger Länge sein!

    Das passt dein zweiter Vorschlag schon besser und ich versuche grade da durchzusteigen 😉

    Vielen Dank 👍

    @ volkard:

    Die Aufgabenstellung lautet jediglich:
    Entwickel ein Programm welches eine Zahl in folgende Art und Weise umschreibt:
    Bsp.: 432 --> vier drei zwei
    Zahl beliebig! nicht nur dreistellig!

    LG
    Chris



  • also vom User ist eine Zahlenfolge einzugeben



  • cknopp schrieb:

    schonmal vielen Dank für die Tipps!

    @ Andi01: Dein erster Vorschlag gefällt mir, da ich Ihn direckt verstanden habe. Allerdings soll die Zahl nicht in Ziffern eingegeben werden und beliebiger Länge sein!

    Das passt dein zweiter Vorschlag schon besser und ich versuche grade da durchzusteigen 😉

    Vielen Dank 👍

    @ volkard:

    Die Aufgabenstellung lautet jediglich:
    Entwickel ein Programm welches eine Zahl in folgende Art und Weise umschreibt:
    Bsp.: 432 --> vier drei zwei
    Zahl beliebig! nicht nur dreistellig!

    LG
    Chris

    Die Lösungen sind alle viel zu kompliziert... Warum macht ihr es euch so schwer?

    #include <iostream>
    #include <string>
    
    std::string gibNamen(char c);
    
    int main()
    {
    	std::cout<< "Bitte eine Zahl eingeben:" << std::endl;
    
    	std::string zahl;
    	std::cin >> zahl;
    
    	for (unsigned int i = 0; i < zahl.length(); ++i)
    	{
    		std::cout << gibNamen(zahl[i]) << " ";
    	}
    
    	std::cout << std::endl;
    
    	return 0;
    }
    
    std::string gibNamen(char c)
    {
    	switch (c)
    	{
    		case '0':
    			return "null";
    
    		case '1':
    			return "eins";
    
    		case '2':
    			return "zwei";
    
    		case '3':
    			return "drei";
    
    		case '4':
    			return "vier";
    
    		case '5':
    			return "fuenf";
    
    		case '6':
    			return "sechs";
    
    		case '7':
    			return "sieben";
    
    		case '8':
    			return "acht";
    
    		case '9':
    			return "neun";
    	}
    
    	return "<error>";
    }
    


  • cknopp schrieb:

    @ volkard:
    Die Aufgabenstellung lautet lediglich:
    Entwickle ein Programm, welches eine Zahl in folgende Art und Weise umschreibt:
    Bsp.: 432 --> vier drei zwei
    Zahl beliebig! Nicht nur dreistellig!

    Dann würde ich den Aufrufstack zum Umdrehen benutzen.

    void sprich(int zahl)
    {
       if(zahl>=10)
          sprich(zahl/10);
       switch(zahl%10)
       {
          case '0': cout<<"null "; break;
          case '1': cout<<"eins "; break;
          ...
          case '9': cout<<"neun "; break;
       }
    }
    int main()
    {
       //zahl eingeben lassen
       sprich(zahl);
    }
    


  • BBBB schrieb:

    Die Lösungen sind alle viel zu kompliziert... Warum macht ihr es euch so schwer?

    Ich nehme an, daß / und % geübt werden sollten.
    Und das switch statt eines Arrays auch nur deswegen, weil Arrays noch nicht dran waren.



  • volkard schrieb:

    BBBB schrieb:

    Die Lösungen sind alle viel zu kompliziert... Warum macht ihr es euch so schwer?

    Ich nehme an, daß / und % geübt werden sollten.
    Und das switch statt eines Arrays auch nur deswegen, weil Arrays noch nicht dran waren.

    Verstehe 🙂



  • volkard schrieb:

    BBBB schrieb:

    Die Lösungen sind alle viel zu kompliziert... Warum macht ihr es euch so schwer?

    Ich nehme an, daß / und % geübt werden sollten.
    Und das switch statt eines Arrays auch nur deswegen, weil Arrays noch nicht dran waren.

    Arrays sind doch Reihungen, oder?
    Damit haben wir jetzt grade angefangen....

    dennoch sagt mir dieses std:: im Quellcode von BBBB gar nichts 😕



  • Ist das denn eine Übung zu Arrays, wenn ihr diese gerade behandelt? Dann wird wahrscheinlich erwartet, dass du das switch-Konstrukt entsprechend ersetzt.

    cknopp schrieb:

    dennoch sagt mir dieses std:: im Quellcode von BBBB gar nichts 😕

    cin/cout/string/usw. liegen im Namespace std. Wahrscheinlich habt ihr das noch nicht durchgenommen, aber letztendlich erfordert es, dass man std::cout etc. schreibt (oder using namespace std; irgendwo an den Anfang schreibt). Dein erstes Beispiel dürfte also eigentlich nicht kompilieren.

    #include <iostream>
    using namespace std;
    int main()
    {
      cout << "Geben Sie bitte eine Zahl ein: ";
      string zahl;
      cin >> zahl;
      static const char* zahlen[]={"null","eins","zwei","drei","vier","fuenf","sechs","sieben","acht","neun"};
      for (string::iterator it=zahl.begin(),e=zahl.end();it!=e;it++)if (*it>='0' && *it<='9')cout << zahlen[*it-'0'] << ' ';
      //Edit: obige Zeile ohne Iteratoren:
      //for (unsigned i=0;i<zahl.length();i++)if (zahl[i]>='0' && zahl[i]<='9')cout << zahlen[zahl[i]-'0'] << ' ';
    }
    


  • Das klappt aber nur bei ASCII oder ähnlich aufgebauten Kodierungen.



  • hier ist noch eine relativ einfache lösung:

    #include<iostream> 
    #include<conio.h> 
    #include<string> 
    #include<sstream>
    using namespace std; 
    
    void umschreiben(int); 
    
    int main() 
    { 
    cout<<"Bitte geben Sie die Zahl ein!\n"; 
    string zahl; 
    cin>>zahl; 
    int länge=zahl.length(); 
    int zahl_neu[30];
    stringstream sstr;
    for(int a=0;a<länge;a++)
    {
    	sstr<<zahl[a];
    	sstr>>zahl_neu[a];
             sstr.clear();
    }
    for(int a=0;a<länge;a++) 
    { 
    umschreiben(zahl_neu[a]); 
    } 
    getch(); 
    } 
    
    void umschreiben(int ziffer) 
    { 
    switch(ziffer) 
    { 
    case 0: 
    cout<<"Null "; 
    break; 
    case 1: 
    cout<<"Eins "; 
    break; 
    case 2: 
    cout<<"Zwei "; 
    break; 
    case 3: 
    cout<<"Drei "; 
    break; 
    case 4: 
    cout<<"Vier "; 
    break; 
    case 5: 
    cout<<"Fünf "; 
    break; 
    case 6: 
    cout<<"Sechs "; 
    break; 
    case 7: 
    cout<<"Sieben "; 
    break; 
    case 8: 
    cout<<"Acht "; 
    break; 
    case 9: 
    cout<<"Neun "; 
    break; 
    } 
    }
    

    Das sollte so ziemlich die einfachste und verständlichste möglichkeit sein.

    Dieses std:: im Code von BBBB kann auch einfach weggelassen werden, es steht für standard.



  • andi01 schrieb:

    ...
    char zahl[100];
    cin>>zahl;
    ...
    

    Mit so etwas fangen wir bitte erst gar nicht an. Dafür gibt es doch std::string!

    Gruß,
    SP



  • jo kleiner fehler von mir 🙂 ich bessere das gleich mal aus.

    edit: hoppla noch ein kleiner fehler, mein obiger code funktioniert nur für einstellige zahlen 😞 . aber den fehler werde ich auch noch finden...



  • David_pb schrieb:

    Das klappt aber nur bei ASCII oder ähnlich aufgebauten Kodierungen.

    Nenn mir eine andere!



  • so der folgende Code wurde jetzt von mir überarbeitet und getestet und funktioniert einwandfrei!

    #include<iostream> 
    #include<conio.h> 
    #include<string> 
    #include<sstream> 
    using namespace std; 
    
    void umschreiben(int); 
    
    int main() 
    { 
    cout<<"Bitte geben Sie die Zahl ein!\n"; 
    string zahl; 
    cin>>zahl; 
    int länge=zahl.length(); 
    int zahl_neu[30]; 
    stringstream sstr; 
    for(int a=0;a<länge;a++) 
    { 
        sstr<<zahl[a]; 
        sstr>>zahl_neu[a]; 
        sstr.clear(); 
    } 
    for(int a=0;a<länge;a++) 
    { 
    umschreiben(zahl_neu[a]); 
    } 
    getch(); 
    } 
    
    void umschreiben(int ziffer) 
    { 
    switch(ziffer) 
    { 
    case 0: 
    cout<<"Null "; 
    break; 
    case 1: 
    cout<<"Eins "; 
    break; 
    case 2: 
    cout<<"Zwei "; 
    break; 
    case 3: 
    cout<<"Drei "; 
    break; 
    case 4: 
    cout<<"Vier "; 
    break; 
    case 5: 
    cout<<"Fünf "; 
    break; 
    case 6: 
    cout<<"Sechs "; 
    break; 
    case 7: 
    cout<<"Sieben "; 
    break; 
    case 8: 
    cout<<"Acht "; 
    break; 
    case 9: 
    cout<<"Neun "; 
    break; 
    } 
    }
    

    Damit sollte dein Problem gelöst sein!

    mfg,
    andi01.



  • andi01 schrieb:

    so der folgende Code wurde jetzt von mir überarbeitet und getestet und funktioniert einwandfrei!

    int main() 
    { 
    cout<<"Bitte geben Sie die Zahl ein!\n"; 
    string zahl; 
    cin>>zahl; 
    int länge=zahl.length(); 
    int zahl_neu[30]; 
    stringstream sstr; 
    for(int a=0;a<länge;a++) 
    { 
        sstr<<zahl[a]; 
        sstr>>zahl_neu[a]; 
             sstr.clear(); 
    } 
    for(int a=0;a<länge;a++) 
    { 
    umschreiben(zahl_neu[a]); 
    } 
    }
    

    Ich weiß ja nicht...

    int main()
    {
      cout<<"Bitte geben Sie die Zahl ein!\n";
      int zahl;
      cin>>zahl;
      sage(zahl);
    }
    


  • ok, mein code ist vielleicht etwas kompliziert, das liese sich wahrscheinlich auch einfacher lösen.
    nur wie soll das mit

    int main()
    {
      cout<<"Bitte geben Sie die Zahl ein!\n";
      int zahl;
      cin>>zahl;
      sage(zahl);
    }
    

    funktionieren? der Funktion sage() muss wenn man es mit switches lösen will doch jede ziffer einzeln übergeben werden und nicht die ganze zahl, oder? genau deswegen ist mein code ja etwas komplizierter. ob man den teil mit dem zerlegen in die einzelnen ziffern in sage() verschiebt oder in main() lässt ist do eigentlich egal,oder?

    aber immerhin, der code funktioniert schonmal, auch wenn er etwas kompliziert ist 🙂



  • Auch getestet.

    #include <iostream>
    using namespace std;
    void sage(int zahl)
    {
       if(zahl>=10)
          sage(zahl/10);
       switch(zahl%10)
       {
          case 0: cout<<"null "; break;
          case 1: cout<<"eins "; break;
          case 2: cout<<"zwei "; break;
          case 3: cout<<"drei "; break;
          case 4: cout<<"vier "; break;
          case 5: cout<<"fünf "; break;
          case 6: cout<<"sech "; break;
          case 7: cout<<"sibn "; break;
          case 8: cout<<"acht "; break;
          case 9: cout<<"neun "; break;
       }
    }
    int main()
    {
      cout<<"Bitte geben Sie die Zahl ein!\n";
      int zahl;
      cin>>zahl;
      sage(zahl);
    }
    


  • cin/cout/string/usw. liegen im Namespace std. Wahrscheinlich habt ihr das noch nicht durchgenommen, aber letztendlich erfordert es, dass man std::cout etc. schreibt (oder using namespace std; irgendwo an den Anfang schreibt). Dein erstes Beispiel dürfte also eigentlich nicht kompilieren.

    Wir haben bisher immer mit <iostrem.h> und nicht <iostream> gearbeitet!
    Warum ka?
    Allerdings sind dann die Information für z.B cout, cin schon drin.

    LG
    Chris



  • cknopp schrieb:

    Wir haben bisher immer mit <iostrem.h> und nicht <iostream> gearbeitet!
    Warum ka?
    Allerdings sind dann die Information für z.B cout, cin schon drin.

    Genaugenommen ist <iostream.h> kein gültiges C++. Leider scheint das kein ausreichender Grund zu sein, dies nicht mehr zu unterrichten.

    Nimm <iostream> , schreib meinetwegen using namespace std; darunter (solange es nicht im Header steht) und du kannst alles genauso gut nutzen. Nur programmierst du dann eben C++.



  • cknopp schrieb:

    Arrays sind doch Reihungen, oder?

    Was soll eine Reihung sein? Arrays sind halt Arrays. Wenn du willst kannst du Felder sagen, oder halt Vektoren, aber Reihung???


Anmelden zum Antworten