| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 15454 人关注过本帖, 4 人收藏
标题:[原创]算术表达式求值演示
只看楼主 加入收藏
冰雨
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-6-26
收藏
得分:0 

喜欢。。。。
2006-06-29 20:55
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 
以下是引用方方在2006-6-29 13:22:00的发言:

程序运行的时候,如果输入错误的表达式,但是它还是会继续运行.

是的,即使是错误的表达式也会把它的入栈出栈顺序表示出来,但计算的结果是错的


我的征途是星辰大海
2006-07-01 20:19
sll
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-7-3
收藏
得分:0 

不错哦!!!!!!!!

2006-07-03 11:36
Zacard
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2006-7-7
收藏
得分:0 

不错,但是比不上我的
我也做这个
我的能实现实数运算,
你的好像不能处理大于10的数
569912111


自由指针是一种生活态度
2006-07-07 18:47
mnzmx
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2005-6-24
收藏
得分:0 

#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define MAXNUM 100

char top(char a[])
{
int i;
char b;
for(i=0;a[i]!='\0';i++);

b=a[i-1];
return b;
}

int power(char x,int &base)
{
int power;
if(x=='+'||x=='-')
power=base+1;
if(x=='*'||x=='/')
power=base+2;
if(x=='(')
{
power=3;
base+=3;
}
if(x==')')
{
power=-1;

}
if('0'<=x&&x<='9')
power=0;
return power;
}

int pop1(int a[])
{
int i,b;
for(i=0;a[i];i++);//!='\0'

b=a[i-1];
a[i-1]='\0';
return b;
}
char pop2(char a[])
{
int i;
char b;
for(i=0;a[i]!='\0';i++);

b=a[i-1];
a[i-1]='\0';
return b;
}
int math(int x,char y,int z)
{
if (y=='+')
x=x+z;
if (y=='-')
x=x-z;
if (y=='*')
x=x*z;
if (y=='/')
x=x/z;
return x;
}

void push1(int a[],int b)
{
int i;
for(i=0;a[i];i++);

a[i]=b;
a[i+1]='\0';
}
void push2(char a[],char b)
{
int i;
for(i=0;a[i]!='\0';i++);

a[i]=b;
a[i+1]='\0';
}


void infixtoSuffix(const char *infix)
{
int i,b,c,base=0,opnd[MAXNUM],m,a;
char y,x,optr[MAXNUM];
opnd[0]='\0';
optr[0]='\0';
for (i = 0; infix[i] != '\0'; i++)
{
x=infix[i];
if (power(x,base)==0)
{
if (i>0&&power(infix[i-1],base)==0)
{
b=pop1(opnd);
a=10*b+int(x-'0');
}
else
a=int(x-'0');//
push1(opnd,a);

for(m=0;opnd[m];m++)
printf("%d ", opnd[m]);
m=10-m;
for(m;m!=0;m--)
printf(" ");
printf("%-15s%-10c%d入OPND栈\n", optr, x, a);

}
else if (power(x,base)==-1)
{

a=pop1(opnd);
b=pop1(opnd);
y=pop2(optr);
c=math(b,y,a);
push1(opnd,c);
////////////////////////////
for(m=0;opnd[m];m++)
printf("%d ", opnd[m]);
m=10-m;
for(m;m!=0;m--)
printf(" ");
printf("%-15s%-10c计算%d%c%d并将结果%d压入OPND栈\n", optr, x,b, y,a,c);

//////////////////////////////////


y=pop2(optr);
///////////////////////////////
for(m=0;opnd[m];m++)
printf("%d ", opnd[m]);
m=10-m;
for(m;m!=0;m--)
printf(" ");
printf("%-15s %c出OPTR栈\n", optr, y);
/////////////////////////////////


if(y=='(') ;
else
{

while(y!='(')
{
a=pop1(opnd);
b=pop1(opnd);
c=math(b,y,a);
push1(opnd,c);
//////////////////////////
for(m=0;opnd[m];m++)
printf("%d ", opnd[m]);
m=10-m;
for(m;m!=0;m--)
printf(" ");
printf("%-15s 计算%d%c%d并将结果%d压入OPND栈\n", optr, b, y,a,c);
///////////////////////////////////

y= pop2(optr);
}
////////////////////////////////
for(m=0;opnd[m];m++)
printf("%d ", opnd[m]);
m=10-m;
for(m;m!=0;m--)
printf(" ");
printf("%-15s %c出OPTR栈\n", optr, y);
//////////////////////////////////
}
base-=3;
}
else if (power(x,base)==3)
{
push2(optr,x);
///////////////////////////
for(m=0;opnd[m];m++)
printf("%d ", opnd[m]);
m=10-m;
for(m;m!=0;m--)
printf(" ");
printf("%-15s%-10c%c入OPTR栈\n", optr, x, x);

}
else
{
if(power(x,base)>power(top(optr),base))
{push2(optr,x);
///////////////////////////
for(m=0;opnd[m];m++)
printf("%d ", opnd[m]);
m=10-m;
for(m;m!=0;m--)
printf(" ");
printf("%-15s%-10c%c入OPTR栈\n", optr, x, x);
///////////////////////////
}
else
{
a=pop1(opnd);

b=pop1(opnd);

y=pop2(optr);

c=math(b,y,a);

push1(opnd,c);
/////////////////////////////
for(m=0;opnd[m];m++)
printf("%d ", opnd[m]);
m=10-m;
for(m;m!=0;m--)
printf(" ");
printf("%-15s%-10c计算%d%c%d并将结果%d压入OPND栈\n", optr, x ,b, y,a,c);
///////////////////////////////////
push2(optr,x);
/////////////////////////////////
for(m=0;opnd[m];m++)
printf("%d ", opnd[m]);
m=10-m;
for(;m!=0;m--)
printf(" ");
printf("%-15s%-10c%c入OPTR栈\n", optr, x, x);
///////////////////////////////
}
}
}
y=pop2(optr);

while(opnd[1]!='\0')
{
a=pop1(opnd);

b=pop1(opnd);

c=math(b,y,a);

push1(opnd,c);
//////////////////////////////////
for(m=0;opnd[m];m++)
printf("%d ", opnd[m]);
m=10-m;
for(;m!=0;m--)
printf(" ");
printf("%-15s 计算%d%c%d并将结果%d压入OPND栈\n", optr, b, y,a,c);
//////////////////////////////
y=pop2(optr);
}
printf("算术表达式计算结果为:%d\n",opnd[0]);

}


