所以,我有一个遍历数组的循环,应该反转连续正数的序列,但是似乎将多余的负数算作序列的一部分,从而改变了它的位置。我自己也找不到错误,很高兴听到任何提示!
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
int Arr[100];
int Arr2[100];
int main()
{
srand(time(NULL));
int n, x;
bool seq = false;
int ib = 0;
printf("Starting array\n");
for (n = 0; n < 100; Arr[n++] = (rand() % 101) - 50);
for (n = 0; n < 100; printf("%3d ", Arr[n++]));
putchar('\n');
for (n = 0; n < 100; n++) //sorting
{
if (Arr[n] > 0) //check if the number is positive
{
if (seq == false) //if it isn't the part of a sequence
{
seq = true; ib = n; //declare it now is, and remember index of sequence's beginning
}
else
seq = true; //do nothing if it isn't first
}
else //if the number is negative
{
if (seq==true) //if sequence isn't null
for (x = n; ib <= n; ib++, x--) //new variable so that n will stay unchanged,
number of iterations = length of sequence
{
Arr2[x] = Arr[ib]; //assigning array's value to a new one,
reversing it in the process
}
seq = false; //declaring sequence's end
Arr2[n + 1] = Arr[n + 1]; //assigning negative numbers at the same place of a new array
}
}
printf("Modified array\n");
for (n = 0; n < 100; printf("%3d ", Arr2[n++]));
putchar('\n');
system('pause');
return 0;
}
答案 0 :(得分:0)
根据我们在评论中讨论的内容,我在此处列出了一些规则以围绕它制定我的答案。
规则:
array[5] = {1,2,3,4,5}
将成为array[5]{5,4,3,2,1}
如果单个正数与负数相邻,则不会发生反向
array[4] = {-1,0,-2,1}
将产生相同的数组
发现负数时不进行任何处理。
基于这些规则。 我认为这是您的代码出了问题。
问题:
1-考虑array = {1,2,-1}
。请注意,最后一个值为负。因为这。处理数组的第三个索引时,以下代码将运行;
` Arr2[n + 1] = Arr[n + 1]; //assigning negative numbers at the same place of a new array`
这是一个禁忌。因为您已经在Arr2
n + 1的末尾,则表明该数组中存在第4个元素。 (在您的情况下为数组的101h元素),这将导致未定义的行为。
2-考虑上述相同的数组。当该数组循环时,结果将为array = {-1,2,1}
。 -1和1被交换,而不是1和2。
3-每当发现负数时,您就分配ib = n
。因为只要命中负值,就会强制seq=false
。但是ib
在找到下一个负数之前从未投入使用。这是一个例子;
array = {...2, 6}
在这种情况下,2和6永远不会反转,因为在此正序列之后没有负值。
4-考虑这种情况arr = {-10,-1,....}
,这将导致arr = {0,-1,....}
。发生这种情况的原因是相同的代码导致了上述未定义的行为问题。
`Arr2[n + 1] = Arr[n + 1];`
建议
上面提到的大多数问题都在发生,因为您正在尝试找出负数时找出正数的顺序。
else //if the number is negative
{
if (seq==true) //if sequence isn't null
for (x = n; ib <= n; ib++, x--) //new variable so that n will stay unchanged,
number of iterations = length of sequence
{
Arr2[x] = Arr[ib]; //assigning array's value to a new one,
reversing it in the process
}
除非您忘记在问题中提及一些关键细节,否则您应该完全摆脱负数并完全忽略负数。而是只关注正数。我不会将完整的代码发送给您,但是这是我解决问题的方法。随时让我知道您是否需要帮助,我很乐于详细介绍。
照常开始for循环。
for (n = 0; n < 100; n++) //sorting
{
当数组中的元素为负值时不要尝试执行任何操作。
if (Arr[n] > 0) //check if the number is positive
如果数字为正。创建记录序列索引。首先,我们知道一旦if(Arr [n]> 0)为真,序列将从n
开始。所以我们可以做这样的事情;
int sequenceStart = n;
我们还需要知道正数序列何时结束。
int sequenceEnd = sequenceStart;
之所以使用int sequenceEnd = sequenceStart;
是因为我们将开始使用相同的n
值。我们现在可以遍历数组并递增sequenceEnd
直到达到负数或数组末尾。
while (currentElement > 0)
{
n++;//increment n
if(n < arraySiz) //make sure we still in the range
{
currentElement = Arr[n]; // get the new elemnet
if (currentElement > 0)
{
sequenceEnd++;
}
}
else
break; // we hit to a negative value so stop the while loop.
}
注意n++;//increment n
,这将使n ++递增,直到我们达到负数为止。这很棒,因为在序列结束时,for循环将从更新后的n
while循环之后,您可以创建一个数组,该数组的大小与您迭代通过的序列数相同。然后您可以从arr[sequenceStart]
和arr[sequenceEnd]
开始存储元素,这将使在数组中反转序列更容易。