理解嵌套for循环的逻辑

时间:2014-01-28 23:24:28

标签: c

我写了一个程序,用户输入数字n次;该程序打印出删除所有重复项的数字。

在代码上你会看到我在代码的开头初始化了seen = 0,当我这样做而没有在我的for循环上再次初始化时它不能正确地打印出数字但是当我这样做时。有人可以解释一下原因吗?我真的很想了解这一点。 我澄清了关于代码本身的问题。看看:

 #include <stdio.h>

int main()
{
    int arr[100];
    int i, j, num, seen = 0; // here is where I first initialized it
                             // but I see that this is not necessary

    printf("Enter Number: ");
    scanf("%d", &num);

    for (i=0; i<num; i++)
    {
        printf("Arr[%d] ", i);
        scanf("%d", &arr[i]);
    }

    for (i=0; i<num; i++)
    {
         //seen = 0; If I initialize it here
         //          it will print out the numbers correctly
        for (j=0; j<i; j++)
       {
           if (arr[i]==arr[j])
           {
               seen = 1;
               break;
           }
       }
       if (!seen)
           printf("%d", arr[i]);
    }
    printf("\n");

}

3 个答案:

答案 0 :(得分:2)

如果您没有在外部循环中重置seen=0,程序会认为它已经在它找到的第一个之后看到了每个人。

Google搜索gdb tutorialthis看起来很有希望。

答案 1 :(得分:1)

考虑一下seen变量的价值

迭代数组。对于每个号码,您执行以下操作:

  • 遍历数组中之前的号码,并检查当前号码是否已被查看。
  • 仅在尚未
  • 的情况下打印当前号码。
只有在您已经看过当前号码时,

seen才会成立。你的程序当前编写的方式,只要程序继续运行,它仍然是正确的,尽管旧的值在外循环前进到新的数字时变得无关紧要。

在实际上,这将是更好的到移动的声明seen(连同其初始化为0的外环内。由于其值不外循环的一次迭代外有意义,它也可能只存在于外循环的每次迭代中。

(在gdb之类的源代码级调试器下运行程序是找到这样的错误的一种方法,但不是唯一的错误。重新阅读代码并推断它的作用与它应该是什么do是另一种有用的方法。添加printf调用以在程序运行时显示变量的值是另一种。)

答案 2 :(得分:0)

请了解调试程序程序。

在像Visual Studio或Eclipse这样的IDE中,它是内置的。

在Linux命令行上使用GCC称为gdb。使用-g标志编译程序以使GCC包含调试信息。然后运行gdb program-namestart以及n,然后在逐步执行程序时点击返回。还有许多其他命令。

有了这个,你应该能够解决这个问题和许多其他问题。