Estas son las instrucciones que me dio mi profesor para un laboratorio en C

- RESUELTO--

struct singlecard
{
  int cardnum;
  char face;
  char suit;
};

Su programa debe tener las funciones nombradas de la siguiente manera:

Main () - Llama a "LoadDeck ()" y "DealCards ()".

LoadDeck () llenará solo el "cardnum" de la matriz con un número único entre 1 y 52. Lo hará seleccionando un número aleatorio y luego llamando a la función "CheckDup ()" para ver si el número es un duplicado. Luego llamará a "LoadFace ()" y "LoadSuit ()".

CheckDup () recibirá el número de prueba y el mazo de cartas como entrada, y devolverá un booleano.

LoadFace () pasará por el mazo y colocará el valor apropiado en la "cara" de la matriz usando solo el "cardnum", el operador de módulo para extraer el valor de la cadena "A23456789TJQK".

LoadSuit () pasará por el mazo y colocará el valor de traje apropiado en "traje" usando un método similar a "LoadFace ()" donde la cadena del traje es "HDCS".

DealCards () mostrará las cartas.

** Mi pregunta es, ¿cómo puedo verificar que no haya caras duplicadas en cada palo sin un montón de declaraciones if? No tenga en cuenta el hecho de que no estoy enviando el "cardnum" como parámetro a las funciones LoadFace y LoadSuit, también estoy usando srand (1) para fines de depuración. Hasta ahora, la salida tiene un número de tarjeta único y la cantidad correcta de caras y trajes (13, 4), pero no estoy seguro de cómo puedo insertar un elemento no duplicado desde aquí. Cualquier consejo sería útil. Además, no se permite una simple asignación y reproducción aleatoria de una matriz :( **

EDIT checkDup y LoadDeck actualmente cargan el mazo con un número de tarjeta único pero no una cara y un palo únicos. Solo cuenta el número de caras A 2 caras 3 caras Rey caras etc. También se asegura de que haya 13 cartas en cada palo. Quiero insertar caras y trajes únicos en la matriz de estucos para no tener que decir dos 7 de espadas.

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>


struct singlecard {
    int cardnum;
    char face;
    char suit;
};


int i, deckSize = 52;
char suits[] = {"HDCS"};
char faces[] = {"A23456789TJQK"};


void DealCards(struct singlecard Deck[]) {

    //SortCards();
    printf("\n\n");
    for (i = 0; i < deckSize; i++) {
        if ((i + 1) % 4 == 0) {
            printf("[%d %c-%c]  %d\n", Deck[i].cardnum, Deck[i].face, Deck[i].suit, i + 1);
        } else {
            printf("[%d %c-%c] ", Deck[i].cardnum, Deck[i].face, Deck[i].suit);
        }
    }

}

int CheckDupe(struct singlecard Deck[],int n) {

    int check = 0, j;
    for (j = 0; j < deckSize; j++) {
        if (n == Deck[j].cardnum || n == 0) {
           return check = 1;
        }

    }
    return check;

}

void LoadSuit(struct singlecard Deck[],int n) 
{  
        Deck[i].suit = suits[(n-1) % 4];
}

void LoadFace(struct singlecard Deck[],int n) {

        Deck[i].face = faces[(n-1) % 13];

} 
void LoadDeck(struct singlecard Deck[]){

    srand(time(NULL));

    for (i = 0; i < deckSize;) {
        int random_number = rand() % 53;
        if (CheckDupe(Deck,random_number) == 0) {

            Deck[i].cardnum = random_number;
            LoadFace(Deck,Deck[i].cardnum);
            LoadSuit(Deck,Deck[i].cardnum);
            i++;
        }
    }   
}

int main(){
    struct singlecard Deck[52];
    LoadDeck(Deck);
    DealCards(Deck);
    return 0;
}

Salida actual

[5 5-H] [36 T-S] [6 6-D] [29 3-H]  4
[12 Q-S] [19 6-C] [25 Q-H] [13 K-H]  8
[42 3-D] [38 Q-D] [14 A-D] [22 9-D]  12
[16 3-S] [40 A-S] [51 Q-C] [35 9-C]  16
[24 J-S] [4 4-S] [20 7-S] [43 4-C]  20
[31 5-C] [9 9-H] [11 J-C] [48 9-S]  24
[49 T-H] [18 5-D] [41 2-H] [21 8-H]  28
[50 J-D] [52 K-S] [3 3-C] [27 A-C]  32
[39 K-C] [8 8-S] [33 7-H] [23 T-C]  36
[44 5-S] [17 4-H] [32 6-S] [45 6-H]  40
[30 4-D] [28 2-S] [2 2-D] [7 7-C]  44
[26 K-D] [34 8-D] [15 2-C] [47 8-C]  48
[10 T-D] [37 J-H] [1 A-H] [46 7-D]  52
c
-3
Tyler J Tucker 28 feb. 2018 a las 12:05

3 respuestas

La mejor respuesta

Los problemas que enfrenta se deben a que no ha leído ni seguido correctamente las instrucciones de su tarea, especialmente este bit:

LoadFace () pasará por el mazo y colocará el valor apropiado en la "cara" de la matriz usando solo el "cardnum", el operador de módulo para extraer el valor de la cadena "A23456789TJQK".

Imagina que has enumerado cada tarjeta en orden, así con el número de tarjeta.

 1. Ace of Hearts
 2. Two of Hearts
 ....
 14. Ace of Diamonds
 15. Two of Diamonds

¿Notas un patrón? Cada 13 carta tiene la misma cara. El operador de módulo (también conocido como %) se puede usar para averiguar a cuál de esas 13 caras se relaciona un valor específico de cardnum de esta manera. cardnum % 13 siempre estará entre 0 y 12. Debido a que su primera carta comienza en 1, primero debe restar 1 antes de obtener el módulo. Su función LoadFace se convierte en esto.

void LoadFace() {
    for (i = 0; i < deckSize;) {
        Deck[i].face = faces[(Deck[i].cardnum-1) % 13];
    }
}

Si desea saber si dos cartas tienen la misma cara en función de su cardnum, puede comparar Deck[a].cardnum % 13 y Deck[b].cardnum % 13.

Siempre y cuando no pongas el mismo cardnum dos veces, sabes que tu mazo siempre contendrá cartas únicas.

2
Chris Turner 28 feb. 2018 a las 10:58

CheckDup recibirá el número de prueba y el mazo de cartas como entrada, y devolverá un booleano.

Que se traduciría a la siguiente declaración

bool CheckDup( const int trial, const struct singlecard deck[], const unsigned int deckSize );

Y debe verificar deck si la tarjeta trial aún no existe (probablemente true si se encuentra un duplicado), probablemente iterando a través de deck.

0
dvhh 28 feb. 2018 a las 09:16

Esto es lo que entendí de tu pregunta.

que desea averiguar, utilizando checkDup() si esa carta ya se ha repartido

Puede mantener una matriz (o listar lo que sea) de los números de tarjeta que se han repartido. Luego, simplemente busque a través de esa matriz cada vez que se llame a checkDup.

0
Parth K 28 feb. 2018 a las 09:57