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

如何根据这些说明加载一副卡片?C,c,C,这是我的教授给我的关于C实验室的指导 -解决- 您的程序必须具有如下命名的功能: Main-调用LoadDeck和DealCards LoadDeck将使用1到52之间的唯一数字填充数组的cardnum。它将通过选择一个随机数,然后调用函数CheckDup来查看该数字是否是重复的。然后它将调用LoadFace和LoadSuit CheckDup将接收试用编号和卡片组作为输入,并返回一个布尔值 LoadFace将遍历数据组,并通过使用cardnum the module运算符从字符串A234567

这是我的教授给我的关于C实验室的指导

-解决-

您的程序必须具有如下命名的功能:

Main-调用LoadDeck和DealCards

LoadDeck将使用1到52之间的唯一数字填充数组的cardnum。它将通过选择一个随机数,然后调用函数CheckDup来查看该数字是否是重复的。然后它将调用LoadFace和LoadSuit

CheckDup将接收试用编号和卡片组作为输入,并返回一个布尔值

LoadFace将遍历数据组,并通过使用cardnum the module运算符从字符串A23456789TJQK中提取值,将适当的值放入数组中

LoadSuit将穿过甲板,并使用类似于LoadFace的方法将适当的西服值放入西服中,其中西服串为HDCS

DealCards将显示这些卡片

**我的问题是,如果没有大量的if语句,我如何检查每件西装中是否有重复的面孔?请忽略以下事实:我没有将cardnum作为参数发送到函数LoadFace和LoadSuit,而且我使用srand1进行调试。到目前为止,输出具有唯一的卡号和正确数量的面和套装13、4,但我不确定如何从这里插入非重复元素。任何建议都会有所帮助。此外,不允许对数组进行简单的赋值和洗牌:**


编辑checkDup和LoadDeck当前加载具有唯一卡号的卡片组,但不是唯一的卡片面和套装。它只计算一张脸、两张脸、三张脸、国王脸等的数量。它还确保每套衣服中有13张牌。我想在stuct数组中插入独特的面和套装,这样我就不用说两个7黑桃了

CheckDup将接收试用编号和卡片组作为输入,并返回一个布尔值

这将转化为以下声明

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

如果试用卡不存在,则应检查卡片组。如果发现重复,则可能为真,可能通过迭代卡片组。

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

你想知道,如果那张卡已经发了,用checkDup


您可以维护一个数组或列出任何已发牌的卡号。然后,每次调用checkDup时,只需搜索该数组

你面临的问题是因为你没有正确阅读和遵循作业指导,尤其是以下几点:

装载面将穿过甲板,并将适当的值放入 仅使用cardnum和模运算符来创建数组的面 从字符串A23456789TJQK中提取值

想象一下,你已经把每张卡片按照这样的顺序和卡号列了出来

 1. Ace of Hearts
 2. Two of Hearts
 ....
 14. Ace of Diamonds
 15. Two of Diamonds
你注意到一种模式了吗?每一张第13张牌都有相同的脸。模数运算符aka%可用于找出cardnum的特定值与这13个面中的哪一个面相关。cardnum%13将始终介于0和12之间。因为你的第一张牌是从1开始的,所以你需要先减去1才能得到模数。然后,LoadFace函数变为

void LoadFace() {
    for (i = 0; i < deckSize;) {
        Deck[i].face = faces[(Deck[i].cardnum-1) % 13];
    }
}
如果您想知道基于cardnum的两张牌是否具有相同的面,您可以比较牌组[a].cardnum%13和牌组[b].cardnum%13


只要您不将同一个cardnum放入两次,您就知道您的牌组将始终包含唯一的牌。

我们不关心您的全部作业。最好是减少问题的代码和文本数量,关注真正的问题,创建一个抱歉,这几乎是我第一次上传到这里。我绝望了。你是说所有这些的目标都是从各种牌的属性中产生一副洗牌牌吗?基本上是的。用随机数。他不希望一个数组只是简单地分配适当的值,然后洗牌,这将使它更容易,而且不必检查重复,因为有固定数量的面和卡。因此,使用单卡结构的比较函数。目前检查重复已经检查卡是否已发牌。我想找出一种方法,用匹配的套服将非重复的面插入到单卡结构中。一套衣服只有一个,2,3..K。在我的输出中,脸7黑桃在牌30和牌26的底部。对不起,没有得到你想要的。请如果你能再解释一下的话,Checkdup和LoadDeck当前会用一个唯一的卡号而不是一个唯一的卡面和套装来加载卡片组。它只计算一张脸、两张脸、三张脸、国王脸等的数量。它还确保每套衣服中有13张牌。我想在stuct数组中插入独特的面和套装,这样我就不用说两张7黑桃牌了。我以为你在牌组中的每张牌都有一个独特的卡号。如果是这种情况,您只需在cardnum和face之间建立一对一的对应关系
和西装。您只需按照问题注释中所述,取deck[i].face=faces[deck[i].cardnum%13]这样的模数即可。我确实有一个唯一的卡号。我将研究卡号的模数。在检查注释后,似乎用上述说明实现这一点的唯一方法是使用模数运算符和cardnum。谢谢,克丽丝,我会调查的。这样的话,衣服就没问题了吗?例如,基于我的输出。接下来的13张牌不都是同一套吗?[6 3-H][36 5-H][32 6-H][50 8-H]4[42 3-H][4 J-H][18 3-H][40 5-H]8不,因为要得到这套衣服,你需要在从卡片上减去1后将卡片数除以4。。。这就是我还在上大学的原因。谢谢你,克里斯。我让它工作了。我无法推翻你的答案。我太平民化了。
bool CheckDup( const int trial, const struct singlecard deck[], const unsigned int deckSize );
 1. Ace of Hearts
 2. Two of Hearts
 ....
 14. Ace of Diamonds
 15. Two of Diamonds
void LoadFace() {
    for (i = 0; i < deckSize;) {
        Deck[i].face = faces[(Deck[i].cardnum-1) % 13];
    }
}