2015-12-05 3 views
1

Мне нужно объединить отрицательные числа из двух массивов. Так что я делаю: добавление столько, сколько я хочу элементов в массив, а затем пытается добавить к объединяемых элементов массива, которые < 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 и т. Д.). Может быть, вы знаете, что не так, и как это исправить?

ответ

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] << " "; 
} 
+0

большое спасибо :) – Pr0t3

+0

Возможно, вы могли бы рассказать мне, как умножить эти элементы массива отрицательных чисел? – Pr0t3

+0

Вы имеете в виду умножение всех отрицательных чисел в массиве? – Shadowwolf

2

В коде нет ничего плохого. Но некоторые элементы в ваших объединенных массивах не инициализируются. Вот почему вы получаете случайные числа в позициях положительных чисел.

Используйте отдельное целое число для подсчета количества отрицательных чисел, которые вы сохранили, чтобы назначить новые отрицательные числа в объединенном массиве или сначала инициализировать полный массив в 0s.

Например, замените последнюю часть следующим кодом, чтобы свести массивы в один массив.

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]<<" "; 
} 
0

Если вы не чувствуете себя мазохистом, вы хотите использовать std::copy_if и std::vector вместо массивов и рукописных петель.

Смежные вопросы