我一直试图将其编码为C ++的初学者程序,以帮助我更多地了解该语言,但我真的不知道该如何解决。
基本上,程序只需要接受'+','*','/','%'或数字,否则它将表示输入无效。
这是我到目前为止所做的
#include <iostream>
#include <string>
using namespace std;
int main()
{
string x;
cout<<"Enter expression: ";
getline(cin,x);
if(x.find('*') != string::npos){
cout<<"Multiplication";
}else if(x.find('/') != string::npos){
cout<<"Division";
}else if(x.find('%') != string::npos){
cout<<"Modulo";
}else if(x.find('+') != string::npos){
cout<<"Addition";
}else{
cout<<"Invalid!";
}
return 0;
}
答案 0 :(得分:1)
有效输入的定义
在这里,我假设有效输入由以下自然语句给出。首先,正如您提到的,
每个输入必须由*
,/
,%
,+
和整数构成。
仅零或一次操作。 (因此1+1
是有效的。)
对于整数输入,我也假设
不允许非空格字符之间的空格字符。
第一个非空白字符必须为0
,1
,...,9
或-
(对于负整数)。
第二个和后续的非空白字符必须为0
,1
,...,8
或9
。
请注意,在我的假设中,整数输入不允许使用正号字符+
和小数点字符.
。
例如,在此定义中,
"123"
," 123"
,"123 "
和" -123 "
是所有有效整数输入。"abc"
,"123a"
," 1 23"
,"+123"
和"1.0"
都是无效的整数的有效性检查功能
首先,要检查整数输入的有效性,我们使用以下trimming function修剪输入并删除左右空格:(如果可以使用C ++ 17,则std::string_view
从性能角度来看会更好。)
#include <string>
std::string trimLR(const std::string& str)
{
const auto strBegin = str.find_first_not_of(" \f\n\r\t\v");
if (strBegin == std::string::npos){
return "";
}
const auto strEnd = str.find_last_not_of(" \f\n\r\t\v");
const auto strRange = strEnd - strBegin + 1;
return str.substr(strBegin, strRange);
}
接下来,我们定义以下简单的有效性检查函数isInteger
,该函数检查传递的字符串是否为整数。这里的std::isdigit
对于检查每个字符是否都是数字很有用。
请注意,past中提出了各种有趣的方法
posts。
#include <string>
#include <algorithm>
bool isInteger(const std::string& s)
{
const auto ts = trimLR(s);
if(ts.empty()){
return false;
}
const std::size_t offset = (ts[0] == '-') ? 1 : 0;
const auto begin = ts.cbegin() + offset;
return (begin != ts.cend()) // false if s is just a negative sign "-"
&& std::all_of(begin, ts.cend(), [](unsigned char c){
return std::isdigit(c);
});
}
主要功能
现在,轻松实现主要功能。 以下代码将检查输入并正常工作。 接下来的考虑因素是编写测试和性能调整:
#include <iostream>
int main()
{
std::string x;
std::cout << "Enter expression: ";
std::getline(std::cin, x);
const auto optPos = x.find_first_of("*/%+");
if (optPos == std::string::npos)
{
if(isInteger(x)){
std::cout << "Valid input, " << x;
}
else{
std::cout << "Invalid input, " << x;
}
return 0;
}
const auto left = x.substr(0, optPos);
const auto opt = x.substr(optPos, 1);
const auto right = x.substr(std::min(optPos+1, x.length()-1));
if (!isInteger(left) || !isInteger(right))
{
std::cout
<< "Either `" << left << "`, `" << right
<< "` or both are invalid inputs." << std::endl;
return 0;
}
const auto leftVal = std::stod(left);
const auto rightVal = std::stod(right);
if(opt == "*")
{
std::cout
<< "Multiplication: "
<< x << " = " << (leftVal * rightVal);
}
else if(opt == "/")
{
std::cout
<< "Division: "
<< x << " = " << (leftVal / rightVal);
}
else if(opt == "%")
{
std::cout
<< "Modulo: "
<< x << " = " << (std::stoi(left) % std::stoi(right));
}
else if(opt == "+")
{
std::cout
<< "Addition: "
<< x << " = " << (leftVal + rightVal);
}
return 0;
}