我写了一个程序,用户输入数字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");
}
答案 0 :(得分:2)
如果您没有在外部循环中重置seen=0
,程序会认为它已经在它找到的第一个之后看到了每个人。
Google搜索gdb tutorial
让this看起来很有希望。
答案 1 :(得分:1)
考虑一下seen
变量的价值。
迭代数组。对于每个号码,您执行以下操作:
seen
才会成立。你的程序当前编写的方式,只要程序继续运行,它仍然是正确的,尽管旧的值在外循环前进到新的数字时变得无关紧要。
在实际上,这将是更好的到移动的声明seen
(连同其初始化为0
的外环内。由于其值不外循环的一次迭代外有意义,它也可能只存在于外循环的每次迭代中。
(在gdb
之类的源代码级调试器下运行程序是找到这样的错误的一种方法,但不是唯一的错误。重新阅读代码并推断它的作用与它应该是什么do是另一种有用的方法。添加printf
调用以在程序运行时显示变量的值是另一种。)
答案 2 :(得分:0)
请了解调试程序程序。
在像Visual Studio或Eclipse这样的IDE中,它是内置的。
在Linux命令行上使用GCC称为gdb
。使用-g
标志编译程序以使GCC包含调试信息。然后运行gdb program-name
和start
以及n
,然后在逐步执行程序时点击返回。还有许多其他命令。
有了这个,你应该能够解决这个问题和许多其他问题。