| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 426 人关注过本帖
标题:【求助】:请看看这个程序错在哪儿
只看楼主 加入收藏
紫凤双飞
Rank: 2
等 级:论坛游民
帖 子:76
专家分:61
注 册:2011-3-26
结帖率:75%
收藏
已结贴  问题点数:20 回复次数:8 
【求助】:请看看这个程序错在哪儿
这是一个小计算器
程序代码:
#include<iostream>
using std::cout;

const int MAXSIZE=20;
template<typename type>
class STACK
{
private:
    type data[MAXSIZE];
    int index;
public:
    STACK(){index=0;}
    type pop(){--index;return data[index];}
    void push(type t){data[index]=t;++index;}
    bool empty(){return index==0;}
};
class calc
{
private:
    char* expression;//指向要求解的中缀表达式
    enum token{OPAREN,ADD,SUB,MULTI,DIV,CPAREN,VALUE,EOL};
    void BinaryOp(token op,STACK<double>& dataStack);
    token getOp(double& value);
public:
    calc(char* e){expression=e;}
    double result();
};
void calc::BinaryOp(calc::token op, STACK<double> &dataStack)
{
    double num1,num2,result;
    num2=dataStack.pop();
    num1=dataStack.pop();
    switch(op)
    {
    case ADD:result=num1+num2;break;
    case SUB:result=num1-num2;break;
    case MULTI:result=num1*num2;break;
    case DIV:result=num1/num2;break;//忽略除数为0的情况
    }
    dataStack.push(result);
}

calc::token calc::getOp(double &value)
{
    while(*expression)
    {
        if(*expression<='9'&&*expression>='0')
        {
            value=0;
            while(*expression<='9'&&*expression>='0')
            {
                value=value*10+*expression-'0';
                ++expression;
            }
            return VALUE;
        }
        switch(*expression)
        {
        case '(':++expression;return OPAREN;
        case ')':++expression;return CPAREN;
        case '+':++expression;return ADD;
        case '-':++expression;return SUB;
        case '*':++expression;return MULTI;
        case '/':++expression;return DIV;
        }
    }
    return EOL;
}
double calc::result()
{
    STACK<token> opStack;
    STACK<double> dataStack;
    double value;
    token TOKEN,topOp;
    while(true)
    {
        TOKEN=getOp(value);
        if(TOKEN==EOL)
            break;
        switch(TOKEN)
        {
        case VALUE:dataStack.push(value);break;
        case OPAREN:opStack.push(OPAREN);break;
        case CPAREN:while((topOp=opStack.pop())!=OPAREN)
                        BinaryOp(topOp,dataStack);
                        break;
        case MULTI:case DIV:while((topOp=opStack.pop())==MULTI||topOp==DIV)
                                BinaryOp(topOp,dataStack);
                            opStack.push(topOp);
                            opStack.push(TOKEN);
                            break;
        case ADD:case SUB:while(!opStack.empty()&&(topOp=opStack.pop())!=OPAREN)
                              BinaryOp(topOp,dataStack);
                            opStack.push(topOp);//为何运行时此处会发生内存冲突? .........................................................
                          opStack.push(TOKEN);
        }
    }
    while(!opStack.empty())
        BinaryOp(topOp,dataStack);
    return dataStack.pop();
}
int main()
{
    calc e("3+4*(5-3)");
    cout<<e.result()<<'\n';
    return 0;
}




[ 本帖最后由 紫凤双飞 于 2011-8-22 14:57 编辑 ]
搜索更多相关主题的帖子: 计算器 
2011-08-22 14:55
xg5699
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:140
专家分:522
注 册:2011-7-27
收藏
得分:20 
程序代码:
#include<iostream>
using std::cout;

