注册 登录
编程论坛 C++教室

新手请教?

Marlborobccn 发布于 2015-12-29 09:02, 2318 次点击
怎样实现在执行窗口输入类似   “2+3*8=”
 然后就会执行对应的运算   
 结果  ‘ 26’
     类似计算器上的运算    。
6 回复
#2
wengbin2015-12-29 09:35
这个,多半得用字符串存输入的内容,然后再把字符串中的字符提取出来成数字和算符吧,这个应该想一下应该怎么实现了,因为输入的数字很可能是整数,小数等。呃,笨办法只能是用循环判断了吧,等大神们给方法,我学习
#3
newdos2015-12-29 12:11
先乘除,后加减,用数据结构栈stack做,减可以把数取负然后压栈,遇到乘除,弹栈一个数,运算后压栈,字符串扫描完成,全部弹栈求和。楼上可以试试。
#4
yangfrancis2015-12-29 13:20
要写代码太费事了。只说个思路。
先检索等号,将等号滤掉。
接下来:
检索字符串中的左右括号,将两括号中间部分保存在一个字符串中。如果有两组括号保存两个字符串。如果是括号嵌套则保存外围的字串。
将保存出的字串进行进一步分解,如果没有了括号便以加减号为分隔符分解,如果没有加减符则以乘除号为分隔符,没有分隔符则以小数点来分解。
通过递归操作,将最初的字串一层层分解下去。以返回值的方式将运算结果一层层传回调用级。最终得到最后的运算结果。
#5
Marlborobccn2015-12-29 16:11
回复 4楼 yangfrancis
麻烦写一个简单点的程序呗,谢谢
#6
yangfrancis2015-12-29 22:24
写个伪代码

float SubStr(ch_origin)
{
     short length;
     length=strlen(ch_origin);
     if(ch_origin[length-1]=='=')   //判断最后一个字符是否是等号
  {
         char ch1[length-1];
         ......//将ch_origin去掉等号后的字符串赋给ch1,代码自己慢慢解决
     return SubStr(ch1);
  }
    else                            //字符串没有等号
  {
          char ch2[length-2];char ch3[length-2];char ch4[length-2]
      .........     
          //伪代码:找找是否有左括号,如果有,
           {
           //将一个初始化为0的变量track加1,
     //继续找,每遇到一个左括号,track增1,每遇到一个右括号,track减1,
          //当track归于0时,遇到的右括号与第一次遇到的左括号配对,
     //根据括号的下标找到括号中的字串,赋给ch2;
          float ch2_f;ch2_f=SubStr(ch2);
          //将ch2_f转换成字符串型,覆盖ch2;括号左右剩下的字符串分别赋给ch3,ch4,不再保留括号
          //按ch3,ch2,ch4的顺序将三个字串合为一个字符ch3;
          return Sub(ch3);
          }
          //如果没有括号
     else
          {
               if(有加号或减号)
        {
        //遇到第一个加或减的时候,将字串分割为前后两个字串分别进行递归
        //比如遇上2+3*8,将对2和3*8分别递归,各自的返回值进行相加运算。
        //返回该运算结果
        }
        else
                           //对乘除进行判断
          }
  }
  //若以上条件分支都没有被执行,说明本次调用的参数已经是一个浮点数
  //表明用户输入的只是一个数或递归调用已到了底层,直接将本字符串转成浮点数返回给调用单位
}
#7
诸葛欧阳2015-12-30 12:57
这个用栈吧,每遇到一个算符进行一次计算
1