2 itboyljm itboyljm 于 2014.08.25 13:49 提问

这是用面向过程写的一个简单计算器,我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个回答

VisualEleven
VisualEleven   Ds   Rxr 2015.01.04 18:13

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

caozhy
caozhy   Ds   Rxr 2015.01.04 18:18

初学者往往喜欢练习花拳绣腿。而根本看不到自己问题的本质。

你的代码的确可以改进,但是就你来说不是胡乱套用什么面向对象的语法,起码是现在,起码是这个项目。你首先优化的应该是代码中那些switch case中大量重复的代码。

Csdn user default icon
上传中...
上传图片
插入图片