C ++输入仅接受运算符或仅数字

时间:2019-01-23 16:03:40

标签: c++

我一直试图将其编码为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;
}

1 个答案:

答案 0 :(得分:1)

有效输入的定义

在这里,我假设有效输入由以下自然语句给出。首先,正如您提到的,

  • 每个输入必须由*/%+整数构成。

  • 仅零或一次操作。 (因此1+1是有效的。)

对于整数输入,我也假设

    在输入字符串的左侧和右侧允许
  • Whitespace characters

  • 不允许非空格字符之间的空格字符。

  • 第一个非空白字符必须为01,...,9-(对于负整数)。

  • 第二个和后续的非空白字符必须为01,...,89

    < / li>

请注意,在我的假设中,整数输入不允许使用正号字符+和小数点字符.。 例如,在此定义中,

  • "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);
                 });
}

主要功能

现在,轻松实现主要功能。 以下代码将检查输入并正常工作。 接下来的考虑因素是编写测试和性能调整:

DEMO(Multiplication)

DEMO(Division)

DEMO(Modulo)

DEMO(Addition)

DEMO(Invalid 1)

DEMO(Invalid 2)

#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;
}