2015-09-28 8 views
0

Итак, я пытаюсь создать программу, которая будет разделять один массив из ints на два, один для четных ints и один для неравных int. Теперь, странно, если я вхожу только в четные или неравномерные числа в базовый массив, программа работает нормально, но если я вхожу в комбинацию из двух, одно из значений, удерживаемых двумя новыми массивами, будет случайным, обычно отрицательный, большой номер, любая идея, почему это так?Случайные целые числа, появляющиеся в программной ошибке

#include <iostream> 
using namespace std; 

void main() 
{ 
    int *a, n, *even_nums = 0, *uneven_nums = 0, counter_even = 0,counter_uneven = 0; 
    cout << "How many values does your array have?\n" << endl; 
    cin >> n; 
    a = new int[n]; 
    cout << "\nEnter the values in your array:" << endl; 
    for (int i = 0; i < n; i++) 
    { 
     cout << "a[" << i << "] = "; 
     cin >> a[i]; 
     if (a[i] % 2 == 0) 
      counter_even++; 
     else 
      counter_uneven++; 
    } 
    if (counter_even == 0) 
     cout << "There are no even numbers in your array." << endl; 
    else 
     even_nums = new int[counter_even]; 
    if (counter_uneven == 0) 
     cout << "There are no uneven numbers in your array." << endl; 
    else 
     uneven_nums = new int[counter_uneven]; 
    for (int i = 0; i < n; i++) 
    { 
     if (a[i] % 2 == 0) 
      even_nums[i] = a[i]; 
     else 
      uneven_nums[i] = a[i]; 
    } 
    if (counter_even != 0) 
    { 
     cout << "\nThe even numbers in your array are:" << endl; 
     for (int i = 0; i < counter_even; i++) 
      cout << even_nums[i] << " "; 
    } 
    if (counter_uneven != 0) 
    { 
     cout << "\nThe uneven numbers in your array are:" << endl; 
     for (int i = 0; i < counter_uneven; i++) 
      cout << uneven_nums[i] << " "; 
    } 
    system("PAUSE"); 
} 

ответ

0

В

for (int i = 0; i < n; i++) 
{ 
    if (a[i] % 2 == 0) 
     even_nums[i] = a[i]; 
    else 
     uneven_nums[i] = a[i]; 
} 

Вы используете один и тот же показатель для всех массивов. Это не будет работать, поскольку even_nums и uneven_nums будут меньше, чем a, если у вас есть оба. В конце концов вы напишете конец конца массива, который равен undefined behavior.

Что вам нужно сделать, это добавить один индекс для каждого массива и каждый раз, когда вы вставляете элемент в массив, вы продвигаете этот индекс.

for (int i = 0, u = 0, e = 0; i < n; i++) 
{ 
    if (a[i] % 2 == 0) 
     even_nums[e++] = a[i]; 
    else 
     uneven_nums[u++] = a[i]; 
} 

Также вы используете void main(), который не является стандартным и не должны использоваться. int main() и int main(int argc, char** argv) являются стандартными приемлемыми сигнатурами main()

0

В блоке

for (int i = 0; i < n; i++) 
{ 
    if (a[i] % 2 == 0) 
     even_nums[i] = a[i]; 
    else 
     uneven_nums[i] = a[i]; 
} 

вы используете i как тот же показатель для массивов a, even_nums и uneven_nums. Вам нужно использовать отдельные индексы для этих массивов. Например, если у вас есть n = 10 элементов, 5 четных и 5 нечетных, то ваши even_nums и uneven_nums содержат всего 5 элементов.

+0

Я, должно быть, не обратил внимания на это, как глупо от меня, спасибо :) – FallenRune