Цикл for возвращает несколько истинных операторов, как вернуть как один истинный bool var - PullRequest
0 голосов
/ 26 марта 2019

У меня есть цикл for, который проходит через вектор целых чисел, чтобы найти конкретную цифру (6) и десятку (1 или 2). И если это верно для ВСЕХ целых чисел вектора, я должен вернуть true, и если только один равен false, я должен вернуть false и напечатать элемент, который делает его ложным.

В этом случае целые числа в векторе удовлетворяют условию. Но я не знаю, как скомпилировать три истины в одну возвращаемую истину

//    ∀x∈D,if the ones digit of x is 6, then the tens digit is 1 or 2.
// vector contains [-48, -14, -8, 0, 1, 3, 16, 23, 26, 32, 36]

void question5 (std::vector<int> x){

    int num;
    int digit1;
    int digit2;

    for (int i=0; i <x.size();i++){
        num = x.at(i); //stores the integer from the vector at position i
        digit1 = num % 10; // the ones digit is stored into digit1

        if (digit1 == 6){ // checks to see if the ones digit is 6
            digit2 = num/10; // if true gets the tens digit in num
            if ((digit1 ==6 && (digit2 == 1||2)))
                std::cout << "True"<< std:: endl;
            else
                std::cout << "False"<< std::endl;
        }

    }  
}

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Компилирование трех условий в один оператор может быть выполнено с тремя условиями, соединенными "и" или "&&".Если выполняются все три условия, система выходит из строя, как показано ниже.После того, как весь вектор был проверен без проблем, у вас возникает ситуация успеха.

Я думаю, что в вопросе об отрицательных числах есть двусмысленность.Как написано, я считаю, что -36, как первое число, не пройдет тест, но только если вы позаботитесь о отрицательном знаке:

#include <iostream>
#include <vector>

//    ∀x∈D,if the ones digit of x is 6, then the tens digit is 1 or 2.
// vector contains [-48, -14, -8, 0, 1, 3, 16, 23, 26, 32, 36]

void question5(std::vector<int> x)
{
  int i = 1;
  for (auto &number: x) {
    int abs_number = abs(number);
    if (abs(abs_number) % 10 == 6 and (abs_number / 10 != 1 and abs_number / 10 != 2)) {
      std::cout << "Element #" << i << " with a value of " << number
                << " is the first failing element." << std::endl;
      return;
    }
    i++;
  }
  std::cout << "All elements satisfy the criteria." << std::endl;
  return;
}

int main()
{
  std::vector<int> vect{-48, -14, -8, 0, 1, 3, 16, 23, 26, 32, 36};

  question5(vect);
  return 0;
}
0 голосов
/ 26 марта 2019

Но я не знаю, как скомпилировать три истины в одну возвращаемую истину

  1. Измените тип возвращаемого значения функции на bool.
  2. Возврат false по первому знаку.
  3. Если вы никогда не встретите условие false, верните true в конце.
  4. Убедитесь, что условие используется правильно. digit2 == 1||2 неверно.

for (int i=0; i <x.size();i++){
    num = x.at(i); //stores the integer from the vector at position i
    digit1 = num % 10; // the ones digit is stored into digit1

    if (digit1 == 6){ // checks to see if the ones digit is 6
        digit2 = num/10; // if true gets the tens digit in num

        // No need for digit == 6 again. It's already been tested.
        // The correct way to test whether digit2 is 1 or 2.
        if ( (digit2 == 1) || (digit2 == 2) )
        {
            std::cout << "True"<< std:: endl;
        }
        else
        {
            std::cout << "False"<< std::endl;
            return false;
        }
    }
}  

return true;

Более простой тест будет состоять в том, чтобы вычислить num % 100 и сравнить полученный результат с 16 и 26.

for (int i=0; i <x.size();i++){
    num = x.at(i);
    int num2 = num % 100;
    if ( num2 == 16 || num2 == 26 )
    {
        std::cout << "True"<< std:: endl;
    }
    else
    {
        std::cout << "False"<< std::endl;
        return false;
    }
}

return true;
...