HILFE - Zufallszahlen - Komische Symbole
-
Hallo Leute,
ich stehe gerade (wahrscheinlich) auf dem Schlauch und komme nicht weiter...Deswegen meld ich mich mal bei euch und hoffe auf hilfe..
Ziel:
- Spielautomat entwickeln, der zu anfang 0 0 0 anzeigt.
- dann auf tastendruck eine zufallszahl (1-12) erzeugt wird und ausgegeben wird
(A = 10, B = 11, C = 12 und <9 einfach die Zahl anzeigen, sonst Buchstaben)
- dann die Punkte berechnen(nach Formel, siehe Code...)Problem:
- Punkte berechnenbei mir gibt er total komische Zeichen aus und keine Zahl
die Funktionsnamen mit Rückgabe und Parameter ist Vorgegeben , soll am besten nicht verändert werden.Code: Hab den kommentiert...hoffe ihr versteht es!
int main(void) { spielStarten(); return 0; } void spielStarten(void) { char zeichen[3] = { '0', '0', '0' }; int i = 0; int j = 0; char eingabe = 0; int punkte = 0; printf("-------------------"); printf("\n|"); for(i=0; i<3; i++) { printf("%3c |", zeichen[i]); } printf("\n-------------------"); printf("\n(Dr\201cken Sie eine beliebige Taste)"); printf("\n\n"); i = 0; eingabe = getch(); printf("-------------------"); printf("\n|"); while(i < 3) { for(j=0; j<i; j++) { printf("%3c |", zeichen[j] = getZeichen()); } i++; } printf("\n-------------------"); punkte = berechneErgebnis(zeichen[0], zeichen[1], zeichen[2]); printf("\n\n"); printf("Ihre Punkte: %c", punkte); } void ausgeben(char *a, char *b, char *c) { } //parameterliste ist VORGABE mit char, und return mit int!! int berechneErgebnis(char a, char b, char c) { //1.ziffer * 100 + 2.ziffer * 10 + 3.ziffer //a=10, b=11, c=12 //2ziffer gleich, erg*2 ; 3ziffern gleich, erg*3 [<-DAS FEHLT NOCH!!] //kann man die Berechnung "kürzer" gestalten? //sieht unschön aus :( int erg = 0; if(a < 9) a = a * 100; // WARUNUNG: '=': Verkuerzung von 'const int ' in 'char'? if(a == 'A') a = 10 * 100; if(a == 'B') a = 11 * 100; if(a == 'C') a = 12 * 100; if(b < 9) b = b * 10; if(b == 'A') b = 10 * 10; if(b == 'B') b = 11 * 10; if(b == 'C') b = 12 * 10; if(c < 9) c = c; if(c == 'A') c = 10; if(c == 'B') c = 11; if(c == 'C') c = 12; erg = a + b + c; return erg; } char getZeichen(void)//hier das zufallszeichen holen { int i = 0; char j; i = 1 + ( rand() % 13 ); if( (i>=1) && (i<=9) ) { j = intToChar(&i); } if(i==10) j = 'A'; if(i==11) j = 'B'; if(i==12) j = 'C'; return j; } char intToChar(int *i) { return (char)*i + 48; }
Ich sag schonmal DANKE!!
(hoffe ich konnte es verständlich erklären)
Schönen Gruß
Manda(noch traurig)
-
char speichert werte bis maximal 255.
-
if(a < 9) a = a * 100;
In a ist ein ASCII-Zeichen gespeichert. Dh., der Vergleich muss so aussehen:
a <= '9' oder a <= 57.
Übrigens muss es wohl <= heißen, denn die 9 willst du schließlich in deine Rechnung miteinbeziehen.
Gilt natürlich auch für b und c.
i = 1 + ( rand() % 13 );
(rand()%12)+1;
char intToChar(int *i)
Den Pointer kannst dir sparen: char intToChar(int i){}
a = 10 * 100;
Wie oben schon gesagt wurde:
In einen char passt nur eine Zahl nicht größer 256. Alles, was drüber ist, schiebt er einfach von hinten in die char-Variable rein.printf("Ihre Punkte: %c", punkte);
Ich nehme an, du willst hier eine Dezimalzahl ausgeben, und kein ASCII-Zeichen. Also statt %c ein %d.
-
Nachtrag: Wenn du a = a * 100; so stehen hast, ist es die Multiplikation von ASCII-Wert des jeweiligen a - also von 48 bis 57 - und 100.
Und nicht, wie du wohl annimst, von einer Zahl 1-9 und 100.
-
wenn du das machst:
return (char)*i + 48;
bekommst du für
a = a * 100;
eine größere zahl als für
if(a == 'A')
a = 10 * 100;gewollt?
muh schrieb:
In einen char passt nur eine Zahl nicht größer 256.
knapp daneben ist auch vorbei, nicht größer als 255.
muh schrieb:
Alles, was drüber ist, schiebt er einfach von hinten in die char-Variable rein.
ih, die sau!
muh schrieb:
In a ist ein ASCII-Zeichen gespeichert. Dh., der Vergleich muss so aussehen:
a <= '9' oder a <= 57.ehm, 97 ?
-
dann musste noch den hier machen:
srand( (unsigned)time( NULL ) );
sonst kriechste imma die glaichn wherte!
-
grösste zahl ist 12?
machstdu so: 1 + rand() % 12MandaJohn schrieb:
//kann man die Berechnung "kürzer" gestalten?
//sieht unschön ausja.
int num [3]; // hat schon INTEGER werte 1-12 per rand int sum = 0; int i = 0; int n = 3; int factor = 100; while ( i<n ) { sum += num[i++] * factor; factor /= 10; }
-
Huuuuuuuuuuaaaaaaaaaaai!
Guckst du:
int berechneErgebnis(char a, char b, char c) // a,b,c [1 ... 12] { int num [3] = {0}; int sum = 0; int i = 0; int factor = 100; num[0] = a; num[1] = b; num[2] = c; while ( i<3 ) { sum += num[i++] * factor; factor /= 10; } return sum; }
Gruß,
B.B.
-
Danke für die Antworten erstmal!! Habe versucht soweit alles zu verbessern.
@BB: Das Ergebnis wird leider falsch berechnet...
ich mach mal ein Bsp.:
zufallszahlen: A 9 B -> 1101 Punkte
Rechnung: A = 10 (also 10*100 = 1000) + 9 * 10 = 90 + B = 11
also: 1000 + 90 + 11 = 1101
1.ziffer * 100 + 2.ziffer * 10 + 3.ziffer
wenn 2 oder 3 ziffern gleich sind, dann noch das Ergebnis mit 2 bzw 3 multiplizieren.@ehm
Zitat:
if(a == 'A')
a = 10 * 100;
gewollt?
Eigentlich schon gewollte, falls a ein 'A' ist, dann soll das ja die 10 sein und mit 100multipliziert werden.
Ich versuche jetzt die chars eventl. auf int zu casten, weil ich ja größer als 255 werde.Da noch eine idee???
Danke und Gruß
Manda
-
Noch eine Ergänzung:
bei diesem Aufruf:
punkte = berechneErgebnis(zeichen[0], zeichen[1], zeichen[2]);
aus spielStarten();will ich in
int berechneErgebnis(char a, char b, char c)
{
..
int x, y, z;x = (int)a - '0';
printf("HIER: %d", x);
..
}
nur mal den Wert sehen der in 'a' stehen würde, somit versuch ich es auf int zu casten. damit ich mit diesem wert rechnen kann.
ABER: er zeigt mir nie das 0.element an sondern das 1.element.
bsp.: zahlen: 1 4 B -> Anzeige für a: 4
warum?? obwohl es ja die 1 sein sollte. ich kriege nie das 0.element.
mach ich beim aufruf was falsch??gruß
Manda
-
zieh einfach 48 von deiner null ab...
-
ehh...zieh einfach 48 (ASCII-WERT für 0) von deinem a ab und du bekommst eine dezimale zahl zwischen 1 und 9. da brauchst nichts casten.
-
Das mach ich auch, aber ich kriege ja das 0.element garnicht zu fassen. ich kann immer nur mit den 1.element rechnen. das 0. wird nie angzeigt.
ist es denn beim aufruf was falsch??hier:
x = (int)a - 48;
printf("HIER: %d", x);
aber hier ist a wieder das 1.element nicht das 0.element. woran kann das liegen?gruß
manda
-
if( (i>=1) && (i<=9) )
Da bekommst du keine Null rein.
-
MandaJohn schrieb:
Danke für die Antworten erstmal!! Habe versucht soweit alles zu verbessern.
@BB: Das Ergebnis wird leider falsch berechnet...
ich mach mal ein Bsp.:
zufallszahlen: A 9 B -> 1101 Punkte
Rechnung: A = 10 (also 10*100 = 1000) + 9 * 10 = 90 + B = 11
also: 1000 + 90 + 11 = 1101
1.ziffer * 100 + 2.ziffer * 10 + 3.ziffer
wenn 2 oder 3 ziffern gleich sind, dann noch das Ergebnis mit 2 bzw 3 multiplizieren.Falsch? Hmm... 1101 kommt doch raus für A9B.
Oder nimmst du etwa immer noch die ASCII Werte, hm?
Den Rest:1.ziffer * 100 + 2.ziffer * 10 + 3.ziffer
und so kriegste hin, ne.
-
Hallo Leute,
ich habs jetzt bisschen anders geschrieben:int berechneErgebnis(char a, char b, char c) { int erg = 0; if(a > '9') a = a - 'A' + 10; else a -= 48; if(b > '9') b = b - 'A' + 10; else b -= 48; if(c > '9') c = c - 'A' + 10; else c -= 48; erg = 100*a +10*b + c; if( (a==b) && (a==c) ) erg *=3; else if( (a==b) || (a==c) || (b==c) ) erg *=2; return erg; }
Jetzt rechnet er auch, aber ich komme auf FALSCHE ergebnisse!
für A soll er mit 10 rechnen
b = 11 und c = 12
irgendwie krieg ich es nicht hin...habt ihr ein tip??
gruß
manda
-
Guck mal zwei Post höher, und:
Ist es vorgeschrieben, das du die Funktion intToChar in der Funktion getZeichen benutzen musst?
Zum Rechnen brauchst du doch intToChar gar nicht, nur fürs Anzeigen.
-
MandaJohn schrieb:
Jetzt rechnet er auch, aber ich komme auf FALSCHE ergebnisse!
Geh doch mal mit dem Debugger durch.
-
@B.B ne ist nicht vorgeschrieben die zu benutzen (intToChar)
aber da ich ja ein char zurückgebe, dachte ich, ich müsste es erst in char umwandeln, deswegen benutze ich diese funktion.und das mit falsch rechnen...ich glaube bei dem Aufruf stimmt was nicht,
also hier:
punkte = berechneErgebnis(zeichen[0], zeichen[1], zeichen[2]);
wenn ich das zeichen[0] anzeigen lassen möchte, zeigt er mir zeichen[1] für a an!
eigentlich sollte in char a ja zeichen[0] drinne stehen und NICHT zeichen[1].
sprich, ich hab garkein zugriff auf zeichen[0], und da soll ja die 1.ziffer drin stehen.
mach ich beim aufruf was falsch??
-
MandaJohn schrieb:
@B.B ne ist nicht vorgeschrieben die zu benutzen (intToChar)
Na, umso besser, dann schmeiss die doch da raus! Du machst es dir damit nur unnötig schwer und umständlich, weil du unnötiger weise konvertierst:
Erst machst du aus einer 10 ein 'A'. Ein 'A' hat den Zahlenwert 65. Zum Rechnen musst du aber wieder aus dem 'A' eine 10 machen. Zum Anzeigen brauchst du aber wieder das 'A'. Ne.
MandaJohn schrieb:
aber da ich ja ein char zurückgebe, dachte ich, ich müsste es erst in char umwandeln, deswegen benutze ich diese funktion.
char wird intern wie eine Ganzzahl behandelt, wobei du die ASCII Werte berücksichtigen musst: 'A' = 65, 'a' = 97 usw.. siehe ASCII Tabelle!
MandaJohn schrieb:
und das mit falsch rechnen...ich glaube bei dem Aufruf stimmt was nicht,
also hier:
punkte = berechneErgebnis(zeichen[0], zeichen[1], zeichen[2]);
wenn ich das zeichen[0] anzeigen lassen möchte, zeigt er mir zeichen[1] für a an!
eigentlich sollte in char a ja zeichen[0] drinne stehen und NICHT zeichen[1].
mach ich beim aufruf was falsch??Guck ich gleich, erstma Kaffee machen.