我需要合并来自两个数组的负数。所以我正在做的事情:向数组添加尽可能多的元素,然后尝试添加到< 0的合并数组元素。这是我的尝试代码:
int main()
{
int arr1[100], arr2[100], size1, size2, size, i, j, k, merge[200];
cout<<"Enter Array 1 Size : ";
cin>>size1;
cout<<"Enter Array 1 Elements : ";
for(i=0; i<size1; i++)
{
cin>>arr1[i];
}
cout<<"Enter Array 2 Size : ";
cin>>size2;
cout<<"Enter Array 2 Elements : ";
for(i=0; i<size2; i++)
{
cin>>arr2[i];
}
for(i=0; i<size1; i++)
{
if(arr1[i]<0)
{
merge[i]=arr1[i];
}
}
size=size1+size2;
for(i=0, k=size1; k<size && i<size2; i++, k++)
{
if(arr2[i]<0)
{
merge[k]=arr2[i];
}
}
cout<<"Now the new array after merging is :\n";
for(i=0; i<size; i++)
{
cout<<merge[i]<<" ";
}
}
编译后,我得到错误的合并数组。它打印所有负数和所有正数(但随机数2084562等)。也许你知道什么是错的以及如何解决它?
答案 0 :(得分:2)
代码没有什么问题。但是合并数组中的某些元素不会被初始化。这就是为什么你在正数的位置得到随机数。
使用单独的整数来计算您存储的负数的数量,以便在合并数组中分配新的负数,或者首先将完整数组初始化为0。
例如,使用下面的代码替换最后一部分,以便在一个数组中很好地合并数组。
int k = 0; //number of negative elements
for(i=0; i<size1; i++)
{
if(arr1[i]<0)
{
merge[k]=arr1[i];//note we use k as index since i might skip some positions when there are positive elements
k++;
}
}
size=size1+size2;
for(i=0; k<size && i<size2; i++)
{
if(arr2[i]<0)
{
merge[k]=arr2[i];
k++; //only increment when we have a negative number
}
}
cout<<"Now the new array after merging is :\n";
for(i=0; i<k; i++) //note that k is the real size that you used for negative elements.
{
cout<<merge[i]<<" ";
}
答案 1 :(得分:2)
在2个循环中存在一个逻辑错误,它设置了合并数组的元素。每次值不为负值时,它们会跳过混合数组中的索引。跳过的值在打印时仍未初始化,因此理论上它们可以是任何东西(实际上它是未定义的行为)。
如何解决这个问题的一个例子可能是创建一个整数来计算合并数组中的元素数。例如:
int negativecount = 0;
for(i=0; i<size1; i++)
{
if(arr1[i]<0)
{
merge[negativecount++]=arr1[i];
}
}
size=size1+size2;
for(i=0; i<size2 && negativecount < size; i++)
{
if(arr2[i]<0)
{
merge[negativecount++]=arr2[i];
}
}
这样,您将跟踪已存储的元素数量,并正确设置所有元素。您可以使用以下方式打印它们:
for(i = 0; i < negativecount; ++i)
{
std::cout << merge[i] << " ";
}
答案 2 :(得分:0)
除非你感到自虐,否则你想使用std::copy_if
和std::vector
而不是数组和手写循环。