永发信息网

C语言有关递归计算器

答案:1  悬赏:20  手机版
解决时间 2021-04-09 02:32
问一下,1,如何控制递归穷尽;2,在字符数组转化阶段如何识别数字位数;程序源代码如下:
程序大体思路如下,先定义一个char[]用来保存输入的表达式,之后利用atoi();isdigit();两个函数把字符串转化为算数表达式,逐层调用,先调用加法函数,再调用乘除法,再判断是否存在()提升优先级;求过来人串讲一下细节,看不明白,谢谢了。受累!
////////////////////////////////////////
// File Name: pr06025.cpp
////////////////////////////////////////
#include
#include
#include
// Function prototypes.
int addsubt();
int multdiv();
int number();
void error();
// Global expression buffer.
static char expr[81];
static int pos;
////////////////////////////////////////
// The main() function.
////////////////////////////////////////
int main()
{
int ans;
do
{
// Initialize the string subscript.
pos = 0;
// Read an expression.
std::cout << "Enter expression (0 to quit):"
<< std::endl;
std::cin >> expr;
// Evaluate the expression.
ans = addsubt();
if (expr[pos] != '\0')
error();
if (ans != 0)
std::cout << ans << std::endl;
}
while (ans != 0);
return 0;
}
//////////////////////////////////////////
// Top of recursive descent: add/subtract.
//////////////////////////////////////////
int addsubt()
{
int rtn = multdiv();
while (expr[pos] == '+' || expr[pos] == '-')
{
int op = expr[pos++];
int opr2 = multdiv();
if (op == '+')
rtn += opr2;
else
rtn -= opr2;
}
return rtn;
}
////////////////////////////////////////
// Highest precedence: multiply/divide.
////////////////////////////////////////
int multdiv()
{
int rtn = number();
while (expr[pos] == '*' || expr[pos] == '/')
{
int op = expr[pos++];
int opr2 = number();
if (op == '*')
rtn *= opr2;
else
rtn /= opr2;
}
return rtn;
}
////////////////////////////////////////
// Extract a number.
////////////////////////////////////////
int number()
{
int rtn;
if (expr[pos] == '(')
{
// Parenthetical expression.
pos++;
rtn = addsubt(); // Back to top.
if (expr[pos++] != ')') // Must have ')'
error();
return rtn;
}
// Extract the number.
if (!isdigit(expr[pos]))
error();
rtn = atoi(expr+pos);
while (isdigit(expr[pos]))
pos++;
return rtn;
}
////////////////////////////////////////
// Syntax error.
////////////////////////////////////////
void error()
{
std::cout << '\r';
while (pos--) // Position error pointer.
std::cout << ' ';
std::cout << "^ syntax error" << std::endl << '\a';
exit(-1);
}
最佳答案
直接解释1:递归出口就是没有下一个字符。就是说扫描完毕你输入的表达式,就结束递归。

细节:所谓细节是什么?先进入优先级最低的+-法,然后在+-法里引入*/法,在*/法里引入括号。在括号里重新检查+-*/的优先级,直到括号结束。返回到*/法里,然后结束再返回到+-法里计算。
期间的各种错误通过函数error() 承接处理。

我个人不喜欢这样的计算方式。还是喜欢用栈
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
描写土豆的优美句子,形容土豆的句子
如图表示生物与环境的关系,据图作答:(1)
斯柯达晶锐2015款玻璃尺寸多大
小黄人快跑外挂
有没有代理写寒假作业的啊
读大洲图,回答下列各题(1)填写大洋、大洲
朋友聚会美文,朋友聚会,一起嗨歌的作文
哪里可以定做SD娃娃?(追加悬赏400)
鸿泰精密模具地址在哪,我要去那里办事
We all know that everyone becomes a little
糠槭的读音是什么,枫槭怎么读????
内蒙古锡林浩特市医保怎么计算
什么的浆果填空填空题,苍鹰有一双什么样的腿
与爱有关的名言
甲、乙两物质的溶解度曲线如图所示,下列叙述
推荐资讯
君子兰怎么养才能开花,养了三年的军子兰不开
电动车的电瓶如何保养,冬季如何保养电动车电
跪求一下谁能帮我提供一些伤感歌曲的改编成失
孤男寡女,同居一室下一句
自己调解后又反悔,多长时间可以起诉?
立健药店连锁第526家店地址有知道的么?有点
05528517633是哪里电话
99x34+33x66最简便的方法
汉景帝身边有那些忠臣
(1)图1中物体的长度是______cm;(2)图2中
人造石和大理石哪个更耐用?请问人造石和大理
android开发大家现在用哪个开发环境
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?