成绩: 5 / 折扣: 0.8
传统的算术表达式是由操作数(又叫运算对象或运算量)和运算符以及改变运算次序的圆括号连接而成的式子。 其运算规则如下:
(1) 先计算括号内,后计算括号外;
(2) 在无括号或同层括号内,先进行乘除运算,后进行加减运算,即乘除运算的优先级高于加减运算的优先级;
(3) 同一优先级运算,从左向右依次进行。
在这种表达式的计算过程中,既要考虑括号的作用,又要考虑运算符的优先级,还要考虑运算符出现的先后次序。
波兰科学家卢卡谢维奇(Lukasiewicz)提出了算术表达式的另一种表示,即后缀表示,又称逆波兰式,其定义是把运算符放在两个运算对象的后面。在后缀表达式中,不存在括号,也不存在优先级的差别,计算过程完全按照运算符出现的先后次序进行,整个计算过程仅需一遍扫描便可完成。
例如:
3/5+6的逆波兰表达式为3 5 / 6 +
2*(3+4)的逆波兰表达式为2 3 4 + *
输入:
一个只包含加、减、乘、除和数字的逆波兰表达式
输出:
该表达式的值
#include<stdio.h>
#include<string.h>
#define N 100
void main()
{
int k,i,j,l,s;
char a[N];
gets(a);
l=strlen(a);
for(k=0;k<l;k++)
{
if(a[k]==' ')
{
for(j=k+1;j<=l;j++)
a[j-1]=a[j];
l--;
}
}
for(i=2;i<l;i++)
{
if(a[i]=='+')
{
s=a[i-1]+a[i-2]-'0'-'0';
a[i-2]=s+'0';
for(j=i+1;j<=l;j++)
a[j-2]=a[j];
l=l-2;
i=1;
}
if(a[i]=='-')
{
s=a[i-2]-a[i-1];
a[i-2]=s+'0';
for(j=i+1;j<=l;j++)
a[j-2]=a[j];
l=l-2;
i=1;
}
if(a[i]=='*')
{
s=(a[i-2]-'0')*(a[i-1]-'0');
a[i-2]=s+'0';
for(j=i+1;j<=l;j++)
a[j-2]=a[j];
l=l-2;
i=1;
}
if(a[i]=='/')
{
s=(a[i-2]-'0')/(a[i-1]-'0');
a[i-2]=s+'0';
for(j=i+1;j<=l;j++)
a[j-2]=a[j];
l=l-2;
i=1;
}
}
printf("%d\n",s);
}
12 个解决方案
#1
#include<stdio.h>
#include<string.h>
#define N 100
void main()
{
int i,j,l,result,temp;
char a[N];
char b[N/2];
printf("input expression:\n");
gets(a);
l = strlen(a);
j = 0;
//get all valid data
for(i = 0;i < l; i++)
{
if(a[i] != ' ')
b[j++] = a[i];
}
//look for operator
for(i = 0;i < j;i++)
{
if((b[i] < '0') || (b[i] > '9'))
break;
}
//start calculation
temp = i;
result = b[temp-1] - '0';
for(i = 0; i < (temp - 1); i++)
{
switch(b[temp+i])
{
case '+':
result = result + (b[temp - i -2] - '0');
break;
case '-':
result = result - (b[temp - i -2] - '0');
break;
case '*':
result = result * (b[temp - i -2] - '0');
break;
case '/':
result = result / (b[temp - i -2] - '0');
break;
default:
break;
}
}
printf("result :%d\n",result);
}
lz的代码有点乱呀
这是我重新写的一个你可以参考一下,
我的程序也有两个缺点
一个是计算的结果不能超过int的表示范围,
另外一个就是输入都是个位数。
都是可以修改的就是比较麻烦我没时间弄,lz可以在我的代码的基础上修改一下。
#2
你编的这个好像不对啊,代码我没仔细看,不过就用一个例子 2 3 + 5 *应该的25,你这个得5,不对啊...
#3
运行没问题
#4
我现在已经知道问题了,就是我这个程序只能解决个位数问题,我把问题想简单了,所以就把空格给消了,可是如果不是各位数的解决办法我还没有想到,请教啊,告诉我两位数的也行
#5
还有,如果大家发程序代码,请用c啊,c++我不会啊,完全看不懂的
#6
而且1楼的程序跟我的几乎一样,我只是在原数组把空格给消了,他是用了一个新数组,不用空格了
#7
#include<stdio.h>
#include<string.h>
#define N 100
int fun_calculation(int para1, char para2, char operat)
{
int ret = 0;
switch(operat)
{
case '+':
ret = para1 + (para2 - '0');
break;
case '-':
ret = para1 - (para2 - '0');
break;
case '*':
ret = para1 * (para2 - '0');
break;
case '/':
ret = para1 / (para2 - '0');
break;
default:
break;
}
return ret;
}
void main()
{
int i,j,l,result,Flag = 0;
int count1 = 0;//for initilize result
int count2 = 0;//continue operator count
char a[N];
char b[N/2];
printf("input expression:\n");
gets(a);
l = strlen(a);
j = 0;
//get all valid data
for(i = 0;i < l; i++)
{
if(a[i] != ' ')
b[j++] = a[i];
}
//look for operator
for(i = 0;i < j;i++)
{
if((b[i] < '0') || (b[i] > '9'))
{
Flag = 1;
if(Flag == 1)
count2++;
//initilize result
count1++;
if(count1 == 1)
{
result = b[i-1] - '0';
}
result = fun_calculation(result,b[i-count2*2],b[i]);
}
else
{
Flag = 0;
count2 = 0;
}
}
printf("result :%d\n",result);
}
是我对这个计算方法理解错了,你在试试
我之所以有用了新数组是方便计算不只是个位数的时候
#8
那也不对啊2 3 + 5 *应该的25,你这个得-25
#9
而且我想请教你一下,你把空格都不要了,把原数组元素都存到一个新的数组里了,空格都没了,你怎么判断原来要运算的数是什么呢
#10
#include<stdio.h>
#include<string.h>
#define N 100
int fun_calculation(int para1, char para2, char operat)
{
int ret = 0;
switch(operat)
{
case '+':
ret = para1 + (para2 - '0');
break;
case '-':
ret = para1 - (para2 - '0');
break;
case '*':
ret = para1 * (para2 - '0');
break;
case '/':
ret = para1 / (para2 - '0');
break;
default:
break;
}
return ret;
}
void main()
{
int i,j,l,result,Flag = 0;
int count1 = 0;//for initilize result
int count2 = 0;//continue operator count
char a[N];
char b[N/2];
printf("input expression:\n");
gets(a);
l = strlen(a);
j = 0;
//get all valid data
for(i = 0;i < l; i++)
{
if(a[i] != ' ')
b[j++] = a[i];
}
//look for operator
for(i = 0;i < j;i++)
{
if((b[i] < '0') || (b[i] > '9'))
{
Flag = 1;
if(Flag == 1)
count2++;
//initilize result
count1++;
if(count1 == 1)
{
result = b[i-1] - '0';
result = fun_calculation(result,b[i-count2-1],b[i]);
}
else
{
if(count2 > 1)
result = fun_calculation(result,b[i-count2*2],b[i]);
else
result = fun_calculation(result,b[i-1],b[i]);
}
}
else
{
Flag = 0;
count2 = 0;
}
}
printf("result :%d\n",result);
}
调试的时候该掉了忘了改回来,呵呵呵
#11
其实如果你想做的是数不只是各位数的话,那就要把我代码中的b数组改成2维数组,如果是个位数那就b中的每一个都是一个数,这下你是否明白了?
#12
恩,懂你的意思,我去把你的程序改改,做成多位数的,谢谢啦,麻烦你了,让你花这么多时间!!
#1
#include<stdio.h>
#include<string.h>
#define N 100
void main()
{
int i,j,l,result,temp;
char a[N];
char b[N/2];
printf("input expression:\n");
gets(a);
l = strlen(a);
j = 0;
//get all valid data
for(i = 0;i < l; i++)
{
if(a[i] != ' ')
b[j++] = a[i];
}
//look for operator
for(i = 0;i < j;i++)
{
if((b[i] < '0') || (b[i] > '9'))
break;
}
//start calculation
temp = i;
result = b[temp-1] - '0';
for(i = 0; i < (temp - 1); i++)
{
switch(b[temp+i])
{
case '+':
result = result + (b[temp - i -2] - '0');
break;
case '-':
result = result - (b[temp - i -2] - '0');
break;
case '*':
result = result * (b[temp - i -2] - '0');
break;
case '/':
result = result / (b[temp - i -2] - '0');
break;
default:
break;
}
}
printf("result :%d\n",result);
}
lz的代码有点乱呀
这是我重新写的一个你可以参考一下,
我的程序也有两个缺点
一个是计算的结果不能超过int的表示范围,
另外一个就是输入都是个位数。
都是可以修改的就是比较麻烦我没时间弄,lz可以在我的代码的基础上修改一下。
#2
你编的这个好像不对啊,代码我没仔细看,不过就用一个例子 2 3 + 5 *应该的25,你这个得5,不对啊...
#3
运行没问题
#4
我现在已经知道问题了,就是我这个程序只能解决个位数问题,我把问题想简单了,所以就把空格给消了,可是如果不是各位数的解决办法我还没有想到,请教啊,告诉我两位数的也行
#5
还有,如果大家发程序代码,请用c啊,c++我不会啊,完全看不懂的
#6
而且1楼的程序跟我的几乎一样,我只是在原数组把空格给消了,他是用了一个新数组,不用空格了
#7
#include<stdio.h>
#include<string.h>
#define N 100
int fun_calculation(int para1, char para2, char operat)
{
int ret = 0;
switch(operat)
{
case '+':
ret = para1 + (para2 - '0');
break;
case '-':
ret = para1 - (para2 - '0');
break;
case '*':
ret = para1 * (para2 - '0');
break;
case '/':
ret = para1 / (para2 - '0');
break;
default:
break;
}
return ret;
}
void main()
{
int i,j,l,result,Flag = 0;
int count1 = 0;//for initilize result
int count2 = 0;//continue operator count
char a[N];
char b[N/2];
printf("input expression:\n");
gets(a);
l = strlen(a);
j = 0;
//get all valid data
for(i = 0;i < l; i++)
{
if(a[i] != ' ')
b[j++] = a[i];
}
//look for operator
for(i = 0;i < j;i++)
{
if((b[i] < '0') || (b[i] > '9'))
{
Flag = 1;
if(Flag == 1)
count2++;
//initilize result
count1++;
if(count1 == 1)
{
result = b[i-1] - '0';
}
result = fun_calculation(result,b[i-count2*2],b[i]);
}
else
{
Flag = 0;
count2 = 0;
}
}
printf("result :%d\n",result);
}
是我对这个计算方法理解错了,你在试试
我之所以有用了新数组是方便计算不只是个位数的时候
#8
那也不对啊2 3 + 5 *应该的25,你这个得-25
#9
而且我想请教你一下,你把空格都不要了,把原数组元素都存到一个新的数组里了,空格都没了,你怎么判断原来要运算的数是什么呢
#10
#include<stdio.h>
#include<string.h>
#define N 100
int fun_calculation(int para1, char para2, char operat)
{
int ret = 0;
switch(operat)
{
case '+':
ret = para1 + (para2 - '0');
break;
case '-':
ret = para1 - (para2 - '0');
break;
case '*':
ret = para1 * (para2 - '0');
break;
case '/':
ret = para1 / (para2 - '0');
break;
default:
break;
}
return ret;
}
void main()
{
int i,j,l,result,Flag = 0;
int count1 = 0;//for initilize result
int count2 = 0;//continue operator count
char a[N];
char b[N/2];
printf("input expression:\n");
gets(a);
l = strlen(a);
j = 0;
//get all valid data
for(i = 0;i < l; i++)
{
if(a[i] != ' ')
b[j++] = a[i];
}
//look for operator
for(i = 0;i < j;i++)
{
if((b[i] < '0') || (b[i] > '9'))
{
Flag = 1;
if(Flag == 1)
count2++;
//initilize result
count1++;
if(count1 == 1)
{
result = b[i-1] - '0';
result = fun_calculation(result,b[i-count2-1],b[i]);
}
else
{
if(count2 > 1)
result = fun_calculation(result,b[i-count2*2],b[i]);
else
result = fun_calculation(result,b[i-1],b[i]);
}
}
else
{
Flag = 0;
count2 = 0;
}
}
printf("result :%d\n",result);
}
调试的时候该掉了忘了改回来,呵呵呵
#11
其实如果你想做的是数不只是各位数的话,那就要把我代码中的b数组改成2维数组,如果是个位数那就b中的每一个都是一个数,这下你是否明白了?
#12
恩,懂你的意思,我去把你的程序改改,做成多位数的,谢谢啦,麻烦你了,让你花这么多时间!!