2011-03-27 173 views
0

对不起,我意识到我把这个问题的所有代码都放进去了。我的所有代码等于大部分针对其他学生的这个特殊问题的答案,这是愚蠢的。C++使用字符串识别两位数

这里我把该问题的基本要点是:我需要以规则的数学表达式来识别单个数字(例如5 + 6)以及两位数(诸如56 + 78)

。数学表达式也可以显示为56 + 78(无空格)或56 +78等。

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

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

杰西Smothermon

+0

不完全与您的问题有关,但无论如何:开关和if语句会导致优化后大多数编译器上的机器代码相同。但是,如果级联会遗留可能未初始化的返回值(您的编译器应该已经警告过您),您应该修复该错误(或使用switch语句是正确的)。一般来说,我会在这种情况下使用switch语句,因为我觉得它更简洁,但是这是我猜想的味道。 – ChrisWue 2011-03-27 03:26:37

+0

@ChrisWue谢谢你的输入....你是对的,我应该返回0或其他东西,如果没有其他命中。是的,一般来说,我只是不知道switch语句是否更快,但我同意你的看法,switch语句看起来很酷哈哈 – 2011-03-27 04:03:24

回答

1

首先,它有助于这样

​​

移动,if s转换自身的功能,只是为了清楚。

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 +给予正确的代表性工作。请告诉我,如果有什么问题。 :)

+0

@Xeo感谢您的帮助。我只是使用你的例子“isOperator”,因为我确实需要确保变量可以被输入(所以a + b仍然需要运行到b +)。话虽如此,我得到一个下标超出范围的错误在这最后如果你给我的声明......我会尝试一些测试的长度,它总是让我困惑。但我敢肯定,出界是因为if语句检查迭代器+ 1(这意味着它错过了语句的第一部分)。谢谢 – 2011-03-27 04:13:14

+0

@Xeo好的,我应该在做最后的评论之前完成测试......抱歉哈哈。迭代器== userInput.length()需要迭代器== userInput.length() - 1.它几乎可以工作,但现在如果我把5 + 6我得到5 6 +,但如果我把5 + 6我得到6 +。同样56 + 78变成578 +,而56 + 78是56 78 +。我不知道发生了什么,它必须是空间的测试,但它之前工作。谢谢 – 2011-03-27 04:16:19

+0

@Jesse:错误是你自己的错误,用''\ b''替换''''。 :)当它在'56 + 78'的'6'后面到达''''时,它将退格一个并从流中删除'6'。你应该忽略这个''''。这应该解决它,如果我有问题的权利。 – Xeo 2011-03-27 04:29:14

2

问题确实由两个部分组成:乐星输入(转向的字符序列为“标记”的序列)和计算表达式。如果你分开完成这两项任务,它应该容易得多。

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

然后,对这个标记序列执行infix-to-postfix转换。 “令牌”类型没有被任何幻想,也可以是简单:

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 
}; 
+0

对不起,我不得不去研究这些东西都是哈哈。根据我的理解,结构就像公共课程;枚举值的大括号中的一切正确?所以操作数是0,操作符是1.最后一个问题:这会将数字推在一起吗?例如在“56 + 78”中,char 5和char 6将被作为int“56”推送?我想我只是不明白最后三行。感谢您的快速回复 – 2011-03-27 02:54:36