发个贴,挣点分儿

antimatterworld 2008-07-02 04:10:10
简单整数计算器:
摘录自C++编程宝典Chap06
支持 + - * / ()嵌套
原书有笔误:
rtn = atoi(expr - pos);
正确写法:
rtn = atoi(expr + pos);

////////////////////////
//标准C++编程宝典Chap06
//File Name:pr06025.cpp
////////////////////////


#include <iostream>
#include <cstdlib>
#include <cctype>

//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);
}
/////////////////////////////
/*
Enter expression (0 to quit):
2+3
5
Enter expression (0 to quit):
2*3
6
Enter expression (0 to quit):
(2+3)/3
1
Enter expression (0 to quit):
23+56
79
Enter expression (0 to quit):
((23+56)+80/40)/9-7
2
Enter expression (0 to quit):
89+256*(1024/8+36-100/2)+63-56/7
29328
Enter expression (0 to quit):
89+256*(1024/8+(36-100/2))+(63-56/7)
29328
Enter expression (0 to quit):
*/
//////////////////////////////
...全文
51 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
antimatterworld 2008-07-02
  • 打赏
  • 举报
回复
每天只要发布帖子就可以获得30个可用分。
yyyapple 2008-07-02
  • 打赏
  • 举报
回复

65,206

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