Вставьте числа, кратные числу, в вектор - PullRequest
1 голос
/ 27 апреля 2019

Мне дали целые числа 15, 16, 17, 18, 19 и 20.

Я должен поместить в вектор только числа, кратные 4, а затем отобразить значения в векторе.

Я знаю, как решить проблему с использованием массивов, но, наверное, я не знаю, как правильно использовать pushback или векторы.

#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> arrmain; int i,j;

for (int i = 15; i <=20 ; i++)
{
        //checking which numbers are divisible by 4
    if (i%4 == 0)
    {   //if number is divisible by 4 inserting them into arrmain 

        arrmain.push_back(i);
        //output the elements in the vector
        for(j=0; j<=arrmain.size(); j++)
        {
            cout <<arrmain[i]<< " "<<endl;
        }
    }
 }

return 0;
 }

желаемый результат: числа, кратные 4: 16, 20

Ответы [ 3 ]

1 голос
/ 27 апреля 2019

Основные проблемы в вашем коде заключаются в том, что вы (1) используете неверную переменную для индексации вектора при печати его значений, т.е. вы используете cout <<arrmain[i] вместо cout <<arrmain[j];и (2) что вы превышаете границы массива при итерации до j <= arrmain.size() (вместо j < arrmain.size(). Обратите внимание, что arrmain[arrmain.size()] превышает границы вектора на единицу, потому что индексы вектора основаны на 0; например, вектор размера 5, имеет допустимые индексы в диапазоне от 0..4, а 5 выходит за пределы.

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

int main()
{
    vector<int> arrmain;

    for (int i = 15; i <=20 ; i++)
    {
        //checking which numbers are divisible by 4
        if (i%4 == 0)
        {   //if number is divisible by 4 inserting them into arrmain

            arrmain.push_back(i);
                    }
    }
    //output the elements in the vector
    for(int j=0; j<arrmain.size(); j++)
    {
        cout <<arrmain[j]<< " "<<endl;
    }

    return 0;
}

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

// could also be written as range-based for loop:
for(auto val : arrmain) {
    cout << val << " "<<endl;
}

Этот синтаксис называется на основе диапазона для цикла и описывается, например, здесь, на cppreference.com .

1 голос
/ 27 апреля 2019

Как уже упоминалось в комментариях, у вас есть пара проблем в вашем коде. Все, что укусит вас в конце концов, когда вы будете писать больше кода. Многие из них могут быть переданы вам средствами компилятора. Например, используя -Weverything в clang .

Чтобы выбрать наиболее важные из них:

source.cpp: 8: 10: предупреждение: объявление скрывает локальную переменную [-Wshadow]

для (int i = 15; i <= 20; i ++) </p>

и

source.cpp: 6: 26: предупреждение: неиспользуемая переменная 'i' [-Wunused-variable]

vector arrmain; int i, j;

Помимо этого, у вас есть логическая проблема в вашем коде:

for values to check
    if value is ok
        print all known correct values

Это приведет к: 16, 16, 20 при запуске. Вместо этого вы хотите изменить область печати, чтобы она не печаталась при каждом совпадении.

Наконец, ошибка, которую вы видите:

for(j=0; j<=arrmain.size(); j++)
{
    cout <<arrmain[i]<< " "<<endl;
}

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

for(innercounter=0; innercounter<=arrmain.size(); innercounter++)
{
    cout <<arrmain[outercounter]<< " "<<endl;
}

Теперь должно быть ясно, что вы используете неправильную переменную для индексации вектора. Это будут индексы 16 и 20 в векторе с максимальным размером 2. Поскольку эти индексы находятся за пределами вектора, у вас неопределенное поведение. При использовании правильного индекса <= также заставляет вас выйти за 1 индекс за пределы вектора, вместо этого используйте <.

Помимо использования лучших имен для ваших переменных, я бы рекомендовал использовать диапазон, основанный на. Это доступно начиная с C ++ 11.

for (int value : arrmain)
{
    cout << value << " "<<endl;
}
0 голосов
/ 27 апреля 2019

После запуска вашего кода я обнаружил две ошибки, которые исправлены в приведенном ниже коде.

vector<int> arrmain; int i, j;

    for (int i = 15; i <= 20; i++)
    {
        //checking which numbers are divisible by 4
        if (i % 4 == 0)
        {   //if number is divisible by 4 inserting them into arrmain 

            arrmain.push_back(i);
            //output the elements in the vector
            for (j = 0; j < arrmain.size(); j++)   // should be < instead of <=
            {
                cout << arrmain[j] << " " << endl;    // j instead of i
            }
        }
    }

Этот код выведет: 16 16 20, так как вы печатаете элементы вектора после каждой операции вставки. Вы можете вывести второй цикл наружу, чтобы избежать повторных операций.

В основном, векторы используются в случае обработки динамического изменения размера. Таким образом, вы можете использовать push_back (), если вы хотите динамически увеличивать размер вектора, или вы можете использовать оператор [], если размер уже предопределен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...