我需要输出按利润递增顺序(从最低利润到最高利润)来赚钱的摊位(如果他们赚了钱)。当我运行程序时,它以升序输出,但仅排除一个<0的利润实例,并输出其余实例。我在做什么错了?
下面是我用来排除获利<0的摊位的代码
n
答案 0 :(得分:1)
我的答案不是完整答案,但是我在代码上找到了主要问题。
# Remove negative items
for (int i = 0; i < n; i++)
{
if (Stalls[i].net < 0)
{
printf(" i = %d, %d\n", i, Stalls[i].net);
for (int j = i + 1; j < n; ++j)
{
// strcpy(Stalls[j - 1].name, Stalls[j].name);
// Stalls[j - 1].net = Stalls[j].net;
Stalls[j - 1] = Stalls[j];
}
n--;
}
}
此功能有问题
如果data
是[-3, -2, -1, 0, 1, 2]
经过上述for
循环后,data
为[-2, 0, 1, 2, 2, 2]
但是,我们可以认为data
是[0, 1, 2, 2, 2, 2]
原因:
-3 -2 -1 0 1 2
-3
的索引为0,
对于Stalls[j - 1] = Stalls[j];
,-3
被-2
取代,
和-2
移至第0位,
但是,-2
无法与if (Stalls[i].net < 0)
进行检查,因为i
已经增加了
所以-2
仍然存在
容易回答:(未优化)
// Remove negative items
for (int k = 0; k < n; k++) // This is added loop
for (int i = 0; i < n; i++)
{
if (Stalls[i].net < 0)
{
printf(" i = %d, %d\n", i, Stalls[i].net);
for (int j = i + 1; j < n; ++j)
{
// strcpy(Stalls[j - 1].name, Stalls[j].name);
// Stalls[j - 1].net = Stalls[j].net;
Stalls[j - 1] = Stalls[j];
}
n--;
}
}