需求:有两个数组一个是待计算的数值数组,一个是计算符号数组。例如:1+2-3*4/5将其中数值按顺序存入一个数值数组,将计算符号按顺序存入另一个符号数组。根据两个数组的内容计算出算术表达式的结果。
想法:根据符号提取两个相邻的数值数组数据进行计算。问题是涉及到了不同优先级的计算符号,想法是优先处理乘除运算,在处理加减运算。在乘除运算中,待计算的数A和数B,结果存入数B,数A清0,并将符号修改为加号(也可以不改变)。进行完第一轮的乘除运算后,只需要在做加减运算。减法运算需要注意,数A与数B做减法,如果数B为0那么就将数B设为下一个待计算的数值,直到数B不等于0为止。做加法运算则直接将数A与数B相加。数A与数B加减运算的结果存入数B。最后表达式计算结果为数B。
代码实现:
#include <stdio.h>
int main(void)
{
float n[]={1,2,3,4,5};
char p[]={'+','-','*','/'};
int i=0,l; /*数值数组与符号数组的索引均为i,l用于跳过0*/
l = sizeof(n)/4; /*sizeof()函数返回的数据结构占据的 字节数,int类型数组占4个字节。因此数值数组的长度需要再除以4*/
for(i=0;i<l-1;i++){
if(p[i] == '*') /*乘法运算,将计算结果放在n[i+1],n[i]清0,p[i]改为加号*/
{
n[i+1] = n[i]*n[i+1];
n[i] = 0;
p[i] = '+';
}
else if(p[i] == '/'){ /*除法运算类同于乘法*/
n[i+1] = n[i]/n[i+1];
n[i] = 0;
p[i] = '+';
}
else
continue; /*加减法直接跳过*/
}
float tmp=0; /*暂存数据n[i]*/
for(i=0;i<l-1;i++){
if(p[i] == '-') /*减法运算,遇到n[i+1]=0需要继续跳到下一个数,此时也跳过了下一个符号(+)的运算*/
{
tmp = n[i];
while(1){
if(n[i+1] == 0)
i++;
else
break;
}
n[i+1] = tmp-n[i+1];
}
if(p[i] == '+') /*加法运算直接相加*/
n[i+1] = n[i]+n[i+1];
}
printf("%f\n",n[i]); /*表达式计算结果*/
return 0;
}
在Ubuntu运行结果: