谁能仔细解释一下这个c语言递归法四则运算的原理? #include <stdio.h> #incl

谁能仔细解释一下这个c语言递归法四则运算的原理?
#include <stdio.h>
#include <stdlib.h>
char token; /*全局标志变量*/
/*递归调用的函数原型*/
int exp( void );
int term( void );
int factor( void );
void error( void ) /*报告出错信息的函数*/
{
fprintf( stderr, "错误\n");
exit( 1 );
}
void match( char expectedToken ) /*对当前的标志进行匹配*/
{
if( token == expectedToken ) token = getchar(); /*匹配成功,获取下一个标志*/
else error(); /*匹配不成功,报告错误*/
}
void Message(void)
{
printf("================================================================\n");
printf("* 递归实现的四则运算表达式求值程序 *\n");
printf("****************************************************************\n");
printf("使用方法:请从键盘上直接输入表达式,以回车键结束.如45*(12-2)[回车]\n");
printf("*****************************************************************\n\n");
}
main()
{
int result; /*运算的结果*/
Message();
printf(" >> 请输入表达式: ");
token = getchar(); /*载入第一个符号*/
result = exp(); /*进行计算*/
if( token == '\n' ) /* 是否一行结束 */
printf( " >> 表达式的计算结果为 : %d\n", result );
else error(); /* 出现了例外的字符 */
puts("\n\n 请按任意键退出 ...\n");
getch();
return 0;
}
int exp( void )
{
int temp = term(); /*计算比加减运算优先级别高的部分*/
while(( token == '+' ) || ( token == '-' ))
switch( token ) {
case '+': match('+'); /*加法*/
temp += term();
break;
case '-': match('-');
temp -= term(); /*减法*/
break;
}
return temp;
}
int term( void )
{
int div; /*除数*/
int temp = factor(); /*计算比乘除运算优先级别高的部分*/

字数太多了,剩下的发图片

无论什么表达式都可以看成三部分,左表达式,运算符,右表达式,只要确定左右表达式的值,那么整个表达式的值都可以求出。
也就是先计算出左边的,然后计算出右边的,然后再运算,结果就出来了
1.如果运算符为+-,那么就两边就按照先括号,再乘除来运算获得结果,然后+-运算即可。
2.如果运算符为*/,那么就两边就按照先括号来运算,然后*/运算即可。
3.上述两步中如果遇到括号,那么括号里面的表达式处理步骤和1,2一样,可以递归处理。
至此,问题全部得到解决。
流程如下:
先输入的为左表达式,如果是数字,接着输入运算符,然后返回,
如果是左括号,直接计算表达式,即第3步
然后遇到运算符,然后输入右表达式,右表达式运算和左表达式运算一样,
最后按照1或2来运算。
int exp( void )
{
int temp = term(); //获得左表达式的值
while(( token == '+' ) || ( token == '-' ))
switch( token ) {
case '+': match('+'); /*加法*/
temp += term();//获得右表达式的值,然后相加
break;
case '-': match('-');
temp -= term(); //获得右表达式的值,然后相减
break;
}
return temp;//返回整个表达式的值
}
term函数也是同样原理。
已经说的很明白了,看你的造化了。追问

谢谢你回答的那么详细
其他的我都看懂了,就这句没看懂:
else if ( isdigit( token )) /*实际的数字*/
{
ungetc( token, stdin ); /*将读入的字符退还给输入流*/
scanf( "%d", &temp ); /*读出数字*/
token = getchar(); /*读出当前的标志*/
}
能解释一下吗?

追答

ungetc( token, stdin );的作用是将token的值先返回缓冲区,然后再通过scanf读出赋给temp.

这样字符就转为整形了。

这样做是为了避免从新输入数字。
看懂了就采纳一下,看不懂的是笨蛋。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-11-06
exp调用term,term调用factor,factor调用exp...如果公式复杂就会出现这个循环调用,就是递归调用了。追问

其他的我都看懂了,就这句没看懂:
else if ( isdigit( token )) /*实际的数字*/
{
ungetc( token, stdin ); /*将读入的字符退还给输入流*/
scanf( "%d", &temp ); /*读出数字*/
token = getchar(); /*读出当前的标志*/
}
能解释一下吗?

本回答被网友采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网