Ausgabe total verhunzt :(
-
Hallo,
habe folgendes Programm geschrieben, aber die ausgabe ist total verhunzt, ohne das ich verstehe wieso
#include <iostream> #include <iomanip> #include <cstdlib> #include <ctime> using namespace std; void shuffel (int[] [13]); void deal (const int[] [13], const char* [], const char* []); int main() { const char *suit[4] = {"Hearts", "Diamonds", "Clubs", "Spades"}; const char *face[13]= {"Ace", "Deuce","Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"}; int deck[4][13]; //initiallisiere Deck linear(1...52) for(int i=0; i<4; i++) for(int c=0; c<13; c++) deck[i][c-1] = i+13+c; srand(time(0)); shuffel(deck); deal(deck,face,suit); system("pause"); return 0; } void shuffel(int wDeck[][13]) { int row, column, rand_row, rand_column, tmp; for (int i=0; i<8 ; i++) { //row by row for(row=0; row<4; row++) for(column=0;column<13;column++) { rand_row = rand()%4; rand_column= rand()%13; tmp = wDeck[rand_row][rand_column] = wDeck[row][column]; wDeck[row][column] = tmp; } //column by column for(column=0;column<13;column++) for(row=0;row<4;row++) { rand_row = rand()%4; rand_column= rand()%13; tmp = wDeck[rand_row][rand_column] = wDeck[row][column]; wDeck[row][column] = tmp; } } } //austeilen der karten void deal (const int wDeck[][13], const char *wFace[], const char *wSuit[]) { bool found; for (int card =1;card <=52;card++) { found =false; for (int row=0;row<=3 && !found; row++) for (int column=0; column<=12 && !found; column++) if(wDeck[row][column] ==card) { cout << setw(15) << right << wFace[column] << " of " << setw(8) << left << wSuit[row] << (card % 2 == 0? '/n' : '/t'); found=true; } } }Ausserdem bekomme ich einen Fehler
Run-Time Check Failure #2 - Stack around the variable 'deck' was corrupted.
-
ThaRealMatix schrieb:
deck[i][c-1] = i+13+c;
Überleg doch mal, was hier beim ersten Schleifendurchlauf passiert. Hier sind gleich zwei Fehler drin.
Das Zeichen zum Einleiten einer Escapesequenz ist \, nicht /.
Und Zuweisungen werden von rechts nach links abgearbeitet. Dein Tauschvorgang funktioniert so nicht.
-
tut mir leid, aber ich komme nicht auf die Fehler?
-
Dann lies mal die Antworten:
MFK schrieb:
ThaRealMatix schrieb:
deck[i][c-1] = i+13+c;
Überleg doch mal, was hier beim ersten Schleifendurchlauf passiert. Hier sind gleich zwei Fehler drin.
Am Schleifenbeginn ist i=0 und c=1, d.h. du greifst auf das Element deck[0][-1] zu - und das gibt es nicht.
Das Zeichen zum Einleiten einer Escapesequenz ist \, nicht /.
Im Klartext: Spezialzeichen solltest du als '\n' oder '\t' angeben, nicht als '/n' bzw. '/t' (beachte die Orientierung der Slashes).
Und Zuweisungen werden von rechts nach links abgearbeitet. Dein Tauschvorgang funktioniert so nicht.
Der Ausdruck
tmp = wDeck[rand_row][rand_column] = wDeck[row][column];weist der Variablen temp und dem zufälligen Array-Element den Inhalt von 'wDeck[row][column]' zu, damit kannst du die beiden Array-Elemente nicht austauschen. Dazu benötigst du eine Zuweisungsfolge:temp=wDeck[rand_row][rand_column]; wDeck[rand_row][rand_column]=wDeck[row][column]; wDeck[row][column]=temp; //oder in Kurzfassung: std::swap(wDeck[rand_row][rand_column],wDeck[row][column]);
-
Dann rechne doch mal nach.
Im ersten Schleifendurchlauf der äusseren Schleife (i=0) werden die Elemente deck[0][-1] - deck[3][-1] auf die Werte 0,1,2,...,13 gesetzt. Im zweiten Durchlauf die Elemnte deck[0][0] - deck[3][0] auf die Werte 1,2,3,...,14. Das ist wohl nicht das, was Du erreichen willst. Das erklärt auch die Fehlermeldung. deck[0][-1] liegt ausserhalb des Arrays.
Und noch was: Du solltest dringend die Einrückung im Programm korrigieren.
-
Hm ich habs nun mal so:
#include <iostream> #include <iomanip> #include <cstdlib> #include <ctime> using namespace std; void shuffel (int[] [13]); void deal (const int[] [13], const char* [], const char* []); int main() { const char *suit[4] = {"Herz", "Karo", "Kreuz", "Pik"}; const char *face[13]= {"Ass", "2","3", "4", "5", "6", "7", "8", "9", "10", "Bube", "Dame", "König"}; int deck[4][13]; //initiallisiere Deck linear(1...52) for(int i=0; i<4; i++) for(int c=0; c<13; c++) deck[i][c] = i+13+c; srand(time(0)); shuffel(deck); deal(deck,face,suit); system("pause"); return 0; } void shuffel(int wDeck[][13]) { int row, column, rand_row, rand_column, tmp; for (int i=0; i<8 ; i++) { //Reihe für Reihe for(row=0; row<4; row++) for(column=0;column<13;column++) { rand_row = rand()%4; rand_column= rand()%13; std::swap(wDeck[rand_row][rand_column],wDeck[row][column]); //tmp = wDeck[rand_row][rand_column] = wDeck[row][column]; //wDeck[row][column] = tmp; } //Zeile für Zeile for(column=0;column<13;column++) for(row=0;row<4;row++) { rand_row = rand()%4; rand_column= rand()%13; std::swap(wDeck[rand_row][rand_column],wDeck[row][column]); //tmp = wDeck[rand_row][rand_column] = wDeck[row][column]; //wDeck[row][column] = tmp; } } } //austeilen der karten void deal (const int wDeck[][13], const char *wFace[], const char *wSuit[]) { bool found; for (int card =1;card <=52;card++) { found =false; for (int row=0;row<=3 && !found; row++) for (int column=0; column<=12 && !found; column++) if(wDeck[row][column] ==card) { cout << setw(15) << right << wFace[column] << " mal " << setw(8) << left << wSuit[row] << (card % 2 == 0? '\n' : '\t'); found=true; } } }Die ausgabe erscheint immer noch verkehrt... er schreibt nun z.B
Ass mal Karo .. was ja eh mal quatsch ist, aber die Anzahl fehlt ja auch -.-
-
ThaRealMatix schrieb:
er schreibt nun z.B
Ass mal Karo .. was ja eh mal quatsch ist, aber die Anzahl fehlt ja auch -.-Was für eine Anzahl? Wie soll die Ausgabe denn aussehen?
ThaRealMatix schrieb:
deck[i][c] = i+13+c;
Der zweite Fehler ist hier immer noch drin. Mit dieser Formel erzeugst du nicht die Zahlen von 1 bis 52. Lass dir i+13+c doch mal ausgeben.
-
Die aufgabenstellung ist folgende:
Im Kartenmisch- und -gebeprogramm der Vorlesung wurde ein ineffizienter Mischalgorithmus verwendet, bei dem es nicht
garantiert war, dass er in einer bestimmten Zeit abgeschlossen ist. Dieser Algorithmus soll verbessert werden.
l Initialisieren Sie das deck Array wie folgt:
0 1 2 3 4 5 6 7 8 9 10 11 12
0 1 2 3 4 5 6 7 8 9 10 11 12 13
1 14 15 16 17 18 19 20 21 22 23 24 25 26
2 27 28 29 30 31 32 33 34 35 36 37 38 39
3 40 41 42 43 44 45 46 47 48 49 50 51 52
l Modifizieren Sie die shuffle Funktion so, dass sie Zeile für Zeile und Spalte für Spalte durch das Array läuft und jedes Element
einmal bearbeitet: Jedes Element soll mit einem zufällig ausgewählten Element des Arrays vertauscht werden. Die shuffle
Funktion soll so oft ausgeführt werden, bis das Blatt gut gemischt ist. Überprüfen Sie dies durch Ausdrucken des Arrays.
l Optimieren Sie zusätzlich auch den Gebe-Algorithmus in der deal Funktion: Sobald eine Karte ausgegeben ist, soll nicht weiter
nach der Nummer dieser Karte gesucht werden, sondern das Programm soll sofort mit dem Geben der nächsten Karte fortfahren.und ich bin möglicherweise doof aber ich verstehe deinen hinweis nicht.. muss da nen * anstatt + hin oder wie?
-
ThaRealMatix schrieb:
und ich bin möglicherweise doof aber ich verstehe deinen hinweis nicht.. muss da nen * anstatt + hin oder wie?
Gut erkannt
Versuch' doch einfach aus der Tabelle die Berechnungsvorschrift für die Array-Elemente zu ermitteln.(Lösung: i*13+c+1)
-
ThaRealMatix schrieb:
und ich bin möglicherweise doof aber ich verstehe deinen hinweis nicht.. muss da nen * anstatt + hin oder wie?
Meine ganz persönliche Meinung: Wenn du das nicht allein hinbekommst, sitzt du in der falschen Vorlesung.
-
Mal was anderes: Was spricht gegen Knuths (bzw. Moses', Oakfords und Durstfelds) Shuffle-Algorithmus? Der Algorithmus aus der Aufgabenstellung ist m.E. richtig schlecht. Knuths hat eine Laufzeit von O(n) und garantiert eine Gleichverteilung. Und, als Bonus ist er in C++ in gängigen Versionen der STL bereits implementiert (SGI zumindest verwendet ihn für ihr 'random_shuffle' und ich vermute mal, dass die meisten anderen STL-Hersteller das auch tun werden).