这些是我教授给我的C实验室指示
- 解决 -
struct singlecard
{
int cardnum;
char face;
char suit;
};
您的程序必须具有以下命名的函数:
Main() - 调用“LoadDeck()”和“DealCards()。”
LoadDeck()将仅填充数组的“cardnum”,其中唯一的数字介于1和52之间。它将通过选择一个随机数然后调用函数“CheckDup()”来查看该数字是否为重复。然后它将调用“LoadFace()”和“LoadSuit()。”
CheckDup()会收到试用号和卡片组作为输入,并返回一个布尔值。
LoadFace()将通过卡片组并通过使用“cardnum”模数运算符将适当的值放入数组的“face”中,以从字符串“A23456789TJQK”中提取值。
LoadSuit()将通过套牌并使用类似于“LoadFace()”的方法将适当的套装值放入“套装”中,其中套装字符串为“HDCS”。
DealCards()将显示卡片。
**我的问题是,如果没有大量的if语句,如何检查每件套装中是否没有重复的面孔?请忽略我没有将“cardnum”作为参数发送到LoadFace和LoadSuit函数的事实,我也使用srand(1)进行调试。到目前为止,输出具有唯一的卡号和正确数量的面和套装(13,4),但我不知道如何从这里插入非重复元素。任何建议都会有所帮助。此外,不允许对数组进行简单的赋值和随机播放:( **
EDIT checkDup和LoadDeck目前正在加载具有唯一卡号的卡组,但不是唯一的卡面和套装。它只计算A面数2面3面国王面等。它还确保每个套装中有13张牌。我想在stuct数组中插入唯一的面和套装,这样我就不会说两个黑桃了。
#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;
}
当前输出
[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
答案 0 :(得分:2)
您遇到的问题是因为您没有正确阅读和遵循您的作业说明,尤其是这一点:
LoadFace()将通过套牌并输入适当的值 &#34;面部&#34;只使用&#34; cardnum&#34;模数算子 从字符串&#34; A23456789TJQK中提取值。&#34;
想象一下,您已经按照卡号的顺序列出了每张卡片。
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
放入两次,您就知道您的套牌将始终包含唯一的卡片。
答案 1 :(得分:0)
CheckDup
将收到试用号和卡片组作为输入,并返回布尔值。
将转换为以下声明
bool CheckDup( const int trial, const struct singlecard deck[], const unsigned int deckSize );
如果deck
卡尚未存在,则应检查trial
(如果找到重复,则可能true
),可能是通过迭代deck
。 / p>
答案 2 :(得分:0)
这是我从你的问题中理解的。
你想知道,如果该卡已被发出,则使用checkDup()
您可以维护已发出的卡号的数组(或列出任何内容)。然后,每次调用checkDup
时,只需搜索该数组。