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 Zeilechar 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
Wogegenchar 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 Zeilechar 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
Wogegenchar 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
-
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