Привет, у меня проблема с этим кодом. ЧЕТНЫЕ и нечетные числа

#c

#c

Вопрос:

У меня проблема с этим фрагментом кода, я пытаюсь напечатать ЧЕТНЫЕ и нечетные числа, но возникает проблема, когда дело доходит до их отображения, векторы не сохраняют числа, как я ожидаю.

     #include <iostream>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
        int vect[n], even[n], odd[n]; // CREATING VECTORS LIMIT AFTER "n"
    
        for(int i = 1; i <= n;   i) { // ENTERING The ELEMENS IN VECTOR
                cin >> vect[i];
        }
    
        for(int i = 1; i <= n;   i) {
                if(vect[i] % 2 != 0) {
                    odd[i] = vect[i];           // I think that here's the problem, the vectors don't save the right numbers.
                }                               /// VERIFYING IF THE NUMBER IS ODD OR EVEN.
                else if (vect[i] % 2 == 0) {
                    even[i] == vect[i];
                }
        }
        for(int i = 1; i <= n;   i) {
                cout << even[i] << " " << endl;    /// PRINTING THE ODD AND EVEN numbers.
                cout << odd[i] << " " << endl;
        }
    
    
    return 0;x
    }
 

Комментарии:

1. Можете ли вы уточнить, что вы имеете в виду под «векторы не сохраняют числа, как я ожидаю»?

2. Посмотрите внимательно в even[i] == vect[i]; течение нескольких минут. (Приличный разработчик предупредил бы вас.)

3. вы переходите от 0 к n и вставляете число в четное / нечетное. Однако четный / нечетный заполняется только для четного / нечетного индекса. Я рекомендую std::vector вместо этого использовать a . Массивы переменной длины не являются стандартными для c .

4. Есть n числа, и ваш последний цикл предполагает, что среди них есть n четные и n нечетные числа.

5. в вашем коде нет векторов. Название std::vector спорно, но называть c-массивы «векторными» очень запутанно

Ответ №1:

Я устранил проблему, спасибо всем за помощь. Теперь он работает отлично.

 #include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int vect[n], even[n], odd[n], z = 0, x = 0; // CREATING VECTORS LIMIT AFTER "n"

    for(int i = 1; i <= n;   i) { // ENTERING The ELEMENS IN VECTOR
            cin >> vect[i];
    }

    for(int i = 1; i <= n;   i) {
            if(vect[i] % 2 != 0) {
                odd[1 z] = vect[i];
                z  ;
                            // I think that here's the problem, the vectors don't save the right numbers.
            }                               /// VERIFYING IF THE NUMBER IS ODD OR EVEN.
            else if (vect[i] % 2 == 0) {
                even[1 x] = vect[i];
                x  ;
            }
    }

    for(int i = 1; i <= x; i  ) {
        cout << even[i] << " ";
    }
    cout << endl;
      for(int i = 1; i <= z; i  ) {
        cout << odd[i] << " ";
    }


return 0;
}
 

Комментарии:

1. Итак, у вас есть проблема, четко опишите ее, и, если вы сами найдете ответ, добавьте его на этот сайт. Отлично! Я бы просто сделал вам простое замечание: вы вызываете свои коэффициенты z и x . Если когда-нибудь в течение длительного времени (скажем, через год) вы снова увидите этот код, вы можете подумать: «Но что означают эти переменные?», Вы можете уточнить это, используя более длинные имена, например even_index , или odd_number или что-то в этом роде.

Ответ №2:

Учитывая подсказки комментариев, ваша программа должна быть изменена на это:

     #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        int n, number;
        cin >> n;
        vector<int> vect, even, odd; // CREATING DYNAMIC VECTORS
    
        for(int i = 0; i < n;   i) { // ENTERING THE ELEMENTS IN VECTOR
                cin >> number;
                vect.push_back(number);
        }
    
        for(int i = 0; i < n;   i) {
                if(vect[i] % 2 != 0) { /// VERIFYING IF THE NUMBER IS ODD OR EVEN.
                    odd.push_back(vect[i]);
                }                      
                else {
                    even.push_back(vect[i]);
                }
        }
        for (int i = 0; i < n;   i)
            cout << vect[i] << " ";
        cout << endl;
        /// PRINTING THE ODD AND EVEN NUMBERS.
        for (autoamp; val : odd)
            cout << val << " ";
        cout << endl;
        for (autoamp; val : even)
            cout << val << " ";
        cout << endl;
    return 0;
    }
 

Он использует vector контейнер STL для ваших массивов, запускает индексацию с 0 и выводит результирующие массивы отдельно, так как количество четных и нечетных записей может отличаться.

Надеюсь, это поможет?

Ответ №3:

Для решения вашей проблемы вы можете использовать стандартную версию std::partition (или стабильную версию):

 void print_even_odd(std::vector<int> v)
{
    auto limit = std::stable_partition(v.begin(), v.end(), [](int n){ return n % 2 == 0; });
    
    std::cout << "Evens:";
    // Pre-C  20 span:
    // for (auto it = v.begin(); it != limit;   it) { int n = *it;
    for (int n : std::span(v.begin(), limit)) {
        std::cout << " " << n;    
    }
    std::cout << std::endl;
    std::cout << "Odds:";
    for (int n : std::span(limit, v.end())) {
        std::cout << " " << n;    
    }
    std::cout << std::endl;
}
 

ДЕМОНСТРАЦИЯ