2013-04-09 69 views
1

我正在读取用户输入的字符串并在循环内使用该字符串进行基本计算的程序中工作。 我的一般问题是使用循环内部的字符串,尽管后来它将不得不做更多的事情,但从现在开始,我只需要测试Bolzano定理(特别是为了找到可能的根的区间) 。 我已经开始研究一个函数,该函数通过字符读取输入字符,并用开关控件计算中缀表达式。 不过,我想知道是什么,如果有一种方法可以做这样的事情:C/C++:将读取的字符串传递给程序中的循环C

{ 
    /*Already stored the doubles: a, b, precision.*/ 
    printf("Enter the expression you want to calculate"); 
    scanf("%s", expression); 
    /*User input: (3*i)+(i*i)-3*/ 
    while(i <= b){ 
     fa = (3*i)+(i*i)-3; /*How to insert the string here*/ 
     fb = (3*(i+precision))+((i+precision)*(i+precision))-3; 
     if(fa*fb < 0) 
      printf("There is at least one root in the interval: [ %g, %g ].", a, a+precision); 
     /*And goes on...*/ 
} 

假设用户没有输入在循环使用无效的表达式(如I^7 )或者我已经实现了控制来转换这些表达式(类似于读取一个字符串,并将其更改为后缀或前缀符号进行必要的转换),有没有办法将一个存储的字符串在一个赋值循环中使用?

+0

在C或C++?也许你想'atoi'? – 2013-04-09 03:55:52

+0

'atoi'有一些非常糟糕的语义 - 'strtol'总是一个更好的选择。 – 2013-04-09 04:02:01

+1

您需要一个表达式解析器。 – user93353 2013-04-09 04:10:15

回答

0

我想你问的是:给一个字符串和一些数学表达式,我该如何评估这个表达式?

我不知道您是否可以对表达式的语法做出某些假设;如果这样可以帮助你简化你的代码。如果没有,你基本上就必须“记号化”的字符串第一个,上面的字符串,将令牌的这样一个顺序:

LBRACKET, NUM, BINOP, VAR, RBRACKET, BINOP, LBRACKET, VAR, BINOP, VAR, RBRACKET, BINOP, NUM 

你也不得不建立自己一点解析器,可以确保你的表达是基于某些句法规则形成的;解析器会使用这个令牌序列。解析器的输出是一个表示该表达式的数据结构(通常是一棵树)。给定那棵树,你可以通过自下而上计算子表达式来评估表达式。

fa =      - 
         /\ 
         + 3 
         /\ 
         * * 
        /\/\ 
        3 i i i 

这只是一个添加新节点到树中以添加精度操作数的问题。

有一些东西在线如何做到这一点。只需搜索“如何构建表达式评估器”,例如this页面会提供一些更多的细节。

+0

谢谢,这正是我需要的。显然它不会像我想象的那么容易,但感谢你提供的答案和链接。 – 2013-04-09 06:28:21

+0

你是对的,这不是一个5分钟的黑客攻击,但有一些帮助你可以自动化这些事情。有些工具可以帮助您从描述中生成扫描器(标记器)和解析器,请参阅'lex'或'flex'或'yacc'或'bison';甚至可以搜索“在线扫描器生成器”或“在线解析器生成器”。话虽如此,如果您可以确保您的表达式字符串具有某种形式/语法,那么您可以直接进入它并将其拉出来。 – Jens 2013-04-09 08:39:41