【问题标题】:How to use an array with switch in c++? [closed]如何在 C++ 中使用带有 switch 的数组? [关闭]
【发布时间】:2014-10-30 17:56:44
【问题描述】:

所以我的问题是我试图得到我在hand1[o]之后得到的数组(从第一个卡片数组[]中随机抽取5个数字。进入开关以检测它是否是同花。 例如如果hand1[1]的开关-hand1[0] = 1;手1[2] - 手[1] = 1...等 printf("从 1~5 刷新").

但是,tbh,我什至不确定在 switch() 或 void corrida() 的括号内放什么。 我尝试放置 hand1[] 或 hand1[],但它说 hand1 不是一个常数值。

附:我知道有些东西是西班牙语(因为这是西班牙语课)

void baraja();
void jugadores();
void jugadores(k);
int cards[52] = { 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13 };
int hand1[5];
int x, y;
int l, k, z;

int main()
{
    srand(time(0));
    baraja();
    jugadores();
}

void baraja()
{

for (l = 1; l <= 52; l++)
{
    x = rand() % 52;
    y = rand() % 52;
    int temp = cards[x];
    cards[x] = cards[y];
    cards[y] = temp;
}

printf("La baraja revuelta es:\n");
for (k = 0; k <= 51; k++)
{
    printf("%d  ", cards[k]);
}
printf("\n\n");
 }

 void jugadores(k)
 {
int o, n = 5;
printf("Tus cartas son:\n");
for (o = 0; o <= 4; o++)
{
    k = rand() % 52;
    printf("%d  ", cards[k]);
    hand1[o] = cards[k];
}
printf("\n\n");

for (o = 0; o < n ; o++)
{
    for (z = 1; z < (n - o); z++)
    if (hand1[z - 1] > hand1[z])
    {
        int temp = hand1[z - 1];
        hand1[z - 1] = hand1[z];
        hand1[z] = temp;
    }
}

printf("Tus cartas en orden incremental son:\n");
for (o = 0; o <= 4; o++)
{
    printf("%d  ", hand1[o]);
}
printf("\n\n");
 }

 void corrida()
 {
switch (hand1)
{
case (hand1[1] - hand1[0] = 1) :

}
 }

【问题讨论】:

  • 我不认为switch 是这里的正确选择。
  • 你知道有什么功能可以帮助我吗?问题是我开始了编程基础,所以我只学习了 if 和 switch for "conditions"/
  • case 标签需要有常数值 case (hand1[1] - hand1[0] = 1) : 没有常数值。除了 switch (hand1) 没有意义之外,hand1 的值永远不会改变。
  • 是的,这是我得到的错误,是的,关于那个开关 (hand1) 我确实意识到它不正确。 tbh 我不是 100% 确定在 switch 的括号内和 switch 之外放什么
  • 为什么这个标签是 C++?这是 C。

标签: c++ arrays switch-statement


【解决方案1】:

你没有正确使用switch。

switch 语句的想法是接受一个可能有多个值的表达式,然后对每种可能性做一些不同的事情。在 C++ 中,您只能打开基本上是整数的东西:int 或 char 类型1,而不是字符串(Java 允许您这样做)或数组尝试在这里做。

但是,switch 不适合在这里使用,因为您有兴趣同时比较多个表达式的值。使用具有多个表达式的if 结构会更好。比如:

if(hand1[1] - hand1[0] == 1 && hand1[2] - hand1[1] == 1 && ...)

您还可以通过使用简短的“刷新查找”算法使其更具可读性,如下所示:

bool hasFlush(){
    for(int i = 1; i < length-of-hand1; i++){
        if(hand1[i] - hand1[i-1] != 1) return false;
    }
    return true;
}

请注意,我没有测试过这段代码;这只是一个普遍的想法。请注意,正如 Baldrickk 在 cmets 中指出的那样,此方法仅在 hand1 按升序排序时才有效。示例手牌{2, 4, 3, 5, 1} 不会被检测为同花,即使它显然是同花。有一些方法可以修改算法以使其在不排序的情况下工作。


1我相信你也可以打开bool,但我不知道你为什么要这样做。

【讨论】:

  • nvm... 我用过 ||这是或......它奏效了!非常感谢你 C:我确实按照你告诉我的条件做了,但似乎发生的唯一问题是,即使条件不满足,它也会执行 if () {} 中的内容。 if (hand1[1] - hand1[0] == 1 || hand1[2] - hand1[1] == 1 || hand1[3] - hand1[2] == 1 || hand1[4] - hand1 [3] == 1) { printf("Tienes una Corrida del %d al %d! Felicidades\n", hand1[0], hand1[4]); } 打印它,即使它不是同花顺(1,2,3,4,5...等)
  • 不是 ||(or) 人,是 &&(and)
  • 请注意,这里的for 循环和长if(使用&amp;&amp; 使其工作)方法都需要对手进行排序。如果不是,它不会检测到它们。您可以使用嵌套的 for 循环(2 级)
  • @Baldrickk 好点;我添加了一条注释
【解决方案2】:

switch 语句由两部分组成:第一部分是您要评估的内容,放在语句的 switch() 部分的括号中。第二部分(或部分,真的)是第一部分将被评估的常数。这些需要是静态/常量值才能检查。因此,您不能使用像 hand1[1]-hand1[0] 这样的表达式——它可以并且将会在程序执行期间发生变化。 但是,您可以使用 if..else 链,并且可能会完成您正在寻找的内容。

【讨论】:

    猜你喜欢
    • 2021-06-07
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 2021-11-16
    相关资源
    最近更新 更多