设置PSPad调用Mingw编译
VS 快捷键[转]

命令行的公式计算器

scturtle posted @ 2009年11月18日 00:21 in Other , 1700 阅读

明天要交的实验的一部分 支持加减乘除括号 配合实验用的书上的堆栈类

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
#include "lstack.h"

double calc(char* s,int head,int end)
{
    int j,kuo;//j中是第一个括号后的那个位置 kuo用来括号匹配时计数
    double a,b; //操作数
    char o; //操作符
    LinkedStack<double> num;
    num.Add(0);
    LinkedStack<char> op;
    for(int i=head; i<end; i++)
    {
        if(isdigit(s[i])) //是数字 加进操作数栈中
        {
            num.Add(atof(s+i));
            while(isdigit(s[i+1])|s[i+1]=='.') i++;
            continue;
        }

        if(s[i]=='(') //是括号 找到匹配括号递归
        {
            i++;
            j=i;
            kuo=1;
            while(kuo) //找匹配括号
            {
                i++;
                if(s[i]=='(') kuo++;
                else if(s[i]==')') kuo--;
            }
            num.Add(calc(s,j,i)); //递归
            continue;
        }

        switch (s[i])
        {
        case '+':
        case '-':
            op.Add(s[i]); //加减直接加 最后再运算
            break;
        case '*':
            num.Delete(a);
            if(s[++i]!='(') //乘除转换为加减
            {
                b=atof(s+i);
                while(isdigit(s[i+1])|s[i+1]=='.') i++;
                b=a*b;
            }
            else //考虑下一个不是操作数是括号
            {
                j=i+1;
                kuo=1;
                while(kuo) //找匹配括号
                {
                    i++;
                    if(s[i]=='(') kuo++;
                    else if(s[i]==')') kuo--;
                }
                b=calc(s,j,i);
                b*=a;
            }
            num.Add(b);
            break;
        case '/':
            num.Delete(a);
            if(s[++i]!='(')//乘除转换为加减
            {
                b=atof(s+i);
                while(isdigit(s[i+1])|s[i+1]=='.') i++;
                b=a/b;
            }
            else //考虑下一个不是操作数是括号
            {
                j=i+1;
                kuo=1;
                while(kuo) //找匹配括号
                {
                    i++;
                    if(s[i]=='(') kuo++;
                    else if(s[i]==')') kuo--;
                }
                b=calc(s,j,i);
                b=a/b;
            }
            num.Add(b);
            break;
        }
    }
    b=0;
    while(!op.IsEmpty()) //全转化为加减后 直接计算
    {
        op.Delete(o);
        num.Delete(a);
        //cout<<a<<o;
        if(o=='+')
            b+=a;
        else
            b-=a;
    }
    num.Delete(a);
    //cout<<a;
    b+=a;
    //cout<<"temp = "<<b<<endl;
    return b;
}

int main()
{
    char s[200];
    while(1)
    {
        cin>>s;
        cout<<"="<<calc(s,0,strlen(s))<<endl;
    }
}

 

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter