我需要编写一个程序,它接受一个给定的数组,然后将它分成两个独立的数组,其中一个数组的元素是主数组的正元素,另一个元素是主数组的负元素。
在尽力使用代码之后,我在尝试编译时遇到了大约一百万行错误。我如何删除三个动态分配的数组有问题吗?什么巨大的错误阻止编译? 这是我的代码:
#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;
}
代码应该在数组中读取并显示一个新的负数和一个新的正数组。提前谢谢!
答案 0 :(得分: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);
修复了这些错误后,它可以编译并运行良好。
答案 1 :(得分: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);
这将使你的代码编译。
Hovewer还有一个错误,这将使整个应用程序以不正确的方式工作。在您输入值的位置,您需要在1>} 之前获取输入在数组中输入它。像这样:
cin
答案 2 :(得分:0)
首先,使用std::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());
就是这样!