проверить, было ли выполнено какое-либо из условий в цикле c ++ - PullRequest
0 голосов
/ 01 августа 2011

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

  string topping;
  cout << "Enter a topping ";
  cin >> topping;
  string toppings_offered[5] = {"onions", "bell peppers", "olives", "spinach", "tomatoes"};

  if ( (topping == toppings_offered[0]) || (topping == toppings_offered[1]) || (topping == toppings_offered[2]) || (topping == toppings_offered[3]) || (topping == toppings_offered[4]))
           cout << "yes";

Ответы [ 7 ]

3 голосов
/ 01 августа 2011

Немного теории логики:

Все условия выполняются обратно пропорционально единице условий, которые не выполняются.

В цикле for (), если одно из условий не выполнено, ответ неверен. В противном случае это правда.

Однако я не уверен, что вы задаете правильный вопрос, потому что в вашем примере, топпинг может соответствовать только одному toppings_offered, но не всем.

3 голосов
/ 01 августа 2011

В C ++ 0x:

#include <algorithm>
#include <iterator>
#include <string>

bool is_offered(const std::string& s)
{
    // look up table
    static const std::string toppingsOffered[] =
                                {"onions", "bell peppers", /* etc */ };

    const auto toppingsBegin = std::begin(toppingsOffered);
    const auto toppingsEnd = std::end(toppingsOffered);

    return std::find(toppingsBegin, toppingsEnd, s) != toppingsEnd;
}

if (is_offered())
    std::cout << "yes";    

В C ++ 03:

#include <algorithm>
#include <string>

bool is_offered(const std::string& s)
{
    // look up table
    static const std::string toppingsOffered[] =
                                {"onions", "bell peppers", /* etc */ };

    const std::string* toppingsBegin = &toppingsOffered[0];
    const std::string* toppingsEnd =
                            toppingsBegin +
                                sizeof(toppingsOffered) / sizeof(std::string);

    return std::find(toppingsBegin, toppingsEnd, s) != toppingsEnd;
}

if (is_offered(topping))
    std::cout << "yes";

В C ++ 03 с утилитами:

#include <algorithm>
#include <cstddef>
#include <string>

template <typename T, std::size_t N>
T* begin(T (&array)[N])
{
    return *array[0];
}

template <typename T, std::size_t N>
T* end(T (&array)[N])
{
    return begin(array) + N;
}


bool is_offered(const std::string& s)
{
    // look up table
    static const std::string toppingsOffered[] =
                                {"onions", "bell peppers", /* etc */ };

    const std::string* toppingsBegin = begin(toppingsOffered);
    const std::string* toppingsEnd = end(toppingsOffered);

    return std::find(toppingsBegin, toppingsEnd, s) != toppingsEnd;
}

if (is_offered(topping))
    std::cout << "yes";
1 голос
/ 01 августа 2011
for (int i = 0; i < 5; i++)
    if (topping == toppings_offered[i])
    {
        cout << "yes";
        break;
    }

Будет делать то, что вы просите. Вам не нужно проверять, все ли они выполнены. Вы должны проверить, является ли введенный топпинг одним из предложенных. По крайней мере, это то, что подразумевает ваш код.

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

1 голос
/ 01 августа 2011
bool isok = false;
for(...)
{
    if(cond)
        isok = true;
}

if(isok)
    cout << "yes"
0 голосов
/ 01 августа 2011

Вы имеете в виду, было ли выполнено одно из условий. Все они не могут быть выполнены, хотя все они могут быть проверены.

int i = 0;
for (; i < 5; ++i)
  if (topping == toppings_offered[i])
    break;
if (i < 5)
  cout << "yes";

Не проверенный код.

0 голосов
/ 01 августа 2011

псевдокод:

  result = false
  for i = 1 to n do
     result = result or (input = target[i])
  if result then print("At least one matched")
  else then print("None matched")

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

0 голосов
/ 01 августа 2011
int i;

for( i = 0; i < sizeof(toppings_offered) / sizeof(string); i++)
{
    if(topping == toppings_offered[i])
    {
       cout << "yes";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...