const int MAXSIZE=20;
template<typename type>
class STACK
{
private:
    type data[MAXSIZE];
    int index;
public:
    STACK(){index=0;}
    type pop(){--index;return data[index];}
    void push(type t){data[index]=t;++index;}
    bool empty(){return index==0;}
};
class calc
{
private:
    char* expression;//指向要求解的中缀表达式
    enum token{OPAREN,ADD,SUB,MULTI,DIV,CPAREN,VALUE,EOL};
    void BinaryOp(token op,STACK<double>& dataStack);
    token getOp(double& value);
public:
    calc(char* e){expression=e;}
    double result();
};
void calc::BinaryOp(calc::token op, STACK<double> &dataStack)
{
    double num1,num2,result;
    num2=dataStack.pop();
    num1=dataStack.pop();
    switch(op)
    {
    case ADD:result=num1+num2;break;
    case SUB:result=num1-num2;break;
    case MULTI:result=num1*num2;break;
    case DIV:result=num1/num2;break;//忽略除数为0的情况
    }
    dataStack.push(result);
}

calc::token calc::getOp(double &value)
{
    while(*expression)
    {
        if(*expression<='9'&&*expression>='0')
        {
            value=0;
            while(*expression<='9'&&*expression>='0')
            {
                value=value*10+*expression-'0';
                ++expression;
            }
            return VALUE;
        }
        switch(*expression)
        {
        case '(':++expression;return OPAREN;
        case ')':++expression;return CPAREN;
        case '+':++expression;return ADD;
        case '-':++expression;return SUB;
        case '*':++expression;return MULTI;
        case '/':++expression;return DIV;
        }
    }
    return EOL;
}
double calc::result()
{
    STACK<token> opStack;
    STACK<double> dataStack;
    double value;
    token TOKEN,topOp;
    while(true)
    {
        TOKEN=getOp(value);
        if(TOKEN==EOL)
            break;
        switch(TOKEN)
        {
        case VALUE:dataStack.push(value);break;
        case OPAREN:opStack.push(OPAREN);break;
        case CPAREN:while((topOp=opStack.pop())!=OPAREN)
                        BinaryOp(topOp,dataStack);
                        break;
        case MULTI:case DIV:while((topOp=opStack.pop())==MULTI||topOp==DIV)
                                BinaryOp(topOp,dataStack);
                            opStack.push(topOp);
                            opStack.push(TOKEN);
                            break;
        case ADD:case SUB:while(!opStack.empty()&&(topOp=opStack.pop())!=OPAREN)
                              BinaryOp(topOp,dataStack);
                            opStack.push(topOp);
                          opStack.push(TOKEN);
                        break;
        }
        break;//退出while循环.switch语句中的break只是退出switch循环.少了我你无限循环下去吧不错才怪   
    }
    while(!opStack.empty())
        BinaryOp(topOp,dataStack);
    return dataStack.pop();
}
int main()
{
    calc e("3+4*(5-3)");
    cout<<e.result()<<'\n';
    return 0;
}


[ 本帖最后由 xg5699 于 2011-8-22 15:22 编辑 ]

都不结贴我郁闷那!
2011-08-22 15:20
紫凤双飞
Rank: 2
等 级:论坛游民
帖 子:76
专家分:61
注 册:2011-3-26
收藏
得分:0 
回复 2楼 xg5699
不是的,原本就可以退出啊
因为while中有
 if(TOKEN==EOL)
            break;

在switch后加一个break就有逻辑错误了
2011-08-22 15:32
xg5699
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:140
专家分:522
注 册:2011-7-27
收藏
得分:0 
回复 3楼 紫凤双飞
晕!那如果不等于呢??!
等于了直接退出while循环了啊后面的switch根本就不会执行

都不结贴我郁闷那!
2011-08-22 15:51
xg5699
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:140
专家分:522
注 册:2011-7-27
收藏
得分:0 
.....

[ 本帖最后由 xg5699 于 2011-8-22 16:06 编辑 ]

都不结贴我郁闷那!
2011-08-22 15:55
紫凤双飞
Rank: 2
等 级:论坛游民
帖 子:76
专家分:61
注 册:2011-3-26
收藏
得分:0 
回复 4楼 xg5699
EOL表示串结束符
如果TOKEN==EOL就表示到达表达式末端(即表达式处理完成)
此时不用进入switch,可直接退出while

