Нахождение числа, кратного пяти, в векторе с помощью функции - PullRequest
0 голосов
/ 07 мая 2020

Напишите функцию с именем findMultipleOfFives, которая принимает вектор целых чисел в качестве параметра (передается как постоянная ссылка). Ваша функция должна возвращать истину, если каждое число в векторе кратно числу 5. В противном случае функция должна возвращать ложь.

Например, для данной векторной переменной vector all_values ​​{10, 20, 30, 40, 50} функция findMultipleOfFives вернет true. Однако для данной векторной переменной vector all_values ​​{10, 24, 30, 40, 5} функция вернет false.

Код, который я написал:

//Name
//This program will determine if a vector has multiples of fives


#include <iostream>
#include <vector>
using namespace std;


string findMultipleOfFives(vector<int> &all_values);

vector<int> all_values{ 10, 20, 30, 40, 50 };

int main()
{
    cout << "This program will determine whether a vector is full of multiples of five." << endl;
    findMultipleOfFives(all_values);
}

string findMultipleOfFives(vector<int>& all_values)
{
    for (int count = 0; count < 5; count++)
    {
        all_values[count] = 5;
        if (all_values[count] % 5 == 0)
        {
            all_values[count]++;
            return "True";
        }
        else
        {
            return "False";
        }
    }
}

Ошибка появляется там, где я вызываю функцию в своей функции main():

Избегайте безымянных объектов с настраиваемым построением и разрушением

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

Ответы [ 3 ]

2 голосов
/ 07 мая 2020

У вас все неправильно.

В вашем коде:

string findMultipleOfFives(vector<int>& all_values)  // the exercise call for a function 
                                                     // that returns bool value, 
                                                     // not a string
{
   for (int count = 0; count < 5; count++)  // you are looking for multiples of 5, 
                                            // not loop though the first 5 elements.
   {
       all_values[count] = 5;              // Why are you changing the original array?
       if (all_values[count] % 5 == 0)
       {
           all_values[count]++;            // Why are you still changing the original array?
           return "True";                  // You are returning before the end of the loop.
                                           // all elements must be mults of 5  
                                           // to return true.
       }
       else
       {
           return "False";
       }
    }
}

Вот один из способов написать это.

bool AllAreMuliplesOfFive(const vector<int>& v) // Note the use of const, we do not need to change 
                                                  // or destroy the caller's data.
{
   for (size_t i = 0; i < v.size(); ++i)  // looping through all elements in v
                                          // v.size() returns a size_t 
   {
       // test condition
       if (v[i] % 5 != 0)   // multiple of 5? 
          return false;     // no, since we need all to be multiple of 5 for success
                            // return false now.
   }
   return true;  // all elements have passed the test!
}
2 голосов
/ 07 мая 2020

Во-первых, вы пытаетесь изменить vector, пока просматриваете его. Вам не нужно этого делать, и инструкции не требуют этого.

Во-вторых, инструкции просят вас вернуть логическое значение, а не строку.

В-третьих, ваша функция не проходит через весь вектор. std::vector имеет член size() для получения фактического количества элементов и operator[] для доступа к элементам. Но даже с этим значением размера ваш l oop равен return на 1-й итерации, поэтому вы сравниваете только 1-й элемент и игнорируете другие элементы. В инструкциях четко указано, что нужно возвращать true, если все элементы соответствуют условию.

Попробуйте вместо этого:

//Name
//This program will determine if a vector has multiples of fives


#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;

bool findMultipleOfFives(const vector<int> &all_values);

int main()
{
    cout << "This program will determine whether a vector is full of multiples of five." << endl;
    vector<int> all_values{ 10, 20, 30, 40, 50 };
    cout << boolalpha << findMultipleOfFives(all_values);
}

bool findMultipleOfFives(const vector<int>& all_values)
{
    if (all_values.empty())
        return false;

    for (size_t count = 0; count < all_values.size(); count++)
    {
        if ((all_values[count] % 5) != 0)
            return false;
    }

    return true;
}

В качестве альтернативы, std::vector имеет iterator s, которые вы можете использовать вместо этого, например:

bool findMultipleOfFives(const vector<int>& all_values)
{
    if (all_values.empty())
        return false;

    for (vector<int>::const_iterator iter = all_values.begin(); iter != all_values.end(); ++iter)
    {
        if ((*iter % 5) != 0)
            return false;
    }

    return true;
}

Или, используя for l oop на основе диапазона в C ++ 11 и более поздних версиях (который использует iterator s внутри) :

bool findMultipleOfFives(const vector<int>& all_values)
{
    if (all_values.empty())
        return false;

    for (int num : all_values)
    {
        if ((num % 5) != 0)
            return false;
    }

    return true;
}
1 голос
/ 07 мая 2020

Это должен быть просто алгоритм:

#include <algorithm>

bool findMultipleOfFives(std::vector<int> const& all_values)
{
  return std::none_of(all_values.cbegin(), 
                      all_values.cend(), 
                      [](int v) { return v % 5; });
}

Как указывает @RemyLebeau, записать это как all_of будет легче для чтения:

bool findMultipleOfFives(std::vector<int> const& all_values)
{
  return std::all_of(all_values.cbegin(), 
                     all_values.cend(), 
                     [](int v) { return v % 5 == 0; });
}
...