Problem bei zwei Programmen mit schleifen!?



  • Hallo Gemeinde,

    ich hab bei zwei Programmen die ich schreiben soll Probleme:

    1.Zahl einlesen, umdrehen und in wörtern ausgeben. Soweit so gut es funktioniert das umddrehen und das ausgeben, aber zusammen funktionierts nicht 😃

    #include <iostream>
    using namespace std;
    int zahl,ziffer,umgedreht;

    void main()
    {
    cout << "Geben sie eine ganze positive Zahl ein: ";
    cin >> zahl;

    while(zahl != 0)
    {

    ziffer = zahl % 10;
    zahl = zahl / 10;
    umgedreht = umgedreht * 10 + ziffer;

    }

    switch(umgedreht)
    {
    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 << "Fuenf";
    break;
    case 6:
    cout << "Sechs";
    break;
    case 7:
    cout << "Sieben";
    break;
    case 8:
    cout << "Acht";
    break;
    case 9:
    cout << "Neun";
    break;
    }

    }

    2.Soll ich ein Prog schreiben das in einer Dauerschleife char Zeichen einliest. Wurde keine Ziffer (0,1,2,3,4,5,6,7,8 oder 9) eingegeben, soll die Eingabe wieder auf dem Bildschirm ausgegeben werden.Bei einem kleinen e wird die schleife beendet. Hier soll man den ascii Zeichensat beachten.

    Hier steh ich absolut auf em Schlauch und hab gar keine Idee was ich machen soll.

    Danke für eure Hilfe!!



  • Zu deinem ersten Problem: Das switch so wie du es verwendest, funktioniert ja nur, wenn deine Zahl nur eine Ziffer hat. Du müsstest also (so ähnlich wie in deiner ersten Schleife) alle Ziffern deiner Zahl in einer Schleife durchlaufen. Wenn du selber auf die erste Schleife gekommen bist, wirst du das auch hinkriegen.

    Zu deinem zweiten Problem: Wie überprüfst du denn, ob ein eingegebenes Zeichen nicht 0,1,2,3,4,5,6,7,8,9 ist? Stichwort ASCII. Bei einem 'e' abzubrechen ist auch nicht so schwer (Stichwort break).

    EDIT: Ach ja, nach dem aktuellen Standard muss es int main() und nicht void main() heißen. Außerdem sind cpp-Tags (Beispiel:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        cout << "Hello World" << endl;
        return 0;
    }
    

    ) und Einrückungen eine ganz nette Idee.

    Felix



  • Zu 1:

    static const char* numbers[] =
    	{ "Null", "Eins", "Zwei", "Drei", "Vier", "Fuenf", "Sechs", "Sieben", "Acht", "Neun" };
    
    // ...
    
    while(zahl != 0)
    {
    
    ziffer = zahl % 10;
    zahl = zahl / 10;
    umgedreht = umgedreht * 10 + ziffer;
    
    	printf( "%s ", numbers[ ziffer ] );
    }
    


  • Ja das mit e ist natürlich nicht das Prob, aber wie kann ich den ASCII ins Programm einbinden?



  • Das mit den Einrückungen sieht bei mir eigentlich auch so aus. Beim Eintrag wurde die Formatierung aber irgendwie nicht übernommen!



  • Putzfrau schrieb:

    Das mit den Einrückungen sieht bei mir eigentlich auch so aus. Beim Eintrag wurde die Formatierung aber irgendwie nicht übernommen!

    Dann versuch doch mal rauszufinden, warum. Tipp: Es hat was damit zu tun dass der Code in den Beiträgen der anderen eingerahmt und bunt ist.



  • Danke für den Tipp!

    @David_pb Danke aber soweit sind wir glaub noch nicht!



  • So evtl.

    #include <cstdlib>
    #include <iostream>
    #include <string>
    
    int main()
    {
        const char* numberLookup[] = {"null", "eins", "zwei", "drei", "vier", "fuenf", "sechs", "sieben", "acht", "neun"};
    
        std::string input;
        std::string output;
    
        while(true)
        {
            std::cout << "Input> ";
            std::cin >> input;
            if(input == "e")
            {
                break;
            }
    
            output = "";
            for(std::string::reverse_iterator riter = input.rbegin(); riter != input.rend(); ++riter)
            {
                if(static_cast<unsigned long>(*riter - '0') < 10)
                {
                    output = output +  numberLookup[*riter - '0'] + ' ';
                }
                else
                {
                    output = input;
                    break;
                }
            }
            std::cout << output << '\n';
        }
    
        return EXIT_SUCCESS;
    }
    


  • Oder so:

    static const char* numbers[] =
    	{ "null", "eins", "zwei", "drei", "vier", "fuenf", "sechs", "sieben", "acht", "neun", "unknown" };
    
    	std::string line;
    
    	do
    	{
    		std::getline( std::cin, line );
    
    		for( std::string::reverse_iterator it = line.rbegin(); it != line.rend(); ++it )
            {
    			printf( "%s ", numbers[ std::isdigit( *it ) ? *it & 0xf : 10 ] );
    		}
    
    	}  while ( line == "e" );
    


  • Hmm...

    David_pb schrieb:

    while ( line == "e" );
    

    Hmm...

    David_pb schrieb:

    printf(...)
    


  • Ups! 😮

    So:

    static const char* numbers[] =
    	{ "unknown", "null", "eins", "zwei", "drei", "vier", "fuenf", "sechs", "sieben", "acht", "neun" };
    
    	std::string line;
    
    	while ( 1 )
    	{
    		std::getline( std::cin, line );
    
    		if ( line == "e" )
    			break;
    
    		for( std::string::reverse_iterator it = line.rbegin(); it != line.rend(); ++it )
            {
    			printf( "%s ", numbers[ bool( std::isdigit( *it ) ) * ( ( *it & 0xf ) + 1 ) ] );
    		}
    	}
    


  • Es ist nicht besser geworden:

    while(1)
    //...
    printf( "%s ", numbers[ bool( std::isdigit( *it ) ) * ( ( *it & 0xf ) + 1 ) ] );
    

    Ausserdem sollte bei Falscheingabe die Eingabe ausgegeben werden und nicht unknown.



  • Doch, ist besser geworden. Die Abbruchbedingung stimmt nämlich jetzt. Nur die Ausgabe nicht! 🙂



  • Danke aber ihr macht das ganze hier viel zu professionell!?

    eins hab ich jetzt. Gibts bei 2 einfach eine Möglichkeit, wie z.B.

    while(a!='e')
    ....

    hier wird solang ausgeführt bis ein e eingegeben wird. Gibts sowas auch für die Zahlen, bzw. ASCII?



  • Jadoch die Möglichkeit gibts:

    char c;
    
    	while ( true )
    	{
    		std::cin >> c;
    
    		if ( c == 'e' )
    			break;
    
    		// tu irgendwas mit c
    	}
    


  • Ich glaube, dir ist nicht ganz klar, was das mit dem ASCII bedeutet. Du musst dafür nichts "einbinden", oder so, intern werden die eingegebenen Zeichen (normalerweise) als ASCII codiert, d.h. 'e' entspricht zum Beispiel der Zahl 101 in Dezimal, bzw. 65 in Hexadezimaler schreibweise. Dadurch kannst du zum Beispiel prüfen, ob ein Zeichen, nennen wir es c 0,1,2,3,4,5,6,7,8,9 ist, indem du schreibst if('0' <= c && c <= '9'), da die Ziffern im ASCII-Code "hintereinander" stehen.

    Felix


Anmelden zum Antworten