C ++使用字符串识别两位数

时间:2011-03-27 02:27:37

标签: c++ digit

抱歉,我意识到我在这个问题中输入了所有代码。对于其他学生来说,我的所有代码都等同于这个特定问题的大部分答案,这是非常愚蠢的。

以下是我提出的问题的基本要点:

我需要识别常规数学表达式(例如5 + 6)中的单位数字以及双位数字(例如56 + 78)。数学表达式也可以显示为56 + 78(无空格)或56 + 78等等。

实际问题是,无论输入是什么,我都在表达式中读取5 6 + 7 8。

感谢和抱歉,我几乎删除了这个问题,但我的目标不是为家庭作业问题提供答案。

Jesse Smothermon

2 个答案:

答案 0 :(得分:2)

问题实际上由两部分组成:输入(将字符序列转换为“标记”序列)和评估表达式。如果分别执行这两项任务,则应该更容易。

首先,读入输入并将其转换为标记序列,其中每个标记是一个运算符(+-等)或操作数(42,等)。

然后,对此令牌序列执行中缀到后缀转换。 “令牌”类型不必是任何花哨的东西,它可以简单如下:

struct Token {
    enum Type { Operand, Operator };
    enum OperatorType { Plus, Minus };

    Type type_;
    OperatorType operatorType_; // only valid if type_ == Operator
    int operand_;               // only valid if type_ == Operand
};

答案 1 :(得分:1)

首先,它有助于移动这样的if

userInput[i] != '+' || userInput[i] != '-' || userInput[i] != '*' || userInput[i] != '/' || userInput[i] != '^' || userInput[i] != ' ' && i < userInput.length() 

进入自己的功能,只为了清晰。

bool isOperator(char c){
  return c == '+' || c == '-' || c == '*' || c == '/' || c == '^';
}

此外,无需检查它是否为运算符,只需检查输入是否为数字:

bool isNum(char c){
  return '0' <= c && c <= '9';
}

另一件事,如果输入字符是 anyhing 而不是tempNumber += ...,那么上面的长链就会出现问题,你也会输入'+'块。您必须使用上面的函数检查&&或更好:

if (isNum(userInput[iterator])){
    tempNumber += userInput[iterator];
}

这也将排除任何无效的输入,例如bX等。


然后,对于您的双位数字问题:
问题是,在插入tempNumber后,总是输入空格。如果数字序列完成,您只需要这样做。要解决此问题,只需修改长if-else if链的末尾:

// ... operator stuff
} else {
  postfixExpression << tempNumber;
  // peek if the next character is also a digit, if not insert a space
  // also, if the current character is the last in the sequence, there can be no next digit
  if (iterator == userInput.lenght()-1 || !isNum(userInput[iterator+1])){
      postfixExpression << ' ';
  }
}

这应该完成从56 + 78 --> 56 78 +给出正确表示的工作。请告诉我是否有任何错误。 :)