itboyljm 2014-08-25 05:49 采纳率: 0%
浏览 1933

这是用面向过程写的一个简单计算器,我C++基础不大好,怎么转换为面向对象的?

#include
#include
#include
using namespace std;
const int MaxSize = 300;
int trans(char *exp_old, char exp_new[])//算法核心:将中缀表达式转化为后缀表达式 ,其中exp_old为原表达式,exp_new为转化后的表达式
{
struct
{
char data[MaxSize];//用于存放运算符
int top;

} op;

int i = 0; //exp_new的下标
int dh = 1;  
op.top = -1;
while (*exp_old != '\0')//一直循环直到检测到式子结束
{
    switch (*exp_old)//检测输入表达式中的每一个字符
    {
    case '(': 
        op.top++;//top就变成了0
        op.data[op.top] = *exp_old;//检测到左括号时将左括号装进data数组的第一个元素里面
        dh = 1;
        exp_old++; break;//完成左括号的入栈之后就开始往后面检测
    case ')':
        while (op.data[op.top] != '(')
        {
            exp_new[i] = op.data[op.top];
            op.top--; i++;
        }
        op.top--; exp_old++; dh = 0; break;
    case '+':
    case '-':  
        if (dh == 1)   
        {
            if (*exp_old == '-')
                op.top++; 
                op.data[op.top] = '@';
                exp_old++; break;
        }
        while (op.top != -1 && op.data[op.top] != '(')
        {
            exp_new[i] = op.data[op.top];
            op.top--;
            i++;
        }
        op.top++;
        op.data[op.top] = *exp_old;
        exp_old++; 
        dh = 0; break;
    case '*':
    case '/':   
        while (op.data[op.top] == '*' || op.data[op.top] == '/' || op.data[op.top] == 's')
        {
            exp_new[i] = op.data[op.top];
            op.top--;
            i++;
        }
        op.top++;
        op.data[op.top] = *exp_old;
        exp_old++;
        dh = 0; break;
    case '^':
        while (op.data[op.top] == '^')
        {
            exp_new[i] = op.data[op.top];
            op.top--;
            i++;
        }
        op.top++;
        op.data[op.top] = *exp_old;
        exp_old++; dh = 0; break;
    case '%':
        while (op.data[op.top] == '%')
        {
            exp_new[i] = op.data[op.top];
            op.top--;
            i++;
        }
        op.top++;
        op.data[op.top] = *exp_old;
        exp_old++;
        dh = 0; break;
    case '  ': exp_old++; break;
    case 's':
    case 'S':
        if ((*(exp_old + 1) == 'i' || *(exp_old + 1) == 'I') && (*(exp_old + 2) == 'n' || *(exp_old + 2) == 'N'))
        {
            op.top++;
            op.data[op.top] = 's';
            exp_old += 3;
            dh = 0;break;
        }
        else
        if ((*(exp_old + 1) == 'q' || *(exp_old + 1) == 'Q') && (*(exp_old + 2) == 'r' || *(exp_old + 2) == 'R') && (*(exp_old + 3) == 't' || *(exp_old + 3) == 'T'))
        {
            op.top++;
            op.data[op.top] = 'q';
            exp_old += 4;
            dh = 0;break;
        }
        else 
        {
            cout<<"\n有错误符号s";
            return 0;
        }

    case 'c':
    case 'C':
        if ((*(exp_old + 1) == 'o' || *(exp_old + 1) == 'O') && (*(exp_old + 2) == 's' || *(exp_old + 2) == 'S'))
        {
            op.top++;
            op.data[op.top] = 'c';
            exp_old += 3;
            dh = 0;break;
        }
        else 
        {
            cout<<"\n有错误符号s";
            return 0;
        }
    case 'T':
    case 't':
        if ((*(exp_old + 1) == 'a' || *(exp_old + 1) == 'A') && (*(exp_old + 2) == 'n' || *(exp_old + 2) == 'N'))
        {
            op.top++;
            op.data[op.top] = 't';
            exp_old += 3;
            dh = 0; break;
        }
        else 
        {
            cout<<"\n有错误符号s"; 
            return 0;
        }
    case 'e':
    case 'E':
        if ((*(exp_old + 1) == 'x' || *(exp_old + 1) == 'X') && (*(exp_old + 2) == 'p' || *(exp_old + 2) == 'P'))
        {
            op.top++;
            op.data[op.top] = 'e';
            exp_old += 3;
            dh = 0;break;
        }
        else 
        { 
            cout<<"\n有错误符号s"; 
            return 0;
        }
    case 'a':
    case 'A':
        if ((*(exp_old + 1) == 'b' || *(exp_old + 1) == 'B') && (*(exp_old + 2) == 's' || *(exp_old + 2) == 'S'))
        {
            op.top++;
            op.data[op.top] = 'a';
            exp_old += 3;
            dh = 0;break;
        }
        else 
        { 
            cout<<"\n有错误符号s"; 
            return 0;
        }
    case 'l':
    case 'L':
        if ((*(exp_old + 1) == 'o' || *(exp_old + 1) == 'O') && (*(exp_old + 2) == 'g' || *(exp_old + 2) == 'G'))
        {
            op.top++;
            op.data[op.top] = 'g';
            exp_old += 3;
            dh = 0;break;
        }
        else
        if ((*(exp_old + 1) == 'n' || *(exp_old + 1) == 'N'))
        {
            op.top++;
            op.data[op.top] = 'n';
            exp_old += 2;
            dh = 0;break;
        }
        else 
        {
            cout<<"\n有错误符号s"; 
            return 0; 
        }
    default:
        while (*exp_old >= '0' && *exp_old <= '9')
        {
            exp_new[i] = *exp_old; i++;
            exp_old++;
        }
        if (*exp_old == '.')
        {
            exp_new[i] = '.'; i++; exp_old++;
            while (*exp_old >= '0' && *exp_old <= '9')
            {
                exp_new[i] = *exp_old; i++;
                exp_old++;
            }
        }
        exp_new[i] = '#';  i++; dh = 0;
    }
}
while (op.top != -1)  
{
    exp_new[i] = op.data[op.top];
    i++; op.top--;
}
exp_new[i] = '\0';   
return 1;

}
double compvalue(char *exp_new)
{
struct
{
float data[MaxSize];
int top;

} st;

double d, x;

st.top = -1;
while (*exp_new != '\0') 
{
    switch (*exp_new)
    {
    case '+':st.data[st.top - 1] = st.data[st.top - 1] + st.data[st.top];
        st.top--; break;
    case '-':st.data[st.top - 1] = st.data[st.top - 1] - st.data[st.top];
        st.top--; break;
    case '*':st.data[st.top - 1] = st.data[st.top - 1] * st.data[st.top];
        st.top--; break;
    case '/':
        if (st.data[st.top] != 0)
            st.data[st.top - 1] = st.data[st.top - 1] / st.data[st.top];
        else
        {
            cout<<"\n\t除数不能为零!\n";
            return 0;
        }
        st.top--; break;
    case '^':st.data[st.top - 1] = pow(st.data[st.top - 1], st.data[st.top]);
        st.top--; break;
    case '%':st.data[st.top - 1] = fmod(st.data[st.top - 1], st.data[st.top]);
        st.top--; break;
    case '@':st.data[st.top] = -(st.data[st.top]);
        break;
    case 's':st.data[st.top] = sin(st.data[st.top]);
        break;
    case 'c':st.data[st.top] = cos(st.data[st.top]);
        break;
    case 'q':
        if (st.data[st.top] >= 0)
            st.data[st.top] = sqrt(st.data[st.top]);
        else
        {
            cout<<"\n\t开方内的数不能小于零!\n";
            return 0;
        }
        break;
    case 'e':st.data[st.top] = exp(st.data[st.top]);
        break;
    case 't':st.data[st.top] = tan(st.data[st.top]);
        break;
    case 'a':st.data[st.top] = abs(st.data[st.top]);
        break;
    case 'g':
        if (st.data[st.top]>0)
            st.data[st.top] = log10(st.data[st.top]);
        else
        {
            cout<<"\n\tlog10内的数不能小于等于零!\n";
            return 0;
        }
        break;
    case 'n':
        if (st.data[st.top]>0)
            st.data[st.top] = log(st.data[st.top]);
        else
        {
            cout<<"\n\tln内的数不能小于等于零!\n";
            return 0;
        }
        break;
    default:
        d = 0; 
        while (*exp_new >= '0' && *exp_new <= '9')  
        {
            d = 10 * d + (*exp_new - '0');
            exp_new++;
        }
        x = 0.1;
        if (*exp_new == '.')
        {
            exp_new++;
            while (*exp_new >= '0' && *exp_new <= '9')   
            {
                d = d + x*(*exp_new - '0');
                x *= 0.1;
                exp_new++;
            }
        }
        st.top++; st.data[st.top] = d;
    }
    exp_new++;
}
return st.data[st.top];

}
int main(int argc, char* argv[])
{
char exp[300], exp_new[400];
cout << "Please enter:";

while (1)
{
    cout << "请输入一个表达式:(按0结束本程序)\n";
    cin >> exp;
    if (strcmp(exp, "0") == 0)
        return 0;

    if (trans(exp, exp_new) == 1)
    {
        double res = compvalue(exp_new);
        cout << "=" << res << endl;
    }
}
return 0;

}

  • 写回答

2条回答

  • Eleven 2015-01-04 10:13
    关注

    可以将相关的一组函数封装成一个类的形式,类中提供接口供外部程序使用。

    评论

报告相同问题?

悬赏问题

  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?