这些是我教授给我为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 % 13
和Deck[b].cardnum % 13
。
只要您不将相同的cardnum
分两次,您就知道您的甲板将始终包含独特的卡片。
CheckDup
将收到试用号码和卡片甲板作为输入,并将返回布尔值。
将转化为以下声明
bool CheckDup( const int trial, const struct singlecard deck[], const unsigned int deckSize );
并且如果尚未存在trial
卡(如果找到重复的话,可能是true
(,则应检查deck
,可能是通过deck
进行迭代。
这是我从您的问题中了解的。
您想找出答案,如果该卡已经被交易
,请使用checkDup()
您可以维护已交易的卡号中的数组(或列出任何(。然后,每次调用checkDup
时,只需搜索该数组即可。