反转阵列中的正序列

时间:2018-10-09 18:35:52

标签: c++ arrays sorting sequence

所以,我有一个遍历数组的循环,应该反转连续正数的序列,但是似乎将多余的负数算作序列的一部分,从而改变了它的位置。我自己也找不到错误,很高兴听到任何提示!

#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;
}

1 个答案:

答案 0 :(得分:0)

根据我们在评论中讨论的内容,我在此处列出了一些规则以围绕它制定我的答案。

规则:

    元素的顺序可以改变。因此,如果数组中的一行中有5个正数,我们将颠倒这5个元素。例如

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]开始存储元素,这将使在数组中反转序列更容易。