游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1967|回复: 7

新手编“计算器”被卡,求教!!!

[复制链接]

1

主题

9

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2005-9-29 22:18:00 | 显示全部楼层 |阅读模式
      刚学C++一个月,今天想编一个带有优先级功能的计算器被卡,还请高手赐教!

      我的思路是:C++编译器本身能识别数学表达式的优先级,所以我想把判断优先级的工作留给编译器去作。但是编译器无法识别用户输入的数学表达式,因为用户输入的都是字符。我想我所要作的工作就是把用户输入的字符转换成编译器能识别的表达式。。。

代码如下:

#include "iostream.h"
#include "string.h"

void main ()
{        char p[ 100 ]="1+2*34-5656=";
        int a[ 100 ];
        int b[ 100 ];            // 存放数字的数组
        char oper[ 100 ];  //存放运算符的数组
        static int x = 0;
        int i ,sum;
        int m = strlen ( p );

//从用户输入的数学表达式取数字和运算符, 里面还有个小BUG^_^,现在先不管,以后再改吧
        for( i = 0; i < m; i++)
        {
                if( i == 0 )
                {
                        a[ i ] = p[ i ] - 48 ; continue;
                }
                if( (p[ i ] == '+') ||  (p[ i ] == '-') || (p[ i ] == '*') || (p[ i ] == '/') || (p[ i ] == '='))
                {
                        oper[ x ] = p[ i ];
                        b[ x ] = a [ i-1 ];
                        a[ i ] = p[ i ] = 0;
                        ++x;
                }else
                        {
                                a[ i ] = a[ i - 1 ] * 10 + p[ i ] - 48;
                        }

        }


//输出表达式,但无法计算。。。

        for (  i = 0 ; i < x; i++)
        {
                cout << b[ i ] << oper[ i ];
        }

}

1

主题

42

帖子

52

积分

注册会员

Rank: 2

积分
52
发表于 2005-9-30 02:09:00 | 显示全部楼层

Re:新手编“计算器”被卡,求教!!!

建议看看编译原理及实践一书

表达式的优先次序是在编译期间确定的,如果在运行时提供表达式只能自己在程序里解析和运算

2

主题

35

帖子

44

积分

注册会员

Rank: 2

积分
44
发表于 2005-9-30 05:05:00 | 显示全部楼层

Re:新手编“计算器”被卡,求教!!!

牛人们又要搬出来自动机一大堆理论了。
我记得我当初写的时候用的是2个堆栈实现的。一个存储字符,一个是数字。
在进行左值,右值判断,实话说,方法太麻烦了。编译原理上应该有更好的办法。

1

主题

9

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2005-9-30 13:10:00 | 显示全部楼层

Re:新手编“计算器”被卡,求教!!!

谢谢lorryabc和dede22的回答。
我现在的想法是接下来用“重载运算符”的思路去作。比方说重载“+”运算符。最终表达式写成类似形式:
a[ 0 ] + b[ 0 ] + a[ 1 ] + b[ 1 ] + a[ 2 ] + b[ 2 ]……
其中,a 数组放的是数字,b 数组放的是运算符。“+”进行右值判断,当右值是运算符时返回该运算符,当右值是数字时返回该数字。

期待牛人的出现  :P

1

主题

42

帖子

52

积分

注册会员

Rank: 2

积分
52
发表于 2005-9-30 16:28:00 | 显示全部楼层

Re:新手编“计算器”被卡,求教!!!

我改的,没有错误检查,只支持+-*/=

#include <iostream>
#include <string>

using namespace std;

int prio(char op)        //优先级
{
        switch(op)
        {
        case '=':
                return(1);
        case '+':
        case '-':
                return(2);
        case '*':
        case '/':
                return(3);
        default:
                cout<<"err";
                return(-1);
        }
}

int calcu(int num1,int num2,char op)
{
        switch(op)
        {
        case '+':
        return(num1+num2);
        case '-':
                return(num1-num2);
        case '*':
                return(num1*num2);
        case '/':
                if(num2==0)
                {
                        cout<<"err";
                        return(0);
                }
                return(num1/num2);
        default:
                cout<<"err";
                return(-1);
        }
}

void main ()
{
        char p[ 100 ]="1+2*34-5656=";
        int a[ 100 ];
        int b[ 100 ];     // 存放数字的数组
        char oper[ 100 ];  //存放运算符的数组
        static int x = 0;
        int i ,sum;
        int m = strlen ( p );


        //从用户输入的数学表达式取数字和运算符, 里面还有个小BUG^_^,现在先不管,以后再改吧
        for( i = 0; i < m; i++)
        {
                if( i == 0 )
                {
                        a[ i ] = p[ i ] - 48 ; continue;
                }
                if( (p[ i ] == '+') ||  (p[ i ] == '-') || (p[ i ] == '*') || (p[ i ] == '/') || (p[ i ] == '='))
                {
                        oper[ x ] = p[ i ];
                        b[ x ] = a [ i-1 ];
                        a[ i ] = p[ i ] = 0;
                        ++x;
                }else
                {
                        a[ i ] = a[ i - 1 ] * 10 + p[ i ] - 48;
                }

        }


        //求值
        int j,k;
        i=0;
        sum=b[0];
        while(1)
        {
                if(oper=='=')
                        break;
                if(prio(oper)>=prio(oper[i+1]))
                {
                        sum=calcu(sum,b[i+1],oper);
                        i++;
                }
                else
                {
                        k=i;
                        i++;
                        j=b;
                        while(1)
                        {
                                j=calcu(j,b[i+1],oper);
                                i++;
                                if(prio(oper[i-1])>prio(oper))
                                        break;
                        }
                        sum=calcu(sum,j,oper[k]);
                }
        }

        //输出表达式,但无法计算。。。

        for (  i = 0 ; i < x; i++)
        {
                cout << b[ i ] << oper[ i ];
        }
        cout<<sum<<"\n";

        getchar();
}

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2005-9-30 17:04:00 | 显示全部楼层

Re:新手编“计算器”被卡,求教!!!

用栈就可以了,不用做太复杂.
栈作一般的运算解析够用了

1

主题

9

帖子

13

积分

新手上路

Rank: 1

积分
13
 楼主| 发表于 2005-10-2 13:59:00 | 显示全部楼层

Re:新手编“计算器”被卡,求教!!!

万分感谢 lorryabc!!!

1

主题

42

帖子

52

积分

注册会员

Rank: 2

积分
52
发表于 2005-10-2 19:28:00 | 显示全部楼层

Re:新手编“计算器”被卡,求教!!!

不客气,呵呵
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-28 01:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表