您现在的位置: 中国男护士网 >> 考试频道 >> 计算机等级 >> 二级辅导 >> C十十 >> 辅导 >> 正文    
  c++实现计算器的方法和代码 【注册男护士专用博客】          

c++实现计算器的方法和代码

www.nanhushi.com     佚名   不详 

  中缀表达式转后缀表达式,考试大现在就用这个方式再实现计算器..
  表达式一旦转换成后缀表达式再进行计算就简单的不得了.Examda遇到一个符号就弹出离他最近的两个操作数然后进行这个操作符指定的运算就ok了...运算完成后压栈继续扫描,依次重复...等到操作符没有了.所有的运算也就结束了.结果也就出来了...不必再判断优先级的什么的了.括号什么的也一并省略...
  其实在中缀转后缀的时候就可以进行计算,表达式扫描完成,计算完成.
  把代码直接复制..修改..
  opt.push('#');
  int len = exp.length();
  for (int i = 0; i < len;)
  {
  char ch = exp.at(i);
  if (isalnum(ch))
  {
  long num = 0;
  while (isalnum(ch)) //转换为整数
  {
  num = (ch-'0') + num*10;
  if (++i >= len)
  break;
  ch = exp.at(i);
  }
  opd.push(num); // 操作数入栈
  }
  else // 操作符就判断并压栈
  {
  if (ch == '(') // 左括号直接压栈
  opt.push(ch);
  else if (ch == ')') // 有括号就弹栈到直到遇到左括号
  {
  ch = opt.top(); // 取得栈顶操作符
  while(ch != '(') // 直到弹出左括号
  {
  OP(ch);
  opt.pop();
  ch = opt.top();
  }
  opt.pop(); // 弹出左括号
  }
  else
  {
  int thisPri = GetPri(ch); // 当前操作符优先级
  char prevOpt = opt.top(); // 上一个操作符
  int prevPri = GetPri(prevOpt); // 上一个操作符优先级
  while (thisPri <= prevPri)
  { //输出栈中的操作符直到遇到比当前的操作符优先级更低的
  OP(prevOpt);
  opt.pop(); // 输出后就弹出
  prevOpt = opt.top();
  prevPri = GetPri(prevOpt);
  }
  opt.push(ch); //当前操作符压栈
  }
  i++;
  }
  }
  char ch = opt.top(); // 表达式扫描完后把栈中剩余的操作符全部输出
  while (ch != '#')
  {
  OP(ch);
  opt.pop();
  ch = opt.top();
  }
  Examda提示:输出的地方换成了运算 OP(const char &ch); 完成运算
  要明白一点.表达式扫描完成,有可能操作符是压栈了而未进行运行,(这由具体的表达式决定),因此最后要把操作符栈弹空,完成全部的运算....则此时操作数栈中的唯一的一个数就是运行结果了.
  函数OP.实现如下. 参数 ch 是操作符
  void Caculator::OP(const char &ch)
  {
  long RightOperand = opd.top();
  opd.pop();
  long LeftOperand = opd.top(); // 这两个操作数的顺序不能错
  opd.pop();
  switch(ch)
  {
  case '+':
  LeftOperand += RightOperand;
  break;
  case '-':
  LeftOperand -= RightOperand;
  break;
  case '*':
  LeftOperand *= RightOperand;
  break;
  case '/':
  if (RightOperand == 0) // 除数为 0
  {
  cout<<"大哥啊,除数为0了!"<<endl;
  system("pause");
  exit(1);
  }
  else
  LeftOperand /= RightOperand;
  default:
  cout<<"非法操作符!!----:"<<ch<<endl;
  system("pause");
  exit(1);
  }
  opd.push(LeftOperand); // 把求得的值压入堆栈
  }
  opd 是操作数栈,是一个类成员变量 .定义是 stack<long> opd; // 只能进行整数的运算
  简单吧...
  关键是把表达式转换成后缀的...
  这个实现中未对表达式是否合法进行判断,所以非法的表达式会造成程序崩溃....表达式的检查也可以在扫描的过程中完成的.

 

文章录入:杜斌    责任编辑:杜斌 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     

    联 系 信 息
    QQ:88236621
    电话:15853773350
    E-Mail:malenurse@163.com
    免费发布招聘信息
    做中国最专业男护士门户网站
    最 新 热 门
    最 新 推 荐
    相 关 文 章
    没有相关文章
    专 题 栏 目

      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)                            【进男护士社区逛逛】
    姓 名:
    * 游客填写  ·注册用户 ·忘记密码
    主 页:

    评 分:
    1分 2分 3分 4分 5分
    评论内容:
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。