Was ist falsch? Wortgenerator



  • Ich habe ein Problem mit einem 'Übungsprogramm'.
    Und zwar sollte es ein Wortgenerator werden.
    Das Wort sollte maximal 10 Buchstaben lang sein und die Buchstaben zwischen A - Z enthalten. Allerdings funktioniert das bei meinem Entwurf nicht so wie gewünscht. Es werden immer komische Zeichen dargestellt und es sind immer die selben. Nur der Tastendruck auf 'B', zum Beenden funktioniert.
    Könnte mir jemand helfen damit das Programm 'Wörter' ausspuckt?

    Danke im voraus.

    -Skotchy



  • //ungetestet
    #include<iostream>
    #include<ctime>
    int main(){using namespace std;srand(time(0));for(int i=0;i!=10;++i)cout<<char('A'+rand()%26);cout<<'\n';}
    

    Aber vielleicht besser, Du zeigst Deins und wir reparieren es.



  • Upps, hab den Code vergessen.

    Wow, dass geht auch so kurz? Mein Code ist ein Stück länger...:

    #include <iostream>
    #include <conio.h>
    #include <time.h>
    
    using namespace std;
    
    int main()
    {
    	//Variablen
    	char buchstabe[10], taste;
    	bool schleife = true;
    	int buchstaben = 0, BuchstabenArt;
    
    	//Die Zufallszahl
    	srand((unsigned)time(NULL));
    	int zufallszahl = rand() % 10;
    
    	//Start-Dialog
    	cout << "Druecke eine Taste um ein Wort zu generieren.\nDruecke 'B' um das Programm zu beenden." << endl;
    
    	//Hauptschleife
    	while(schleife == true)
    	{
    		//Speichert die Gedrückte taste in 'taste'
    		taste = getch();
    
    		//Wenn taste = b,B dann beende das Programm
    		switch (taste)
    		{
    		case 'B':
    		case 'b':
    			schleife = false;
    			break;
    		//Wenn taste nicht b,B ist dann erstelle das Wort
    		default:
    			{
    				//Schleife für die generierung des Wortes
    				for(int i = zufallszahl; i > buchstaben; buchstaben++)
    				{
    					//Generiert eine Zahl zwischen 1 und 26 um einen Buchstaben zu generieren
    					BuchstabenArt = 1 + (rand() % 26);
    
    					//Wandelt die Zahl in einen Buchstaben um und steckt sie an
    					//die richtige Stelle im Wort
    					switch (BuchstabenArt)
    					{
    					case '1':
    						buchstabe[buchstaben] = 'A';
    						break;
    					case '2':
    						buchstabe[buchstaben] = 'B';
    						break;
    					case '3':
    						buchstabe[buchstaben] = 'C';
    						break;
    					case '4':
    						buchstabe[buchstaben] = 'D';
    						break;
    					case '5':
    						buchstabe[buchstaben] = 'E';
    						break;
    					case '6':
    						buchstabe[buchstaben] = 'F';
    						break;
    					case '7':
    						buchstabe[buchstaben] = 'G';
    						break;
    					case '8':
    						buchstabe[buchstaben] = 'H';
    						break;
    					case '9':
    						buchstabe[buchstaben] = 'I';
    						break;
    					case '10':
    						buchstabe[buchstaben] = 'J';
    						break;
    					case '11':
    						buchstabe[buchstaben] = 'K';
    						break;
    					case '12':
    						buchstabe[buchstaben] = 'L';
    						break;
    					case '13':
    						buchstabe[buchstaben] = 'M';
    						break;
    					case '14':
    						buchstabe[buchstaben] = 'N';
    						break;
    					case '15':
    						buchstabe[buchstaben] = 'O';
    						break;
    					case '16':
    						buchstabe[buchstaben] = 'P';
    						break;
    					case '17':
    						buchstabe[buchstaben] = 'Q';
    						break;
    					case '18':
    						buchstabe[buchstaben] = 'R';
    						break;
    					case '19':
    						buchstabe[buchstaben] = 'S';
    						break;
    					case '20':
    						buchstabe[buchstaben] = 'T';
    						break;
    					case '21':
    						buchstabe[buchstaben] = 'U';
    						break;
    					case '22':
    						buchstabe[buchstaben] = 'V';
    						break;
    					case '23':
    						buchstabe[buchstaben] = 'W';
    						break;
    					case '24':
    						buchstabe[buchstaben] = 'X';
    						break;
    					case '25':
    						buchstabe[buchstaben] = 'Y';
    						break;
    					case '26':
    						buchstabe[buchstaben] = 'Z';
    						break;
    					}
    				}
    			}
    			//Schreibt das Wort
    			for(int i = buchstaben; buchstaben > 0; buchstaben--)
    			{
    				cout << buchstabe[buchstaben];
    			}
    			cout << endl;
    		}
    	}
    	cout << "Drücke eine beliebige Taste um das Programm zu beenden.";
    	getch();
    }
    

    Danke für die schnelle Antwort.

    -Skotchy



  • case '1':
    

    soll besimmt

    case 1:
    

    sein.



  • Um es zusammenzufassen:
    Dein Code ist C + cout.
    Dein C-Code ist kein ANSI C.
    volkards Code muss sich nach dem Standard nicht so verhalten, wie er soll.
    volkards Code ist eleganter.
    Du könntest deinen Code kürzer machen und trotzdem standardkonform bleiben.



  • Ok, Änderung für Nicht-ASCII-Zeichensatz-Habe-Rechner.

    //ungetestet
    #include<iostream>
    #include<ctime>
    int main(){using namespace std;srand(time(0));for(int i=0;i!=10;++i)cout<<"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[rand()%26];cout<<'\n';}
    


  • wxSkip schrieb:

    Um es zusammenzufassen:
    Dein Code ist C + cout.
    Dein C-Code ist kein ANSI C.
    volkards Code muss sich nach dem Standard nicht so verhalten, wie er soll.
    volkards Code ist eleganter.
    Du könntest deinen Code kürzer machen und trotzdem standardkonform bleiben.

    Ich hab ja erst vor kurzem angefangen C++ zu lernen...
    Von solchen Standards habe ich noch nicht viel gehört oder gelesen.
    Trotzdem, danke für eure Antworten.

    -Skotchy



  • Lässt der Compiler das zu?

    "BuchstabenArt" ist doch vom Typen Integer die cases vergleichen aber ein Character. Wird das implizit gecastet?

    Können '15' ein Character sein?

    Dachte das es entweder nur eine Zahl sein kann
    case 15:
    oder ein String
    case "15":



  • Alles "int-ige" ist erlaubt. Strings sind nicht erlaubt.



  • David W schrieb:

    Können '15' ein Character sein?

    Denk an Unicode.



  • Das 15 ein Zeichen repräsentieren können ist mir klar, ich meinte eher die Art der Eingabe.
    C# quittiert diese Zeile

    char i = '15';
    

    mit der Meldung

    Too many characters in character literal

    Was ich auch verstehe, da es eine 1 und eine 5 ist und kein Zeichen mit den 15er ASCII Wert
    Wogegen

    char i = (char)15;
    

    direkt funktioniert, da man an der stelle die 15 als Integer nach einem Char schiebt.



  • David W schrieb:

    Das 15 ein Zeichen repräsentieren können ist mir klar, ich meinte eher die Art der Eingabe.
    C# quittiert diese Zeile

    char i = '15';
    

    mit der Meldung

    Too many characters in character literal

    Was ich auch verstehe, da es eine 1 und eine 5 ist und kein Zeichen mit den 15er ASCII Wert
    Wogegen

    char i = (char)15;
    

    direkt funktioniert, da man an der stelle die 15 als Integer nach einem Char schiebt.

    wchar_t c='15';//c='1'*256+'5'=49*256+53=12597
    

    http://ideone.com/9QUcx



  • Scheinbar erkennt der C++ Compiler das die 15 nicht das Literal selber ist sondern der ASCII und Castet selber entsprechend.
    C# kanns nicht.
    http://www.ideone.com/OpEOL


Anmelden zum Antworten