分享

计算一个算术表达式

 quasiceo 2013-12-10

计算一个算术表达式-C/C++计算器

//悲剧,竟然有bug..调试中。。。通过。。

 //暂时不能计算小数的!

【DEBUG前】//计算一个算术表达式,以#结束,如图,例如:


 

  

【DEBUG前】

#include <iostream.h>
#include <stdio.h>
#include <math.h>

const int size=20;
int D[20],sum=0,i,j,k; //66行if语句用

class Opnd //数栈
{
public:
int size;
int *base;
int *top;
};

class Optr //符号栈
{
public:
int size;
char *base;
char *top;
};

char precede(char top,char cc) //优先级比较函数,这个函数花了我好长时间,一点点的调试出来的,真的好累。
{
if(top=='(' && cc==')')
return '=';
else if(top=='#'||top=='('||top>cc && cc !='#'&&cc!=')') 
return '<';

else if(cc=='#'||cc==')'||top<cc||top==cc)
return '>';

}

int oprator(int a,char b,int c) //运算函数
{
switch(b)
{
case '+': return a+c;
case '-': return a-c;
case '*': return a*c;
case '/': return a/c;
}
}
int main()
{
Opnd pnd;
Optr prt;
char c;
pnd.base=new(int[size]);
prt.base=new(char[size]);
pnd.top=pnd.base;
prt.top=prt.base;
*prt.top='#';

c=getchar();
while(c !='#'||*prt.top !='#')
{
if(c>='0'&& c<='9')
{
for(i=0;c>='0'&& c<='9';i++)
{
D[i]=c-48; //将例如"123"这样的字符串转换成整数123 
c=getchar();
}
for(j=0,k=i,sum=0;j<i;j++)
{
sum+=D[j]*pow(10,--k);
}
*pnd.top=sum;
pnd.top++;
}
else
switch(precede(*prt.top,c))
{
case '<': //当前算术符号优先级小于符号栈顶,进符号栈
*(prt.top+1)=c; 
prt.top++;
c=getchar();
break;
case '=': //'='只是指当'('遇到')',这个语句块用来消去括号
prt.top--; 
c=getchar();
break;
case '>': //当前算术符号优先级大于符号栈顶,取符号栈顶元素
//并取数栈中的最上两个元素进行运算
*(pnd.top-2)=oprator(*(pnd.top-2),*prt.top,*(pnd.top-1)); 
pnd.top--;
prt.top--;
break;
}
}
cout<<*(pnd.top-1)<<endl;
return 0;
}


  【DEBUG后】

#include <iostream.h>
#include <stdio.h>
#include <math.h>

const int size=20;
int D[20],sum=0,i,j,k;   //66行if语句用

class Opnd  //数栈
{
public:
 int size;
 int *base;
 int *top;
};

class Optr  //符号栈
{
public:
 int size;
 char *base;
 char *top;
};

char precede(char top,char cc)     //优先级比较函数,这个函数花了我好长时间,一点点的调试出来的,真的好累。
{
/*if(top=='(' && cc==')')
  return '=';
 else if(top=='#'||top=='('||top>cc && cc !='#'&&cc!=')'||top<cc&&cc=='/')  //这部分被注释的是先前写的存在着错误
                                                                              //不想找错误了,所以写了下面的新的
  return '<';                                                                  //虽然看着比较长但还是很容易能看懂的

 else if(cc=='#'||cc==')'||top<cc&&cc!='/'||top==cc)
  return '>';*/
 if(top=='(' && cc==')')      //判断左右括弧
  return '=';

 if((top=='+'||top=='-')&&(cc=='*'||cc=='/'))     //栈顶操作符优先级低
  return '<';
 if((cc=='+'||cc=='-')&&(top=='*'||top=='/'))     //栈顶操作符优先级高
  return '>';
 
 if((cc=='+'||cc=='-')&&(top=='+'||top=='-'))        //这两个语句判断'+''-''*''/'
  return '>';
 if((cc=='*'||cc=='/')&&(top=='*'||top=='/'))         //优先级相等的情况
  return '>';


 if(top=='#'||top=='('||cc=='(')       //继续插入cc操作符
  return '<';
 if(cc=='#'||cc==')'||top==')')        //继续运算                                                         
  return '>';
 else
  return 'r';


}

int oprator(int a,char b,int c)        //运算函数
{
 switch(b)
 {
 case '+': return a+c;
 case '-': return a-c;
 case '*': return a*c;
 case '/': return a/c;
 }
}
int main()
{
 Opnd pnd;
 Optr prt;
 char c;
 pnd.base=new(int[size]);
 prt.base=new(char[size]);
 pnd.top=pnd.base;
 prt.top=prt.base;
 *prt.top='#';

 c=getchar();
 while(c !='#'||*prt.top !='#')
 {
  if(c>='0'&& c<='9')
  {
   for(i=0;c>='0'&& c<='9';i++)
    {
     D[i]=c-48;     //将例如"123"这样的字符串转换成整数123 
     c=getchar();
    }
   for(j=0,k=i,sum=0;j<i;j++)
    {
     sum+=D[j]*pow(10,--k);
    }
   *(pnd.top++)=sum;
  }
  else
  switch(precede(*prt.top,c))
  {
   case '<':                             //当前算术符号优先级小于符号栈顶,进符号栈
      *(++prt.top)=c;          
      
      c=getchar();
      break;
   case '=':                             //'='只是指当'('遇到')',这个语句块用来消去括号
      prt.top--;           
      c=getchar();
      break;
   case '>':         //当前算术符号优先级大于符号栈顶,取符号栈顶元素
                    //并取数栈中的最上两个元素进行运算
      *(pnd.top-2)=oprator(*(pnd.top-2),*prt.top,*(pnd.top-1));   
      pnd.top--;
      prt.top--;
      break;
  }
 }
 cout<<*(pnd.top-1)<<endl;
 return 0;
}


【修改版】



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
*完成时间:  2013年05月24日 星期五 12时42分52秒 
*环境:        Linux(ubuntu12.04版)
*编译器:   gcc (版本 4.6.3)
*作者:        不辞远
*功能:        简单实现,加减乘除(使用编译原理中的递归下降分析法)
*/
#include    <stdio.h>
#include    <stdlib.h>
char token;
    
void error(void)
{
    printf("error!\n");
    exit(1);
}
    
void match(char expected)
{
    if (token == expected) token = getchar();
    else error();
}
     
int _exp(void)      //exp is gcc reserved word
{
    int temp = term();
    while (token == '+' || token == '-') {
        switch (token) {
            case '+':
                match('+');
                temp += term();
                break;
            case '-':
                match('-');
                temp -= term();
                break;
        }
    }
    return temp;
}
    
int term(void)
{
    int temp = factor();
    while (token == '*' || token == '/') {
        switch (token) {
            case '*':
                match('*');
                temp = temp * factor();
                break;
            case '/':
                match('/');
                temp = temp / factor();
                break;
        }
    }
    return temp;
}
    
int factor(void)
{
    int temp;
    if (token == '(') {
        match('(');
        temp = _exp();
        match(')');
    }
    else if (token >= '0' && token <= '9') {
        ungetc(token,stdin);
        scanf("%d",&temp);
        token = getchar();
    }
    else
        error();
    return temp;
}
    
int main(void)
{
    int result;
    printf("please input the expression:\n");
    token  = getchar();
    result = _exp();
    if (token == '\n')
        printf("the result = %d\n",result);
    else
        error();
    return 0;
}


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多