1

我需要编写一个程序,该程序采用给定的数组,然后将其拆分为两个单独的数组,一个数组的元素是主数组的正元素,另一个元素是主数组的负元素。

在尽我最大的努力编写代码之后,我在尝试编译它时遇到了大约一百万行错误。我如何删除三个动态分配的数组有问题吗?阻止编译的巨大错误是什么?这是我的代码:

#include <iostream>
using namespace std;


void count(int ARRAY[], int SIZE, int& NEG, int& POS);
void split(int ARRAY[], int SIZE, int& NEG_ARRAY, int NEG, int& POS_ARRAY, int POS);
void print_array(int ARRAY[], int SIZE);


int main()
{

  int SIZE(0);
  int* ARRAY;

  cout << "Enter number of elements: ";
  cin >> SIZE ;

  ARRAY = new int[SIZE];
  int x(0);
  int numEle(0);

  cout << "Enter list: " << endl;

  while (numEle < SIZE)
  {
      ARRAY[numEle] = x;
      numEle++;
      cin >> x;
  }

  int POS(0), NEG(0);
  count(ARRAY, SIZE, NEG, POS);

  int* NEG_ARRAY;
  NEG_ARRAY = new int[NEG];

  int* POS_ARRAY;
  POS_ARRAY = new int[POS];


  split(ARRAY, SIZE, NEG_ARRAY, NEG, POS_ARRAY, POS);

  cout << "Negative elements: " << endl;
  cout << print_array(NEG_ARRAY, NEG) << endl;

  cout << "Non-negative elements: " << endl;
  cout << print_array(POS_ARRAY, POS) << endl;


  delete [] ARRAY;
  delete [] NEG_ARRAY;
  delete [] POS_ARRAY;

  return 0;
}

void count(int ARRAY[], int SIZE, int& NEG, int& POS)
{
    for (int x=0; x < SIZE; x++)
    {
        if (ARRAY[x] >= 0)
    {
        POS = POS + 1;
    }
        if (ARRAY[x] < 0)
    {
        NEG = NEG + 1;
    }
    }
}

void split(int ARRAY[], int SIZE, int& NEG_ARRAY, int NEG, int& POS_ARRAY, int POS)
{
    NEG = POS = 0;
    for (int x = 0; x < SIZE; x++)
    {
        if (ARRAY[x] < 0)
    {
            NEG_ARRAY[NEG++] = ARRAY[x];
        }
        else
        {
            POS_ARRAY[POS++] = ARRAY[x];
        }
    }
}

void print_array(int ARRAY[], int SIZE)
{
    for (int i = 0; i < SIZE; i++)
    {
        cout << ARRAY[i] << " ";
    }
    cout << endl;
}

该代码应该读取数组并显示一个新的负数和一个新的正数数组。提前致谢!

4

3 回答 3

2

您有以下错误:

void split(int ARRAY[], int SIZE, int&NEG_ARRAY, int NEG, int&POS_ARRAY, int POS);

改成 :

void split(int ARRAY[], int SIZE, int*NEG_ARRAY, int NEG, int*POS_ARRAY, int POS);

还有:

void split(int ARRAY[], int SIZE, int&NEG_ARRAY, int NEG, int&POS_ARRAY, int POS){..}

改成 :

void split(int ARRAY[], int SIZE, int*NEG_ARRAY, int NEG, int*POS_ARRAY, int POS){..}

cout<<print_array(NEG_ARRAY, NEG) <<endl
cout<<print_array(NEG_ARRAY, POS) <<endl;

至 :

print_array(NEG_ARRAY, NEG);
print_array(NEG_ARRAY, POS);

修复这些bug后,可以正常编译运行。

于 2013-11-15T04:13:45.907 回答
2

您的代码中有一堆错误。split最糟糕的是在函数的声明和定义中通过引用传递数组。将两者都更改为void split(int ARRAY[], int SIZE, int *NEG_ARRAY, int NEG, int *POS_ARRAY, int POS);,大部分错误都会消失。

其余的来自您在其中打印数组的两行main

cout<<print_array(NEG_ARRAY, NEG) <<endl;

您不想打印该功能,而是想使用该功能在其中打印(您正确地执行了该操作)。您需要将调用更改为:

print_array(NEG_ARRAY, NEG);

这将使您的代码编译。

但是还有一个错误,这将使整个应用程序以不正确的方式工作。在您输入值的地方,您需要先获取输入,cin 然后再将其输入到数组中。像这样:

while(numEle<SIZE) {
  cin>>x;
  ARRAY[numEle] = x ;
  numEle++;
}
于 2013-11-15T04:14:10.077 回答
0

首先,使用 astd::vector几乎总是比使用动态分配的 C 数组更好。您不会得到指针和方括号数组访问的可怕混合,也不需要传递额外的大小变量。

其次,标准库有一些很好的算法来帮助你做你想做的事。假设您将给定的数字写入一个名为 的向量vec中。然后,您可以使用std::partition将所有小于零的元素移动到向量的前半部分,并将所有大于或等于零的元素移动到后半部分,如下所示:

inline bool less_than_zero(int a)
{
    return a < 0;
}

std::vector<int>::iterator midpoint = std::partition(vec.begin(),
                                                     vec.end(),
                                                     less_than_zero);

(还有其他指定谓词的方法,但这样的简单函数定义最容易用于演示目的。)

返回的迭代器指向向量中非负的第一项。所以现在您可以轻松地将这些值复制到两个新向量中:

std::vector<int> negative(vec.begin(), midpoint);
std::vector<int> positive(midpoint, vec.end());

就是这样!

于 2013-11-15T04:17:29.533 回答