如何根据这些说明加载一张卡片?C

  • 本文关键字:一张 何根 加载 说明 c
  • 更新时间 :
  • 英文 :


这些是我教授给我为C

实验的说明

- 解决 -

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

您的程序必须具有以下功能:

main(( - 调用" LoadDeck(("one_answers" DealCards((。"

loaddeck((将仅填充数组的" cardnum",其唯一数字在1到52之间重复。然后,它将调用" LoadFace(("one_answers" LoadSuit((。"

checkdup((将收到试用号码和卡片甲板作为输入,并将返回布尔值。

loadface((将穿过甲板,并通过仅使用" cardnum"模量运算符从字符串" A23456789TJQK提取值来提取值。"

loadsuit((将通过使用类似于" loadface(("的方法将适当的西装值放在"西装"中,其中西装字符串为" HDCS"。

DealCards((将显示卡片。

**我的问题是,我如何检查每个西装中没有重复的面孔,而没有大量的语句?请忽略一个事实,即我没有将" cardnum"作为参数发送到功能负载和加载件,而且我正在使用srand(1(进行调试。到目前为止,输出具有唯一的卡号和正确数量的面孔和西服(13,4(,但是我不确定如何从这里插入非拼写元素。任何建议都会有所帮助。另外,不允许使用一个简单的分配和洗牌:( **

编辑检查DUP和LOADDECK当前使用唯一的卡号加载甲板,但不是唯一的卡面和西装。它只是计算面孔2面的数量3个面孔。国王面。还可以确保每个西装中都有13张卡片。我想将独特的面孔和西服插入柱阵列中,这样我就没有说两七个黑桃。

#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("nn");
    for (i = 0; i < deckSize; i++) {
        if ((i + 1) % 4 == 0) {
            printf("[%d %c-%c]  %dn", 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;
}

当前输出

[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

您所面临的问题是因为您没有正确阅读并遵循您的作业说明,尤其是这样:

loadface((将穿过甲板并将适当的值放入 仅使用" cardnum"模量运算符,阵列的"面" 从字符串" A23456789TJQK"中提取值。

想象一下,您已经按顺序列出了每张卡片。

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

您注意到模式吗?每13张卡都有相同的脸。模量运算符(又称%(可用于找出13个面对cardnum的特定值中的哪个与此相关。cardnum % 13始终在0到12之间。由于您的第一张卡从1开始,因此您需要先减去1,然后再进行模量。然后您的LoadFace功能成为此。

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

如果您想知道两张卡是否根据cardnum具有相同的面孔,则可以比较Deck[a].cardnum % 13Deck[b].cardnum % 13

只要您不将相同的cardnum分两次,您就知道您的甲板将始终包含独特的卡片。

CheckDup将收到试用号码和卡片甲板作为输入,并将返回布尔值。

将转化为以下声明

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

并且如果尚未存在trial卡(如果找到重复的话,可能是true(,则应检查deck,可能是通过deck进行迭代。

这是我从您的问题中了解的。

您想找出答案,如果该卡已经被交易

,请使用checkDup()

您可以维护已交易的卡号中的数组(或列出任何(。然后,每次调用checkDup时,只需搜索该数组即可。

相关内容

最新更新