C++ 可以将单词作为输入的计算器
我想写一个可以把单词作为输入的计算器。 例如,“二加五乘七”应给出37作为输出。 我不会撒谎,这是一个家庭作业,所以在做这件事之前,我想如果我能指出一些可能对这类事情有用的东西,我不知道 另外,我想,方法n如何做也可以。它必须用C++编写。不接受其他语言 谢谢 [编辑]--谢谢你的回答。这是一门入门课程。因此,保持事情尽可能简单将是感激的。我应该早一点提到这一点C++ 可以将单词作为输入的计算器,c++,string,calculator,C++,String,Calculator,我想写一个可以把单词作为输入的计算器。 例如,“二加五乘七”应给出37作为输出。 我不会撒谎,这是一个家庭作业,所以在做这件事之前,我想如果我能指出一些可能对这类事情有用的东西,我不知道 另外,我想,方法n如何做也可以。它必须用C++编写。不接受其他语言 谢谢 [编辑]--谢谢你的回答。这是一门入门课程。因此,保持事情尽可能简单将是感激的。我应该早一点提到这一点 [编辑2]--达到了一个阶段,在这个阶段中,我可以以数字形式输入,并获得正确的优先和全部输出。只是想看看现在如何将单词转换成数字。感谢
[编辑2]--达到了一个阶段,在这个阶段中,我可以以数字形式输入,并获得正确的优先和全部输出。只是想看看现在如何将单词转换成数字。感谢每一个想帮忙的人。这就是为什么会这样。只要可接受的输入足够严格,编写a应该很容易。它的语法应该与只接受数字和符号的简单计算器的语法没有太大区别 使用
std::istream
类和提取操作符(>
),您可以轻松地将输入分解为单独的单词
下面是一个例子,它展示了如何对带有数字和符号的常规计算器执行此操作
与您案例中的主要区别在于解析数字。与符号“0-9”不同,您的输入将包含“零”、“一”、“九”、“百”、“千”等词。要解析这样的词流,您可以执行以下操作:
+--------+---------+-----+
/ | | \
thousand hundred ninety seven
/ \ |
hundred three two
|
one
+--------+---------+-----+
/ | | \
thousand hundred ninety seven
/ \ |
hundred three two
|
one
这是我在学校最喜欢的东西 正确的方法是将其实现为解析器——编写语法,标记输入,然后进行解析。然后可以递归地计算它
如果这些听起来都不熟悉(例如,这是一门入门课),那么你可以用一种不那么健壮的方式把它们组合在一起——按照你自然的方式去做。将句子转换成数字和运算,然后只进行运算。注意:我假设这是一门入门级课程,而不是编译器理论课程。如果你被教授与此相关的特定知识(例如,除我提到的以外的算法),你几乎肯定会应用这些概念 首先,你必须理解每个单词。为此,你可以把它拼凑在一起——一次读一个单词,然后试着理解它。逐步建立一个函数,可以读取您需要使用的一组数字 如果输入足够简单(只有您提供的基本形式的表达式,没有括号或任何东西),您可以简单地在读取数字和运算符之间切换,直到完全读取输入(但如果这是可靠的,如果您最后读取的是运算符,则需要停止并显示错误),因此,您可以为数字和运算符编写单独的方法 要了解表达式需要如何计算,请使用以适当的运算符优先级解析表达式。您可以简单地使用它为算法提供标记,从而将单词的初始解析与此结合起来
要实际计算结果,需要对解析后的表达式求值。要做到这一点,您可以简单地使用一个堆栈作为输出:当您通常按下一个运算符时,您会弹出2个值,对它们应用运算符,然后按下结果。调车场算法完成后,堆栈上会有一个值,包含最终结果。到目前为止,您对这个问题做了哪些尝试?如果你不知道从哪里开始,就从你知道的开始。你能把单词变成数字吗?你怎么知道你的单词是运算还是数字?这是一个可怕的任务;英语有很多特点,要做到这一点几乎是不可能的。为什么这么早就教学生做错事?@Dennis我认为如果有一组有限的输入,并且程序可以排除任何不属于某个范围的东西,那就没那么糟糕了。否则,我同意你的意见。@jonsca。我已经编辑了这个问题来回答你的评论。基本上,“(4+6)*2”现在起作用了。现在想知道如何将单词转换成数字吗?@Ian写一个句子,就像你刚才用手写的一样,看看你需要什么步骤来转换它。我认为您需要确定一组数字是否关联<代码>七百九十一加一:对照数字单词列表检查每个单词,“七”、“百”、“九十”、“一”匹配,但“加”不匹配。但是,它与运算符匹配,因此将所有数字合并在一起。将数字进一步细分为{“七”、“百”}和{“九十”、“一”}。从那里试试看。它现在变得越来越复杂,但它只需要大量的编码…谢谢。现在它开始有意义了。我现在可以做到了-“2+2*5”得到12。现在如何解决将单词转换为数字的问题?有算法吗?一个人可以给三千五百加三。我怎么理解这一点?允许“三千五百”吗?虚线“三千五百”怎么样。您必须处理无效输入吗?通常情况下,您应该这样做,但有时好的错误处理比处理有效的输入更难——因为这是一个介绍类(可能是编译器介绍),谢谢。我已经达到了您提到的使用-tokening t的阶段