我正在构建一个简单的计算器,尝试做一个while循环,如果用户没有选择正确的运算符,那么如果他们不选择+
,我需要让它们卡在循环中,{ {1}},-
,*
或/
。我知道如果我只是为每个符号添加%
,如果第一个条件未满足!=
,它将继续运行。
这是我的代码,一些帮助将不胜感激。
||
答案 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; (和)运营商。
将此更改为while
:while (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( '+', '-', '*', '/', '%' ) ) {
以上要求C ++ 14。进一步的改进将包括短路评估,而不是完全写入,可能还有C ++ 1z折叠。哦,compare_with_t == compare_with_t
交叉点测试和!=
相似。
上面的设计创建了一个包含参数集合的转发类型compare_with_t
。然后,当您使用==
或!=
时,它会为您进行每次比较的明智联接。
可能对中级程序员有用的技术:统一初始化,索引技巧,将元组解压缩到数组中,(ab)使用accumulate,基于ADL的朋友操作符,自动lambda,模板类的模板工厂。