void getline(char *line, int limit)
{
char c;
int i=0;
while (i<limit-1&&(c=getchar())!=EOF&&c!='\n')
line[i++]=c;
line[i]='\0';
}

void main()
{
char infix[MAXNUM] ;
printf(" ***********************************\n");
printf(" * 算术表达式求值演示 *\n");
printf(" * --------------------------- *\n");
printf(" * 制 作 人 starrysky *\n");
printf(" * 个人信息 见论坛简介 *\n");
printf(" * QQ 297456458 *\n");
printf(" * ————————————————*\n");
printf(" ***********************************\n");
printf("\n\n说明:\n如下表达式非法:\n 数字和'('直接连接在一起,如 1+2(1+1)\n 请输入一个表达式,如3*(7-2)。\n\n请输入表达式 :");
getline(infix, MAXNUM);
printf("\n");
printf("OPND栈 OPTR栈 输入字符 主要操作\n");
infixtoSuffix(infix);
printf("按回车结束。");
getchar();

}

在WIN-TC下编译会说int power(char x,int &base)这句“说明语法错误”??????

2006-07-07 20:02
mnzmx
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2005-6-24
收藏
得分:0 
我用C++bulder编译后可以运行,但是运算结果会出错误有一个莫名其妙的数会进栈
2006-07-07 20:36
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 
以下是引用Zacard在2006-7-7 18:47:00的发言:

不错,但是比不上我的
我也做这个
我的能实现实数运算,
你的好像不能处理大于10的数
569912111

谁说不能处理大于10的数啊,楼顶的老版本好象是不行,但后面的新版本100*100 都可以,不过我设定的变量类型为int , 所以最好计算时不要溢出,否则计算结果能显示,但结果是错的。


我的征途是星辰大海
2006-07-09 15:15
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 
以下是引用mnzmx在2006-7-7 20:02:00的发言:

在WIN-TC下编译会说int power(char x,int &base)这句“说明语法错误”??????

SunShine 过来帮忙看看,我现在在网吧上网,自己电脑前几天格式化了一次,没装WIN-TC。


我的征途是星辰大海
2006-07-09 15:20
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 
以下是引用mnzmx在2006-7-7 20:36:00的发言:
我用C++bulder编译后可以运行,但是运算结果会出错误有一个莫名其妙的数会进栈

现在我电脑上没有C++Build , 等明天我装个后看看。

这个程序是在VC++6.0下编译通过的。用其他的编译器可能会出现问题(我没用其他编译器试过)。


我的征途是星辰大海
2006-07-09 15:23
Firedy
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-10-10
收藏
得分:0 

十分感谢


2006-10-10 18:38
快速回复:[原创]算术表达式求值演示
数据加载中...
 
   



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

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