2014-05-15 5 views
0

У меня есть массив A[9]= {1,2,3,4,5,6,7,8,9} и мне нужно удалить цифры, которые не делящиеся на 2. Кода я пытался сделать:C++ массив не может получить правильный массив

int main() 
{ 
    int n; 
    ifstream fd(Cdf); 
    fd>>n; // read how many numbers are in the file. 
    int A[n]; 
    for(int i = 0; i < n; i++) 
    { 
     fd >> A[i]; //read the numbers from file 
    } 
    for(int i = 0; i < n; i ++) // moving the numbers. 
    { 
     if(A[i] % 2 !=0) 
     { 
      for(int j = i; j < n; j++) 
      { 
       A[i] = A[i+1]; 
      } 
     } 
    } 
    fd.close(); 
    return 0; 
} 

Но я получаю число как 224466888 , что мне нужно сделать, чтобы получить 2,4,6,8?

Мне нужно удалить числа в том же массиве.

+0

Первый комментарий: значащие имена переменных делают код более удобным для чтения. – Almo

+0

Почему бы не использовать лучшую структуру данных, например 'std :: vector' или' std :: list'? – crashmstr

+0

@crashmstr Из-за обучения. – molbdnilo

ответ

0

Ваш цикл удаления индексирует с неправильной переменной:

for(int j = i; j < n; j++) 
{ 
    A[i] = A[i+1]; 
} 

Вы используете i, который не меняется в цикле.
Изменить его на j. Вы также должны вычесть один из верхнего предела, так как вы выходите за пределы массива, иначе при доступе к A[j + 1].

for(int j = i; j < n - 1; j++) 
{ 
    A[j] = A[j + 1]; 
} 
+0

это все еще ничего не снимает – sp2danny

+0

спасибо, что помогло мне :) – Julius

0

Массив не может использоваться для вашей цели. Он выделяется на стек, и его размер не может быть изменен динамически (вы не можете изменить размер массива в целом, а не только тогда, когда он выделен в стеке).

Вы можете выделить второй массив и перераспределить его с помощью realloc каждый раз, когда вы добавляете новый элемент, но это не самый лучший способ сделать это. Вы работаете с C++, так просто использовать std::vector<int> и ваши проблемы будут решены:

std::vector<int> evenArray; 
evenArray.reserve(sizeof(A)/sizeof(A[0])/2); 

if (number is even) { 
    evenArray.pushBack(number); 
} 

виду, что вектор хранит элементы смежно так это законно:

int *evenA = &evenArray[0]; 
+0

Я не могу использовать Вектор. потому что я изучаю его в школе. и мой учитель дает мне сделать это с массивами .. – Julius

2

Во-первых, вы должны использовать зЬй :: вектор для динамических массивов. Во-вторых, для удаления номера, которые даже в векторе, вы можете сделать:

std::vector<int> inf = {12,0,5,6,8}; 
auto func = [](int i){return i % 2 != 0;}; 
inf.erase(std::remove_if(inf.begin(),inf.end(),func), inf.end()); 

EDIT:

Ok, так что вы можете сделать это без StD :: векторов, но это будет уродливее:

#include <algorithm> 

int res[] = {2,5,9,8,6,7}; 
int size = 6; 
auto func = [](int i){return i % 2 != 0;}; 
int new_size = std::remove_if(res,res + size, func) - res; 

Все данные, которые вы хотите в [0, new_size [диапазона, другая часть вашего массива теперь мусор.

+0

Я не могу использовать Вектор. потому что я изучаю его в школе. и мой учитель дает мне сделать это с массивами ... – Julius

+0

@ user3609104 Отредактировано для версии массива – Kiroxas

+0

#include // для std :: remove_if – playful

0

Для вашего внутреннего цикла for вы должны указывать j, а не i.

for(int j = i; j < n - 1; j++) 
{ 
    A[j] = A[j+1]; 
} 

В противном случае, в чем смысл создания j?

Конечно, это также означает, что если вы прочитаете весь массив назад, вы отобразите все символы, которые были сдвинуты (что будет просто равно последнему числу). Таким образом, вам, вероятно, следует отслеживать новую длину массива и просто перебирать его, а не конец массива.

EDIT:
Во внутреннем for цикле вы должны цикла к n - 1 иначе, если у вас есть A[j + 1] он будет идти от конца массива, когда вы можете изменить его, что может или не может дать вам сообщение об ошибке выполнения.

+0

, так что вы говорите, что мне просто нужно A [i] = A [i + 1] записать в предложение If без цикла for? – Julius

+0

Нет, вам нужно изменить внутренний цикл 'for', чтобы использовать' j' вместо 'i' при доступе к массиву. В противном случае вы просто используете значение 'i', которое не изменилось. Таким образом, каждый раз, когда вы нажимаете нечетное число, все, что вы делаете, заменяет его номером непосредственно после него. Изменение его на 'j', а не' i' сделает так, чтобы он повторил этот процесс по массиву. Хотя, у мольбднило была точка, и вам нужно сделать это «n - 1», чтобы вы не ушли с ног. –

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