C ++ While Loop多选条件

时间:2015-05-05 17:06:31

标签: c++ loops while-loop

我正在构建一个简单的计算器,尝试做一个while循环,如果用户没有选择正确的运算符,那么如果他们不选择+,我需要让它们卡在循环中,{ {1}},-*/。我知道如果我只是为每个符号添加%,如果第一个条件未满足!=,它将继续运行。

这是我的代码,一些帮助将不胜感激。

||

6 个答案:

答案 0 :(得分:3)

首先,正如您所指出的,单独检查每个操作员可能最简单。但请注意,您需要&&)运算符,而非||)运算符:

while (symbol != '+' && 
       symbol != '-' && 
       symbol != '*' && 
       symbol != '/' && 
       symbol != '%') {
    // code...

或者,string::find可能更方便:

std::string OPERATORS = "+-*/%";
while (OPERATORS.find(symbol) != std::string::npos) {
    // code...

答案 1 :(得分:2)

使用&& (而且)我建议使用do-while循环来最小化代码。

do
{
    cout << "\nPlease choose a VALID operator: +, -, *, /, %,\n";
    cin >> symbol;

} while (symbol != '+' && symbol != '-' && symbol != '*' && symbol != '/' && symbol != '%')

答案 2 :(得分:1)

您正在寻找的逻辑运算符是$(function(){ $(".topic-menu li a").click(function(){ $('html, body').animate({ scrollTop: $('.smooth').offset().top }, 2000); return false; }); });

&&不是while (symbol != '+', '-', '*', '/', '%')循环中条件的正确方法。你必须比较每一个条件(用paranthesis分开它们),然后用||加入这些条件(或)或&amp;&amp; (和)运营商。

将此更改为whilewhile (symbol != '+', '-', '*', '/', '%')

使用paranthesis更清晰的表达。

此外,我建议您使用while ((symbol != '+') && (symbol!= '-')&&(symbol!= '*') &&(symbol!='/')&&(symbol!= '%'))循环来执行此类基于菜单的程序,您必须至少运行一次do while。所以,试试这个:

while

如果您使用 do { // code }while ((symbol != '+') && (symbol!= '-')&&(symbol!= '*') &&(symbol!='/')&&(symbol!= '%')) 循环方法,则只需do while一次。

答案 3 :(得分:1)

正如Orbit的@Lightness Races所说,||是错误的操作员。只有在symbol不等于所有运算符时才想循环:

while(symbol != '+' && symbol != '-' && symbol != '*' && symbol `= '/' && symbol != '%') {
    cout << "\nPlease choose a VALID operator: +, -, *, /, %,\n";
    cin >> symbol;
}

答案 4 :(得分:1)

试试这个:

#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{
    int a;
    int b;
    int c;
    char symbol;

    cout << "Please choose a number\n" << endl;
    cin >> a;

    cout << "\nPlease choose another number\n" << endl;
    cin >> b;

    cout << "\nPlease choose a operator: +, -, *, /, %,\n";
    cin >> symbol;

    while ((symbol!='+') && (symbol!='-') && (symbol!='*') && (symbol!='/') && (symbol!='%'))
    {
        cout << "\nPlease choose a VALID operator: +, -, *, /, %,\n";
        cin >> symbol;
    }

    /* do the operation */
}

答案 5 :(得分:1)

这是一种奇闻趣事解决方案。

作为初学者,这不是一个好主意,因为它涉及到非常复杂的C ++特性。作为一名中级程序员,弄清楚它是如何工作的可能是有趣的和有教育意义的。作为一名高级C ++程序员,我建议不要使用它,因为在使用时简洁的收益超过了其余代码的荒谬性。

当语法让你失望时,写下新的语法:

template<class...Ts>
struct compare_with_t {
  using indexes=std::make_index_sequence<sizeof...(Ts)>;
  std::tuple<Ts...> values;
  template<size_t...Is, class F, class C>
  bool apply( std::index_sequence<Is...>, F&& f, C&& c, bool id) const {
    bool results[]={
      f( std::get<Is>(values) )...
    };
    return std::accumulate( std::begin(results), std::end(results), id, std::forward<C>(c) );
  }
  template<class O>
  bool operator!=( O&& o )const{
    return apply( indexes{}, [&o]( auto const&t ){ return o != t; }, [](bool a, bool b){return a&&b;}, true );
  }
  template<class O>
  bool operator==( O&& o )const{
    return apply( indexes{}, [&o]( auto&&t ){ return o == t; }, [](bool a, bool b){return a||b;}, false );
  }
  template<class O>
  friend bool operator==( O&& o, compare_with_t const& c ){
    return c==std::forward<O>(o);
  }
  template<class O>
  friend bool operator!=( O&& o, compare_with_t const& c ){
    return c!=std::forward<O>(o);
  }
};
template<class...Ts>
compare_with_t<std::decay_t<Ts>...>
compare_with( Ts&&...ts ) {
  return { std::forward_as_tuple( std::forward<Ts>(ts)... ) };
}

使用:

while ( symbol  != compare_with( '+', '-', '*', '/', '%' ) ) {

live example

以上要求C ++ 14。进一步的改进将包括短路评估,而不是完全写入,可能还有C ++ 1z折叠。哦,compare_with_t == compare_with_t交叉点测试和!=相似。

上面的设计创建了一个包含参数集合的转发类型compare_with_t。然后,当您使用==!=时,它会为您进行每次比较的明智联接。

可能对中级程序员有用的技术:统一初始化,索引技巧,将元组解压缩到数组中,(ab)使用accumulate,基于ADL的朋友操作符,自动lambda,模板类的模板工厂。