【问题标题】:variable not changing c [closed]变量不改变c [关闭]
【发布时间】:2018-02-11 13:20:03
【问题描述】:

嗨,我是一名初学者 c 程序员,我正在尝试制作一个过滤器,它应该根据其他变量更改变量,但由于某种原因它似乎没有更改变量 g1。我真的很感谢我能得到的任何帮助,因为我现在被困在这里。谢谢

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main(void)
{
    int car;
    int g1;
    int g2;
    int sel1;
    unsigned int iseed = (unsigned int)time(NULL);          
    srand (iseed);
    g1 = 0;
    car = rand() % 3 + 1;
    printf("%d\n",car);

    printf("select a door beetween 1 and 3\n ");
    scanf ("%d",&sel1);
    if (sel1 < 0)
    {
        printf("Invalid selection!\n");
        return 0;
    }
    if (sel1 > 3)
    {
        printf("Invalid selection!\n");
        return 0;
    }

    if (sel1 == 1)
    {   
        if(car == 1)
        {
            g1 = 2;
            g2 = 3;
        }   
        if (car == 2);
        {
            g1 = 3;
            g2 = 1;
        }
        if (car == 3);
        {
            g1 = 2;
            g2 = 1;
        } 
    }

    if (sel1 == 2)
    {   
        if(car == 1)
        {
            g1 = 3;
            g2 = 2;
        }   
        if (car == 2);
        {
            g1 = 1;
            g2 = 3;
        }
        if (car == 3);
        {
            g1 = 1;
            g2 = 2;
        } 
    }

        if (sel1 == 3)
    {   
        if(car == 1)
        {
            g1 = 2;
            g2 = 3;
        }   
        if (car == 2);
        {
            g1 = 1;
            g2 = 3;
        }
        if (car == 3);
        {
            g1 = 1;
            g2 = 2;
        } 
    }

    printf("Behind door %d is a goat\n",g1);



    return 0;
}

显然我没有足够的细节,所以忽略这个我只是添加一些随机细节。在初等数学中,变量是表示数字的字母字符,称为变量的值,它可以是任意的、未完全指定的或未知的。

【问题讨论】:

  • if (car == 2); :删除;
  • 一般来说,调试会很好。使用 Visual Studio,在那里很容易。如果您使用的是 linux,请使用 gdb,但这对于初学者来说要困难得多。 (尽管尝试一下。)但是您总是可以分散printfs 并在这么小的代码中查看控制流。 (而且 bluepix 是对的;你明白为什么吗?)
  • 程序不是一个数学世界。它有一些改变的内部状态。阅读semantics
  • 作为风格问题:像这样的重复代码容易出错(它通常被复制和粘贴,通常有出错的机会)。当您复制和粘贴某些内容时,请考虑将其设为函数。这将成为一种反射。如果您可以使用公式计算不同的值(这里:g1 和 g2),那么就这样做。如果值不太规则,请将值存储在数组等中并查找它们。
  • Monty Hall 问题。在第一次输入“选择 1 到 3 之间的门”之后,测试 if (sel1 &lt; 0) 应该是 if (sel1 &lt; 1)

标签: c variables initialization int


【解决方案1】:

首先,按照@BLUEPIXY 的建议,您应该删除;

我会将前两个 sel1 条件更改为仅设置一个,如下所示:

if (sel1 < 1 || sel1 > 3)
    printf("Invalid selection!\n");

然后我会使用switch case 和if 声明:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main(void)
{
    int car;
    int g1;
    int g2;
    int sel1;
    unsigned int iseed = (unsigned int)time(NULL);
    srand(iseed);
    g1 = 0;
    car = rand() % 3 + 1;
    printf("Car= %d\n", car);

    printf("Select a door beetween 1 and 3:\n");
    scanf("%d", &sel1);


    if (sel1 < 1 || sel1 > 3)
        printf("Invalid selection!\n");

    switch (sel1)
    {
    case 1:
        if (car == 1)
        {
            g1 = 2;
            g2 = 3;
        }
        else if (car == 2)
        {
            g1 = 3;
            g2 = 1;
        }
        else if (car == 3)
        {
            g1 = 2;
            g2 = 1;
        }

        break;

    case 2:
        if (car == 1)
        {
            g1 = 3;
            g2 = 2;
        }
        else if (car == 2)
        {
            g1 = 1;
            g2 = 3;
        }
        else if (car == 3)
        {
            g1 = 1;
            g2 = 2;
        }
        break;

    case 3:
        if (car == 1)
        {
            g1 = 2;
            g2 = 3;
        }
        else if (car == 2)
        {
            g1 = 1;
            g2 = 3;
        }
        else if (car == 3)
        {
            g1 = 1;
            g2 = 2;
        }
        break;
    }


    printf("Behind door, %d is a goat\n", g1);


    getchar();
    getchar();  

    return 0;   
}

例子:

【讨论】:

  • if (sel1 &lt; 0 || sel1 &gt; 3) 在只有三种可能性时允许四种可能性。应该是if (sel1 &lt; 1 || sel1 &gt; 3)
  • 我已经编辑了答案。谢谢!
  • 非常感谢 Cecho 完美地完成了这项工作。
【解决方案2】:

我注意到您没有指定如果sel1==0 会发生什么 您为sel1&gt;3sel1==3sel1==2sel1==1sel1&lt;0 指定了它,但您没有指定如果sel1==0 怎么办我认为如果sel1 为0 则g1 不会改变,否则会改变 可能是你在输入 sel1 时应该放一个空格,如下所示

scanf ("%d ",&sel1);

并删除条件if(car==2)if(car==3)之后的;

【讨论】:

  • 你读过 bluepix 的评论了吗?你明白了吗?
  • 是的@PeterA.Schneider
  • 我问是因为未指定的 sel1==0 和 printf 格式中的缺失空格都不是 OP 程序不起作用的原因。它是空的 if 块。
  • 即使 (if)block 为空,值也会改变,但不是以我想要的方式,我认为他的意思是值仍然是 0
  • OP 说变量没有改变,但他没有指定它有但不应该有的值(我猜g1 总是 2 除了sel1==1 时它始终为 1,与 car 的值无关)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
相关资源
最近更新 更多