2015-01-14 3 views
-1

Моя функция, которая проверяет, являются ли цифры в векторе четными или нечетными, не работает должным образом. Эта функция печатает числа, которые я набрал в векторе, и помещает их в 2 категории EVENS/ODDS. Но если у меня есть отрицательное число, возникает проблема с шансами не распечатывать, а работать. проблематично код здесь:Почему моя функция не работает должным образом

void printEvensAndOddsVector(const vector <int>& new_v1) 
{ 
    cout << "Vector Evens: "; 
    for (unsigned int i = 0; i < new_v1.size(); ++i) 
    { 
     if (new_v1.at(i) % 2 == 0) 
     { 
      cout << new_v1.at(i) << " "; 
     } 
    } 
    cout << " \n"; 

    cout << "Vector Odds: "; 
    for (unsigned int i = 0; i < new_v1.size(); ++i) 
    { 
     if (new_v1.at(i) % 2 == 1) // Here is the problem. 
     { 
      cout << new_v1.at(i) << " "; 
     } 
    } 
    cout << " \n"; 
} 

Или более точно строки: if (new_v1.at(i) % 2 == 1) Он печатает числа, нечетные, но только позитивные не отрицательные. Но если я изменю его на if (new_v1.at(i) % 2 != 0), тогда он будет работать правильно. Почему это происходит и есть проблема с равным оператором? Если да, то почему печатаются эвены, даже если они являются негативами при использовании равного оператора?

Код здесь для справки.

clude <iostream> 
#include <vector> 

using namespace std; 

void fillVector(vector <int>&); 

void printVector(const vector <int>&); 

void printEvensAndOddsVector(const vector <int>&); // Prints Evens and Odds. 

int main() 
{ 
    vector <int> v1; 

    fillVector(v1); 
    printVector(v1); 
    printEvensAndOddsVector(v1); 

    cout << "\n\n\n"; 
    system("pause"); 
    return 0; 
} 

// Function Definitions 
void fillVector(vector <int>& new_v1) 
{ 
    int number; 
    cout << "Type in numbers and type -100 to stop: "; 
    cin >> number; 

    while (number != -100) 
    { 
     new_v1.push_back(number); 
     cin >> number; 
    } 
} 

void printVector(const vector <int>& new_v1) 
{ 
    cout << "\nVector: "; 
    for (unsigned int i = 0; i < new_v1.size(); ++i) 
    { 
     cout << new_v1.at(i) << " "; 
    } 
    cout << " \n"; 
} 

void printEvensAndOddsVector(const vector <int>& new_v1) 
{ 
    cout << "Vector Evens: "; 
    for (unsigned int i = 0; i < new_v1.size(); ++i) 
    { 
     if (new_v1.at(i) % 2 == 0) 
     { 
      cout << new_v1.at(i) << " "; 
     } 
    } 
    cout << " \n"; 

    cout << "Vector Odds: "; 
    for (unsigned int i = 0; i < new_v1.size(); ++i) 
    { 
     if (new_v1.at(i) % 2 == 1) 
     { 
      cout << new_v1.at(i) << " "; 
     } 
    } 
    cout << " \n"; 
} 
+5

ли вам нужен весь этот код, чтобы продемонстрировать простой вопрос с оператором по модулю? 3 или 4 строки 'main()' программа - это все, что вам нужно. – PaulMcKenzie

+0

Результат '%' на отрицательном числе, вероятно, отрицательный. –

+0

@Paul да, я знаю это, но вопрос все еще остается. Я не спрашиваю, как самый быстрый или лучший способ его кодировать. Я делаю эту программу по какой-то причине, и мой код не работает. почему мой вопрос? – Johnson

ответ

3

Эта линия: if (new_v1.at(i) % 2 == 1). Он печатает цифры, которые являются нечетными, но только положительные, а не отрицательные.

Для отрицательного n, n % 2 возвращает либо 0 или -1 в C++. Он никогда не возвращает 1, поэтому условие не может быть истинным для отрицательных входов.

Как вы обнаружили, по сравнению с нолем будет работать.

См Modulo operator with negative values

+0

О, это объясняет, почему даже работа по-прежнему вызывает его право 0? Кроме того, почему это: https://encrypted.google.com/search?output=search&sclient=psy-ab&q=-5+mod+2&btnG=&oq=&gs_l=&pbx=1 говорящий остаток 1, а не -1? – Johnson

+0

@Johnson: * Сравнение * с нулями работает, да. – NPE

+0

Ok mate спасибо, теперь я понимаю и выбрал лучший ответ за 7 минут. – Johnson

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