C/ c++:在C程序中向循环传递一个读字符串
C/C++: Passing a string read to a loop inside a program in C
我正在一个程序中工作,该程序应该读取用户输入的字符串,并在循环中使用该字符串进行基本计算。我的一般问题是在循环中使用字符串,尽管稍后它将不得不做更多的事情,但从现在开始,我只需要测试Bolzano定理(特别是找到根的可能间隔)。我已经开始编写一个函数,该函数一个字符一个字符地读取输入,并使用开关控件计算中缀表达式。然而,我想知道的是,如果有一种方法来做这样的事情:
{
/*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),或者我已经实现了转换这些表达式的控件(例如读取字符串并将其更改为后缀或前缀表示法,进行必要的转换),是否有一种方法可以将赋值中存储的字符串使用到循环中?
我想你问的是:给定一个字符串与一些数学表达式,我如何评估该表达式?
我不知道你是否可以对表达式的语法做出某些假设;如果是这样,这将帮助您简化代码。如果没有,基本上必须首先对字符串进行"标记化",因为上面的字符串将是一个像这样的标记序列:
LBRACKET, NUM, BINOP, VAR, RBRACKET, BINOP, LBRACKET, VAR, BINOP, VAR, RBRACKET, BINOP, NUM
你还必须自己构建一个小解析器,以确保你的表达式是基于某些语法规则形成的;解析器将使用该令牌序列。解析器的输出是表示该表达式的数据结构(通常是树)。给定该树,您可以通过自底向上计算子表达式来计算表达式。
fa = -
/
+ 3
/
* *
/ /
3 i i i
只需在树中添加新的节点来添加精确操作数。
网上有一些关于如何做到这一点的资料。只需搜索"如何构建表达式求值器",例如,这个页面会提供更多细节。