умножить и добавить к вектору целого числа - PullRequest
0 голосов
/ 08 ноября 2018

Напишите программу, которая предлагает пользователю ввести данные в вектор целых чисел и присваивает другому вектору целых чисел значения первого вектора (измененного умножением на 8 и увеличенным на 100), НО В ОБРАТНОМ ПОРЯДКЕ. Пример: Вводим в первый вектор значения:

3   8   2   9   11  5  40 100 203 49

Тогда второй вектор имеет значения:

(49*8 +100) (203*8 +100) (100*8 +100) (40*8 +100) (5*8 +100) (11*8 +100) (9*8 +100)
(2*8 +100) (8*8 +100) (3*8 +100) .

Итак, это вопрос, который задают, но пока все, что я могу сделать в своем коде, - это ввести целые числа и переставить их в обратном порядке, но я не могу понять, как добавить математику в код (добавление 100 и раз 8)

#include <iostream>
using namespace std;

int main(){
    int input[500], output[500], count, i;

    cout << "Enter number of elements in array\n";
    cin >> count;

    cout << "Enter " << count << " numbers \n";

    for(i = 0; i < count; i++){
        cin >> input[i];
    }

    // Copy numbers from inputArray to outputArray in 
    // reverse order 
    for(i = 0; i < count; i++){
        output[i] = input[count-i-1];
    }    

    cout << "Reversed Array\n";
    for(i = 0; i < count; i++){
        cout << output[i] << " ";
    }
    return 0;
}

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Когда вы копируете числа из inputArray в outputArray в обратном порядке, вы в основном обращаетесь к каждому элементу inputArray, а затем помещаете их в новый массив, так что вы также можете изменить их на этом шаге:

//take the element index (count - 1 - i) from inputArray, 
//multiply by 8, then increment by 100, 
//then assign output element index i equal to the result 

cout << "Reversed Array\n";
for(i = 0; i < count; i++){
    output[i] = ((input[count-i-1]) * 8) + 100;
}
0 голосов
/ 08 ноября 2018

Фактический расчет является однострочным:

std::vector<int> input(count);
// populate input vector here...
std::vector<int> result(count);

// one-liner, formatted for easier readability
std::transform(std::cbegin(input), std::cend(input),
    std::rbegin(result),
    [](int incoming) { return 8 * incoming + 100; } );

Вызовы std::cbegin и std::cend возвращают итераторы, которые указывают на первый элемент input и конец концаinput, соответственно.

Вызов std::rbegin возвращает reverse итератор в result;он бежит от конца вектора назад к началу.

Эта последняя строка является лямбда-функцией - она ​​вызывается с аргументом int с именем incoming и возвращаетвычисленное значение.

Стандартный алгоритм std::transform проходит через входной диапазон (std::cbegin(input) .. std::cend(input)) и для каждого элемента применяет лямбда-функцию и сохраняет результат в выходном диапазоне (std::rbegin(output); без конечного итератора).потому что алгоритм заканчивается, когда исчерпан входной диапазон).

Это выглядит сложнее, чем одноразовые решения в других ответах.Но как только вы привыкнете использовать итераторы и алгоритмы, это становится естественной формулировкой с преимуществом большей ясности и гибкости.Например, если ваши требования изменились, и вам нужно было записать значения в порядке, а не в обратном порядке, вы просто изменили бы std::rbegin(result) на std::begin(result).

0 голосов
/ 08 ноября 2018

Ну, вы нигде не использовали std::vector<int> в вашем коде, скорее, у вас есть обычные массивы с обоими размерами 500. Это не было требованием.

Прочитайте о std :: vector <> и используйте их вместо этих массивов, выделяя размер только того, что хочет иметь пользователь (т.е. соответственно пользовательский ввод count).

Во-вторых, вы могли бы выполнить вычисления для каждого из элементов вектора input, копируя / заполняя векторный массив output.

Вот пример кода: ДЕМО ЗДЕСЬ

#include <iostream>
#include <vector>

int main()
{
    std::cout << "Enter number of elements in array\n";
    std::size_t count; std::cin >> count;

    std::cout << "Enter " << count << " numbers \n";
    std::vector<int> input(count, 0);
    // input element
    for (int& element : input) std::cin >> element;

    std::vector<int> output; output.reserve(count); // reserve memory for elements

    // apply to the output vector: for that    
    // simply reverse iterate input array using the while loop, 
    // emplace back the calculated result to the output array
    while (count--)
    {
        output.emplace_back((input[count] * 8) + 100);
    }

    // print out the output
    std::cout << "Reversed Array\n";
    for (const int element : output)    std::cout << element << " ";
    return 0;
}

выход :

Enter number of elements in array
10
Enter 10 numbers
1 2 3 4 5 6 7 8 9 10
Reversed Array
180 172 164 156 148 140 132 124 116 108 

При этом вы могли бы также сделать это с помощью функции алгоритма std std::trasform. Для этого выполняет итерацию в обратном порядке вектора input в std::transform с использованием лямбда-функции (которая вычисляет необходимое) и вставляет обратно в вектор output.

СМОТРЕТЬ В ЖИЗНИ

#include <algorithm> // std::transform

auto doMath = [](int element) { return (element * 8) + 100; }; // lambda which does the calculation
std::transform(input.crbegin(), input.crend(), std::back_inserter(output), doMath);

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

СМОТРЕТЬ В ЖИЗНИ

#include <iostream>
#include <vector>

int main()
{
    std::size_t count; std::cin >> count;
    std::vector<int> vec; vec.reserve(count);
    // take the input and store the calculated value directly in the vec array
    while (count--)
    {
        int element; std::cin >> element;
        vec.emplace_back((element * 8) + 100);
    }
    return 0;
}
...