C++ falsche ausgabe, karten



  • Moin, hierum gehts:

    static const char* suit[4] =
    	{ "Hearts", "Diamonds", "Clubs", "Spades" };
    
    	static const char* face[13] =
    	{ "Ace", "Deuce", "Three", "Four", "Five", "Six", "Seven",
    	"Eight", "Nine", "Ten", "Jack", "Queen", "King" };
    
    	for (int i = 0; i <= 3; ++i){
    		for (int k = 0; k <= 12; ++k){
    
    			cout << face[deck[i][k] % 13] << " of "
    				<< suit[deck[i][k] / 13] << endl;
    		}
    	}
    

    Problem ist "face" wird eins zu hoch ausgegeben, sprich statt einer drei gibt er eine vier aus.
    face[deck[i][k] % 13] hier ist also irgendwie der Wurm drinne, aber ich finde ihn nicht.



  • Riecht sehr nach falscher Arrayindizierung.
    Arrays starten bei 0 und nicht bei 1.



  • Hm ich merke grade die beiden sind eins daneben.
    Wie kann ich das korrigieren? Mit face[deck[i][k] % 13 - 1] komme ich ja teilweise auf -1 was ja falsch ist.



  • Dann ist deck falsch gefüllt.



  • static const char* face[13] =
        { "", "Ace", "Deuce", "Three", "Four", "Five", "Six", "Seven",
        "Eight", "Nine", "Ten", "Jack", "Queen", "King" };
    

    Ein Dummywert für Position 0 wäre ein schneller Fix.



  • Ethon schrieb:

    static const char* face[13] =
        { "", "Ace", "Deuce", "Three", "Four", "Five", "Six", "Seven",
        "Eight", "Nine", "Ten", "Jack", "Queen", "King" };
    

    Ein Dummywert für Position 0 wäre ein schneller Fix.

    Dann ist die 13 aber falsch.
    Sowohl bei der Definition von dem Array, als auch bei der Berechnung.



  • Stimmt, nicht nachgedacht. 🙄

    Am Besten intern statt 1-13 mit 0-12 arbeiten.



  • Ethon schrieb:

    Stimmt, nicht nachgedacht. 🙄

    Am Besten intern statt 1-13 mit 0-12 arbeiten.

    Sag ich doch. deck ist falsch gefüllt 😉



  • ~~Btw: deine for Schleifen zählen pre-increment hoch!
    D.h. ++i ist beim 1. Durchgang nicht 0, sondern schon 1, da erst hochgezählt und dann ausgewertet wird.
    i++ würde erst i auswerten und dann hochzählen.

    Wenn man das berücksichtigt erklärt sich der Offset ;)~~

    -.-' Hirnfurz



  • ...


  • Mod

    Boolshit schrieb:

    Btw: deine for Schleifen zählen pre-increment hoch!
    D.h. ++i ist beim 1. Durchgang nicht 0, sondern schon 1, da erst hochgezählt und dann ausgewertet wird.
    i++ würde erst i auswerten und dann hochzählen.

    Wenn man das berücksichtigt erklärt sich der Offset 😉

    Quatsch.
    for(A; B; C) D; ist nichts anderes als

    {
      A;
      while(B)
      {
        D;
        C;
      }
    }
    


  • Japp, sorry. Da hat sich was im Hirn verklemmt...



  • SeppJ schrieb:

    for(A; B; C) D; ist nichts anderes als

    {
      A;
      while(B)
      {
        D;
        C;
      }
    }
    

    Gegenbeispiele:
    - A="int i=0;", B="int i=0;" => geht mit while aber nicht mit for
    - D="continue;" => C wird nicht ausgeführt
    - C="int i=0;" => geht nicht in for


  • Mod

    paragraphenscheisser schrieb:

    SeppJ schrieb:

    for(A; B; C) D; ist nichts anderes als

    {
      A;
      while(B)
      {
        D;
        C;
      }
    }
    

    Gegenbeispiele:
    - A="int i=0;", B="int i=0;" => geht mit while aber nicht mit for
    - D="continue;" => C wird nicht ausgeführt
    - C="int i=0;" => geht nicht in for

    Der mit continue ist gut, aber die anderen: Logikfehler deinerseits. Dackel und Hunde sollte man schon unterschieden können, wenn man Klugscheißen möchte. Da steht nicht "while... ist das gleiche wie for...", da steht "for... ist das gleiche wie while...".



  • ...



  • SeppJ schrieb:

    Da steht nicht "while... ist das gleiche wie for...", da steht "for... ist das gleiche wie while...".

    "ist das gleiche wie" ist das gleiche wie "ist äquivalent zu" und das schliesst die Rückführung mit ein.


  • Mod

    - A="int i=0;", B="int i=0;" => geht mit while aber nicht mit for

    Natürlich geht das mit for . Warum denn auch nicht 😕

    Ich frage mich auch, wieso SeppJ das nicht gesagt hat.

    paragraphenscheisser schrieb:

    SeppJ schrieb:

    Da steht nicht "while... ist das gleiche wie for...", da steht "for... ist das gleiche wie while...".

    "ist das gleiche wie" ist das gleiche wie "ist äquivalent zu" und das schliesst die Rückführung mit ein.

    Nope



  • Arcoth schrieb:

    - A="int i=0;", B="int i=0;" => geht mit while aber nicht mit for

    Natürlich geht das mit for . Warum denn auch nicht 😕

    Weil dann beide in der gleichen identischen declarative-region sind?


  • Mod

    Arcoth schrieb:

    Ich frage mich auch, wieso SeppJ das nicht gesagt hat.

    So genau hatte ich mir die Rückführungsfalle gar nicht angesehen, da irrelevante Trollerei. Der interessante Fall ist das continue. Das Ergebnis ist nicht mehr schön, wenn man das noch beachtet. Verschachtelte Schleifen oder if-do-while mit Kommaoperator fielen mir da ein.


  • Mod

    paragraphenscheisser schrieb:

    Arcoth schrieb:

    - A="int i=0;", B="int i=0;" => geht mit while aber nicht mit for

    Natürlich geht das mit for . Warum denn auch nicht 😕

    Weil dann beide in der gleichen identischen declarative-region sind?

    Achso. Gleicher Name. <°)))o>< )


Log in to reply