如果TOKEN!=EOL就说明要进入switch
感觉程序不错,可就是执行不了
2011-08-22 15:59
xg5699
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:140
专家分:522
注 册:2011-7-27
收藏
得分:0 
回复 6楼 紫凤双飞
原来是这样,看来问题很深奥,
我总觉得
程序代码:
class STACK
{
private:
    type data[MAXSIZE];
    int index;
public:
    STACK(){index=0;}
    type pop(){--index;return data[index];}
    void push(type t){data[index]=t;++index;}
    bool empty(){return index==0;}
};
中的  void push(type t){data[index]=t;++index;}感觉有点不对...
希望高人帮忙

都不结贴我郁闷那!
2011-08-22 16:24
紫凤双飞
Rank: 2
等 级:论坛游民
帖 子:76
专家分:61
注 册:2011-3-26
收藏
得分:0 
回复 7楼 xg5699
呵呵,貌似解决了
程序代码:
#include<iostream>
using std::cout;
using std::cin;

const int MAXSIZE=20;
template<typename type>
class STACK
{
private:
    type data[MAXSIZE];
    int index;
public:
    STACK(){index=0;}
    type pop(){--index;return data[index];}
    void push(type t){data[index]=t;++index;}
    bool empty(){return index==0;}
    type top(){return data[index-1];}
};
class calc
{
private:
    char* expression;//指向要求解的中缀表达式
    enum token{OPAREN,ADD,SUB,MULTI,DIV,CPAREN,VALUE,EOL};
    void BinaryOp(token op,STACK<double>& dataStack);
    token getOp(double& value);
public:
    calc(char* e){expression=e;}
    double result();
};
void calc::BinaryOp(calc::token op, STACK<double> &dataStack)
{
    double num1,num2,result;
    num2=dataStack.pop();
    num1=dataStack.pop();
    switch(op)
    {
    case ADD:result=num1+num2;break;
    case SUB:result=num1-num2;break;
    case MULTI:result=num1*num2;break;
    case DIV:result=num1/num2;break;//忽略除数为0的情况
    }
    dataStack.push(result);
}

calc::token calc::getOp(double &value)
{
    while(*expression!='\0')
    {
        if(*expression<='9'&&*expression>='0')
        {
            value=0;
            while(*expression<='9'&&*expression>='0')
            {
                value=value*10+*expression-'0';
                ++expression;
            }
            return VALUE;
        }
        switch(*expression)
        {
        case '(':++expression;return OPAREN;
        case ')':++expression;return CPAREN;
        case '+':++expression;return ADD;
        case '-':++expression;return SUB;
        case '*':++expression;return MULTI;
        case '/':++expression;return DIV;
        }
    }
    return EOL;
}
double calc::result()
{
    STACK<token> opStack;
    STACK<double> dataStack;
    double value;
    token TOKEN,topOp;
    while(true)
    {
        TOKEN=getOp(value);
        if(TOKEN==EOL)
            break;

     
        switch(TOKEN)
        {
        case VALUE:dataStack.push(value);
                    break;
        case OPAREN:opStack.push(OPAREN);break;
        case CPAREN:while((topOp=opStack.pop())!=OPAREN)
                        BinaryOp(topOp,dataStack);
                        break;
        case MULTI:case DIV:
                            while(!opStack.empty()&&(opStack.top()==DIV||opStack.top()==MULTI))
                                BinaryOp(topOp=opStack.pop(),dataStack);
                          
                            opStack.push(TOKEN);
                            break;
        case ADD:case SUB:
                        while(!opStack.empty()&&(opStack.top()!=OPAREN))
                              BinaryOp(topOp=opStack.pop(),dataStack);
                          
                          opStack.push(TOKEN);
                        break;
        }
      
    }
   while(!opStack.empty())
        BinaryOp(topOp=opStack.pop(),dataStack);
    return dataStack.pop();
}
int main()
{
   
    calc e("3+4*(5-3)");
    cout<<e.result()<<'\n';
    return 0;
}


void push(type t){data[index]=t;++index;}这一句没有问题
不过也谢谢了,耽误你好长时间了
2011-08-22 16:49
xg5699
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:140
专家分:522
注 册:2011-7-27
收藏
得分:0 
回复 8楼 紫凤双飞
牛B

都不结贴我郁闷那!
2011-08-22 16:53
快速回复:【求助】:请看看这个程序错在哪儿
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031663 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved